トピックハブ

ハードウェアとアクセラレーション

機械学習の性能の大半を決めるのが演算能力ではなくメモリ帯域幅である理由、GPU・TPU・Apple Silicon・NPU・FPGAの違い、そして混合精度とカスタムカーネルで実際に何が得られるかを解説します。

更新 2026年11月13日 · GPU、TPU、HBM、メモリ帯域幅、混合精度、FP8、CUDAカーネル、FPGA

概要

機械学習の性能に関する問いはほぼすべて、2つの数値のどちらかに帰着します。アクセラレータが1秒間に何バイト動かせるか、そして1秒間に何回の浮動小数点演算ができるかです。この2つの比と、ワークロードにおける演算数とバイト数の比を合わせれば、コードを1行も書く前に、計算律速なのかメモリ律速なのかがわかります。ルーフラインモデル(Williams, Waterman and Patterson, 2009)はこの議論をグラフに描いたもので、このハブで最も役に立つ唯一の考え方です。

このページは、ハードウェアを選ぶ、ジョブの規模を見積もる、あるいは学習が遅いのにGPUの使用率が10%と表示されるのはなぜかと悩んでいるエンジニアのためのものです。主なアクセラレータのファミリー、メモリ階層、混合精度、カスタムカーネルを扱います。購入のアドバイスはすぐに古くなるので、ここに挙げる数値は本稿執筆時点でのベンダーの公表仕様であり、問題の形を示すために掲げるもので、特定の部品を推奨するものではありません。

重要な考え方

帯域幅が予算である

NVIDIA H100 SXMを例に取ります。NVIDIAのデータシートには、HBM3が80 GBで3.35 TB/s、密なBF16テンソルコアのスループットが989 TFLOPSとあります。この2つを割ると、1バイトあたり約295演算になります。大きなバッチサイズの行列乗算は読み込んだ1バイトあたりそれよりはるかに多くの演算を行うので計算律速であり、学習がチップを飽和させるのはそのためです。7 Bパラメータのモデルからbf16でトークンを1つデコードするには、14 GBの重みを読んでおよそ14 GFLOPの仕事をします。強度は1バイトあたり約1演算で、したがって完全にメモリ律速です。演算がどれだけ速くても、最大で3.35 TB/sを14 GBで割った、毎秒約240トークンにしかなりません。リクエストのバッチ処理、重みの量子化、KVキャッシュを小さく保つことは、すべてこの同じ限界への対処であり、/topics/mlops-and-deployment/と/topics/efficient-ml/がこれらに多くの紙幅を割いているのはそのためです。

同じ計算で民生品も順位付けできます。NVIDIAの公表ではRTX 4090はGDDR6Xが24 GBで1,008 GB/sです。Appleの公表ではM4 Maxはユニファイドメモリが最大128 GBで546 GB/s、M3 Ultraは最大512 GBで819 GB/sです。128 GBのMacは24 GBのGPUには入らないモデルを保持でき、トークンあたりおよそ半分の速度でデコードします。

SMレジスタと共有メモリSMあたり最大228 kB共有、132 SM最速、数十TB/s(非公表)L2 cache50 MB、全SMで共有HBM380 GB、3.35 TB/s他のGPUNVLink 4, 900 GB/sホストCPUとDRAMPCIe 5.0 x16、片方向約63 GB/sone decode step7 B model, bf1614 GB of weights readabout 14 GFLOP done1 op per bytevs about 295 neededto be compute-boundso: memory-bound,at most ~240 tokens/sat batch size 1各階層は、1つ上の階層よりおよそ1桁遅く、1桁大きい。FlashAttentionのようにデータを共有メモリに留めるカーネルは、HBMとの往復を避けられる。
H100 SXM GPU 1基を取り巻くメモリ階層。容量と帯域幅はH100 SXM5とNVLink 4についてのNVIDIAの公表値。PCIe 5.0 x16はPCI-SIGの片方向の値。チップ上のレジスタと共有メモリの帯域幅は単一の数値としては公表されていない。

アクセラレータのファミリー

GPUは汎用的な選択肢です。数千の単純なコア、行列乗算のためのテンソルコア、成熟したコンパイラ、そして最大のライブラリエコシステムをもちます。NVIDIAはCUDAを通じて支配的です。AMDのInstinct製品はROCmを通じてPyTorchを動かし、スタックは薄いものの改善しつつあります。GoogleのTPUは密な行列乗算のために作られたシストリックアレイ型のマシンで、JAXとXLAを通じてプログラムし、クラウドインスタンスとしてのみ提供されます。Googleのドキュメントでは、TPU v6eはチップあたりHBMが32 GBで1,640 GB/sとされ、大規模な学習のためにチップをポッドに接続します。Apple SiliconはCPU、GPU、ニューラルエンジンを共有メモリプールとともに1つのダイに載せているため、モデルはどの単体の民生用GPUのメモリよりも大きくできますが、その代償として帯域幅は低く、CUDAもありません。スマートフォンやノートPCのNPUは数ワットを狙った小さな固定機能の行列エンジンで、すでにint8以下に量子化されたモデルのオンデバイス推論に向いています。FPGAはその対極にあります。再構成可能なロジックであり、レイテンシ律速、特殊な精度、センサー直結の推論では勝ち、大きな密行列乗算に見えるものではすべて負けます。姉妹サイトにそのケースを扱う専用ハブがあり、下にリンクしています。

混合精度とカーネル

完全なfp32での学習はテンソルコアの大半を無駄にします。混合精度(Micikevicius et al., 2017)は重みのマスターコピーをfp32で保持し、順伝播と逆伝播を16ビットで実行します。bf16はfp32の指数範囲を保ち、損失スケーリングを必要としないため、対応ハードウェアではfp16に取って代わりました。Hopper世代で導入されたFP8は行列乗算のバイト数をさらに半減させ、テンソルごとのスケーリングで範囲内に収めます。

残りの2倍から3倍はカーネルに隠れています。融合カーネルはメモリへの1往復で1つではなく複数の演算を行います。FlashAttention(Dao et al., 2022)が典型例で、共有メモリに留まるタイル単位で厳密な注意機構を計算し、注意行列全体を一度も実体化しません。torch.compileとTritonによって、CUDAを書かなくても融合カーネルに手が届きます。

どこから始めるか

まず/learn/beginner/04-training-loop-and-loss/と/learn/beginner/07-your-first-neural-network/を読み、次に/reference/pytorch-training-loop/の学習ループをCPU、MPSまたはCUDA、そしてbf16のautocastで計時して比較してください。/reference/tensor-shapes-and-broadcasting/は、カーネルが速いかどうかを決めるレイアウトの問題を扱っています。/projects/lora-fine-tune-apple-silicon/プロジェクトは現実的なユニファイドメモリのワークロードです。/topics/deep-learning/ハブは、これらの数値が適用されるモデルを扱っています。

ツールとプラットフォーム

ツール 用途 ライセンス プラットフォーム
CUDA Toolkit、cuDNN、cuBLAS NVIDIA GPUのプログラミングとPyTorchが呼び出すライブラリ プロプライエタリ、無償利用可 /platforms/nvidia/
Triton(OpenAI) Pythonで融合GPUカーネルを書く MIT /platforms/openai/
torch.compileとPyTorchプロファイラ グラフのキャプチャ、カーネル融合、遅い演算子の特定 BSD-3 /platforms/pytorch/
JAXとXLA コンパイラを介したTPUとGPUのプログラミング Apache-2.0 /platforms/jax/
Cloud TPU Googleのアクセラレータ。チップ単位またはポッド単位でレンタル プロプライエタリ、従量課金 /platforms/google/
MLXとCore ML Apple Siliconでの学習とオンデバイス推論 MIT(MLX)、プロプライエタリ(Core ML) /platforms/apple/
ROCm PyTorch向けのAMD GPUスタック 大部分はMITおよびオープンソース /platforms/opensource/
FPGA Guide FPGAでの推論フローを扱う姉妹サイト 該当なし fpgaguide.com/topics/ai-ml/

よくある間違い

  • ピークTFLOPSを比較する。ピーク値はすべてのユニットが稼働する密な行列乗算を前提にしています。自分のワークロードでの実測スループットを比較し、引用された数値に構造化スパース性が含まれていないか確認してください。
  • ジョブがメモリ律速なのに演算能力で購入する。推論では帯域幅と容量が、大規模な学習では相互接続が決め手になります。
  • 損失スケーリングなしでfp16で学習する。あるいはbf16テンソルコアをもつハードウェアでfp32で学習する。
  • GPU使用率を効率の尺度として読む。メモリを待っているカーネルも使用率100%と表示されます。
  • データローダーをCPUワーカー2つで動かして、GPUのせいにする。
  • メモリに収まるモデルなら動くと思い込む。KVキャッシュ、オプティマイザの状態、活性化にも場所が必要です。

さらに深く

リファレンス

  • 量子化形式とそのコスト

    FP32からINT4、NF4、GGUFのk-quant、AWQ、GPTQまでを1ページにまとめ、パラメータあたりのバイト数、7 Bと70 Bモデルのメモリ量、報告されている精度への影響、ハードウェア対応を示します。

このトピックの最新ニュース

最近の論文

  • LazyWeights: Decode-on-Demand Edge LLMs

    A. Sanyal, G. Datta, S. P. Chinchali · arXiv cs.LG · ダイジェスト

    新しい量子化形式を発明する代わりに、この論文はGPTQ、AWQ、llama.cppのK-quantとI-quantをそのまま使い、整数コードがよく圧縮されるようGPTQを調整し、それらを可逆にHuffman符号化して、DRAMとL2の間にある小さなハードウェアユニットで必要に応じて復号します。GPUカーネルには手を加えません。パープレキシティ予算1%と3.5%において、符号化したPhi-3-mini、Mistral-7B、SmolLM-1.7Bは最良のllama.cpp形式より5.7から31.4%小さくなります。7 nmプロセスで1 GHz動作のビット厳密な0.21平方ミリメートルのデコーダは、Jetson Orin Nano Superでのトークンあたりレイテンシとエネルギーを最大36%と38%削減し、4 GBのJetson Nanoは1重みあたり3.89ビットでストリーミングされるMistral-7Bを6.6倍速く実行します。ハードウェアユニットはZynq UltraScale+ FPGAで検証された提案なので、この利得を実現するには新しいシリコンかFPGAのコンパニオンが必要です。

  • KernelMosaic: An Open Dataset and Agentic Framework for CUDA Kernel Generation

    N. Xi, Y. Lai, N. Miao · arXiv cs.LG · ダイジェスト

    KernelMosaicは、検証済みの解法とそれを生み出した推論の軌跡を対にしたCUDAタスクのオープンなデータセットで、人間のレビューと多様性を考慮した選択によって整備されています。エージェント型のフレームワークが強力なLLMを実装、正しさの修正、性能チューニングへと導いて軌跡を生成します。このデータセットで小さなオープンソースモデルをファインチューニングすると、KernelBenchのLevel 1、2、3での正答率が大幅に上がり、PyTorchのeager実行に勝る生成カーネルの割合が増えます。著者らはまた、軌跡を教師とするほうが最終回答だけを教師とするより優れると報告しています。要旨には絶対的な数値がなく、公開はCC BY-NC-ND 4.0の下で行われており、データの商用再利用が制限されます。