それでは、VoltaとTuringに実装され、ディープラーニングなどで高い演算能力を提供するTensorコアを見ていく。成瀬氏は、Tensorコアについて「一言で言うと、行列のFMA(Fused Multiply Add:融合積和演算)」を実行する演算ユニットだと説明する。
4×4行列2つを入力として積を計算するとその演算量は64となり、さらに和を計算すると演算量は128となる。Tensorコアは、1個のユニットでこの128演算を1サイクルで実行できるスループットを持つ。VoltaからサポートされたTensorコアでは、FP16で入力された行列2つを乗算するが、ここでは32ビットに精度を拡張し実行する。その後、FP32の行列を加算している。この手法により精度が改善するため、「入力はFP16だが、得られる結果はFP32で計算した結果に近い」(成瀬氏)という。
さらに、TuringではINT8入力もサポートしており、この場合は加算と出力をINT32で実行する。これにより、「推論で用いる場合などは全く問題なく計算できる。単純にFP16から2倍の性能向上が望める」(成瀬氏)とし、INT8モデルの用意も「FP32で学習済みのモデルを、われわれが提供するTensorRTによってINT8に落とし込む」(同氏)ことで調達できる。より高速に推論を実行する環境が、Turingの登場で整備しやすくなったといえる。
このように、Tensorコアは大きな行列積を高速に演算することに長けているが、NVIDIAが提供する密行列演算ライブラリ「cuBLAS」はTensorコアをサポートしている。このため、ユーザーはこのライブラリを適切に利用することで特別なコーディングが必要なくTensorコアを利用できるとする。
また、大きな行列積は小さな行列積(サブ行列)の集合と見なすことができ、Tensorコアでは16×16サイズのサブ行列積をそれぞれのコアに割り当てている。CUDAにおいても、このサブ行列を取り扱うAPI「WMMA API」が用意されており、サブ行列(CUDAではfragment)の演算を実行することができる。WMMA APIは、CUDA 9.0から提供され、FP16とINT8(TuringとCUDA10の組み合わせた場合のみ)に対応している。
TuringのTensorコアでは、INT8をサポートしたためピーク性能は250TOPSに到達。また、試験用としてINT4とINT1もサポートし、INT4の場合には500TOPSを発揮する。Tensorコアの拡張で、量子化が進みつつあるニューラルネットワークにも対応する構えだ。
Copyright © ITmedia, Inc. All Rights Reserved.