開発・運用環境

エッジ向けモデル軽量化

エッジ推論では、枝刈り・量子化・蒸留を「何を削るか」で選び、精度だけでなくメモリ帯域と実行カーネルまで含めて軽量化を判断します。

  • A|中核
  • 開発・運用環境

数式の記号で止まったら 記号の読み方 (∂・⊙・転置・上付き添字を、読み方から)

目的先に見る指標主な注意点
格納量を下げる重みのバイト数、コード表のオーバーヘッド圧縮形式を実行時に展開するか
レイテンシを下げる実機の推論時間、キャッシュミス疎行列・低ビット用カーネルの有無
電力を下げるメモリ転送量、推論あたりの消費エネルギーDRAMアクセスが残っていないか

ひとことで言うと

エッジ向けモデル軽量化は、精度を保ちながら推論時のモデルサイズ、転送量、計算量、消費電力を下げる設計です。代表的な三系統は、冗長な結合を削る枝刈り、数値のビット幅を削る量子化、大きなモデルの知識を小さなモデルへ移してモデル自体を小さくする蒸留です。Deep Compression は枝刈り、trained quantization、Huffman 符号化を順に適用する構成で、蒸留の論文ではありません。

引っ越しにたとえると、枝刈りは不要な家具を捨て、量子化は家具を小さく梱包し、蒸留は大きな家の暮らし方だけを狭い部屋に移す作業です。どれも荷物は減りますが、捨てる対象と、現場で必要な道具は違います。

なぜ必要か

エッジでは、サーバーのように計算資源やメモリを増設できません。モデルが大きいと、格納できないだけでなく、重みをメモリから読み出す回数と転送量が増えます。Deep Compression はニューラルネットワークが計算集約的であると同時にメモリ集約的だと説明し、特にメモリアクセスのエネルギーが支配的になり得る点を問題にしています。したがって「FLOPs が減ったか」だけでなく、重みがオンチップ SRAM に収まるか、対象ランタイムが疎行列や低ビット演算を本当に使えるかを測ります。

三系統の選択は、削る場所で決まります。既存ネットワークの構造を大きく変えたくないなら量子化、重みの中に明らかな冗長性があるなら枝刈り、演算器やレイテンシの制約が厳しく、より小さい構造を再設計できるなら蒸留が候補です。枝刈り後の疎な行列は、保存量が減っても不規則なインデックス参照を生みます。密行列用の高速カーネルしかない実機では、理論上の削減がそのまま速度になりません。

目的先に見る指標主な注意点
格納量を下げる重みのバイト数、コード表のオーバーヘッド圧縮形式を実行時に展開するか
レイテンシを下げる実機の推論時間、キャッシュミス疎行列・低ビット用カーネルの有無
電力を下げるメモリ転送量、推論あたりの消費エネルギーDRAMアクセスが残っていないか

仕組み

元の重みを ww、代表値集合を c1,…,ckc_1, \ldots, c_k、量子化後の番号を q(w)q(w) とすると、保存値は cq(w)c_{q(w)} です。

各番号に log⁡2k\log_2 k ビットを使う単純化した場合、元の nn 個の重みが bb ビットだったときの保存量の比は次で見積もれます。

r=nbnlog⁡2k+kbr = \frac{nb}{n\log_2 k + kb}

nn は結合数、bb は元のビット幅、kk は共有する代表値の数です。分母には全結合の番号だけでなく、代表値表 kbkb も含まれます。代表値を学習中に更新する trained quantization では、同じ代表値へ割り当てられた重みの勾配をまとめ、代表値を再調整します。これに対して post-training quantization(PTQ)は学習済みの浮動小数点モデルへ後から量子化を施します。量子化誤差を学習に織り込む quantization-aware training(QAT)は、推論時の低精度化を模擬しながら学習するため、追加学習のコストと引き換えに精度を守りやすい選択です。

蒸留は、教師モデルの出力分布や中間表現を手掛かりに、より小さい生徒モデルを学習します。削る対象は個々の結合やビット幅ではなく、層数・チャネル数などを含むモデルそのものです。教師の予測を正解ラベルだけでなく学習信号として使えるため、単純に小さく設計したモデルより精度を保てる場合がありますが、教師を用意して学習し直す工程が必要です。

Deep Compression 論文の主張は、枝刈りと trained quantization が互いを邪魔せず、Huffman 符号化を加えた三段構成で保存量を下げるというものです。AlexNet と VGG-16 では、論文の実験条件で 35〜49 倍の圧縮を報告しています。この数値を任意のモデルや現行ランタイムの速度保証として扱わず、対象ハードウェアで再測定します。

試験でどう問われるか

問われ方正解に寄る条件引っかけ
三手法と削る対象の対応枝刈り=冗長な結合、量子化=ビット幅、蒸留=小さいモデルへの知識移転三つとも重みをゼロにする手法とする
PTQ と QAT の比較PTQ は学習後に適用、QAT は量子化を模擬して学習に織り込むPTQ は必ず再学習が必要とする
圧縮後も遅くなる理由疎な参照や非対応カーネルでは、FLOPs削減が実測レイテンシに直結しないパラメータ数が減れば必ず高速化するとする
エッジでのボトルネック重みのメモリ帯域、キャッシュ適合、低ビット演算の対応を確認する演算回数だけを測って消費電力を断定する
Deep Compression の範囲枝刈り・trained quantization・Huffman 符号化の三段構成同論文が蒸留を提案したと混ぜる

実装で確かめる

次のコードは、代表値を四つに固定する単純な PTQ の例です。量子化後の二乗誤差を実際に計算し、保存時には各要素を 32 ビット浮動小数点で持つ代わりに番号で持てることを確認します。実運用では、重みだけでなく活性化の範囲、演算カーネル、キャリブレーションデータも評価対象です。

import numpy as np

w = np.array([-1.2, -0.7, -0.1, 0.2, 0.8, 1.1], dtype=np.float32)
centroids = np.array([-1.0, -0.4, 0.2, 1.0], dtype=np.float32)
index = np.abs(w[:, None] - centroids[None, :]).argmin(axis=1)
w_q = centroids[index]
print("index:", index.tolist())
print("mse:", float(np.mean((w - w_q) ** 2)))

この例の番号列は重みの値そのものではありません。復元時に代表値表と組み合わせるため、代表値表の管理コストと、番号参照を処理できる実装が必要です。数値誤差だけで合否を決めず、実機のレイテンシ、ピークメモリ、帯域、消費電力を同じ入力で比較します。

取り違えやすいもの

用語切り分け
枝刈り結合数を減らす。構造化されていない疎性は、対応カーネルがなければ速度に出にくい
量子化数値表現のビット幅を減らす。PTQ は後処理、QAT は量子化を学習に織り込む
蒸留教師の知識を小さい生徒モデルへ移す。圧縮対象はネットワーク構造そのもの
Huffman 符号化値やインデックスの出現頻度を利用する可逆な格納圧縮。演算量を直接減らす手法ではない
低ランク分解行列を低ランク因子へ分ける別の近似。枝刈りや量子化と同一視しない

選択の順番は、まず許容精度とモデル更新の自由度を決め、次に対象ハードウェアが使える表現を確認します。既存モデルを短時間で配布したいなら PTQ、量子化誤差が精度を壊すなら QAT、構造と学習工程を変更できるなら蒸留や枝刈りを比較します。枝刈りと量子化は併用できますが、圧縮率の足し算として扱わず、再学習後の精度と実測値で判断します。

想起チェック

枝刈り・量子化・蒸留がそれぞれ主に削るものは何か

枝刈りは冗長な結合、量子化は数値のビット幅、蒸留は教師の知識を移した小さいモデルそのものです。

PTQ と QAT の工程上の違いは何か

PTQ は学習済みモデルへ後から量子化を適用します。QAT は推論時の量子化を学習中に模擬し、量子化誤差を含めてパラメータを調整します。

枝刈りでパラメータ数が減っても速度が変わらないことがあるのはなぜか

疎なインデックス参照を処理するカーネルがない、またはメモリアクセスのオーバーヘッドが大きい場合、理論上の演算削減が実機のレイテンシへ現れないためです。

Deep Compression の三段構成に蒸留は含まれるか

含まれません。論文が扱うのは枝刈り、trained quantization、Huffman 符号化です。蒸留は別の軽量化系統として切り分けます。

出典