M5stack Module LLMで好きなLLMモデルを動かす - Wed, Jan 15, 2025
Writer: 青木 心路
0. 宣伝
この記事はすっかり年明けも過ぎましたが「M5Stack Module LLM Advent Calendar 2024」に空きがあったので参加している記事です。
弊社ではM5stack Module LLM moduleの発売前検証を担当させていただきましたのでその時の知見を記事にしました! そんな仕事もあるDefiosでは一緒に働いてくれるアルバイトを大募集中です! IoTxAI (エッジAI)で世の中の課題を一緒に解決していきましょう!!
以上、ここまで 代表取締役 Taisyo が代筆。1. はじめに
本記事では、M5stack Module LLM上で任意のLLMモデルを実行する方法について解説します。M5stack Module LLMは、オフラインで動作するLLM推論モジュールで、AX630CというNPU内蔵SoCを搭載しています。細かい仕様は公式サイトからご確認ください。標準でQwen2.5-0.5Bモデルがプリインストールされていますが、今回はTinyLlama-1.1B-Chat-v1.0を実行する手順を解説します。本記事が、M5stack Module LLMを活用したい方の参考になれば幸いです。
2. 開発環境
- 使用した機材、環境は以下になります。
- 端末 : M5stack Module LLM
- 環境 : Linux
3. pulsar2の環境構築
- まず自分のPC上でpulsar2ツールを使用してonnxモデルをaxmodelモデル(Module LLMで動作するモデル形式)に変換する必要があります。
-
1.こちらのGoogle Driveのリンクからax_pulsar2_${version}.tar.gzをダウンロードします。
-
2.以下のコマンドを実行してDockerイメージをローカル環境にロードします。本記事では、docker環境が構築済みであることを前提に進めていきます。docker環境が未構築の場合はこちらのdocumentを参照してください。
sudo docker load -i ax_pulsar2_${version}.tar.gz
- 3.ロードしたDockerイメージからコンテナを作成、コンテナ内で下記コマンドを実行し正常に環境構築できているか確認します。
pulsar2 version
- 4.期待される結果
version: 3.2
commit: 48a1d3f9
4. TinyLlamaのコンパイル
- それではpulsar2を使用してTinyLlamaのコンパイルを行っていきます。
- 1.以下のコマンドを実行してax-llm-buildを任意のディレクトリにクローンします
git clone https://github.com/AXERA-TECH/ax-llm-build.git
- 2.以下のコマンドを実行してdockerコンテナを起動します
sudo docker run -it --net host --rm -v $PWD:/data pulsar2:3.2
- 3.Hugging Face Hubからモデルをダウンロードするためにhuggingface_hubをinstallします
pip install -U huggingface_hub
- 4.ax-llm-buildフォルダに移動してhuggingfaceからTinyLlamaをダウンロードします
huggingface-cli download --resume-download TinyLlama/TinyLlama-1.1B-Chat-v1.0 --local-dir TinyLlama/TinyLlama-1.1B-Chat-v1.0
- 5.以下のコマンドを実行してTinyLlamaをコンパイルします。output_pathに出力結果が格納され,実行から完了まで30分以上かかります。Module LLMにはAX630Cが搭載されていますが、AX630CはAX620Eの系統に含まれるので –chipはAX620Eに設定しています。 参考
pulsar2 llm_build --input_path TinyLlama/TinyLlama-1.1B-Chat-v1.0/ --output_path TinyLlama/TinyLlama-1.1B-Chat-v1.0-output/ --kv_cache_len 1023 --hidden_state_type bf16 --prefill_len 128 --chip AX620E
- 6.fp32_to_bf16とembed_process.shファイルに実行権限を追加します
chmod +x ./tools/fp32_to_bf16
chmod +x ./tools/embed_process.sh
- 7.以下のコマンドを実行して埋め込みファイルの抽出と最適化を行います。fp32のデータをbf16に変換することでモデルサイズを削減しつつ精度を維持することが可能です。
./tools/embed_process.sh TinyLlama/TinyLlama-1.1B-Chat-v1.0 TinyLlama/TinyLlama-1.1B-Chat-v1.0-output/
5. M5stack Module LLMでの実行準備
- 今回はPCとModule LLMをUSBケーブルで接続し、adbコマンドを使用してModule LLM内にアクセスしました。
-
1.Module LLM内の任意のディレクトリにTinyLlamaフォルダを作成して移動します。
-
2.output-pathで指定した出力ファイルが入ったフォルダを
adb push
コマンドを使用してPCからModule LLMのTinyLlamaフォルダ内に転送します。 -
3.TinyLlama-1.1B-Chat-v1.0フォルダ(huggingfaceからダウンロードしてきたフォルダ)の中にあるtokenizer.modelというファイルを手順2.と同じ方法でModule LLMに転送します。
-
4.pulsar2の開発者の方が公開されているModelZooのリンクからModelZoo/LLM/Qwen/qwen2.5-0.5b-prefill-ax630c.zipをダウンロードします。解凍後にqwen2.5-0.5b-prefill-ax630c/main_prefillというファイルを手順2.と同じ方法でModule LLMに転送します
-
4.run_tinyllama_ax630c.shというファイルを作成します。
touch run_tinyllama_ax630c.sh
- 5.お好きな方法で作成したshファイルの中身を下記のように記述します。
./main_prefill \
--template_filename_axmodel "TinyLlama-1.1B-Chat-v1.0-output/llama_p128_l%d_together.axmodel" \
--axmodel_num 22 \
--filename_post_axmodel "TinyLlama-1.1B-Chat-v1.0-output/llama_post.axmodel" \
--filename_tokens_embed "TinyLlama-1.1B-Chat-v1.0-output/model.embed_tokens.weight.bfloat16.bin" \
--eos 0 \
--live_print 1 \
--continue 1 \
--prompt "$1"
- 6.現時点でTinyLlamaフォルダの中身は下記のようになっています
TinyLlama
- TinyLlama-1.1B-Chat-v1.0-output
- run_tinyllama_ax630c.sh
- tokenizer.model
- main_prefill
6. M5stack Module LLMでの実行
- TinyLlamaフォルダでrun_tinyllama_ax630c.shを実行したらTinyLlamaがModule LLM上で動作します
./run_tinyllama_ax630c.sh
- 下記が実行例になります
Type "q" to exit, Ctrl+c to stop current running
>> who are you?
[I][ Run][ 484]: ttft: 1176.21 ms
I am a machine learning model trained on a large dataset of text data. I can analyze and understand text, and provide insights and recommendations based on the text.
7. おわりに
- 今回はM5stack Module LLMでTinyLlama-1.1B-Chat-v1.0を動かす手順を解説しました。公式リポジトリに検証済みモデルがリストアップされているため、新たなモデルの導入時に参考にしてください。
- では、良きM5開発ライフを!!!