シンギュラリティ実験ノート

購入した1000ドルPCで何がどこまでできるのか実験した記録です。

UM790 ProのNPUでLLM(Llama2-7B)を動かしてみた

NPUでLLM(opt-1.3b)のデモプロを動かすことができたので、今回はLlama2-7Bにチャレンジしてみた。結果的に動かすことはできたが、期待していた結果とは少し違っていた。導入手順とその中で気付いたことをここにまとめておきたい。

Copilotに頼んだらDALL E3が描いてくれました

Step1 リポジトリのダウンロードと仮想環境の作成

こちらのページを見ながら環境を作成する。AnacondaからCMDプロンプトを起動して以下を実行する。

git clone https://github.com/amd/RyzenAI-SW.git
cd RyzenAI-SW\example\transformers
conda env create --file=env.yaml

仮想環境を作成したら、Anaconda-navigatorで作成した仮想環境を選択してCMDプロンプトを起動し、以下を実行する。

git lfs install
cd RyzenAI-SW\example\transformers\ext
git clone https://huggingface.co/datasets/mit-han-lab/awq-model-zoo awq_cache

私の場合、自宅のNET環境ではエラーとなりクローンできなかったが、シェアオフィスのNET環境で実行したところ問題なくできた。自宅のNET環境の問題だと思うが詳細は不明である。作業環境を複数持っていてよかったと思う。

Step2 環境のセットアップ

続けて以下のコマンドを実行する。

cd RyzenAI-SW\example\transformers\ 
setup.bat
pip install ops\cpp --force-reinstall

setup.bat は Pythonスクリプトで使用する環境変数を設定しているので、後日作業を行う場合、この setup.bat は再度実行する必要がある。

ONNXベースのフローで行う場合は、次のコマンドを実行する必要があるが、今回は pytorch ベースで行うため、私は実行しなかった。

pip install onnxruntime
cd ryzen-ai-sw-1.1\ryzen-ai-sw-1.1\voe-4.0-win_amd64
pip install voe-0.1.0-cp39-cp39-win_amd64.whl
pip install onnxruntime_vitisai-1.15.1-cp39-cp39-win_amd64.whl
python installer.py

Step3 Llama-2-7B関連ファイルのダウンロード

HugginfaceからLlama-2-7B関連の以下のファイルをダウンロードする。7B_chat を使いたい場合は 7B_chat 関連のファイルをダウンロードする。

checklist.ch
consolidated.00.pth
params.json
tokenizer.model
tokenizer_checklist.chk

llama2 フォルダに llama2-wts フォルダを作成し、以下のように配置する。

~/llama2
  ├ llama2-wts/
  | ├ 7B/
  | | ├ checklist.chk
  | | ├ consolidated.00.pth
  | | └ params.json
  | ├ tokenizer.model
  | └ tokenizer_checklist.chk
  └ llama2-wts-hf/
    └ 7B/

コンバーターを起動する。コマンドでは ./llama-2-wts-hf/7B と指定しているが、7B_chat でないとエラーになるようだ。仕方がないのでフォルダ名を 7B_chat に変更して実行すると llama2-wts/7B のデータがコンバートされ、llama2-wts-hf/7B_chat にデータが作成される。

python -m transformers.models.llama.convert_llama_weights_to_hf --input_dir ./llama-2-wts/ --model_size 7B --output_dir ./llama-2-wts-hf/7B

Step4 Quantization(量子化

以下のコマンドを実行。何種類かコマンドが記載されているが、説明がないので細かい違いは全く分からない。とりあえず4ビットの量子化を実行する。

python run_awq.py --w_bit 4 --task quantize

以下のように量子化されたモデルが作成される。

Quantized and saved model: pytorch_llama27b_w_bit_4_awq_amd.pt

Step5 Deployment(導入)

以下のコマンドを実行。opt-1.3b の時はコマンドの引数の説明もある程度書かれていたが、今回の Llama2 は説明が全くないため、ソースの中のコメントを読むしかない。困ったものだ。

python run_awq.py --task decode --target aie --w_bit 4

結果

opt-1.3b では任意のプロンプトを入力できるコマンドがあったが、Llama2 では用意されていないようだ。上記の run_awq.py ではmax_new_tokensという変数で11トークンを返答する内容になっていたので、110トークンを返すようにして実行した結果が以下である。

****************************************
prompt: What is the meaning of life?
Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.
response: What is the meaning of life? What is the meaning of death? What is the meaning of love? What is the meaning of hate? What is the meaning of life? What is the meaning of death? What is the meaning of love? What is the meaning of hate? What is the meaning of life? What is the meaning of death? What is the meaning of love? What is the meaning of hate? What is the meaning of life? What is the meaning of death? What is the meaning of love? What is the meaning of hate? What is the meaning of
****************************************

同じフレーズの繰り返しになっていて、何かちょっと変である。他のプロンプトの実行結果も似たような感じであった。これでは全く知性が感じられない(笑)。

AMDのページの結果サンプルは短いのでよく分からないが、もう少しまともな回答を返している。別の環境で同じプロンプトでLlama2に聞いてみると、やはりまともな回答を返してくれるので、私がどこかの作業でミスをしているのかもしれない。どのステップでも特にエラーは出力されていないので、原因はよく分からないというのが今の状況だ。

まとめ

分かりにくい導入手順をなんとか解読し、NPUでLlama2を動かしてみたが、残念な結果となった。タスクモニタを見るとCPUもガンガン動いているので、本当にNPUで動いているのか、その点も不安に感じる。xbutil というNPUの動作状況をモニタするコマンドを見つけたが、稼働率などを表示させることはできなかった。コマンドの説明はこちらにある。

LlamaはLlama3が最近発表され、LM Studioでは既に動いている。かなり性能が高いようなので、NPUについてはとりあえず一区切りとして、次は Llama3 で遊んでみるつもりだ。