気の向くままに辿るIT/ICT/IoT
ハードウェア

AMD Ryzen AIチュートリアルHello World

ホーム前へ次へ
AMD Ryzen AIソフトウェアって?

AMD Ryzen AIチュートリアルHello World

AMD Ryzen AIチュートリアルHello World

2025/03/31

 AMD Ryzen AIソフトウェアとNPUドライバをインストールした自身初購入のミニパソコンRyzen 7 8845HS搭載AOOSTAR GEM12 Pro MAX/Windows 11 Proにamd / RyzenAI-SWをgit cloneしてAI学習するHello World編。

hello_worldの概要

 AMD Ryzen AIソフトウェアチュートリアルの第一歩、hello_worldは、シンプルな機械学習モデルをCPUからNPU/Neural Processing Unitに移植する方法のデモ。

 より具体的には、データモデルとしてResNet50(画像認識におけるCNN/Convolutional Neural Network/畳み込みネットワークの1つで50層残差ネットワーク/Residual Networkを使った学習モデル)をONNX形式に変換、量子化、NPU上で推論を実行。

 これは、つまり、CPUやGPU(iGPU)の作業を同程度の性能をもつNPUに移植できれば、できるほど、CPUやGPUの負荷を低減させることができ、ハード全体としてパフォーマンス向上に直結することを意味しています。

WindowsでRyzen AI Softwareチュートリアルhello_world

path\to\hello_world> conda activate ryzen-ai-1.4.0
(ryzen-ai-1.4.0) path\to\hello_world>

 まずは、quicktest時と同様に仮想環境を作って、仮想環境を有効にしてから始めます。

 ryzen-ai-1.4.0は、Ryzen AIソフトウェアのインストール中に指定時、デフォルトのconda仮想環境名、もしくは、それをベースに変更したconda仮想環境名です。

(ryzen-ai-1.4.0) path\to\hello_world> pip install -r requirements.txt

 続いて当該プロジェクトで必要なパッケージのインストール。

Ryzen AI Softwareチュートリアルhello_world Jupyter notebook上の実行前の説明画面/Ryzen 7 8845HS|Hawk Point

 こちらは、hello_world実行前のJupyter notebook上のプロジェクト説明ページ(というか*.ipynbファイルに応じたデフォルト)をJupyter notebookのファイルメニューからHTMLとして出力後の全画面なスクショ。

 hello_worldフォルダ上でjupyter notebook hello_world.ipynbすれば、Jupyter notebookが表示されます。

 開いたら、画面右上のデバッガ用(虫の)アイコンと進捗インジケータとなる白丸(○)の間あたりの文字列がカーネル選択用アイコンとなっているのでconda仮想環境と異なる名称ならクリックして実行したipynbファイル名か、conda仮想環境名に、python3-ipykernelとなっている場合は、前者か否かを確認、違えば変更します。

 もしなければ、Anacondaプロンプトからpython -m ipykernel install --user --name ryzen-ai-1.4.0(conda仮想環境名)として(ipkernelコマンドがないエラーに遭遇したらconda install ipykernel後、再実行して)Jupyter Notebookを開き直せば、カーネル選択候補に出てきます。

 あとはRunメニューから必要なものを選んで実行するなど、必要に応じて対応します。

 久しぶりすぎてnotebook忘れてjupyter hello_world.ipynbして起動できず、仕様が変わったのかと一瞬あたふたしったって話は内緒。

Ryzen AI Softwareチュートリアルhello_world Jupyter notebook上の実行結果/Ryzen 7 8845HS|Hawk Point

 RyzenAI-SW/tutorial/hello_world/にある方法でJupyter notebook上でhello_worldを実行、今回使用した実機での結果がこれ。

(ryzen-ai-1.4.0) path\to\hello_world> python hello_world.py

 PowerShell上でhello_world.pyの実行もしてみました。

(ryzen-ai-1.4.0) path\to\hello_world>python hello_world.py
SmallModel(
 (conv1): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
 (conv2): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
 (conv3): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
 (conv4): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
 (relu): ReLU()
)
 
[QUARK-INFO]: Checking custom ops library ...
 
[QUARK-WARNING]: The custom ops library C:\Users\reg\anaconda3\envs\ryzen-ai-1.4.0\lib\site-packages\quark\onnx\operators\custom_ops\lib\custom_ops.dll does NOT exist.
 
[QUARK-INFO]: Start compiling CPU version of custom ops library.
 
[QUARK-INFO]: CPU version of custom ops library compiled successfully.
 
[QUARK-INFO]: removing file: [WinError 5] アクセスが拒否されました。: 'C:\\Users\\reg\\anaconda3\\envs\\ryzen-ai-1.4.0\\lib\\site-packages\\quark\\onnx\\operators\\custom_ops\\build_cpu\\libcustom_ops.pyd'
 
[QUARK-INFO]: Checked custom ops library.
The configuration of the quantization is Config(global_quant_config=QuantizationConfig(calibrate_method=<PowerOfTwoMethod.MinMSE: 1>, quant_format=<QuantFormat.QDQ: 1>, activation_type=<QuantType.QUInt8: 1>, weight_type=<QuantType.QInt8: 0>, input_nodes=[], output_nodes=[], op_types_to_quantize=[], nodes_to_quantize=[], extra_op_types_to_quantize=[], nodes_to_exclude=[], subgraphs_to_exclude=[], specific_tensor_precision=False, execution_providers=['CPUExecutionProvider'], per_channel=False, reduce_range=False, optimize_model=True, use_dynamic_quant=False, use_external_data_format=False, convert_fp16_to_fp32=False, convert_nchw_to_nhwc=False, include_sq=False, include_rotation=False, include_cle=False, include_auto_mp=False, include_fast_ft=False, enable_npu_cnn=True, enable_npu_transformer=False, debug_mode=False, print_summary=True, ignore_warnings=True, log_severity_level=1, extra_options={'ActivationSymmetric': True, 'UseRandomData': True}))
[QUARK_INFO]: Time information:
2025-04-09 07:53:47.738705
[QUARK_INFO]: OS and CPU information:
                    system --- Windows
                     node --- gem12promax
                    release --- 10
                    version --- 10.0.26100
                    machine --- AMD64
                   processor --- AMD64 Family 25 Model 117 Stepping 2, AuthenticAMD
[QUARK_INFO]: Tools version information:
                    python --- 3.10.16
                     onnx --- 1.16.1
                  onnxruntime --- 1.20.1
                  quark.onnx --- 0.8+2fc870b
[QUARK_INFO]: Quantized Configuration information:
                  model_input --- models/helloworld.onnx
                 model_output --- models/helloworld_quantized.onnx
            calibration_data_reader --- None
             calibration_data_path --- None
                 quant_format --- QDQ
                  input_nodes --- []
                 output_nodes --- []
             op_types_to_quantize --- []
          extra_op_types_to_quantize --- []
                  per_channel --- False
                 reduce_range --- False
                activation_type --- QUInt8
                  weight_type --- QInt8
               nodes_to_quantize --- []
               nodes_to_exclude --- []
             subgraphs_to_exclude --- []
                optimize_model --- True
           use_external_data_format --- False
               calibrate_method --- PowerOfTwoMethod.MinMSE
              execution_providers --- ['CPUExecutionProvider']
                enable_npu_cnn --- True
            enable_npu_transformer --- False
           specific_tensor_precision --- False
                  debug_mode --- False
             convert_fp16_to_fp32 --- False
             convert_nchw_to_nhwc --- False
                  include_cle --- False
                  include_sq --- False
               include_rotation --- False
                include_fast_ft --- False
                 extra_options --- {'ActivationSymmetric': True, 'UseRandomData': True}
 
[QUARK-INFO]: The input ONNX model models/helloworld.onnx can create InferenceSession successfully
 
[QUARK-INFO]: Random input name input shape [1, 3, 224, 224] type <class 'numpy.float32'>
 
[QUARK-INFO]: Obtained calibration data with 1 iters
 
[QUARK-INFO]: Removed initializers from input
 
[QUARK-INFO]: Simplified model sucessfully
 
[QUARK-INFO]: Duplicate the shared initializers in the model for separate quantization use across different nodes!
 
[QUARK-INFO]: Loading model...
 
[QUARK-INFO]: The input ONNX model C:/Users/reg/AppData/Local/Temp/vai.cpinit.31pmr619/model_cpinit.onnx can run inference successfully
 
[QUARK-INFO]: optimize the model for better hardware compatibility.
 
[QUARK-WARNING]: The opset version is 17 < 20. Skipping fusing Gelu.
 
[QUARK-INFO]: Start calibration...
 
[QUARK-INFO]: Start collecting data, runtime depends on your model size and the number of calibration dataset.
 
[QUARK-INFO]: Finding optimal threshold for each tensor using PowerOfTwoMethod.MinMSE algorithm ...
 
[QUARK-INFO]: Use all calibration data to calculate min mse
Computing range: 100%|█████████████████████████████████████████████████████████████| 10/10 [00:03<00:00, 3.04tensor/s]
 
[QUARK-INFO]: Finished the calibration of PowerOfTwoMethod.MinMSE which costs 3.5s
 
[QUARK-INFO]: Remove QuantizeLinear & DequantizeLinear on certain operations(such as conv-relu).
 
[QUARK-INFO]: Adjust the quantize info to meet the compiler constraints
The operation types and their corresponding quantities of the input float model is shown in the table below.
┏━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Op Type       ┃ Float Model           ┃
┡━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ Conv         │ 4                │
│ Relu         │ 4                │
│ Constant       │ 1                │
│ Add         │ 1                │
├──────────────────────┼──────────────────────────────────┤
│ Quantized model path │ models/helloworld_quantized.onnx │
└──────────────────────┴──────────────────────────────────┘
The quantized information for all operation types is shown in the table below.
The discrepancy between the operation types in the quantized model and the float model is due to the application of graph optimization.
┏━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┓
┃ Op Type ┃ Activation ┃ Weights ┃ Bias  ┃
┡━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━┩
│ Conv  │ UINT8(4)  │ INT8(4) │ INT8(4) │
│ Add   │ UINT8(1)  │     │     │
└─────────┴────────────┴─────────┴─────────┘
Calibrated and quantized model saved at: models/helloworld_quantized.onnx
APU Type: PHX/HPT
Setting environment for PHX/HPT
XLNX_VART_FIRMWARE= C:\Program Files\RyzenAI\1.4.0\voe-4.0-win_amd64\xclbins\phoenix\1x4.xclbin
NUM_OF_DPU_RUNNERS= 1
XLNX_TARGET_NAME= AMD_AIE2_Nx4_Overlay
Directory 'path\to\hello_world\cache\hello_cache' does not exist.
WARNING: Logging before InitGoogleLogging() is written to STDERR
I20250409 07:53:52.524256 15068 vitisai_compile_model.cpp:1144] Vitis AI EP Load ONNX Model Success
I20250409 07:53:52.524256 15068 vitisai_compile_model.cpp:1145] Graph Input Node Name/Shape (1)
I20250409 07:53:52.524256 15068 vitisai_compile_model.cpp:1149]     input : [-1x3x224x224]
I20250409 07:53:52.524256 15068 vitisai_compile_model.cpp:1155] Graph Output Node Name/Shape (1)
I20250409 07:53:52.524256 15068 vitisai_compile_model.cpp:1159]     output : [-1x256x224x224]
[Vitis AI EP] No. of Operators :  CPU   2  NPU  28
[Vitis AI EP] No. of Subgraphs :  NPU   1 Actually running on NPU   1
2025-04-09 07:53:56.2921146 [W:onnxruntime:, session_state.cc:1168 onnxruntime::VerifyEachNodeIsAssignedToAnEp] Some nodes were not assigned to the preferred execution providers which may or may not have an negative impact on performance. e.g. ORT explicitly assigns shape related ops to CPU to improve perf.
2025-04-09 07:53:56.2993936 [W:onnxruntime:, session_state.cc:1170 onnxruntime::VerifyEachNodeIsAssignedToAnEp] Rerunning with verbose output on a non-minimal build will show node assignments.
CPU Execution Time: 0.10882749999291264
NPU Execution Time: 0.04418560001067817
 
(ryzen-ai-1.4.0) path\to\hello_world>

 Ryzen AIソフトウェアが正常にインストールされた状態のpython hello_world.py実行結果。

 特に最終行付近で[Vitis AI EP]が効いている様子で、CPUよりもNPUの方が実行時間が速いのがみてとれます。

終わったらconda deactivateを忘れずに

(ryzen-ai-1.4.0) path\to\hello_world> conda deactivate
path\to\hello_world>

 condaの仮想環境での作業が一通り終わったら、conda deactivate(activateの反対語deactivate)しましょう。

 これを忘れると、たいてい痛い目にあうので要注意。

conda info -e
 
# conda environments
#
 
base                path\to\anaconda3
ryzen-ai-1.4.0      path\to\anaconda3\envs\ryzen-ai-1.4.0

 conda deactivateしたら、都度、conda info -eで[*]のついた仮想環境がないことを確認しておくと安心です。

 なぜなら、一見、作業ディレクトリパス先頭から(ryzen-ai-1.4.0)といった仮想環境の表記が消えてもconda info -eで確認すると、まだ[*]が付いているなんてことがあったり、なぜか、代わりに(base)という仮想環境に入ってしまっていたり、知らずにAnacondaコマンドプロンプトを閉じて戻っても同様だったりすることもあったりするので。

 仮想環境baseになってしまう場合、ディレクトリパス先頭に表示されるとは言え、本来の仮想環境については、deactivateコマンドを実行した確信が手伝うのか、意外と気づかないことも多く...。

 何れにせよ、condaの仮想環境にいることを、知らずに、そのまま作業し続けると何かとハマりやすいので要注意。

2025/04/09 訂正・追記
(ryzen-ai-1.4.0) path\to\hello_world> python -m virtualenv .venv
(ryzen-ai-1.4.0) path\to\hello_world> .\.venv\Scripts\activate

 まずは、quicktest時と同様に仮想環境を作って、仮想環境を有効にしてから始めます。

 ここでは、condaではなく、pipを使いますが、pip install virtualenvは既に済んでいるものとします。

(ryzen-ai-1.4.0) path\to\hello_world> pip install -r requirements.txt

 続いて当該プロジェクトで必要なパッケージのインストール。

Ryzen AI Softwareチュートリアルhello_world Jupyter notebook上の実行前の説明画面/Ryzen 7 8845HS|Hawk Point

 こちらは、hello_world実行前のJupyter notebook上のプロジェクト説明ページをJupyter notebookのファイルメニューからHTMLとして出力後の全画面なスクショ。

 Jupyter notebookは、pip install jupyterし、hello_worldフォルダ上でjupyter notebook hello_world.ipynbすれば、Jupyter notebookが表示されます。

 jupyterインストールして初めての起動時には、どのブラウザ使うか聞かれたかも。

 開いたら、画面右上のデバッガ用(虫の)アイコンと進捗インジケータとなる白丸(○)の間あたりの文字列がカーネル選択用アイコンとなっているのでconda仮想環境と異なる名称ならクリックしてconda仮想環境名に変更します。

 もしなければ、Anacondaプロンプトからpython -m ipykernel install --user --name ryzen-ai-1.4.0(conda仮想環境名)として(ipkernelコマンドがないエラーに遭遇したらconda install ipykernel後、再実行して)Jupyter Notebookを開き直せば、カーネル選択候補に出てきます。

 あとはRunメニューから必要なものを選んで実行するなど。

 久しぶりすぎてnotebook忘れてjupyter hello_world.ipynbして起動できず、仕様が変わったのかと一瞬あたふたしったって話は内緒。

Ryzen AI Softwareチュートリアルhello_world Jupyter notebook上の実行結果/Ryzen 7 8845HS|Hawk Point

 (Ryzen AIソフトウェアが正常にインストールされた後、)RyzenAI-SW/tutorial/hello_world/にある方法でJupyter notebook上でhello_worldを実行、今回使用した実機での結果がこれ。

Ryzen AI Softwareチュートリアルhello_world Jupyter notebook上の実行結果/Ryzen 7 8845HS|Hawk Point

 でもってRyzenAI-SW/tutorial/hello_world/にある方法でJupyter notebook上でhello_worldを実行、今回使用した実機での結果がこれ。

 コマンドラインでやる方法もあるということで、そうしようと思ったら、はてdisplay_nameってなんぞや?ってなったのでVS Codeでhello_world.ipynbを開いて、元はのこしておくかとrun_hello_world.ipynbみたいにして名前をつけて保存、PowerShellの当該パスからjupyter notebook run_hello_world.ipynbしてブラウザに表示させたあとHTML変換出力、ダウンロードフォルダに出力されたhtmlファイルをブラウザで表示、全画面スクショ。

 ファイル名変更は、全く意味なし。なぜ、そんなことしようと思ったのか我ながら謎。ちなみに、あれから、エディタも即、VS CodeからVIMに替え、Anacondaプロンプト(はじめ各プロンプト)上で使用中。

 尚、hello_world.ipynbには、hello_world.pyにはないimport vai_q_onnxがあり、ModuleNotFoundErrorとなったものの、pip installはできず、.pyを先行した自身には、にわかに解消法がわからなかったので深追いすることなく、コメントアウトして凌ぎました。

 他の同種のエラーは、pip installして再実行。

(ryzen-ai-1.4.0) path\to\hello_world> python hello_world.py

 PowerShell上でhello_world.pyの実行もしてみました。

Ryzen AI Softwareチュートリアルhello_world端末上の実行結果/Ryzen 7 8845HS|Hawk Point

 こちらは、端末上の実行結果のスクショ。

 結果、少々、警告やエラーもありつつ、Windows 11 Pro上でRyzen AI Softwareのチュートリアルからhello_worldを実行、完了できました。

(venv) PS C:\Users\reg\Downloads\RyzenAI-SW-main\RyzenAI-SW-main\tutorial\hello_world> py .\hello_world.py
SmallModel(
(conv1): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv3): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv4): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU()
)
[QUARK-INFO]: Checking custom ops library ...
[QUARK-WARNING]: The custom ops library C:\Users\reg\Downloads\RyzenAI-SW-main\RyzenAI-SW-main\tutorial\hello_world\venv\Lib\site-packages\quark\onnx\operators\custom_ops\lib\custom_ops.dll does NOT exist.
[QUARK-INFO]: Start compiling CPU version of custom ops library.
C:\Users\reg\Downloads\RyzenAI-SW-main\RyzenAI-SW-main\tutorial\hello_world\venv\Lib\site-packages\torch\utils\cpp_extension.py:414: UserWarning: Error checking compiler version for cl: [WinError 2] 指定されたファイルが見つかりません。
warnings.warn(f'Error checking compiler version for {compiler}: {error}')
INFO: Could not find files for the given pattern(s).
[QUARK-ERROR]: CPU version of custom ops library compilation failed:Command '['where', 'cl']' returned non-zero exit status 1.
[QUARK-WARNING]: Custom ops library compilation failed: CPU version of custom ops library compilation failed:Command '['where', 'cl']' returned non-zero exit status 1..
[QUARK-INFO]: Checked custom ops library.
The configuration of the quantization is Config(global_quant_config=QuantizationConfig(calibrate_method=, quant_format=, activation_type=, weight_type=, input_nodes=[], output_nodes=[], op_types_to_quantize=[], nodes_to_quantize=[], extra_op_types_to_quantize=[], nodes_to_exclude=[], subgraphs_to_exclude=[], specific_tensor_precision=False, execution_providers=['CPUExecutionProvider'], per_channel=False, reduce_range=False, optimize_model=True, use_dynamic_quant=False, use_external_data_format=False, convert_fp16_to_fp32=False, convert_nchw_to_nhwc=False, include_sq=False, include_rotation=False, include_cle=False, include_auto_mp=False, include_fast_ft=False, enable_npu_cnn=True, enable_npu_transformer=False, debug_mode=False, print_summary=True, ignore_warnings=True, log_severity_level=1, extra_options={'ActivationSymmetric': True, 'UseRandomData': True}))
[QUARK_INFO]: Time information:
2025-04-02 05:53:59.268862
[QUARK_INFO]: OS and CPU information:
system --- Windows
node --- gem12promax
release --- 11
version --- 10.0.26100
machine --- AMD64
processor --- AMD64 Family 25 Model 117 Stepping 2, AuthenticAMD
[QUARK_INFO]: Tools version information:
python --- 3.12.0
onnx --- 1.17.0
onnxruntime --- 1.20.1
quark.onnx --- 0.8+103c340fe2
[QUARK_INFO]: Quantized Configuration information:
model_input --- models/helloworld.onnx
model_output --- models/helloworld_quantized.onnx
calibration_data_reader --- None
calibration_data_path --- None
quant_format --- QDQ
input_nodes --- []
output_nodes --- []
op_types_to_quantize --- []
extra_op_types_to_quantize --- []
per_channel --- False
reduce_range --- False
activation_type --- QUInt8
weight_type --- QInt8
nodes_to_quantize --- []
nodes_to_exclude --- []
subgraphs_to_exclude --- []
optimize_model --- True
use_external_data_format --- False
calibrate_method --- PowerOfTwoMethod.MinMSE
execution_providers --- ['CPUExecutionProvider']
enable_npu_cnn --- True
enable_npu_transformer --- False
specific_tensor_precision --- False
debug_mode --- False
convert_fp16_to_fp32 --- False
convert_nchw_to_nhwc --- False
include_cle --- False
include_sq --- False
include_rotation --- False
include_fast_ft --- False
extra_options --- {'ActivationSymmetric': True, 'UseRandomData': True}
[QUARK-INFO]: The input ONNX model models/helloworld.onnx can create InferenceSession successfully
[QUARK-INFO]: Random input name input shape [1, 3, 224, 224] type
[QUARK-INFO]: Obtained calibration data with 1 iters
[QUARK-INFO]: Removed initializers from input
[QUARK-INFO]: Simplified model sucessfully
[QUARK-INFO]: Duplicate the shared initializers in the model for separate quantization use across different nodes!
[QUARK-INFO]: Loading model...
[QUARK-INFO]: The input ONNX model C:/Users/reg/AppData/Local/Temp/vai.cpinit.6o1pgf9q/model_cpinit.onnx can run inference successfully
[QUARK-INFO]: optimize the model for better hardware compatibility.
[QUARK-WARNING]: The opset version is 17 < 20. Skipping fusing Gelu.
[QUARK-INFO]: Start calibration...
[QUARK-INFO]: Start collecting data, runtime depends on your model size and the number of calibration dataset.
[QUARK-INFO]: Finding optimal threshold for each tensor using PowerOfTwoMethod.MinMSE algorithm ...
[QUARK-INFO]: Use all calibration data to calculate min mse
Computing range: 100%|█████████████████████████████████████████████████████████████| 10/10 [00:03<00:00, 3.14tensor/s]
[QUARK-INFO]: Finished the calibration of PowerOfTwoMethod.MinMSE which costs 3.6s
[QUARK-INFO]: Remove QuantizeLinear & DequantizeLinear on certain operations(such as conv-relu).
[QUARK-INFO]: Adjust the quantize info to meet the compiler constraints
The operation types and their corresponding quantities of the input float model is shown in the table below.
┏━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Op Type ┃ Float Model ┃
┡━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ Conv │ 4 │
│ Relu │ 4 │
│ Constant │ 1 │
│ Add │ 1 │
├──────────────────────┼──────────────────────────────────┤
│ Quantized model path │ models/helloworld_quantized.onnx │
└──────────────────────┴──────────────────────────────────┘
The quantized information for all operation types is shown in the table below.
The discrepancy between the operation types in the quantized model and the float model is due to the application of graph optimization.
┏━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┓
┃ Op Type ┃ Activation ┃ Weights ┃ Bias ┃
┡━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━┩
│ Conv │ UINT8(4) │ INT8(4) │ INT8(4) │
│ Add │ UINT8(1) │ │ │
└─────────┴────────────┴─────────┴─────────┘
Calibrated and quantized model saved at: models/helloworld_quantized.onnx
APU Type: PHX/HPT
Setting environment for PHX/HPT
XLNX_VART_FIRMWARE= C:\Program Files\RyzenAI\1.4.0\voe-4.0-win_amd64\xclbins\phoenix\1x4.xclbin
NUM_OF_DPU_RUNNERS= 1
XLNX_TARGET_NAME= AMD_AIE2_Nx4_Overlay
Directory 'C:\Users\reg\Downloads\RyzenAI-SW-main\RyzenAI-SW-main\tutorial\hello_world\cache\hello_cache' does not exist.
CPU Execution Time: 0.18412820000230568
NPU Execution Time: 0.19413189999613678
(venv) PS C:\Users\reg\Downloads\RyzenAI-SW-main\RyzenAI-SW-main\tutorial\hello_world>

 こちらが、ターミナル上の実行時の生の出力結果で[QUARK-ERROR]が1件、[QUARK-WARNING]が3件、[QUARK-INFO]でエラーがあったよ情報が1件ありますね。

 「fusing Geluスキップしてるよ」という不明な警告1件を除き、他は、一連の出来事としてCPU版custom_ops.dllがないよ、ファイルがなくてCPU版cl用のコンパイラのバージョンチェックに失敗したよ、CPU版カスタムopライブラリのコンパイルに失敗しちゃったよ、コマンド['where', 'cl']でエラー出てるよってことな模様。

 さておき、最終行にCPUとNPUでの実行時間がそれぞれ出力されており、どこまでいくのか、少なくとも3回やってみたところ、実行するたびに高速に。

 速度は拮抗、処理内容にもよるとは思いますが、実行するごとに共に僅かながらCPUが速かったり、NPUが速かったり。

 ただ、NPUで実行すれば、その分、CPUやiGPUの負荷はゼロだったり、大幅に低減されたりするようなので、そういう意味では、CPUとNPUの実行速度が拮抗しているというのは優秀かつ頼もしいと見て良さ気。

 というわけで初めの一歩hello worldを実行できたわけですが、この後うまくいったものの、getting_started_resnetでハマって同環境でhello worldが最初になったからでしょう、結構ハマりどころがあり、それもRyzen AIとか、torchとかじゃなく、大変だったのは、あらゆるエラーに見舞われたWindows上の依存関係の調整や環境設定。

 hello_world.py内でimportとインストール時のパッケージ名が異なり、PyPiにも似たようなパッケージが並び悩ましいケースがあったり、エラー原因がどうにもわからず、ライブラリを再インストールしてみたり、キャッシュをクリアしてみたり、importしているライブラリに起因するような内容のエラーが、実は、PythonやCMakeのバージョンに起因していたり...。

 開発環境もWindows 11 Pro/Visual Studio 2022(Comunityバージョン)/CMake 4.0.0/Anaconda3-2024.10-1(Python 3.12)に加え、一部pip、エディタをVS Codeとして開始。

 一時使って即やめた良い思い出がないAnacondaも入れてやってみたわけですが、やはり、これを即捨ててpipでvirtualenvに切り替え、VS/Visual Studio CodeもGUIなVimに替え...、それはそれでユーザー権限と管理者権限のPowerShellターミナルを併用したり...

 CMakeは要件上はバージョン3.26以上もpip install amd-quarkの原因不明なコンパイルエラーが、最新の4.0.0から3.31.6にダウングレードしたことで解消したり、python.exeがWindows管理フォルダ内にもあって影響したり、以後、pythonではなく、pyコマンドに替えて上手くいったり...。

 Linuxなら、少なくともDebianとか保守的なディストロの安定版なら、自分で他からパッケージを持ってこない限り、いや、仮にそうであっても、ほぼ安定しているソフトウェア間の依存関係、何かあってもdpkg -P --force-remove-reinstreqのような強力なコマンド群があったりする好環境に甘えて、どっぷり、ゆったり、のんびり、のんきに浸かることに慣れてしまっている自身にとって、自分で調達してくる必要のあるWindows上での開発は、異国の地で荒野を彷徨う迷い人のごとく、過酷極まりなく、それもhello worldで...(って過言か)。

 初心者にとってはわかりやすいOSながら、IDEを使わない開発者にとっては、過酷な環境だったんだなと、Windowsでの開発と言えば、せいぜいVBやVBAとその辺包含してくれるIDEやアプリ内の狭い環境でしかやったことのなかった、やれることの少なさ窮屈さを感じてWindowsから去った自身は、今回、そんな風に感じました。

 良かったことは、hello worldなのに変に達成感があった?こと、CLIなvi慣れした今となっては初めて使ってみたGUIのVIMが超快適であることを知ったこと(ってLinux上では端末で十分ですが)、更にGUIを使うまでもなく、PowerShell上でvim file_name等とすれば、Linux同様にPowerShell内でviが使えることを知ったこと、以前、AIに触れた頃の感覚が少し戻ってきた気がしたこと。

 あと、Pythonのvirtualenv(venv、pipenv)、自身の場合、Linux(安定版なDebian)では、ホームディレクトリあたりに仮想環境1個作って何をするにも全部そこで完結といった使い方しかしていなかったのですが、チュートリアルやプロジェクトごとに各アプリのバージョンの互換性がシビアに影響してくる状況では、個別に仮想環境作らないとやってられないこともあるよねと気づいたこと。

 この点は、Windowsなら日常茶飯事、AI分野のような進化著しい分野ではOSやディストロに関わらずってところですかね。

 尤もDockerとか、Wineとかも同様で、それらはそうやって使ってますし、Anacondaもそうでしょうが。

 そんな作業ばかりだと特にAI関連は、データが大きくなりがちでストレージは膨らむ一方なのでTBなディスクであってもマメな管理は必要ながら便利ですよね。

 それと、やっぱり、成功体験は大事。

ホーム前へ次へ