巨大なLLMモデルをマルチGPUで動かす!~モデル分割方法による速度の違い~
Metaが405BのLLMをリリースし、オープンLLMにも巨大なモデルが増えてきました。
スケーリング則に従い、巨大になるほど精細になり、能力も増えます。
すべて巨大なモデルで推論処理を続けたいのですが、
巨大になった時、メモリに載らないことと、推論速度の面で現実的に動かすことが困難となっています。
コンシューマークラスのGPUのVRAMは最大24GB、
405Bモデルは、16bitでは、800GB以上、4bitでも200GBを軽く超えます。
システムのメモリを256GB 積めば、CPUで推論可能ですが、1秒で1token以下となり、文章出力に時間がかかりすぎて実用性がありません。
今回、マルチGPUでの推論速度に影響する因子を実際に調べてみました。
測定マシンは、以前作成したRTX4090 x 2の自作ワークステーションです
測定環境は、vLLMです
今回は70Bと8Bモデルの推論速度を調べました。
70Bは4bitでも40GB近くあるため、24GBの4090の場合2台が必要です。
そのため、モデルを2つのGPUにわけて載せます。
vLLMのマルチGPU推論には、2種類のモデルパラレル(Tensor parallelとpipeline parallel)があります。
簡単に説明すると
Tensor parallelは、2台に分ける場合、レイヤーを半分に分けて載せます。
Pipeline parallelは、レイヤーの前半と後半を分けて載せます。
それぞれの方法でモデルを分けて読み込み推論速度を比較します。
Pipeline-parallel
python -m vllm.entrypoints.openai.api_server --model /home/models/hugging-quants_Meta-Llama-3.1-70B-Instruct-AWQ-INT4 --dtype auto --api-key token-abc123 --pipeline-parallel-size 2 --max_model_len=2048 --quantization="awq"
70B-AWQ
21.6 tokens/s
19.8 tokens/s
8B-AWQ
118 tokens/s
Tensor-parallel
python -m vllm.entrypoints.openai.api_server --model /home/models/hugging-quants_Meta-Llama-3.1-70B-Instruct-AWQ-INT4 --dtype auto --api-key token-abc123 --tensor-parallel-size 2 --max_model_len=2048 --quantization="awq_marlin"
70B-AWQ
32.6 tokens/s
33.8 tokens/s
8B-AWQ
158 tokens/s
Tensor Parallelのほうが圧倒的に速いです!
モデルパラレルについては、説明省きます。下記を参照ください。
Pipeline parallelは、各GPUが担当しているレイヤーが活性化するまで、休んでいるため、GPUが休んでいる時間が増えてしまい、速度低下しているようす
このPipeline parallelですが、GPU間のデータ使用量は、Tensor parallelと比較して少ないようです。
私の環境では、
Tensor parallelは、送受信それぞれ50MiB/s
Pipeline parallelは、送受信数MiB/s
となり、圧倒的にネットワーク使用量がすくないため、
通信が遅くても影響が少ない方法と言えます。
この記事が気に入ったらサポートをしてみませんか?