コンテンツにスキップ

Float16および混合精度モデル

Float16および混合精度モデルの作成

Section titled “Float16および混合精度モデルの作成”

モデルをfloat32からfloat16に変換すると、モデルサイズが(最大で半分に)減少し、一部のGPUでパフォーマンスが向上する可能性があります。多少の精度低下があるかもしれませんが、多くのモデルでは新しい精度は許容範囲内です。float16変換にはチューニングデータは不要であるため、量子化よりも好まれる場合があります。

次の手順に従って、モデルをfloat16に変換します。

  1. onnxとonnxconverter-commonをインストールします

    pip install onnx onnxconverter-common

  2. pythonでconvert_float_to_float16関数を使用します。

    import onnx
    from onnxconverter_common import float16
    model = onnx.load("path/to/model.onnx")
    model_fp16 = float16.convert_float_to_float16(model)
    onnx.save(model_fp16, "path/to/model_fp16.onnx")

変換されたモデルが機能しない場合や精度が低い場合は、追加の引数を設定する必要がある場合があります。

convert_float_to_float16(model, min_positive_val=1e-7, max_finite_val=1e4, keep_io_types=False,
disable_shape_infer=False, op_block_list=None, node_block_list=None)
  • model: 変換するONNXモデル。
  • min_positive_val, max_finite_val: 定数値はこれらの範囲にクリップされます。0.0naninf、および-infは変更されません。
  • keep_io_types: モデルの入出力をfloat32のままにするかどうか。
  • disable_shape_infer: onnxの形状/型推論の実行をスキップします。形状推論がクラッシュする場合、形状/型がモデルにすでに存在する場合、または型が不要な場合(型は、サポートされていない/ブロックされた演算子にキャスト演算子が必要な場所を決定するために使用されます)に役立ちます。
  • op_block_list: float32のままにする演算子タイプのリスト。デフォルトではfloat16.DEFAULT_OP_BLOCK_LISTのリストを使用します。このリストには、ONNX Runtimeでfloat16がサポートされていない演算子が含まれています。
  • node_block_list: float32のままにするノード名のリスト。

注意: ブロックされた演算子の前後には、float16/float32へのキャストが挿入されます。現在、2つのブロックされた演算子が隣接している場合でもキャストは挿入され、冗長なペアが作成されます。ORTは実行時にこのペアを最適化するため、結果は完全な精度のままになります。

float16変換で結果が思わしくない場合は、ほとんどの演算子をfloat16に変換し、一部をfloat32のままにすることができます。auto_mixed_precision.auto_convert_mixed_precisionツールは、特定の精度レベルを維持しながらスキップする演算子の最小セットを見つけます。モデルのサンプル入力を提供する必要があります。

ONNX RuntimeのCPUバージョンはfloat16演算子をサポートしておらず、ツールは精度低下を測定する必要があるため、混合精度ツールはGPUを搭載したデバイスで実行する必要があります

from onnxconverter_common import auto_mixed_precision
import onnx
model = onnx.load("path/to/model.onnx")
# xがモデルへの入力であると仮定します
feed_dict = {'input': x.numpy()}
model_fp16 = auto_convert_mixed_precision(model, feed_dict, rtol=0.01, atol=0.001, keep_io_types=True)
onnx.save(model_fp16, "path/to/model_fp16.onnx")
auto_convert_mixed_precision(model, feed_dict, validate_fn=None, rtol=None, atol=None, keep_io_types=False)
  • model: 変換するONNXモデル。
  • feed_dict: 変換中にモデルの精度を測定するために使用されるテストデータ。形式はInferenceSession.runに似ています(入力名から値へのマップ)
  • validate_fn: 2つのnumpy配列のリスト(それぞれfloat32モデルと混合精度モデルの出力)を受け入れ、結果が十分に近ければTrue、そうでなければFalseを返す関数。rtolatolの代わり、またはそれに加えて使用できます。
  • rtol, atol: 検証に使用される絶対許容誤差と相対許容誤差。詳細については、numpy.allcloseを参照してください。
  • keep_io_types: モデルの入出力をfloat32のままにするかどうか。

混合精度ツールは、演算子のクラスターをfloat16に変換することで機能します。クラスターが失敗した場合、半分に分割され、両方のクラスターが独立して試行されます。ツールが動作すると、クラスターサイズの視覚化が出力されます。