日本語ニュース
最新
AI・テクノロジー

cuda-convnet の内部:AlexNet のデュアル GPU レイヤーと ImageNet の時代

プロセッサダイのイメージ図。記事で扱う NVIDIA GPU ではありません。
プロセッサダイのイメージ図。記事で扱う NVIDIA GPU ではありません。

2012 年の AlexNet のマイルストーンは、低レベルの GPU エンジニアリング(cuda-convnet)と分割されたデュアル GPU アーキテクチャに支えられ、より深く効率的なコンピュータビジョンモデルへの急速な競争を直接引き起こしました。

1. cuda-convnet の内部動作

NVIDIA が cuDNN を開発する前、Alex Krizhevsky は生の CUDA C++ で cuda-convnet を書き、初期の Fermi アーキテクチャ GPU(GTX 580)から最大限の速度を引き出しました。現代のライブラリは通常、畳み込みを巨大な行列乗算(im2col)に展開しますが、これは大量のメモリを消費します。各 GTX 580 の VRAM は 3 GB しかなかったため、Krizhevsky は直接的でメモリを節約する GPU ルーチンを設計しました。

  • バッチファーストのメモリレイアウト(CHWN)。現代のフレームワークはデフォルトで NCHW(バッチ、チャネル、高さ、幅)を採用し、1 枚の画像のすべてのピクセルをメモリ上で隣接させます。Krizhevsky はテンソルを CHWN 順で保存し、バッチ次元(N)を最後に配置しました。ワープ内の 32 の GPU スレッドがまったく同じピクセル位置で 32 枚の異なる画像を処理するとき、メモリ読み出しは完全に連続(コアレスド)となり、VRAM 帯域幅を最大化できました。
  • 共有メモリのタイル化。グローバル VRAM からの読み出しには数百クロックサイクルかかるのに対し、オンチップの共有メモリ(GTX 580 ではストリーミングマルチプロセッサあたりわずか 48 KB)はわずか数サイクルです。スレッドブロックは画像ピクセルとフィルタ重みの小さな 2D パッチを共有メモリにロードし、最終結果を VRAM に書き戻す前に数十のドット積を計算しました。
  • ワープレベルのレジスタ再利用。Krizhevsky は各スレッドブロックに、複数のフィルタにまたがる出力ピクセルのタイルを同時に計算させました。フィルタ重みを高速な GPU レジスタに保持することで、共有メモリからロードした 1 つの画像パッチを多数のフィルタで一度に再利用でき、メモリトラフィックを大幅に削減しました。

2. AlexNet の各レイヤーとデュアル GPU 分割

AlexNet には 8 つの学習レイヤー(畳み込み 5 層と全結合 3 層)があり、合計約 6,000 万パラメータです。単一の GTX 580 では活性化、重み、勾配に必要な 3 GB 以上の VRAM が不足していたため、Krizhevsky はネットワークを垂直に 2 つの並列ストリームに分割しました。

レイヤータイプフィルタ / ニューロン総数GPU ごとの分割GPU 間通信
入力RGB 画像224 × 224 × 3両方の GPU にコピーなし
Conv 111×11 畳み込み(ストライド 4)+ MaxPool96 フィルタGPU あたり 48 フィルタ分離(同期なし)
Conv 25×5 畳み込み + MaxPool256 フィルタGPU あたり 128 フィルタ分離(自 GPU の Conv 1 のみ読み出し)
Conv 33×3 畳み込み384 フィルタGPU あたり 192 フィルタ完全同期(両 GPU の全 256 マップを読み出し)
Conv 43×3 畳み込み384 フィルタGPU あたり 192 フィルタ分離(自 GPU の Conv 3 のみ読み出し)
Conv 53×3 畳み込み + MaxPool256 フィルタGPU あたり 128 フィルタ分離(自 GPU の Conv 4 のみ読み出し)
FC 6全結合 + Dropout4,096 ニューロンGPU あたり 2,048 ニューロン完全同期(全 Conv 5 出力に接続)
FC 7全結合 + Dropout4,096 ニューロンGPU あたり 2,048 ニューロン完全同期(全 FC 6 ニューロンに接続)
FC 8全結合(Softmax)1,000 クラス1,000 クラス(結合)完全同期(最終的な ImageNet 予測を出力)
  • 自然な特徴の専門化。興味深いことに、レイヤー 1 と 2 は GPU 間で通信しなかったため、2 枚のカードは一貫して専門的な役割を進化させました。一方の GPU は色に依存しないエッジやテクスチャの検出器(グレースケールの Gabor 様フィルタ)を学習し、もう一方の GPU は色特有のブロブや色相に特化しました。
  • PCIe ボトルネックの最小化。マザーボードの PCIe バス経由のデータ転送は低速でした。GPU 間通信を Conv 3 と全結合層のみに厳しく制限することで、Krizhevsky はデータ転送で停滞することなく GPU をフルスピードで計算させ続けました。

3. ImageNet 時代にその後起きたこと

AlexNet の勝利は ImageNet コンペティションでの毎年の競争に火をつけ、わずか 3 年でネットワークを 8 層から 150 層以上へと押し上げました。

  • 2013 – ZFNet(可視化とチューニング)。Matthew Zeiler と Rob Fergus は、AlexNet が隠れ層で実際に何を「見て」いるかを可視化する逆畳み込み(deconvolution)手法を導入しました。AlexNet の第 1 層フィルタサイズを 11×11 から 7×7 に縮小しストライドを小さくすることで、ZFNet は ImageNet の top-5 エラー率を 15.3% から 14.8% に下げました。
  • 2014 – VGGNet(均一な 3×3 フィルタによる深化)。オックスフォードの研究者らは、小さな 3×3 畳み込みを多数積み重ねる(最大 16 または 19 層)方が、単一の大きなフィルタ(11×11 や 5×5 など)を使うよりも優れることを証明しました。2 つ積み重ねた 3×3 層は、より少ないパラメータと追加の非線形 ReLU 活性化で同じ 5×5 の視野をカバーし、エラー率を 7.3% まで下げました。
  • 2014 – GoogLeNet / Inception(マルチスケール効率)。Google は Inception モジュールを導入し、同じ層内で 1×1、3×3、5×5 の畳み込みを並列に実行して出力を統合しました。高価な計算の前に安価な 1×1 畳み込みでチャネル深度を圧縮することで、GoogLeNet は AlexNet より 12 倍少ないパラメータで 22 層、6.7% のエラー率に到達しました。
  • 2015 – ResNet(スキップ接続と 152 層)。単純に層を増やすだけでは、逆伝播中に勾配が消失するため、最終的に訓練精度が劣化しました。Microsoft Research は残差接続(スキップ接続)でこれを解決し、データが直接的な恒等ショートカットを通じて層をバイパスできるようにしました。これにより 152 層ネットワークが可能になり、3.57% の top-5 エラー率を達成し、初めて人間レベルのベンチマーク性能(約 5%)を上回りました。

その他のニュース: AI・テクノロジー