vai_q_pytorchを動かしてみる

Xilinxの公式ドキュメントには次のように記載されている。

「vai_q_pytorch には現在 GPU バージョンだけがあり、vitis-ai-pytorch 環境は GPU コンテナー内にのみ存在します。」

どういう意味?

無いってこと?

今度はちゃんとREADME.txtを読みながら進めるぞ!

vai_q_pytorchのインストール

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だな。

それでここからどうすんの?

vai_q_pytorchを動かしてみる

試すのは次を使えばいいみたい。

./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の中に入り始めたのでこれ以上、深追いするのはやめよう。

write: 2021/01/27/ 22:16:48