MRが楽しい

MRやVRについて学習したことを書き残す

Unity AIのドキュメントを読む その46(モデルの量子化)

本日はUnityの技術調査枠です。
Unity AIのドキュメントを読みながら実際に操作を試して記事に残します。

Unity AI

以下のUnity AIのドキュメントを試しながら実行時のキャプチャをしていきます。
docs.unity3d.com

モデルの量子化

推論エンジンはモデル定数と重みを32ビット値としてインポートします。
ディスクとメモリ上のモデルのストレージサイズを削減するにはモデルの量子化を使用します。

量子化では重みの値は低精度の形式で表現されます。
実行時に、推論エンジンはこれらの値をより高精度の形式に変換してから演算を処理します。

量子化タイプ

推論エンジンは以下の量子化タイプをサポートしています。

量子化タイプ 値あたりのビット数 説明
なし 32ビット 値を完全な精度で保存します。
Float16 16ビット 値を16ビット浮動小数点に変換します。多くの場合、元のモデルに近い精度が維持されます。
Uint8 8ビット 最大値と最小値の範囲で値を線形量子化します。モデルによっては精度に大きな影響を与える可能性があります。

値あたりのビット数を減らすと、推論速度に大きな影響を与えることなくモデルのディスク使用量とメモリ使用量を削減できます。
推論エンジンはDense、MatMul、Convなどの特定の演算への入力として使用される浮動小数点型の重みのみを量子化します。整数定数は変更されません。

量子化がモデルの精度に与える影響はモデルの種類によって異なります。
モデルの量子化を評価する最良の方法は実際にテストを行い、パフォーマンスと精度を比較することです。

読み込んだモデルの量子化

コード内でモデルを量子化するには以下の手順に従います。

1.ModelQuantizer APIを使用して、モデルに量子化を適用します。
2.ModelWriter APIを使用して、量子化されたモデルをシリアル化してディスクに保存します。

using Unity.InferenceEngine;

void QuantizeAndSerializeModel(Model model, string path)
{
    // 推論エンジンは量子化時にメモリ内のソースモデルを編集します。
    ModelQuantizer.QuantizeWeights(QuantizationType.Float16, ref model);

    // 量子化されたモデルをファイルにシリアル化します。
    ModelWriter.Save(path, model);
}