Xilinxの公式ドキュメントには次のように記載されている。
「vai_q_pytorch には現在 GPU バージョンだけがあり、vitis-ai-pytorch 環境は GPU コンテナー内にのみ存在します。」
どういう意味?
無いってこと?
今度はちゃんとREADME.txtを読みながら進めるぞ!
README.txtによると次のようにインストールする。
export CUDA_HOME=/usr/local/cuda
pip3 install torch==1.4.0 torchvision==0.5.0
pip3 install -r requirements.txt
cd ./pytorch_binding
python3 setup.py install
python3 setup.py develop
そして、次のコマンドを実行する。
python3 -c "import pytorch_nndct"
あれ、どこかで見かけたな…
$ python3 -c "import pytorch_nndct"
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/home/hidemi/workspace/VitisAI/VitisAI_2020.2/Vitis-AI/tools/Vitis-AI-Quantizer/vai_q_pytorch/pytorch_binding/pytorch_nndct/__init__.py", line 12, in <module>
from .apis import *
File "/home/hidemi/workspace/VitisAI/VitisAI_2020.2/Vitis-AI/tools/Vitis-AI-Quantizer/vai_q_pytorch/pytorch_binding/pytorch_nndct/apis.py", line 24, in <module>
from .qproc import TorchQuantProcessor
File "/home/hidemi/workspace/VitisAI/VitisAI_2020.2/Vitis-AI/tools/Vitis-AI-Quantizer/vai_q_pytorch/pytorch_binding/pytorch_nndct/qproc/__init__.py", line 1, in <module>
from .base import TorchQuantProcessor, dump_xmodel
File "/home/hidemi/workspace/VitisAI/VitisAI_2020.2/Vitis-AI/tools/Vitis-AI-Quantizer/vai_q_pytorch/pytorch_binding/pytorch_nndct/qproc/base.py", line 30, in <module>
from pytorch_nndct.quantization import TORCHQuantizer
File "/home/hidemi/workspace/VitisAI/VitisAI_2020.2/Vitis-AI/tools/Vitis-AI-Quantizer/vai_q_pytorch/pytorch_binding/pytorch_nndct/quantization/__init__.py", line 2, in <module>
from .quant_aware_training import QatScheduler
File "/home/hidemi/workspace/VitisAI/VitisAI_2020.2/Vitis-AI/tools/Vitis-AI-Quantizer/vai_q_pytorch/pytorch_binding/pytorch_nndct/quantization/quant_aware_training.py", line 28, in <module>
from pytorch_nndct.nn.qat.modules import conv_fused
File "/home/hidemi/workspace/VitisAI/VitisAI_2020.2/Vitis-AI/tools/Vitis-AI-Quantizer/vai_q_pytorch/pytorch_binding/pytorch_nndct/nn/__init__.py", line 1, in <module>
from .modules import *
File "/home/hidemi/workspace/VitisAI/VitisAI_2020.2/Vitis-AI/tools/Vitis-AI-Quantizer/vai_q_pytorch/pytorch_binding/pytorch_nndct/nn/modules/__init__.py", line 2, in <module>
from .linear import *
File "/home/hidemi/workspace/VitisAI/VitisAI_2020.2/Vitis-AI/tools/Vitis-AI-Quantizer/vai_q_pytorch/pytorch_binding/pytorch_nndct/nn/modules/linear.py", line 26, in <module>
from .fix_ops import NndctScale
File "/home/hidemi/workspace/VitisAI/VitisAI_2020.2/Vitis-AI/tools/Vitis-AI-Quantizer/vai_q_pytorch/pytorch_binding/pytorch_nndct/nn/modules/fix_ops.py", line 22, in <module>
from ..load_kernels import nndct_kernels
File "/home/hidemi/workspace/VitisAI/VitisAI_2020.2/Vitis-AI/tools/Vitis-AI-Quantizer/vai_q_pytorch/pytorch_binding/pytorch_nndct/nn/load_kernels.py", line 87, in <module>
nndct_kernels = load(
File "/usr/local/lib/python3.8/dist-packages/torch/utils/cpp_extension.py", line 670, in load
return _jit_compile(
File "/usr/local/lib/python3.8/dist-packages/torch/utils/cpp_extension.py", line 857, in _jit_compile
_write_ninja_file_and_build(
File "/usr/local/lib/python3.8/dist-packages/torch/utils/cpp_extension.py", line 907, in _write_ninja_file_and_build
_write_ninja_file(
File "/usr/local/lib/python3.8/dist-packages/torch/utils/cpp_extension.py", line 1150, in _write_ninja_file
cuda_flags = common_cflags + COMMON_NVCC_FLAGS + _get_cuda_arch_flags()
File "/usr/local/lib/python3.8/dist-packages/torch/utils/cpp_extension.py", line 1027, in _get_cuda_arch_flags
raise ValueError("Unknown CUDA arch ({}) or GPU not supported".format(arch))
ValueError: Unknown CUDA arch (8.6) or GPU not supported
なんでエラーなの?
そういえば、昨日までこのコマンドを使ってたよなぁ。
あ、たぶん、バージョンをデグレしちゃったなぁ。
バージョンを確認しよう。
$ pip3 list |grep torch
pytorch-ignite 0.4.2
pytorch-nndct 0.1.0+eeafe77 /usr/local/lib/python3.8/dist-packages
torch 1.4.0 /usr/local/lib/python3.8/dist-packages
torchvision 0.5.0
やっぱり、ダメやん。
もう一度、インストールする。
$ pip3 list |grep torch
pytorch-ignite 0.4.2
pytorch-nndct 0.1.0+eeafe77 /usr/local/lib/python3.8/dist-packages
torch 1.8.0a0+unknown /usr/local/lib/python3.8/dist-packages
torchvision 0.9.0a0+d732562
確認してみよう。
$ python3 -c "import pytorch_nndct"
[NNDCT_NOTE]: Loading NNDCT kernels...
OKだな。
それでここからどうすんの?
試すのは次を使えばいいみたい。
./tools/Vitis-AI-Quantizer/vai_q_pytorch/example/resnet18_quant.py
$ cd Vitis-AI-Quantizer/vai_q_pytorch/example/
$ ls
mobilenetv2_fast_finetune.py resnet18_quant.py resnet18_quantize_finetuning.py
ソースコードは次ので良いみたい。
resnet18_quant.py
$ python3 resnet18_quant.py --quant_mode calib --subset_len 200
[NNDCT_NOTE]: Loading NNDCT kernels...
-------- Start resnet18 test
Traceback (most recent call last):
File "resnet18_quant.py", line 280, in <module>
quantization(
File "resnet18_quant.py", line 203, in quantization
model.load_state_dict(torch.load(file_path))
File "/usr/local/lib/python3.8/dist-packages/torch/serialization.py", line 579, in load
with _open_file_like(f, 'rb') as opened_file:
File "/usr/local/lib/python3.8/dist-packages/torch/serialization.py", line 230, in _open_file_like
return _open_file(name_or_buffer, mode)
File "/usr/local/lib/python3.8/dist-packages/torch/serialization.py", line 211, in __init__
super(_open_file, self).__init__(open(name, mode))
FileNotFoundError: [Errno 2] No such file or directory: '/path/to/trained_model/resnet18.pth'
エラーになったんだですがなにか忘れてます?
resnet18.pthのPathを合わせないといけないようですね。
$ wget https://download.pytorch.org/models/resnet18-5c106cde.pth
$ mv resnet18-5c106cde.pth resnet18.pth
$ python3 resnet18_quant.py --quant_mode calib --subset_len 200 --model_dir=./
[NNDCT_NOTE]: Loading NNDCT kernels...
-------- Start resnet18 test
[NNDCT_NOTE]: Quantization calibration process start up...
[NNDCT_NOTE]: =>Quant Module is in 'cuda'.
[NNDCT_NOTE]: =>Parsing ResNet...
Traceback (most recent call last):
File "resnet18_quant.py", line 280, in <module>
quantization(
File "resnet18_quant.py", line 211, in quantization
quantizer = torch_quantizer(
File "/usr/local/lib/python3.8/dist-packages/pytorch_nndct/apis.py", line 63, in __init__
self.processor = TorchQuantProcessor(quant_mode = quant_mode,
File "/usr/local/lib/python3.8/dist-packages/pytorch_nndct/qproc/base.py", line 113, in __init__
quant_module, graph = prepare_quantizable_module(
File "/usr/local/lib/python3.8/dist-packages/pytorch_nndct/qproc/utils.py", line 160, in prepare_quantizable_module
graph = parse_module(module, input_args)
File "/usr/local/lib/python3.8/dist-packages/pytorch_nndct/qproc/utils.py", line 73, in parse_module
graph = parser(module._get_name() if graph_name is None else graph_name,
File "/usr/local/lib/python3.8/dist-packages/pytorch_nndct/parse/parser.py", line 32, in __call__
raw_graph = torch_graph_handler.build_torch_graph(graph_name, module, input_args)
File "/usr/local/lib/python3.8/dist-packages/pytorch_nndct/parse/trace_helper.py", line 37, in build_torch_graph
fw_graph, params = self._trace_graph_from_model(input_args, train)
File "/usr/local/lib/python3.8/dist-packages/pytorch_nndct/parse/trace_helper.py", line 58, in _trace_graph_from_model
graph, output = trace_and_get_graph_from_model(self._module, input_args,
File "/usr/local/lib/python3.8/dist-packages/pytorch_nndct/parse/utils.py", line 183, in trace_and_get_graph_from_model
old_map = torch.jit._trace_module_map
AttributeError: module 'torch.jit' has no attribute '_trace_module_map'
pyhtorchのソースコードを読むと_trace_module_map
は次のように書いているが関係あるかな?
# By default, training=False, which is good because running a model in
# training mode could result in internal buffers getting updated, dropout
# getting applied, etc. If you really know what you're doing, you
# can turn training=True (or None, to preserve whatever the original
# training mode was.)
あ、それよりもtorch.jitでget_trace_graph
がなかったら、_trace_module_map
を選択してしまうようだな。
キーワードはget_trace_graph
っぽいんだけど、
pytorchの中に入り始めたのでこれ以上、深追いするのはやめよう。