コンテンツにスキップ

量子化(AI推論)とは

量子化(AI推論)とは、ニューラルネットワークの演算の入出力を細かい値から粗い値へ近似して、計算の負荷を軽くする技術です。 一般に細かい値を使うほど認識の精度は上がりますが、その分だけ多くのビットが要り、演算の負荷が上がります1。細かさと軽さが正面から衝突するなかで、精度を決めるのはビット数だけではありません。同じビット数でも、刻みをどこへ置くか、ネットワークのどこを粗くするかで結果が変わり、粗さの下限は素子の側が決めることもあります。

実数を、scaleの間隔で並ぶ整数へ丸める

Section titled “実数を、scaleの間隔で並ぶ整数へ丸める”

AIの推論では、掛け算と足し算(積和演算)を膨大な回数繰り返します。量子化は、その途中に出入りする数を何ビットで表すかという一点についての技術です。2020年のAIエッジLSIより前のネットワーク構造では、小数を32ビットか16ビットの浮動小数点で、整数を8ビットで表してきました2。量子化はこの桁数を削る操作で、桁数を削ると、メモリに収める数のかさと、その数を計算する回路そのものが同時に小さくなります。

推論ランタイムのONNX Runtimeでは、浮動小数点の値を8ビットの量子化空間へ写し、元の値を「scale ×(量子化値 − zero_point)」で表します3。scaleは整数1目盛りが実数でいくつにあたるかで、非対称の量子化ではデータの最大値と最小値の差を量子化範囲の幅で割り、対称の量子化ではデータの最大値と最小値の絶対値の大きいほうを2倍して同じ幅で割ります。実数の0は量子化空間でちょうど表せなければなりません。多くのCNNがゼロパディングを使うためで、0を一意に表せないと精度の誤差になります。

実数を整数の目盛へ写す
実数(FP32)データの最小値データの最大値08ビット整数zero_pointscale
実数はscaleの間隔で並ぶ整数の目盛へ丸められ、実数の0はzero_pointにちょうど重なります。丸めた差が、量子化の誤差です。

浮動小数点をやめると、回路はおよそ半分になる

Section titled “浮動小数点をやめると、回路はおよそ半分になる”

学習能力の等しいニューラルネットワークを浮動小数点と固定小数点で組み、FPGAへ実装して比べると、固定小数点の側の回路はおよそ半分の大きさに収まります4。演算そのものも速く、学習にかかる時間も短くなります。代償として、演算を簡単にするほど学習の成績は落ちるので、どこまで簡単にしてよいかのつり合いが問題になります。

2値化や3値化まで粗くすると、掛け算が足し引きに変わる

Section titled “2値化や3値化まで粗くすると、掛け算が足し引きに変わる”

回路規模をさらに小さくするには、活性化関数を2値化または3値化することが有効4とされています。2値化ではニューロンの出力が+1と-1だけ、3値化では+1、0、-1だけになるので、関数の値を覚えておくメモリ(LUT)が要らなくなり、出力と重みを掛ける回路を足し引きの回路へ置き換えられます。重み係数を2のべき乗だけに絞ってシナプス乗算器を省いた提案もあり、その場合の掛け算はシフトレジスタで済みます。粗くすると、回路の形そのものが入れ替わります。

ルネサス エレクトロニクスは、この考え方をSRAMへ持ち込みました。同社は2019年、それまでのPIM(Processing-in-Memory)が0と1の2値だけで演算するSRAM構造で、1ビットの演算では大規模なCNNに必要な精度に届かなかったとして5、3値(-1, 0, 1)SRAM構造のPIMを試作技術として開発しました。3値のメモリに、簡単なデジタルの演算ブロックを足した構成です。同社は、回路が増える分も演算誤差が増える分も小さく抑えたうえで、求められる精度に合わせて演算のビット数を1.5ビット(3値)と4ビットのあいだで切り替えられ、利用者ごとに異なる演算規模と精度の要求へ対応して、演算精度と消費電力のつり合いを最適化できるとしています。同社はこの技術でAI処理の実効性能8.8 TOPS/Wを実証したと発表しています。

同じ2ビットでも、刻みの置き所で精度が変わる

Section titled “同じ2ビットでも、刻みの置き所で精度が変わる”

ビット数のほかに、刻みの置き所も精度を左右します。NEDOと沖電気工業(OKI)は2021年、AIの学習の最中に量子化値を最も良い位置へ割り当てる低ビット量子化技術LCQ(Learnable Companding Quantization)を発表しました。先行技術では、元の値をどの値へ丸めるか(量子化値)があらかじめ固定値として決まっているため、2ビットのような超低ビットまで縮めると、固定値との誤差で認識精度が劣化し、実用化への障壁になっていました1。

LCQは、DNNの誤差勾配をもとに圧縮関数と伸張関数そのものを学習させ、それを織り込んで量子化することで、間隔が不均一な量子化関数を作り、適した位置へ量子化値を割り当てます。圧縮関数と伸張関数は線形の量子化演算の前後に通す関数で、演算前に圧縮関数で情報を圧縮し、演算後に伸張関数で復元します。もとにしたCompandingは音声符号化の分野でよく使われる非線形の量子化技術で、圧縮と伸張の英語を組み合わせた造語です。

両者は、DNNの性能をはかる指標とされる画像認識で、高精度なネットワークを32ビットから2ビットへ、つまりビット数を16分の1にしたとき、先行技術では認識の精度が約3%下がるところ、LCQでは下げ幅を1.7%に抑えたとしています1。2ビットで表せる段階は2の2乗の4つなので、同じ4段階でも、刻みをどこへ割り当てるかで精度が上下します。

4段階の置き所
固定の等間隔量子化する前の値認識精度の劣化 約3%学習で割り当て(LCQ)量子化する前の値認識精度の劣化 1.7%2ビットの4つの量子化値値の分布
NEDOと沖電気工業の発表では、同じ4段階でも量子化値を学習で割り当てると、32ビットから2ビットへ縮めたときの認識精度の劣化が約3%から1.7%に縮みました。

粗さは、ネットワークの場所ごとに使い分ける

Section titled “粗さは、ネットワークの場所ごとに使い分ける”

NEDO、ソシオネクスト、ArchiTek、豊田自動織機は2020年、深層学習の実行に必要なパラメーターやアクティベーションを低ビット化するハイブリッド量子化DNN技術を発表しました。バックボーンネットワークには3進数の2ビットと2進数の1ビットを、ヘッドネットワークには整数の8ビットを割り当て2、粗さの異なる量子化を1つのネットワークに混ぜます。バックボーンネットワークは入力された画像からフィーチャーマップを取り出す側、ヘッドネットワークはそれを受け取って後段の演算を進める側で、入口側は粗く、出口側は細かくという配分です。

ネットワークの場所ごとのビット数
従来の浮動小数点 32ビット3進数 2ビット2進数 1ビット整数 8ビットバックボーン特徴を取り出す側ヘッド後段の演算3進数2ビット・2進数1ビット整数8ビット
層の高さはビット数に比例し、特徴を取り出すバックボーンは2ビットと1ビット、後段のヘッドは整数8ビットで、従来の32ビットの枠を大きく下回ります。

4者は、これにより認識精度の低下を抑えながら低消費電力を実現したとしています。道具立てとして、学習環境ではTensorFlowに合わせた量子化ライブラリを、推論環境ではハイブリッド量子化エンジンを、さらに学習環境から推論環境への変換処理技術を開発しました。試作したAIエッジLSIの測定では、この量子化を適用したAI認識の処理が、汎用GPUと比べて10倍以上の電力効率だったとしています6。

ルネサスの3値SRAM構造のPIMも、必要精度に応じて1.5ビットと4ビットを切り替える設計です。粗さは、ネットワーク全体へ一律に当てるものから、場所ごとに割り当てるものへ移りつつあります。

実装の道具は、量子化を模擬し、演算子をまとめてから丸める

Section titled “実装の道具は、量子化を模擬し、演算子をまとめてから丸める”

ONNX Runtimeの量子化には、元の演算子のあいだにQuantizeLinearとDeQuantizeLinearを挟んで、量子化と逆量子化の過程を模擬する形式があります。動的量子化では、量子化のパラメータを計算する関数を差し込み、実行の最中にパラメータを求めます。

ONNX Runtimeでは、モデルの最適化で一部の演算子を融合でき、量子化ツールの作業が楽になります。たとえば畳み込みの後に続くBatchNormalizationは1つにまとめられ、まとめた演算子は効率よく量子化できます3。ただしONNX Runtimeには、最適化の出力が2GBを超えるモデルを出せないという既知の制約があり、大きなモデルでは最適化を飛ばす必要があります。

刻みの限界は、ハードウェア側にもある

Section titled “刻みの限界は、ハードウェア側にもある”

量子化はソフトウェア側の技術に思えますが、粗さの下限を握るのが素子の側だということもあります。NEDO、産業技術総合研究所、パナソニックセミコンダクターソリューションズ、北海道大学が2018年に発表した脳型情報処理回路は7、重み値を素子の抵抗値として保存する方式で、素子が再現性よく書き分けられる階調の数が深層学習の推論の出来に響くと注記しています。素子が何段階を安定して覚えられるかが、そのハードウェアで使える刻みの細かさを左右します。インメモリ演算の階調の話は、量子化の側からたどっても同じ場所へ行き着きます。

量子化(AI推論)とは何ですか?

ニューラルネットワークの演算の入出力を、細かい値から粗い値へ近似して、計算の負荷を軽くする技術です。刻みを細かくするほど認識の精度は上がるものの、その分だけビット数が要り、計算の負荷が増えます。

何ビットまで下げられるのですか?

NEDOと沖電気工業は、画像認識の高精度なネットワークを32ビットから2ビットへと16分の1に圧縮した事例を発表しています。活性化関数を2値化して出力を+1と-1だけにする方式もあり、用途と要求精度によって下限が上下します。

粗くすると認識精度はどれくらい落ちますか?

NEDOと沖電気工業の2021年の発表では、画像認識の高精度なネットワークで32ビットを2ビットへ縮めたとき、先行技術では認識の精度が約3%下がるのに対し、開発したLCQでは下げ幅が1.7%にとどまりました。差を生んだのは、4つの量子化値をどこへ置くかです。

ビット数を減らすと、なぜ電力が下がるのですか?

計算する回路そのものが小さくなるためです。学習能力の等しいネットワークをFPGAへ実装して比べると、固定小数点で組んだ側の回路がおよそ半分の大きさに収まります。2値化や3値化まで進めると、出力と重みを掛ける回路を足し引きの回路へ置き換えられます。

ネットワーク全体を同じビット数にするのですか?

場所ごとに変える方式があります。NEDO、ソシオネクスト、ArchiTek、豊田自動織機のハイブリッド量子化DNN技術は、バックボーンネットワークへ3進数の2ビットと2進数の1ビットを、ヘッドネットワークへ整数の8ビットを割り当て、粗さの異なる量子化を1つのネットワークに混ぜます。

量子化とインメモリ演算はどう関係しますか?

ルネサス エレクトロニクスは、3値SRAM構造のPIMでメモリ回路の中で積和演算まで行いながら、必要精度に応じて演算ビット数を1.5ビットや4ビットへ切り替えられるとしています。NEDOらの脳型情報処理回路では、素子が再現性よく書き分けられる階調の数が推論の出来に響きます。粗さの選び方は、ハードウェアの構造と一体です。

学習の段階でも量子化を使うのですか?

使います。NEDOと沖電気工業のLCQは、DNNの学習時に誤差勾配に基づいて圧縮関数と伸張関数を学習し、それを反映した量子化で量子化値を割り当てます。ONNX Runtimeも、量子化と逆量子化の演算を元の演算子の間に挟んで、量子化の過程を模擬する形式を持っています。

7件を表示
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7