GPUメモリ帯域幅
このブログでは、見落とされがちなGPUの特性の1つ、メモリ帯域幅について解説します。GPUメモリ帯域幅とは何かを掘り下げ、機械学習プラットフォームにおいてMLの専門家が考慮すべき特性の1つとしてなぜ重要であるかを見ていきます。
機械学習のためのメモリニーズを理解することは、モデルの開発プロセスの重要な要素です。それでも、見落としがちになることがあります。
前提条件
この記事を進めるために必要な前提スキルはありません。コンピュータハードウェアの基本的な理解は役立ちますが、ほとんどすべての重要な情報はこの記事内で提供されています。
基本的なGPUの構造
グラフィックカードは、マザーボードと同様に、プロセッサ、メモリ、および電力管理ユニットを搭載したプリント回路基板です。また、カードの設定を保持し、メモリ、入力、出力の起動診断を実行するBIOSチップも備えています。
グラフィックカード上のグラフィック処理装置(GPU)は、コンピュータのマザーボード上のCPUに若干類似しています。一方、GPUはグラフィックスレンダリングやその他の機械学習関連アプリケーションに必要な複雑な数学的および幾何学的計算を行うように設計されています。
グラフィックスカードにおいて、計算ユニット(GPU)は、メモリインターフェースと呼ばれるバスを介してメモリユニット(VRAM、ビデオランダムアクセスメモリの略)に接続されています。
コンピュータシステム全体にわたって、多くのメモリインターフェースがあります。メモリインターフェースとは、GPUに関連するメモリバスの物理ビット幅を指します。データは、毎クロックサイクル(毎秒数十億回)ごとに、カード上のメモリに送信され、また受信されます。このインターフェースの幅は、バスにフィットする物理ビットの数であり、通常「384ビット」やそれに類似した表現で説明されます。384ビットのメモリインターフェースでは、毎クロックサイクルに384ビットのデータが転送されます。したがって、GPUの最大メモリスループットを確立する際、メモリインターフェースもメモリ帯域幅計算の重要な要素となります。その結果、NVIDIAやAMDは、グラフィックカードに標準化されたシリアルポイントツーポイントバスを採用することが多くなっています。例えば、POD125規格は、A4000、A5000、A6000 NVIDIA Ampereシリーズのグラフィックカードで使用されており、これは基本的にGDDR6 vRAMとの通信プロトコルを説明しています。
メモリ帯域幅に関しては、レイテンシは考慮すべき第2の要素です。もともと、VMEバスやS-100バスなどの汎用バスが実装されましたが、現代のメモリバスはレイテンシを削減するためにVRAMチップに直接接続するように設計されています。
GDDR5およびGDDR6メモリは、最新のGPUメモリ規格の一つです。各メモリは2つのチップで構成されており、それぞれ32ビットバス(並列の16ビットが2つ)を持ち、同時に複数のメモリアクセスを可能にします。その結果、256ビットのメモリインターフェースを持つGPUには8つのGDDR6メモリチップが搭載されます。
メモリタイプのもう一つの標準はHBMおよびHBM2(高帯域幅メモリv1およびv2)であり、これらの標準では各HBMインターフェースが1024ビットで、一般的にGDDR5およびGDDR6よりも高い帯域幅を提供します。
マザーボードとグラフィックカードの間の外部PCI-エクスプレッション接続は、この内部メモリインターフェースと混同してはいけません。このバスは、その帯域幅と速度によっても特徴付けられていますが、数桁遅いです。
GPUメモリ帯域幅とは何ですか?
GPUのメモリ帯域幅は、メモリ(vRAM)から計算コアへのデータの移動速度を決定します。これはGPUメモリ速度よりもより代表的な指標です。これは、メモリと計算コア間のデータ伝送速度およびこれら二つの部分間のバス内の個別の並列リンクの数によって決まります。
消費者向けデバイスの絶対メモリ帯域幅は、1980年代初頭のホームコンピュータ(約1MB/s)以来、いくつかのオーダーの大きさで増加しましたが、利用可能な計算リソースもそれ以上に早く増加しており、帯域幅の制限に常に達するのを避ける唯一の方法は、ワークロードとリソースがメモリのサイズと帯域幅の観点で同じオーダーの大きさであることを確保することです。
例えば、ML指向の最先端のGPUの一つであるNVIDIA RTX A4000を見てみましょう:
16 GBのGDDR6メモリ、256ビットのメモリインターフェース(GPUとVRAMの間のバス上の個別リンクの数)、そして6144に達する驚異的なCUDAコア数を備えています。これらすべてのメモリ関連の特性により、A4000は448 GB/sのメモリ帯域幅に達することができます。
他の人気のあるマシンで注目すべき他の関連するGPU仕様は以下の通りです:
| GPU | vRAM | メモリインターフェース幅 | メモリ帯域幅 |
|---|---|---|---|
| P4000 | 8 GB GDDR5 | 256ビット | 243 GB/s |
| P5000 | 8GB GDDR5X | 256ビット | 288 GB/s |
| P6000 | 24GB GDDR5X | 348ビット | 432 GB/s |
| V100 | 32GB HBM2 | 4096ビット | 900 GB/s |
| RTX4000 | 8GB GDDR6 | 256ビット | 416 GB/s |
| RTX5000 | 16GB GDDR6 | 256ビット | 448 GB/s |
| A4000 | 16GB GDDR6 | 256ビット | 448 GB/s |
| A5000 | 24GB GDDR6 | 348ビット | 768 GB/s |
| A6000 | 48GB GDDR6 | 348ビット | 768 GB/s |
| A100 | 80GB HBM2 | 5120ビット | 1555 GB/s |
なぜ機械学習アプリケーションに高いメモリ帯域幅が必要なのですか?
メモリ帯域幅の効果は本質的に明白ではありません。もしそれが遅すぎると、システムはボトルネックになり、何千ものGPU計算コアがメモリの応答を待ってアイドル状態になります。また、GPUが使用されるアプリケーションの種類によっては、データブロックがGPUによって繰り返し処理される場合(T回と呼びましょう)、外部PCI帯域幅はGPU内部帯域幅の1/Tでなければなりません。
GPUの最も一般的な使用法は、上記の制限を示しています。例えば、モデル訓練プログラムはトレーニングデータをGDDR RAMに読み込み、数時間にわたり計算コア内のニューラルネットワーク層のためにいくつかの処理を行います。そのため、PCIバスの帯域幅とGPU内部の帯域幅の比率は最大で20対1になることがあります。
必要なメモリ帯域幅の量は、あなたが取り組んでいるプロジェクトの種類によって完全に依存します。例えば、大量のデータが供給され、再処理され、継続的にメモリに復元されることに依存する深層学習プロジェクトに取り組んでいる場合、より広いメモリ帯域幅が必要になります。動画や画像に基づく機械学習プロジェクトの場合、メモリおよびメモリ帯域幅の要件は、自然言語処理や音声処理プロジェクトに比べてそれほど低くはありません。ほとんどの平均的なプロジェクトにおいては、良い目安の数字は300 GB/sから500 GB/sです。これは常にそうであるわけではありませんが、一般的には多様な視覚データ機械学習アプリケーションに対応できる十分なメモリ帯域幅です。
深層学習のメモリ帯域幅要件の検証の例を見てみましょう:
50層のResNetを考えると、25百万以上の重みパラメータがあり、1つのパラメータを32ビット浮動小数点で保存すると、約0.8GBのメモリスペースが必要になります。したがって、例えばミニバッチのサイズが32の場合、各モデルパスで読み込む必要があるメモリは25.6GBになります。A100のような19.5 TFLOPsを持つGPUを考慮すると、ResNetモデルは1回のパスで497 GFLOPsを使用するので、1秒間に約39回の完全なパスを行うことができ、バンド幅の必要性は998 GB/sになります。したがって、バンド幅が1555 GB/sのA100は、このモデルを効率的に処理し、ボトルネックから大きく離れていることになります。
メモリ帯域幅の使用を減らすためにモデルを最適化する方法は?
一般的に機械学習アルゴリズム、特にコンピュータビジョン分野における深層神経ネットワークは、大きなメモリとメモリ帯域幅のフットプリントを引き起こします。一部の技術は、リソースが限られた環境や、コストと時間を削減するために強力なクラウドMLサービスでMLモデルをデプロイする際に使用できます。以下は実装可能な戦略のいくつかです:
部分フィッティング:データセットが一度のパスで収めきれない場合。この機能は、データ全体で一度にモデルをフィットするのではなく、データを段階的にフィットさせることを可能にします。つまり、データの一部を取り、それにフィットさせて重みベクトルを取得し、次のデータの部分に進んで再びフィットさせて別の重みベクトルを取得し、というように続けます。言うまでもなく、これによりVRAMの使用量が低下し、トレーニングの期間が延びます。最も重大な欠点は、すべてのアルゴリズムおよび実装が部分フィットを利用できるわけではなく、技術的に調整できるとも限らないことです。それでも、可能な限り考慮すべきです。
次元削減:これは、トレーニング時間を短縮するだけでなく、実行時のメモリ消費を削減するためにも重要です。主成分分析(PCA)、線形判別分析(LDA)、または行列分解のような技術は、次元を大幅に削減し、元のデータの重要な特性を保持しつつ、より少ない特徴を持つ入力変数のサブセットを生成することができます。
スパース行列:スパース行列を扱う際には、非ゼロ項目のみを保存することで、大幅なメモリ節約が可能です。非ゼロ項目の数や分布に応じて、異なるデータ構造を利用することができ、基本的な手法と比較して大きなメモリ節約が得られます。ただし、個々の要素にアクセスすることが難しくなり、元の行列をあいまいさなく取り出すために追加の構造が必要になるため、メモリ帯域幅の利用を低減させる代わりに、より多くのコア計算が必要になります。
結論
機械学習のメモリ帯域幅要件を理解することは、モデル構築プロセスの重要な部分です。この文章を読むことによって、今ではメモリ帯域幅が何であるかを知っています。次に、その重要性とメモリ帯域幅要件の評価方法についてのレビューを行いました。また、タイミングと精度の基準を維持しながら、帯域幅の使用を減らし、コストを下げるためのいくつかの方法についても議論しました。


