EC2でLLM推論のコールドスタートをどこまで短縮できるか検証してみた

に公開

はじめに

Fusicのレオナです。GPU付きEC2でLLMを推論する際、インスタンス起動後にHugging Faceからモデルをダウンロードする構成はよくあります。しかし、モデルサイズが大きくなるにつれて、このダウンロード時間がコールドスタートのボトルネックになります。

今回は、EC2単体の構成で、モデルの取得元・配置方法を変えることで、どの程度コールドスタートを高速化できるかを実測してみました。

仮説

モデルをあらかじめAmazon S3やEBSに配置しておけば、インスタンス起動後にHugging Faceから外部インターネット経由で取得するよりも、高速かつ安定してモデルを利用できるはずです。

今回は以下の4方式を比較します。

方式 取得元 特徴
A. Hugging Face 外部インターネット huggingface_hubライブラリで取得
B. S3 Standard AWS内部、同一リージョン aws s3 syncでローカルディスクへコピー後ロード
C. Mountpoint for S3 AWS内部、FUSE S3をファイルシステムとしてマウントし、コピーせず直接ロード
D. EBS アタッチ済みEBSボリューム 事前にモデルを配置したEBSボリュームから直接ロード

検証環境

  • インスタンス: g4dn.xlarge(NVIDIA T4 16GB VRAM, 4 vCPU, 16GB RAM)
  • リージョン: ap-northeast-1
  • AMI: Deep Learning Base OSS Nvidia Driver GPU AMI(Ubuntu 24.04)
  • モデル: Qwen/Qwen2.5-3B-Instruct(約5.76GB / 26ファイル)
  • 計測回数: 各方式3回
  • 条件: 各方式ともキャッシュをクリアしてから実行

各方式の計測方法

各方式とも、以下の3フェーズに分けて時間を計測しました。

フェーズ 内容
Download モデルファイルの取得、または取得相当の処理
GPUロード AutoModelForCausalLM.from_pretrained() によるGPUロード
1st Inference 初回推論、model.generate()

A. Hugging Face

huggingface_hub.snapshot_download()でHugging Face Hubからモデルを取得します。

from huggingface_hub import snapshot_download

snapshot_download(repo_id=MODEL_ID, local_dir=LOCAL_PATH)

B. S3 Standard

aws s3 syncで、同一リージョンのS3バケットからEC2のローカルディスクへモデルをコピーします。

aws s3 sync s3://<bucket>/<model>/ /home/ubuntu/models/<model>/

その後、ローカルディスク上のモデルをロードします。

model = AutoModelForCausalLM.from_pretrained("/home/ubuntu/models/<model>/")

C. Mountpoint for S3

Mountpoint for Amazon S3は、S3バケットをローカルファイルシステムとしてマウントできるFUSEクライアントです。

この方式では、事前にローカルディスクへコピーせず、S3上のファイルを直接参照してモデルをロードします。

mount-s3 <bucket> /home/ubuntu/s3mount
model = AutoModelForCausalLM.from_pretrained("/home/ubuntu/s3mount/<model>/")

D. EBS Attached Volume

事前にモデルを配置したEBSボリュームをEC2にアタッチし、マウントポイントから直接モデルをロードします。

model = AutoModelForCausalLM.from_pretrained("/home/ubuntu/ebs_models/<model>/")

結果

計測結果一覧、3回平均

フェーズ HF S3 Standard Mountpoint S3 EBS
Download 29.96s 25.06s 0s ※1 0s ※2
GPUロード 19.64s 6.38s 717.18s 29.50s
1st Inference 0.93s 0.57s 0.70s 0.76s
TOTAL 50.53s 32.01s 717.89s 30.26s

ばらつき、最小値-最大値

フェーズ HF S3 Standard Mountpoint S3 EBS
TOTAL 34.4 - 79.7s 30.2 - 35.3s 697.4 - 742.3s 26.5 - 37.8s

フェーズごとの特徴

Download

S3 StandardのDownloadは25.06秒で、HFの29.96秒より約5秒速くなりました。

HFは外部インターネット経由での取得になるため、ネットワーク状況やHub側の応答に影響を受けます。一方で、S3 Standardは同一リージョン内のS3から取得するため、今回の環境ではより安定していました。

GPUロード

GPUロードはS3 Standardが6.38秒で最速でした。

一方で、EBSは29.50秒、Mountpoint for S3は717.18秒となり、大きな差が出ました。S3 Standard方式では、事前にローカルディスクへコピーした後にロードするため、from_pretrained() 実行時点ではローカルファイルを読むだけで済みます。

Mountpoint for S3は、ダウンロードフェーズを省略できる一方で、from_pretrained() のファイルアクセスがS3への読み込みとして発生します。今回のモデルロードのように、複数ファイルをライブラリ側が順次読み込む処理では、FUSE経由のS3アクセスが大きなボトルネックになったと考えられます。

1st Inference

初回推論は全方式とも1秒未満で、方式による大きな差はありませんでした。モデルがGPUにロードされた後は、取得元や配置方法の影響はほぼなくなると考えられます。

ばらつき

  • HF: 34.4 - 79.7s、差45.3s
  • S3 Standard: 30.2 - 35.3s、差5.1s
  • EBS: 26.5 - 37.8s、差11.3s
  • Mountpoint S3: 697.4 - 742.3s、差44.9s

HFは最速時こそ比較的速いものの、ばらつきが大きい結果になりました。S3 Standardは平均値だけでなく、ばらつきの小ささという点でも安定していました。

EBSのGPUロードが遅い理由

EBS方式では、Downloadフェーズが不要であるにもかかわらず、GPUロードが29.50秒とS3 Standard方式より遅くなりました。
今回利用した構成では、以下の2つのスループット制約を受けます。

  • gp3ボリュームのベースラインスループット: 125 MiB/s

  • g4dn.xlargeのEBS帯域:

    • ベースライン: 950 Mbps、約118.75 MB/s
    • 最大: 3,500 Mbps、約437.50 MB/s

gp3はバースト性能ではなく、プロビジョニングされた性能を継続的に維持するタイプです。一方、g4dn.xlarge側のEBS帯域にはベースラインと最大値があり、実効スループットはEBSボリューム側とEC2インスタンス側の小さい方に制限されます。ベースラインで見ると、g4dn.xlarge側のEBSスループット(約118.75 MB/s)が上限になりやすいです。そのため、EBSに事前配置していても、S3 Standard方式より必ず速くなるとは限りません。

また、S3 Standard方式ではDownloadフェーズでまとめてローカルディスクへコピーした後、GPUロード時にはローカルファイルを読むだけです。一方、EBS方式ではGPUロード時にEBSから直接読み込むため、from_pretrained() の処理時間にEBS読み込み性能がそのまま反映されます。

そのため、今回の結果ではEBS方式のGPUロードがS3 Standard方式より遅くなったと考えられます。

参考:

最後に

今回は、EC2上でLLMを推論する際のコールドスタート短縮を目的に、Hugging Face、S3 Standard、Mountpoint for S3、EBSの4方式を比較しました。またHFから直接取得する方式と比較すると、以下のようになりました。

方式 TOTAL HF比
Hugging Face 50.53s -
S3 Standard 32.01s 約36.7%短縮
EBS 30.26s 約40.1%短縮
Mountpoint S3 717.89s 大幅に悪化

今後さらに最適化する場合は、各フェーズのボトルネックを深掘りすることで、改善の余地がまだあると考えています。

今回の検証が、GPU付きEC2でLLM推論環境を構築する際の参考になれば幸いです。

Fusic 技術ブログ

Discussion