見出し画像

巨大な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


となり、圧倒的にネットワーク使用量がすくないため、
通信が遅くても影響が少ない方法と言えます。

この記事が気に入ったらサポートをしてみませんか?