skip to Main Content
『半導体業界の第一人者、AI業界を行く!』 Vol.2:NVIDIA Ampere が深層学習のスパース性を利用

こんにちは、ハカルス 東京R&Dセンター所属のエッジ・エバンジェリスト 田胡治之です。この連載では、半導体業界で長年知識や情報を得てきた私、田胡がこれまでと異なるAI業界に飛び込み、そこから感じる業界のニュースやトピックを独自の視点で紹介したいと思います。

第二回のテーマは第一回に引き続き NVDIA 関連で Ampere についてです。


NVIDIAは2020年5月の自社イベント GTC2020 で,データセンター向けにNVIDIA Ampereアーキテクチャと製品ファミリー  NVIDIA A100 TENSOR コア GPU などを発表しました。関連資料には「スパース性が AI 推論をパワーアップする方法」、「 NVIDIA は A100 GPU で、ディープ ニューラル ネットワークの計算スループットを 2 倍にする新たな手法として、細粒度構造化スパース性を導入しました。」とあります。

エッジ(端末)側での深層学習推論が普及するのに伴い、エッジ機器の限られたメモリ量や演算能力などに対応したコンパクトな学習済深層ネットワークが必要となっています。データセンターで行われる学習ステップでは、精度を保ちながら深層ネットワークをコンパクト化する研究開発が盛んです。例えば資料では、「プルーニング(Pruning:刈り込み)」、「量子化(Quantization)」、「ウェイトシェアリング(Weight Sharing:重み共有)」、「ハフマン符号化(Huffman Coding)」を報告しています。

本稿では深層学習重み行列のスパース性(Sparsity)を利用した圧縮技術を説明します。こちらの資料 では、深層学習ネットワークの一つである Resnet-18 について、重み行列密度(layer density)のスパース性を利用した圧縮を報告しています。Figure 2 左図は layer density を削減しない元の layer density)分布で、赤色は正の重み、青色は負の重みを示しています。中央の図はゼロに近い重みをゼロ(黒色)にして layer density を35%に削減した時の分布、右図は更に15%まで削減した分布を示します。右に行くほど黒色領域が増え、ゼロにされた重みが多いことがわかります。

Figure 2 Resnet-18 res2a_2a laler の layer density を3種に変化させた場合の layer density マップ

layer density と精度(Top-5 accuracy)の関係 をFigure 3 に示します。layer density を15%にまで削減してもTop-5 accuracy は僅か0.86%しか低下しないことがわかります。即ち深層学習重み行列にはスパース性があると言えます。

layer density 100% 35% 15%
Top-5 accuracy 87.43% 87.36% 86.57%

Figure 3  3種類の重み削減と Top-5 accuracy 

ソフトウェアでは疎行列(sparse matrix)を効率よく扱うデータ構造や計算手法は良く知られています。GPU関連ではテクスチャデータの圧縮規格が使われています、これもソフトウェア処理です。

NVIDIA Ampere の新しい点は「マトリックス計算用のテンサーコアでスパースネットワークに『ハードウェア』で対応」と筆者は考えます。具体的に見ていきましょう。

重み行列の圧縮

文献を参考に筆者の推測を交えつつ、重み行列の圧縮処理を説明します。Figure 4 (A)が圧縮対象の重み行列です。Figure 4 (B) は (A) を要素の値によって二色で表したものです。ある一行の 0~3列(Figure 4 (C) 青枠)に着目したとき、4つの要素のうち絶対値が大きい2要素を水色、それ以外、即ち水色よりも絶対値が小さい2要素を黒色で表しています。

圧縮は Fine-grained structured pruning (2:4 non-zero) 、また「NVIDIA A100 Tensor Core GPU Architecture」 では”prunes trained weights with a 2-out-of-4 non-zero pattern,” と説明されています。
それ以上の説明はありませんが、おそらく専用ハードウェアが4要素中絶対値が大きい2要素を残し、残り2要素をゼロにする処理(pruning) を行うと推測します。この処理を行う専用ハードウェア規模はGPU全体に比べれば微々たるものでしょう。

ある行の0~3列をまず圧縮し、次に4~7列を圧縮、結果を (D)水色 Non-zero dataと (E)紫色 Non-zero indices に書き込む、と思われます。Non-zero Indices は、残した2要素の元の4要素中の位置を 2bit で示します。4~7列に対しても同じく 2bit 必要で、行当たり合計4bit必要です。(F)緑枠が(A)の一行を圧縮した4要素と Non-zero indices 4bit を示します。Figure 5 は圧縮前後の重み行列イメージを表しています。左側 8×8 行列の白い要素が刈り取られ、右側では残された要素(濃い緑,薄い緑)とNon-zero indices(紫) に圧縮されています。

Figure 4 Sparse Tensor Core of NVIDIA Ampere[3] に筆者が赤字と青線を加筆.

Figure 5 Compressed Matrix format [3]

重み行列の圧縮率をFigure 6 に示します。重み行列は約半分に圧縮されています。

重みのビット幅(精度) 圧縮前

(一行8列分)

圧縮後

(一行8列分)

圧縮率
8bit 8 x 8 4 x 8 + 4 56.25%
16bit 8 x 16 4×16 + 4 53.125%

Figure 6  重み行列の圧縮率

圧縮された重み行列と活性値との演算

Figure 4 (H) が Sparse Tensor Core で、圧縮された重み行列と入力活性値行列 (Input activations) との行列内積演算を行うブロックです。まず入力活性値行列(M)の一列8要素を(I)に持ってきます。圧縮された重み行列(G)緑枠中の non-zero indices をデコードし、MUX (J) が8つの入力活性値 (I) から残された重み位置に対応する4つの入力活性値(K) を選択します。(K) と (G) の要素を変えつつ積和演算を4回繰り返して、入力活性値1列分の結果を得ます。
これを入力活性値行列の列を変え繰り返し、出力活性値 (Output Activations) (N) を得ます。(N)は入力(M)と同じサイズの活性値行列なので、そのまま次の処理に進めます。重み圧縮後に再学習を行い、Pruning で低下した正解率を回復させます。

ハードウェア圧縮のメリット

二つあると考えます。ひとつは、圧縮されてゼロになった重みの積和演算をスキップできるため、積和演算回数が重み行列圧縮前に比べて半減できることです。積和演算性能は二倍に向上します。もうひとつは重み行列サイズがほぼ半減(Figure 6)したことによる転送量削減メリットです。重み行列は通常Ampereチップ内ではなく外部 DRAM 置かれています。圧縮された重み行列(Figure 4 の(D)と(E))を使うことで、DRAM 上のフットプリントがほぼ半減するのに加え、外部DRAMとAmpere チップ間の転送ハンド幅もほぼ半減します。Sparse Tensor Core は重み値の大小に関わらず、重み行列要素4個から絶対値の大きい二つを残して残り二つをゼロにする、という強引とも言える方法です。しかし重み行列のスパース性(Figure 2, 3)、即ち「重みを50%削っても深層学習ネットワークの性能にほとんど影響しない」という特徴をうまく生かして、積和演算性能を2倍に向上させています。

まとめ

AI手法の主流である深層学習ではエッジ機器での推論実行のため、深層学習ネットワークのサイズ削減が重要になってきています。データセンター向け NVIDIA Ampere アーキテクチャはSparse Tensor Core of NVIDIA Ampere を導入しました。これは深層学習重み行列のスパース性を利用し、比較的簡単なハードウェア追加で重み行列を半分に圧縮し積和演算性能を2倍にする仕組みです、スパース性の利用は適用分野を拡げていると言えるでしょう。

参考文献