WSL2でgemma.cppを試してみる
「GoogleのGemma基盤モデル用の軽量のスタンドアロンC++推論エンジン」であるgemma.cppを試してみます。
使用するPCはドスパラさんの「GALLERIA UL9C-R49」。スペックは
・CPU: Intel® Core™ i9-13900HX Processor
・Mem: 64 GB
・GPU: NVIDIA® GeForce RTX™ 4090 Laptop GPU(16GB)・GPU: NVIDIA® GeForce RTX™ 4090 (24GB)
・OS: Ubuntu22.04 on WSL2(Windows 11)
です。
1. 準備
環境の構築
python3 -m venv gemma.cpp
cd $_
source bin/activate
リポジトリをクローンします。
git clone https://github.com/google/gemma.cpp
cd gemma.cpp
モデルのダウンロード
モデルとして、8つ提供されています。https://www.kaggle.com/models/google/gemma/frameworks/gemmaCpp/
sfpがオススメとのことなので、7b-it-sfpを今回ためします。
モデルの展開
先ほどダウンロードしたarchive.tar.gzを展開します。
mkdir 7b-it-sfp
tar zxvf /path/to/archive.tar.gz -C 7b-it-sfp
2. ビルド
ビルド
gemmaコマンドをビルドしましょう。
cmake -B build
sfpではないモデルを使用する場合はビルドのオプションを追加する必要があるようです。
make -B build -DWEIGHT_TYPE=hwy::bfloat16_t
引数の確認
引数に何が指定できるか、ヘルプを見てみましょう。
$ ./build/gemma --help
gemma.cpp
---------
To run gemma.cpp, you need to specify 3 required model loading arguments: --tokenizer, --compressed_weights, and --model.
Model Loading Arguments
--tokenizer : Path name of tokenizer model file. (required)
--compressed_weights : Path name of compressed weights file, regenerated from `--weights` file if the compressed weights file does not exist. (required)
--model : Model type - can be 2b-it (2B parameters, instruction-tuned), 2b-pt (2B parameters, pretrained), 7b-it (7B parameters, instruction-tuned), or 7b-pt (7B parameters, pretrained). (required)
--weights : Path name of model weights (.sbs) file. Only required if compressed_weights file is not present and needs to be regenerated. Otherwise, not needed
Inference Arguments
--max_tokens : Maximum number of tokens in prompt + generation.
--max_generated_tokens : Maximum number of tokens to generate.
--temperature : Temperature for top-K
--deterministic : Make top-k sampling deterministic
--multiturn : Multiturn mode (if 0, this clears the KV cache after every interaction without quitting)
Application Arguments
--log : Logging file
--verbosity : Show verbose developer information
0 = only print generation output
1 = standard user-facing terminal ui
2 = show developer/debug info).
Default = 1.
--num_threads : Number of threads to use. Default value is set based on an estimate of how many concurrent threads are supported.
以下は意訳。
モデルのロード引数
--tokenizer: トークナイザ モデル ファイルのパス名。 (必須)
--compressed_weights: 圧縮された重みファイルのパス名。圧縮された重みファイルが存在しない場合は、「--weights」ファイルから再生成される。 (必須)
--model: モデル タイプ。以下のいずれか。 (必須)
2b-it (2B パラメータ、命令調整済み)
2b-pt (2B パラメータ、事前トレーニング済み)
7b-it (7B パラメータ、命令調整済み)
7b-pt (7B パラメーター、事前トレーニング済み)--weights: モデルの重み (.sbs) ファイルのパス名。 compressed_weightsファイルが存在せず、再生成する必要がある場合にのみ必要。 それ以外の場合は必要なし
推論引数
--max_tokens: プロンプト + 生成でのトークンの最大数。
--max_generated_tokens: 生成するトークンの最大数。
--temperature: top-k のtemperature
--deterministic: top-k のサンプリングを決定的にする
--multiturn: マルチターン モード
(0 の場合、対話のたびに終了せずに KV キャッシュをクリアする)
アプリケーションの引数
--log: ログファイル
--verbosity: 詳細な開発者情報を表示します。デフォルトは1
0 = 生成結果の出力のみ
1 = 標準のユーザー向け端末 UI
2 = 開発者/デバッグ情報を表示--num_threads: 使用するスレッドの数。 デフォルト値は、サポートされる同時スレッドの数の推定に基づいて設定される。
なるほど。verbosityに2を指定すると、いいことがありそうです。
3. 試してみる
以下の引数で実行します。
./build/gemma \
--tokenizer ./7b-it-sfp/tokenizer.spm \
--compressed_weights ./7b-it-sfp/7b-it-sfp.sbs \
--model 7b-it \
--verbosity 2 \
--log log.txt
確かに出力内容が多くなっています。
__ _ ___ _ __ ___ _ __ ___ __ _ ___ _ __ _ __
/ _` |/ _ \ '_ ` _ \| '_ ` _ \ / _` | / __| '_ \| '_ \
| (_| | __/ | | | | | | | | | | (_| || (__| |_) | |_) |
\__, |\___|_| |_| |_|_| |_| |_|\__,_(_)___| .__/| .__/
__/ | | | | |
|___/ |_| |_|
tokenizer : ./7b-it-sfp/tokenizer.spm
compressed_weights : ./7b-it-sfp/7b-it-sfp.sbs
model : 7b-it
weights : [no path specified]
max_tokens : 3072
max_generated_tokens : 2048
temperature : 1.000000
deterministic : 0
multiturn : 1
log : log.txt
verbosity : 2
num_threads : 18
Date & Time : Sun Feb 25 00:03:49 2024
Prefill Token Batch Size : 16
Hardware concurrency : 32
Instruction set : AVX2 (256 bits)
Weight Type : SFP
EmbedderInput Type : b16
*Usage*
Enter an instruction and press enter (%Q quits).
*Examples*
- Write an email to grandma thanking her for the cookies.
- What are some historical attractions to visit around Massachusetts?
- Compute the nth fibonacci number in javascript.
- Write a standup comedy bit about GPU programming.
>
では聞いてみましょう。
> ドラえもんとはなにか
[ Reading prompt ] .............
[ Prefill tokens / sec = 4.33377 ]
ドラえもんは、藤本弘明によって創作されたキャラクターです。ドラえもんは、未来に遡って、少年が冒険を繰り込むファンタジータジータジーです。ドラえもんは、アニメ、ゲーム、漫画など多くのメディアに展開され、世界中で人気のあるキャラクターです。
[ End ]
[ Generation tokens / sec = 4.84729 ]
73 tokens (73 total tokens)
4.81158 tokens / sec
>
4.81158トークン/秒と表示されました。
続きを聞きます。
> 続きを教えてください。
[ Reading prompt ] .............
[ Prefill tokens / sec = 4.17719 ]
ドラえもんは、未来に遡って、少年が冒険を繰り込むファンタジータジータジーです。ドラえもんは、アニメ、ゲーム、漫画など多くのメディアに展開され、世界中で人気のあるキャラクターです。
ドラえもんの物語は、主人公のドラえもんが未来に遡って、自分の未来を決定するための冒険を描いていることを中心に、展開されています。ドラえもんは、冒険のテーマ、友情のテーマ、そして成長のテーマをテーマに、多くのファンに愛され、世界中の子供に勇気を与えています。
[ End ]
[ Generation tokens / sec = 4.52304 ]
127 tokens (200 total tokens)
4.52029 tokens / sec
>
4.52029トークン/秒。
うーん、logファイルがどこにもみあたらない…。ま、いいか。
4. まとめ
ターンを増やしていくと徐々にスピードは落ちていきますが、弊環境では3.8 ~ 4.8トークン/秒付近でした。
関連
この記事が気に入ったらサポートをしてみませんか?