Amazon FSx for LustreとTurboQuantによるGPUDirect活用でLLMの読み込み加速とコンテキストウィンドウ拡大
AWS は Amazon FSx for Lustre と NVIDIA GPUDirect Storage を組み合わせることで、大規模 LLM の GPU 読み込み時間を数分から数秒に短縮し、TurboQuant 技術によりコンテキストウィンドウを大幅に拡大する手法を発表しました。
キーポイント
GPUDirect Storage によるロード時間劇的短縮
従来の CPU を介した読み込み方式から、GPU が直接ストレージからデータを読み込む GPUDirect Storage (GDS) へ移行することで、モデルの冷間起動時の TTFT(First Token Time)を数分から数秒に削減します。
NVIDIA Blackwell アーキテクチャとの連携
AWS の P6e/P5en インスタンスや 72 GPU を収容する UltraServer で、FSx for Lustre の並列読み込み機能と GDS を活用し、大規模モデルの効率的な分散ロードを実現します。
TurboQuant KV キャッシュによるコンテキスト拡大
最近発表された TurboQuant 技術を活用することで、KV キャッシュの効率を高め、LLM の処理可能なコンテキストウィンドウサイズを劇的に増やすことが可能になります。
GDS を使用した直接 GPU メモリ読み込み
nvidia_fs モジュールをロードし fastsafetensors を利用することで、FSx for Lustre から CPU を介さずにストレージデータを直接 GPU HBM に転送できます。
EFA インターフェースの構成と検証
Lustre 用 EFA インターフェースが正しくアクティブか確認し、単一ノードでは全 16 インターフェースを、マルチノード環境では FSx と NCCL トラフィック用に分割して設定する必要があります。
vLLM を用いたプロダクション対応
事前シャード化されたチェックポイントを vLLM で直接読み込み、FP8 量子化とテンソル並列処理を指定することで、GDS パスを利用した高速推論サーバーを構築できます。
影響分析・編集コメントを表示
影響分析
この発表は、数百億パラメータを超える大規模モデルの運用において、従来のボトルネックであった「読み込み待ち時間」を解消する画期的な解決策です。特に Blackwell アーキテクチャや UltraCluster 環境での実用性が示されることで、企業における LLM の導入コストと待機時間の削減に直結し、より大規模で複雑な推論タスクの実現を加速させるでしょう。
編集コメント
LLM の実運用において、モデルサイズが巨大化するほど顕著になる「読み込み待ち時間」を解決する具体的なアーキテクチャ提案であり、インフラ最適化の観点から極めて重要です。TurboQuant との組み合わせにより、単なる速度向上だけでなく「コンテキストウィンドウの拡大」という新たな価値も付与されています。
AWS GPU インスタンス上で大規模言語モデル(LLM)のデプロイを反復している場合、GPU 高速帯域メモリ(HBM)に読み込むモデルが大きくなるほど、推論のために GPU が準備されるまでの*痛みを伴う*待ち時間が長くなっていることに気づいているかもしれません。モデルが数百億パラメータ規模に成長し、GPU 環境もますます大規模化する中で、モデルのロード時間はエンドツーエンドの最初のトークン生成までの時間(TTFT)に悪影響を及ぼします。本稿では、Amazon FSx for Lustre に NVIDIA GPUDirect Storage (GDS) を組み合わせ、少しの巧妙な計画を加えることで、コールドスタート時の TTFT の方程式が根本的にどう変わるかを探ります。これにより、モデル起動時に毎回数分間にわたる非生産的なロード時間が数秒に短縮されます。
最適化の話が出たので、本稿では最近発表された TurboQuant の KV キャッシュが、コンテキストウィンドウサイズの劇的な増加にもたらす影響についても取り上げます。
背景:AWS 上の NVIDIA Blackwell アーキテクチャ
AWS は最近、NVIDIA の Blackwell アーキテクチャ(発表動画はこちら)を搭載した Amazon EC2 P6e および P6 インスタンスファミリー をリリースしました。フラッグシップモデルである P6e UltraServer は、単一の NVLink ドメインに 72 個の NVIDIA Blackwell GPU を搭載し、バイセクション帯域幅は 130 TB/s、HBM3e メモリ容量は 13.4 TB、FP8 演算性能は 360 petaflops(FP4 では 720 petaflops)を誇ります。これらの UltraServer は通常、数兆パラメータ規模の最先端モデルの大規模分散学習に使用されます。
本稿では、単一の P6 または P5en インスタンスにおけるコールドスタート時の TTFT(Time To First Token:最初のトークンまでの時間)を改善する方法に焦点を当てます。具体的には、モデル重みを可能な限り速やかに HBM メモリへ正しい形式で転送する方法について解説します。複数のノードからなる UltraCluster の場合、このプロセスはクラスター内のすべてのノードで並列に実行されます。各 UltraServer ノードは、共有 FSx for Lustre ファイルシステムから独立してモデルを読み込み、FSx for Lustre が提供する大規模なスケーラブルな GDS(GPUDirect Storage)対応スループットを最大限に活用します。
モデル読み込みのボトルネック
まず、GPUDirect Storage と CPU ベースのモデル読み込みの基本的な違いについて考えてみましょう。従来の CPU ベースのモデル読み込み(左側)では、チェックポイントが CPU メモリをストリーミングされ、重み(weights)が PCIe を介して各 GPU に順次コピーされます。一方、シャード化された GPUDirect Storage による読み込み(右側)では、Amazon FSx for Lustre 上でチェックポイントがテンソル並列ランク間で事前に分割され、8 つのすべての GPU が EFA を経由して HBM(High Bandwidth Memory:高帯域幅メモリ)へ直接シャードを読み込むことで、図 1 に示すように CPU を完全にバイパスします。

*図 1: 8 GPU インスタンスにおける CPU ベースのモデル読み込みとシャード化された GPUDirect Storage による読み込みの比較。
Llama 3.1 405B のような 4050 億パラメータ(405B parameters)のモデルを想定すると、BF16(Brain Floating Point 16:脳浮動小数点 16 ビット形式)でのチェックポイントデータは約 800 GB に相当します。従来のモデル読み込みパスは以下のようになります:
- ストレージからチェックポイントされたモデルファイルを CPU システムメモリに読み込む
- 重みの非直列化(torch.load または safetensors の解析)
- 必要に応じて CPU で量子化(BF16 → FP8 または INT4)– これにより HBM(High Bandwidth Memory)の要件が削減される
- 重みを PCIe を介して CPU メモリから各 GPU に一度に一つずつコピーする。
このパイプラインは、シングルスレッドで逐次的かつ CPU バウンドであるために大きく制限されています。GDS(GPUDirect Storage)を使用しない一般的なデプロイでは、CPU 側での量子化を伴うシングルスレッドのモデル読み込みには Llama 3.1 405B で 10〜20 分かかります。事前シャードされたチェックポイントがあったとしても、それでも数分はかかります。この間、GPU(スタック内で最も高価なリソース)はアイドル状態となり、最初のトークンまでのコールドスタート時間が延びます。
vLLM などの最近のサービングフレームワークがモデル読み込みに大幅な改善をもたらしたことは注目に値します。vLLM V1 エンジン(vLLM 0.19 以降デフォルト)では、GPU 間での並列重みロードを導入し、以前のバージョンと比較して読み込み時間を大幅に短縮しました。しかし、これらの改善があってもデータは依然として CPU メモリと PCIe バスを経由して流れます。GDS はこのボトルネックを完全に解消します。
推論サービングにおいて、これは単なる不便ではありません。長いモデル読み込み時間は直接的に影響を及ぼします:
- コールドスタート遅延 – モデルの読み込み完了まで、新しいインスタンスはトラフィックを処理できない
- オートスケーリングの応答性 – スケーリングイベントが数秒ではなく数分遅れる
- 障害復旧 – サービングインスタンスが失敗した場合、代替キャパシティがオンラインになるまでに数分かかる
- コスト効率 – 読み込み中に消費される GPU ハウアは、リクエストを処理する GPU ハウアではない
直接的な経路:GPUDirect Storage を備えた FSx for Lustre
Amazon FSx for Lustre は、計算集約型ワークロード向けに設計された、フルマネージド型の高性能並列ファイルシステムです。NVIDIA GPUDirect Storage のサポートと組み合わせることで、FSx for Lustre は GPU メモリへの複数の直接データパスを確立し、CPU やシステムメモリを経由せずにデータを転送します。
この統合は、以下の 2 つの主要な技術が連携して機能することに依存しています:
- Amazon Elastic Fabric Adapter (EFA) は、AWS Scalable Reliable Datagram (SRD) プロトコルを使用してオペレーティングシステムのオーバーヘッドをバイパスします。P5en インスタンスには 200 Gbps の EFA インターフェースが 16 個搭載されており、合計で 3,200 Gbps(400 GB/s)のネットワーク帯域幅を提供します。FSx for Lustre は、ストレージから GPU への直接データ転送のために、これらの EFA インターフェースを 8 個以上使用できます。
- NVIDIA GPUDirect Storage (GDS) は、DMA 転送をネットワークインターフェースから GPU の HBM(High Bandwidth Memory)へ直接行うことを可能にし、従来のボトルネックとなる CPU メモリバッファ(バウンスバッファ)を排除します。
その結果、従来の TCP ベースのストレージアクセスと比較してスループットが大幅に向上します。しかし、生のスループットは物語の一部に過ぎません。真の突破口は、この直接経路がアーキテクチャ的に可能にするものです:シャード化された並列モデル読み込み時の CPU バイパスです。
テスト設定では、1000 MBps/TiB の Persistent_2 EFA ファイルシステムを使用します。これは 20 個のオブジェクトストレージターゲット(OST)(96 TiB の容量)を備えており、ファイルシステムのスループットは約 94 GiB/s を提供します。スループットはファイルシステムの容量に比例して線形にスケールします。より大きなファイルシステムとは、より多くの OST と並列 I/O パースを意味します。高スループットの FSx for Lustre ファイルシステムの構築に関する手順については、以前のブログ記事 Build and deploy a 1 TB/s file system in under an hour を参照してください。セットアップコマンドは以下のセクションの Stage 0 に記載されています。
FSx for Lustre への GDS 対応アクセスを P5en クライアントに設定するには、FSx for Lustr ユーザーガイドの Configuring EFA clients の手順に従ってください。AWS が提供する構成スクリプト(setup.sh –optimized-for-gds)は、自動的にインスタンスタイプを検出し、NUMA 対応の CPU パーティショニングで正しい EFA インターフェースを設定し、再起動後も設定が維持されるように systemd サービスを作成します。P5en はデフォルトでは FSx for Lustre に 8 つの EFA インターフェースのみを使用し、これによりストレージから各 GPU の HBM(High Bandwidth Memory)への直接 GDS データパスが提供されます。
P5en におけるシャード並列読み込み (8x H200)
シャード読み込みアプローチを説明するために、P5en インスタンス(p5en.48xlarge)を使用します。これは、NVSwitch を介して接続され、3.6 TB/s のバイセクション帯域幅を持つ 8 つの NVIDIA H200 GPU と、それぞれに 141 GB の HBM3e を備えたものです。P5en は GDS をサポートしており、P6-B200 と同じ 3,200 Gbps の SRD EFA ネットワークを有しているため、このパターンを実証するのに適したプラットフォームです。ストレージ読み込みステージのパフォーマンス特性は、各ノードが同じインスタンスあたりのネットワーク帯域幅を持っているため、P6 ノードでも同一となります。
十分に大きなモデル(例えば、FP8 で 400 GB の Llama 3.1 405B など)の場合、重みは単一の GPU の HBM(H200 では 141 GB)には収まりません。そのため、テンソル並列性 [tensor parallelism] を用いてモデルを複数の GPU に分割する必要があります。これは、推論時に NVLink を介して GPU 間で低遅延の通信が必要であることを意味します(アテンション層と多層パーセプトロン (MLP) 層後のオールリダクション操作のため)。このため、NVSwitch で接続された P5en や P6 のようなインスタンスは、これらのモデルをサービス提供するために不可欠です。
このアプローチは 4 つの段階で構成されます:
Llama 3.1 405B を参照モデルとして使用していますが、このパターンはテンソル並列シャード化をサポートするあらゆるモデル(Mixtral、DeepSeek、およびカスタムアーキテクチャを含む)に適用可能です。重要な要件は、サービス提供フレームワークがモデルを GPU ごとのシャードに分割できることです。
ステージ 0:インフラの用意。 モデルを読み込む前に、同じ Amazon Virtual Private Cloud (Amazon VPC) およびアベイラビリティゾーン (AZ) 内に、EFA 対応の FSx for Lustre ファイルシステムと、GPUDirect Storage [GDS] 用に構成された P5en(または P6)GPU インスタンスの 2 つが必要です。以下のセクションで説明するインフラのプロビジョニングおよび GDS 設定を自動化するための AWS CloudFormation テンプレートとセットアップスクリプトを、関連する aws-samples リポジトリ で提供しています。
FSx for Lustre ファイルシステムは、前述の「直接パス」セクションで説明されている通り、EFA を有効化し、スループット設定を 1000 MBps/TiB にした Persistent_2 SSD デプロイであるべきです。ファイルシステムの容量が集約読み取りスループットを決定します。容量が大きければ大きいほど、OST(Object Storage Target)の数が増え、並列 I/O パスも増えます。
P5en インスタンスでは、すべての EFA インターフェースの構成完了、EFA ドライバーのインストール、NVIDIA GDS の nvidia-fs.ko カーネルモジュールのビルドとロード、最適なスループットのための NUMA 対応 Lustre クライアントネットワーク設定、および GDS ランタイム設定 (cufile.json) の準備が整っている必要があります。これには、いくつかの手順が必要です:NVIDIA nvidia-fs.ko モジュールの構築、インスタンスの NUMA トポロジに基づいた EFA インターフェースと CPU パーティションのアライメント、Lustre クライアントパラメータのチューニングです。完全なセットアップ手順については、FSx for Lustre ユーザーガイドの EFA クライアントの設定 ガイドに従ってください。
インフラストラクチャが準備できたら、出力ディレクトリに Lustre ストライピングを設定して、複数の GPU からの並行 GDS 読み取りをすべての OST に分散させます:
# 16 MB のストライプサイズで全 OST にまたがる(最適な GDS ブロックサイズと一致)
mkdir -p /fsx/model_shards/Llama-3.1-405B-FP8-8way
lfs setstripe -c -1 -S 16M /fsx/model_shards/Llama-3.1-405B-FP8-8way
ステージ 1:モデル重みの事前シャード化と事前量子化
オフライン環境で vLLM を使用し、モデルを FP8 量子化された 8 つのテンソル並列シャードに分割して FSx for Lustre に保存します。ソースチェックポイントは BF16(HuggingFace 上の Llama 3.1 の標準フォーマット)です。事前シャード化ステップでは重みが FP8 に量子化され、GDS(GPU Direct Storage)を介して読み込む必要があるデータ量が半分になります。
save_sharded_state.py \
--model /fsx/models/Llama-3.1-405B \
--quantization fp8 \
--tensor-parallel-size 8 \
--output /fsx/model_shards/Llama-3.1-405B-FP8-8wayこれにより、各シャードが推論に GPU が必要とする重みスライスのみを正確に含む、8 つのテンソル並列(TP)対応シャードが生成されます。アテンションヘッドと MLP カラムは GPU 間で正しく分割されます。シャードは FP8 に事前量子化されており、チェックポイント全体のサイズを約 800 GB から約 400 GB に削減します。出力ディレクトリは以下のようになります。
/fsx/model_shards/Llama-3.1-405B-FP8-8way/
├── model-rank-0-part-0.safetensors # ~51 GB — GPU 0 のスライス
├── model-rank-1-part-0.safetensors # ~51 GB — GPU 1 のスライス
├── ...
├── model-rank-7-part-0.safetensors # ~51 GB — GPU 7 のスライス
├── config.json
├── tokenizer.json
└── tokenizer_config.jsonこの事前シャード化ステップは、ファインチューニング後や新しいモデルバージョンへ切り替えた後など、ベースモデルのチェックポイントを更新するたびに繰り返す必要があります。オフラインで実行され、その後の読み込みごとにシャード化された出力が再利用されるため、費用の均等配分(アモタイズ)コストは最小限に抑えられます。
トレーニングパイプラインを制御できる場合は、このステップを完全に省略できます。Megatron-LM や NeMo などのフレームワークでは、チェックポイントをテンソル並列レイアウトおよびサービングスタックが期待する精度で直接保存することが可能です。例えば、FP8 safetensors 形式の 8 分割 TP シャードなどが該当します。トレーニング時にサービング形式で保存が行われれば、チェックポイントは後処理ゼロで GDS 並列ロードの対象となります。なお、Megatron-LM はデフォルトで torch_dist 形式でチェックポイントを保存するため、safetensors ベースのローダーと併用する前に Megatron Bridge を使用した変換が必要です。これはシャードを safetensors ローダーで使用可能にするための一度きりの変換ステップであり、オーバーヘッドは最小限です。
本稿では FP8 を採用しました。これは H200 および B200 においてネイティブな Tensor Core(テンソルコア)サポートを持つファーストクラスのデータ型であり、vLLM では単一のフラグ(–quantization fp8)で設定可能、かつ Llama クラスのモデルにおいて精度損失がほぼゼロという特徴を備えているためです。より積極的な 4 ビット重み量子化手法(AWQ、GPTQ、HQQ)と、vLLM の最適化された W4A16 サービングカーネルを組み合わせることで、チェックポイントサイズをさらに 2 倍削減でき、帯域幅制約のあるワークロードにおける生成スループットを向上させることができます(H100/H200 上で小バッチサイズ時、FP8 と比較して 2〜3 倍)。AWQ および GPTQ は代表的なデータに対する短いキャリブレーションパスを必要としますが、HQQ はデータフリーです。本稿で示す GDS(GPUDirect Storage)読み込みパターンは量子化手法に依存しません。サービングフレームワークがサポートするどのような形式であっても、FSx for Lustre からの並列シャードロードは同様に適用可能です。4 ビット 405B のチェックポイントは、以下のセクションで報告される FP8 の結果と比較して、およそ半分の時間で読み込まれます。
FP8量子化によりチェックポイントサイズとロード時間が半減しますが、ウェイトの量子化だけが利用可能な手段ではありません。Google ResearchがICLR 2026で発表したTurboQuant やその基盤となるPolarQuant といった新興技術は、推論時にコンテキスト長とともに増大するキーバリュー(KV)キャッシュ[Key-Value (KV) cache]を対象としています。著者によると、TurboQuant は KV キャッシュを値あたり約3ビットに圧縮し(6倍の削減)、微調整なしで NVIDIA H100 GPU 上でアテンション計算を最大8倍高速化しつつ、精度損失ゼロを実現します。これらの手法はチェックポイントサイズやモデルロード時間を直接短縮するものではありませんが、推論中の高帯域メモリ(HBM)[High Bandwidth Memory (HBM)] の消費量を大幅に削減し、より長いコンテキストウィンドウや大きなバッチサイズのために GPU メモリを空けることができます。本記事で取り上げている FP8 ウェイト量子化と組み合わせることで、KV キャッシュ圧縮は全体の HBM 要件をさらに低減します。これにより、同じハードウェア上でより大規模なモデルの提供や、より多くの同時リクエストの処理が可能になります。
ステージ2: パラレル GDS リード。 ロード時、8 つの GPU はすべて、割り当てられたシャードを FSx for Lustre から直接、GDS を介して GPU HBM に読み込みます。シャードは事前に FP8 へ量子化されているため、読み込むデータ総量は約400GB、GPU あたり約50GBとなります。GDS は CPU メモリを完全にバイパスするため、ホストを経由するシリアライズ処理は一切発生しません。8 つの読み込み操作はすべて並列で実行されます。
GDS リードパスにおいては、NVIDIA cuFile(GDS API)を使用して safetensors ファイルを直接 GPU メモリに読み込み、CPU 側での逆シリアライズを行わずに PyTorch テンソルを再構築するオープンソースライブラリである fastsafetensors を使用します。各 GPU はシャードファイルを開き、GPU バッファに対して単一の大きな GDS リードを実行した後、safetensors ヘッダーメタデータを使用してバッファからすべてのテンソルを抽出します。このテンソル抽出ステップは、すでにロードされた GPU バッファ内へのポインタ演算であるため、1 ミリ秒未満で完了します。
モデルの読み込み前に、GDS カーネルモジュールがロードされており、Lustre クライアントが EFA 用に設定されていることを確認してください:
# GDS カーネルモジュールがロードされているか確認
lsmod | grep nvidia_fs
Lustre に対して EFA インターフェースがアクティブになっているか確認
sudo lnetctl net show | grep -c "nid:.*@efa"
16 と表示されるはずです(Lustre 用に設定された各 EFA インターフェースごとに 1 つ。すべてのインスタンス NIC は含まれません)
シングルノード展開では、セットアップスクリプトがすべての 16 の EFA インターフェースを Lustre 用に構成します。
UltraCluster マルチノード構成では、FSx に 8 つのインターフェースを設定し、残りの 8 つをノード間 NCCL コレクティブトラフィック用に予約できます。
もし nvidia_fs がロードされていない場合、GDS リードは CPU ボウンダリーバッファパスに静かにフォールバックします。結果は正しく得られますが、パフォーマンスの恩恵は受けられません。sudo modprobe nvidia_fs を実行してモジュールをロードしてください。fastsafetensors を使用すると、各 GPU はシャードを並列で読み込みます:
from fastsafetensors import SafeTensorsFileLoader
GDS を経由して各 GPU が自身のシャードを読み込みます
loader = SafeTensorsFileLoader(pg=None, device=f"cuda:{rank}", nogds=False)
loader.add_filenames({0: [f"/fsx/model_shards/Llama-3.1-405B-FP8-8way/model-rank-{rank}-part-0.safetensors"]})
fbuf = loader.copy_files_to_device() # GDS リード:ストレージから GPU HBM(High Bandwidth Memory)へ直接
テンソルを抽出 — サブミリ秒、GPU バッファ内でのポインタ演算のみ
tensors = {name: fbuf.get_tensor(name) for name in loader.get_keys()}
ステージ 3:検証と提供。 GDS を介してテンソルが GPU HBM(High Bandwidth Memory)に読み込まれた後、すべての推論計算は完全に GPU メモリ内で行われます。ファイルシステムは初期ロード時のみ関与します。ステージ 2 から得られるテンソル辞書には、このランクの重みがすべて含まれており、すでに正しい GPU デバイス上にあり、適切なテンソル並列化レイアウトで配置されています。CPU メモリは一切使用されず、シリアライズ解除も発生していません。重みは FSx for Lustre ストレージから直接 GPU HBM へ転送されました。
これらのテンソルは、事前読み込みされた重み辞典を受け入れる任意のテンソル並列推論エンジンに対して準備が整っています。統合ポイントはフレームワーク固有であり、vLLM、TensorRT-LLM、SGLang はそれぞれ、TP 対応モデルグラフに重みを注入するための内部 API を持っています。これらのフレームワークが GDS 対応の重み読み込みをネイティブに採用するようになれば(fastsafetensors はまさにこの統合のために Foundation Model Stack チームによって構築されたものです)、ステージ 2 で示される完全な GDS パスは単一コマンド操作となります。
現在のプロダクション環境でのサービングにおいては、vLLM は FSx for Lustre から同じ事前シャード化されたチェックポイントをロードできます:
vllm serve /fsx/model_shards/Llama-3.1-405B-FP8-8way \
--load-format sharded_state \
--quantization fp8 \
--tensor-parallel-size 8
vLLM
原文を表示
If you’re iterating on deploying large language models (LLMs) on AWS GPU instances, you’ve probably noticed the larger the model to be loaded into GPU High Bandwidth Memory (HBM), the longer the *painful* wait until the GPUs are ready for inference. As models grow to hundreds of billions of parameters and GPU environments grow ever larger, model load time negatively affects your end-to-end total time to first token (TTFT). This post explores how Amazon FSx for Lustre, combined with NVIDIA GPUDirect Storage (GDS), plus a bit of clever planning, can fundamentally change the cold-start TTFT equation. It reduces minutes of unproductive load time to seconds each time your model starts. While we’re on the topic of optimization, this post will also cover the effect of the recently announced TurboQuant KV cache in terms of a massive increase in context window size.
Background: NVIDIA Blackwell architecture on AWS
AWS recently launched the Amazon EC2 P6e and P6 instance families, powered by NVIDIA’s Blackwell architecture (watch the announcement). The flagship P6e UltraServer packs 72 NVIDIA Blackwell GPUs into a single NVLink domain with 130 TB/s of bisection bandwidth, 13.4 TB of HBM3e, and 360 petaflops of FP8 compute (720 at FP4). These UltraServers are typically used for large-scale distributed training of frontier models at the multi-trillion-parameter scale.
In this post, we focus on improving cold-start TTFT for a single P6 or P5en instance. Specifically, we cover how to get model weights in the correct format to HBM memory as quickly as possible. For UltraClusters with multiple nodes, this same process would be performed in parallel across all nodes in the cluster. Each node in the UltraServer loads the model independently from the shared FSx for Lustre filesystem, taking advantage of the massive scalable GDS-enabled throughput FSx for Lustre can provide.
The model loading bottleneck
First, consider the basic difference between GPUDirect Storage and CPU-based model loading. Traditional CPU-based model loading (left) streams the checkpoint through CPU memory and copies weights to each GPU sequentially over PCIe. Sharded GPUDirect Storage loading (right) pre-splits the checkpoint across tensor-parallel ranks on Amazon FSx for Lustre, and all eight GPUs read their shards in parallel directly into HBM through EFA, bypassing the CPU entirely as shown in Figure 1.

*Figure 1: CPU-based model loading vs. sharded GPUDirect Storage loading on an 8-GPU instance.*
Consider a 405B parameter model like Llama 3.1 405B, that’s roughly 800 GB of checkpoint data in BF16.The traditional model loading path looks like the following:
- Read checkpointed model file from storage into CPU system memory
- Deserialize the weights (torch.load or safetensors parsing)
- Optionally quantize on the CPU (BF16 → FP8 or INT4) – this reduces HBM requirements
- Copy weights from CPU memory to each GPU over PCIe, one at a time.
This pipeline is largely limited by being single-threaded, sequential and CPU bound. On a typical deployment without GDS, a single-threaded model load with CPU-side quantization takes 10–20 minutes for Llama 3.1 405B. Even with pre-sharded checkpoints, you’re still looking at several minutes. During that entire time, your GPUs (the most expensive resource in the stack) sit idle, increasing your cold start to first token time.
It’s worth noting that recent versions of serving frameworks like vLLM have made significant improvements to model loading. The vLLM V1 engine (default since vLLM 0.19) introduced parallel weight loading across GPUs, reducing load times considerably compared to earlier versions. However, even with these improvements data still flows through CPU memory and the PCIe bus. GDS removes this bottleneck entirely.
For inference serving, this isn’t just an inconvenience. Long model load times directly impact:
- Cold start latency – new instances can’t serve traffic until the model is loaded
- Autoscaling responsiveness – scaling events are delayed by minutes, not seconds
- Fault recovery – if a serving instance fails, replacement capacity takes minutes to come online
- Cost efficiency – GPU-hours consumed during loading are GPU-hours not serving requests
A direct path: FSx for Lustre with GPUDirect Storage
Amazon FSx for Lustre is a fully managed, high-performance parallel file system designed for compute-intensive workloads. When combined with support for NVIDIA GPUDirect Storage, FSx for Lustre establishes multiple direct data paths directly to GPU memory, bypassing the CPU and system memory entirely.
This integration relies on two key technologies working together:
- Amazon Elastic Fabric Adapter (EFA) uses the AWS Scalable Reliable Datagram (SRD) protocol to bypass operating system overhead. The P5en instance has 16 EFA interfaces at 200 Gbps each, providing 3,200 Gbps (400 GB/s) of aggregate network bandwidth. FSx for Lustre can use eight or more of these EFA interfaces for direct storage-to-GPU data transfer.
- NVIDIA GPUDirect Storage (GDS) enables DMA transfers directly from the network interface to GPU HBM, removing the CPU memory bounce buffer that creates the traditional bottleneck.
The result is a significant throughput improvement over traditional TCP-based storage access. But raw throughput is only part of the story. The real unlock comes from what this direct path enables architecturally: CPU bypass when using sharded parallel model loading.
For our test configuration, we use a Persistent_2 EFA filesystem at 1000 MBps/TiB with 20 Object Storage Targets (OSTs) (96 TiB capacity), delivering approximately 94 GiB/s of filesystem throughput. Throughput scales linearly with filesystem capacity. A larger filesystem means more OSTs and more parallel I/O paths. For a walkthrough on building high-throughput FSx for Lustre filesystems, refer to an earlier blog, Build and deploy a 1 TB/s file system in under an hour. See Stage 0 in the following section for the setup commands.
To configure your P5en client for GDS-enabled access to FSx for Lustre, follow the steps in Configuring EFA clients in the FSx for Lustre User Guide. The configuration script provided by AWS (setup.sh –optimized-for-gds) automatically detects your instance type, configures the correct EFA interfaces with NUMA-aware CPU partitioning, and creates a systemd service so the configuration persists across reboots. The P5en by default only uses 8 of its EFA interfaces for FSx for Lustre, which provides the direct GDS data path from storage to each GPU’s HBM.
Sharded parallel loading on P5en (8x H200)
To illustrate the sharded loading approach, we’ll use the P5en instance (p5en.48xlarge)—8 NVIDIA H200 GPUs with 141 GB of HBM3e each, connected using NVSwitch with 3.6 TB/s of bisection bandwidth. The P5en supports GDS and has the same 3,200 Gbps SRD EFA networking as the P6-B200, making it a well suited platform to demonstrate this pattern. The performance characteristics for the storage read stage would be identical on a P6 node because each node has the same per-instance network bandwidth.
For any sufficiently large model (such as Llama 3.1 405B at 400 GB in FP8), the weights don’t fit in a single GPU’s HBM (141 GB on the H200). Tensor parallelism is required, splitting the model across multiple GPUs. This implies low-latency communication between GPUs over NVLink during inference (for all-reduce operations after attention and Multi-Layer Perceptron (MLP) layers), which is why NVSwitch-connected instances like the P5en and P6 are essential for serving these models.The approach works in four stages:While we use Llama 3.1 405B as our reference model, this pattern applies to any model that supports tensor-parallel sharding, including Mixtral, DeepSeek, and custom architectures. The key requirement is that the serving framework can split the model into per-GPU shards.
Stage 0: Provision the infrastructure. Before loading any models, you need two things in the same Amazon Virtual Private Cloud (Amazon VPC) and Availability Zone (AZ): an EFA-enabled FSx for Lustre filesystem and a P5en (or P6) GPU instance configured for GPUDirect Storage. We provide AWS CloudFormation templates and setup scripts in the accompanying aws-samples repository that automate the infrastructure provisioning and GDS configuration described in the following section.
The FSx for Lustre filesystem should be a Persistent_2 SSD deployment with EFA enabled and a throughput setting of 1000 MBps/TiB, as described in the preceding A direct path section. The filesystem capacity determines your aggregate read throughput. More capacity means more OSTs and more parallel I/O paths.
The P5en instance needs all of its EFA interfaces configured, the EFA driver installed, the NVIDIA GDS nvidia-fs.ko kernel module built and loaded, NUMA-aware Lustre client networking configured for optimal throughput, and the GDS runtime configuration (cufile.json) in place. This involves several steps: building the NVIDIA nvidia-fs.ko module, aligning EFA interfaces to CPU partitions based on the instance’s NUMA topology, and tuning Lustre client parameters. Follow the Configuring EFA clients guide in the FSx for Lustre User Guide for the complete setup procedure.
After the infrastructure is ready, set up Lustre striping on the output directory to ensure concurrent GDS reads from multiple GPUs are distributed across all OSTs:
# Stripe across all OSTs with 16 MB stripe size (matches optimal GDS block size)
mkdir -p /fsx/model_shards/Llama-3.1-405B-FP8-8way
lfs setstripe -c -1 -S 16M /fsx/model_shards/Llama-3.1-405B-FP8-8wayStage 1: Pre-shard and pre-quantize the model weights. Offline, use vLLM to split the model into 8 tensor-parallel shards with FP8 quantization, and save them to FSx for Lustre. The source checkpoint is in BF16 (the standard format for Llama 3.1 on HuggingFace). The pre-sharding step quantizes the weights to FP8, halving the data that needs to be loaded via GDS:
python save_sharded_state.py \
--model /fsx/models/Llama-3.1-405B \
--quantization fp8 \
--tensor-parallel-size 8 \
--output /fsx/model_shards/Llama-3.1-405B-FP8-8wayThis produces 8 tensor-parallel (TP) aware shards where each shard contains exactly the weight slices that GPU needs for inference. Attention heads and MLP columns are split correctly across GPUs. The shards are pre-quantized to FP8, reducing the total checkpoint size from ~800 GB to ~400 GB. The output directory will look like this:
/fsx/model_shards/Llama-3.1-405B-FP8-8way/
├── model-rank-0-part-0.safetensors # ~51 GB — GPU 0's slices
├── model-rank-1-part-0.safetensors # ~51 GB — GPU 1's slices
├── ...
├── model-rank-7-part-0.safetensors # ~51 GB — GPU 7's slices
├── config.json
├── tokenizer.json
└── tokenizer_config.jsonThis pre-sharding step needs to be repeated whenever you update the base model checkpoint, for example, after fine-tuning or switching to a new model version. Because it runs offline and the sharded output is reused on every subsequent load, the amortized cost is minimal.
If you control the training pipeline, you can remove this step entirely. Frameworks like Megatron-LM and NeMo can save checkpoints directly in the tensor-parallel layout and precision your serving stack expects. For example, 8-way TP shards in FP8 safetensors format. When training saves in the serving format, the checkpoint is ready for GDS parallel loading with zero post-processing. Note that Megatron-LM saves checkpoints in torch_dist format by default, which requires conversion using the Megatron Bridge before the shards can be used with safetensors-based loaders—a one-time conversion step that adds minimal overhead.
We chose FP8 for this post because it’s a first-class datatype on H200 and B200 with native Tensor Core support, requires a single flag in vLLM (–quantization fp8), and delivers near-zero accuracy loss on Llama-class models. More aggressive 4-bit weight quantization methods (AWQ, GPTQ, and HQQ), combined with optimized W4A16 serving kernels in vLLM, can reduce checkpoint size by another 2x and improve generation throughput on bandwidth-bound workloads (2–3x vs. FP8 at small batch sizes on H100/H200). AWQ and GPTQ require a short calibration pass over representative data. HQQ is data-free. The GDS loading pattern in this post is independent of the quantization method. Whatever format your serving framework supports, the parallel sharded load from FSx for Lustre applies the same way. A 4-bit 405B checkpoint loads in roughly half the time of the FP8 results reported in the following section.
FP8 quantization halves checkpoint size and thus load time, but weight quantization isn’t the only lever available. Emerging techniques like TurboQuant (Google Research, ICLR 2026) and its underlying PolarQuant method target the Key-Value (KV) cache. The memory that grows with context length during inference. TurboQuant compresses the KV cache to approximately 3 bits per value (a 6x reduction), with up to 8x speedup in attention computation on NVIDIA H100 GPUs, and zero accuracy loss, all without fine-tuning, according to the authors. While these methods don’t reduce checkpoint size or model load time directly, they significantly reduce HBM consumption *during inference*, clearing GPU memory for longer context windows or larger batch sizes. Combined with the FP8 weight quantization used in this post, KV cache compression further reduces overall HBM requirements. This can help you to serve larger models, or more concurrent requests, on the same hardware.
Stage 2: Parallel GDS reads. At load time, all 8 GPUs simultaneously read their assigned shard directly from FSx for Lustre into GPU HBM via GDS. Because the shards were pre-quantized to FP8, the total data to read is roughly 400 GB, or about 50 GB per GPU. GDS bypasses CPU memory entirely, so there’s no serialization through the host. All 8 reads happen in parallel.
For the GDS read path, we use fastsafetensors, an open source library that reads safetensors files directly into GPU memory using NVIDIA cuFile (the GDS API) and reconstructs PyTorch tensors without any CPU-side deserialization. Each GPU opens its shard file, performs a single large GDS read into a GPU buffer, and then extracts all tensors from the buffer using the safetensors header metadata. The tensor extraction step takes less than a millisecond because it’s pointer arithmetic into the already-loaded GPU buffer.
Before loading the model, verify that the GDS kernel module is loaded and the Lustre client is configured for EFA:
# Verify the GDS kernel module is loaded
lsmod | grep nvidia_fs
# Verify EFA interfaces are active for Lustre
sudo lnetctl net show | grep -c "nid:.*@efa"
# Should show 16 (one per EFA interface configured for Lustre — not all instance NICs)
# On single-node deployments, the setup script configures all 16 EFA interfaces for Lustre.
# In UltraCluster multi-node configurations, you may configure 8 interfaces for FSx
# and reserve the remaining 8 for inter-node NCCL collective traffic.If nvidia_fs isn’t loaded, GDS reads will silently fall back to the CPU bounce-buffer path. You will still get correct results, but without the performance benefit. Load the module with sudo modprobe nvidia_fs.Using fastsafetensors, each GPU loads its shard in parallel:
from fastsafetensors import SafeTensorsFileLoader
# Each GPU loads its own shard via GDS
loader = SafeTensorsFileLoader(pg=None, device=f"cuda:{rank}", nogds=False)
loader.add_filenames({0: [f"/fsx/model_shards/Llama-3.1-405B-FP8-8way/model-rank-{rank}-part-0.safetensors"]})
fbuf = loader.copy_files_to_device() # GDS read: storage → GPU HBM directly
# Extract tensors — sub-millisecond, just pointer math into the GPU buffer
tensors = {name: fbuf.get_tensor(name) for name in loader.get_keys()}Stage 3: Verify and serve. After the tensors are loaded into GPU HBM via GDS, all inference computation runs entirely from GPU memory. The filesystem is only involved during the initial load. The tensors dictionary from Stage 2 contains every weight for this rank, already on the correct GPU device and in the correct tensor-parallel layout. No CPU memory was touched, no deserialization occurred. The weights went directly from FSx for Lustre storage to GPU HBM.
These tensors are ready for any tensor-parallel inference engine that accepts pre-loaded weight dictionaries. The integration point is framework-specific: vLLM, TensorRT-LLM, and SGLang each have internal APIs for injecting weights into their TP-aware model graphs. As these frameworks adopt GDS-aware weight loading natively (fastsafetensors was built for exactly this integration by the Foundation Model Stack team), the full GDS path shown in Stage 2 will become a single-command operation.
For production serving today, vLLM can load the same pre-sharded checkpoints from FSx for Lustre:
vllm serve /fsx/model_shards/Llama-3.1-405B-FP8-8way \
--load-format sharded_state \
--quantization fp8 \
--tensor-parallel-size 8vLLM’
関連記事
NVIDIA Blackwell、MLPerf Training 6.0 で業界をリードするスケーラビリティとパフォーマンスを獲得し首位に
NVIDIA は、同社の最新 AI チップセット「Blackwell」が MLPerf Training 6.0 ベンチマークで業界最高水準のスケーラビリティとパフォーマンスを発揮し、首位を獲得したことを発表した。
ミニマックスが109BパラメータMoEモデル向けに開発したスパースアテンション手法「MSA」を発表
中国のAI企業ミニマックスは、長文コンテキストにおける計算コストを削減する新手法「MiniMax Sparse Attention(MSA)」を開発し、109BパラメータのMoEモデルで実証した。同社はさらに推論用カーネルをオープンソース化し、生産環境向けモデル「MiniMax-M3」もリリースした。
[AINews] GLM-5.2:世界最高峰のフロントエンドコーディングモデル、推測型デコーディングのための IndexShare を発表
Z.ai は週末に「GLM-5.2」をリリースし、この新モデルが世界最高のフロントエンドコーディング性能を持つと主張した。また、推測型デコーディング技術の向上を目指す「IndexShare」という仕組みも紹介された。
今日のまとめ
AI日報で今日の重要ニュースをまとめ読み