RyzenAIのNPUでLLMベンチマークを取得する方法と結果

AI

NPUのRyzenAIでLLMのベンチマークが取れたのでその記録をする。

前提

RyzenAIの開発環境はすでに整っている前提で進める。

https://github.com/amd/RyzenAI-SW/blob/main/example/transformers/models/llm/docs/README.md
リンクのReadmeがあるので参考にする。

Anacondaの環境作成

Anacondaプロンプトで以下を実行

cd examle/transformers
set TRANSFORMERS_ROOT=%CD%
conda env create --file=env.yaml
conda activate ryzenai-transformers
build_dependencies.bat

AnacondaにLLMを使用する”ryzenai-transformers”の名前で仮想環境ができる。

量子化後の重みをダウンロード

AWQ量子化1したモデルの重みを以下の手順でクローンする。

git lfs install
cd %TRANSFORMERS_ROOT%\ext
git clone https://huggingface.co/datasets/mit-han-lab/awq-model-zoo awq_cache

Ryzen 8600GはPhoenix(PHX)アーキテクチャのNPUなので、デバイス用のセットアップは以下になる。

.\setup_phx.bat
pip install ops\cpp --force-reinstall
pip install ops\torch_cpp --force-reinstall

モデルのダウンロード&量子化

HuggingFaceからモデルをダウンロードを行う。

Huggingfaceアクセストークンの発行

ダウンロードを実行する前にHuggingfaceのアクセストークンを登録を行う。
SettingAccessTokensからCreate new tokenを選択。アクセストークンあが発行されるので、Copyを選択する。

TokenNameを適当に設定したらCreate Tokenを選択すると

MyTokenを先程取得したアクセストークンに書き換えてAnacondaプロンプトで実行する。

pip install huggingface_hub
python -c "from huggingface_hub.hf_api import HfFolder; HfFolder.save_token('MyToken')"

モデルの実行

今回のモデルはfacebook/opt-125m2を使用してベンチマークを取得する。

CPU編

CPUでモデルを実行する。

cd  %TRANSFORMERS_ROOT%\models\llm
python run_awq.py --model_name facebook/opt-125m --task benchmark --target cpu --precision bf16
実行の様子
結果

CPU

Example#Prompt Length (tokens)New Tokens GeneratedTotal Time (s)Prefill Phase (ms)Time/Token (ms)Tokens/Sec
14601.0205116.660414.560268.6805
28601.0104322.339814.27670.0475
316601.0430124.074714.586868.5553
432601.0408434.606914.460369.1549
537601.0437537.16414.352369.6755
664601.090749.843214.78967.6177
7128601.2045486.155715.688763.7403
8256601.39375185.49816.736459.75

NPU

モデルの量子化
python run_awq.py --model_name facebook/opt-125m --task quantize
実行の様子
#実行
python run_awq.py --model_name facebook/opt-125m --task benchmark --target aie
結果

NPU

Example#Prompt Length (tokens)New Tokens GeneratedTotal Time (s)Prefill Phase (ms)Time/Token (ms)Tokens/Sec
14603.41484240.26951.304519.4915
28603.40065249.51950.879219.6544
316603.29651227.82749.43220.2298
432603.32855339.80448.102920.7888
537603.49163282.40351.901719.2672
664603.3468365.02947.689620.9689
7128604.15262839.62952.895218.9053
8256604.524781409.1149.047120.3886

他のモデルで試したい場合は、モデルごとに利用規約の同意が求められることがあるので、同意してモデルのリポジトリ管理者に承認されないと試せない。

結果比較

Example#Prompt Length (tokens)New Tokens GeneratedNPU合計時間 (秒)CPU合計時間 (秒)NPU Time/Token (ms)CPU Time/Token (ms)NPU Tokens/SecCPU Tokens/Sec
14603.414841.0205151.304514.560219.491568.6805
28603.400651.0104350.879214.276019.654470.0475
316603.296511.0430149.432014.586820.229868.5553
432603.328551.0408448.102914.460320.788869.1549
537603.491631.0437551.901714.352319.267269.6755
664603.346801.0907047.689614.789020.968967.6177
7128604.152621.2045452.895215.688718.905363.7403
8256604.524781.3937549.047116.736420.388659.7500

考察と感想

CPUよりNPUの方が実行速度が遅かった。NPUは16TOPSの性能なので、CPUより遅くなるだろうと思っていたが予想通りの結果になった。NPUを使えばCPUやGPUの負荷をある程度分散できるととは思うが、現実的な実行速度にはならなさそう。
実行するまでの時間が長く恐らくメモリにモデルを展開していると考えられるので、機能ごとにモデルを切り替えながらアプリケーションを作成するのは難しそう。

これからのNPUデバイスの性能向上に期待する。

  1. Activation-aware Weight Quantization:通常の量子化手法と異なり、AWQ量子化は重みだけでなくアクティベーション(モデルが入力に対して出力する中間値)にも配慮した量子化方法。量子化された重みが実際のアクティベーション分布により適した形で表現され、精度の低下が抑えられ、計算コストを抑えることができる手法 ↩︎
  2. Meta(旧Facebook)が開発した大規模言語モデル「Open Pretrained Transformers(OPT)」シリーズの一部で、約1億2500万(125M)のパラメータを持つモデル。このモデルは、GPT-3と同様のデコーダー専用のトランスフォーマーアーキテクチャを採用しており、主に英語のテキストデータを用いて事前学習されている。 ↩︎

コメント

タイトルとURLをコピーしました