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方式より遅くなったと考えられます。
参考:
- Amazon EBS General Purpose SSD volumes
- Specifications for Amazon EC2 accelerated computing instances
最後に
今回は、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推論環境を構築する際の参考になれば幸いです。
Discussion