このブログは、株式会社フィックスターズのエンジニアが、あらゆるテーマについて自由に書いているブログです。
プレスリリース によると、Llama 4 Scout は INT4 量子化をすることでNVIDIA H100 1 枚に載り、最大 1000 万トークンまで入力できるとされています。一方で、前回の記事で紹介した通り、vLLM では H100 1 枚に載せきることはできず、 1000 万トークンを入力することもできませんでした。そこで、今回は公式に提供されているスクリプトを使用して、これらを実現できるかについて調べます。
公式の手順に従って環境構築をします。まずは llama-stack
ライブラリをインストールします。
uv venv -p 3.11
. .venv/bin/activate
uv pip install llama-stack
次に、モデルをダウンロードします。今回は HuggingFace を経由するのではなく、 https://llama.meta.com/llama-downloads/ から直接ダウンロードします。必要な情報を入力すると、ダウンロードリンクがメールで送られてきます。
ダウンロード先は ~/.llama
以下になるので、空き容量に注意してシンボリックリンクを張るなどして対応してください。
ダウンロードのコマンドは次のようになります。
llama download --source meta --model-id Llama-4-Scout-17B-16E-Instruct --meta-url <ダウンロードリンク>
次に、モデルを実行するための llama-models
ライブラリをインストールします。
git clone git@github.com:meta-llama/llama-models.git
cd llama-models
pip install .[torch]
FP16 精度でモデルを実行するためには、README に記載されている次のスクリプトを実行します。
#!/bin/bash
NGPUS=4
CHECKPOINT_DIR=~/.llama/checkpoints/Llama-4-Scout-17B-16E-Instruct
PYTHONPATH=$(git rev-parse --show-toplevel) \
torchrun --nproc_per_node=$NGPUS \
-m models.llama4.scripts.chat_completion $CHECKPOINT_DIR \
--world_size $NGPUS
FP8 量子化も同様に README のスクリプトで実行可能です。H100 GPU が 2 枚ある環境で動きます。
MODE=fp8_mixed # or int4_mixed
if [ $MODE == "fp8_mixed" ]; then
NGPUS=2
else
NGPUS=1
fi
CHECKPOINT_DIR=~/.llama/checkpoints/Llama-4-Scout-17B-16E-Instruct
PYTHONPATH=$(git rev-parse --show-toplevel) \
torchrun --nproc_per_node=$NGPUS \
-m models.llama4.scripts.chat_completion $CHECKPOINT_DIR \
--world_size $NGPUS \
--quantization-mode $MODE
一方で、 INT4 量子化は上記のスクリプトそのまま( MODE
変数を修正するだけ)ではエラーになってしまいましたが、 https://github.com/meta-llama/llama-models/pull/316 のパッチによって動くようになることを確認しました。
動作すると、下記のようにテキストが生成される様子が確認できます。
実装を見ると分かる通り、デフォルトのコンテキスト長は 4096 と設定されています。次のスクリプトのように --max-seq-len
を引数に追加することによって、コンテキスト長を大きくしたときの挙動を調査します。
# 利用する GPU を指定する
export CUDA_VISIBLE_DEVICES=0
NGPUS=1
# コンテキスト長を指定する
SEQ_LEN=10000
# 同じマシンの別の GPU でも実行する場合は torchrun のポートを個別に指定する
MASTER_PORT=29004
# INT4 量子化で推論を実行する
MODE=int4_mixed
CHECKPOINT_DIR=~/.llama/checkpoints/Llama-4-Scout-17B-16E-Instruct
PYTHONPATH=$(git rev-parse --show-toplevel) \
torchrun --nproc_per_node=$NGPUS --master-port $MASTER_PORT \
-m models.llama4.scripts.chat_completion $CHECKPOINT_DIR \
--world_size $NGPUS \
--quantization-mode $MODE \
--max-seq-len $SEQ_LEN
GPU 数が 1,2,4,8 枚のときにコンテキスト長を二分探索した結果を次の表に示します。
H100 GPU の枚数 | 動作した最大コンテキスト長 | 動作しない最小コンテキスト長 |
---|---|---|
1 | 35,000 | 40,000 |
2 | 400,000 | 600,000 |
4 | 1,000,000 | 1,200,000 |
8 | 2,500,000 | 3,000,000 |
H100 を 1 枚使ったときの最大コンテキスト長は 3.5 万トークンに限られており、H100 を 8 枚使っても 250 万トークンが最大となっていました。vLLM を利用した FP8 量子化推論に比べると、より少ないメモリで動作し、より長いコンテキスト長を実現できましたが、プレスリリースにある 1000 万トークンの入力は実現できませんでした。なお、コンテキスト長がメモリ容量に比例すると仮定すると、1000 万トークンの入力を今回の方法で実現するためには 32 枚以上の H100 が必要になると考えられます。
今回は、Llama 4 のプレスリリースのうち「1 枚の H100 GPU に載せることができる」という部分が正しいことを公式の手順に従って確認しました。「1000 万トークンの入力ができる」という部分は検証できませんでしたが、実現させる場合のGPU 数の見積もりを行いました。
今後は実装の確認やプロファイルを通して、効率的なデプロイに適したオプションについて調査していきます。
keisuke.kimura in Livox Mid-360をROS1/ROS2で動かしてみた
Sorry for the delay in replying. I have done SLAM (FAST_LIO) with Livox MID360, but for various reasons I have not be...
Miya in ウエハースケールエンジン向けSimulated Annealingを複数タイルによる並列化で実装しました
作成されたプロファイラがとても良さそうです :) ぜひ詳細を書いていただきたいです!...
Deivaprakash in Livox Mid-360をROS1/ROS2で動かしてみた
Hey guys myself deiva from India currently i am working in this Livox MID360 and eager to knwo whether you have done the...
岩崎システム設計 岩崎 満 in Alveo U50で10G Ethernetを試してみる
仕事の都合で、検索を行い、御社サイトにたどりつきました。 内容は大変参考になりま...
Prabuddhi Wariyapperuma in Livox Mid-360をROS1/ROS2で動かしてみた
This issue was sorted....