Float16および混合精度モデル
Float16および混合精度モデルの作成
Section titled “Float16および混合精度モデルの作成”モデルをfloat32からfloat16に変換すると、モデルサイズが(最大で半分に)減少し、一部のGPUでパフォーマンスが向上する可能性があります。多少の精度低下があるかもしれませんが、多くのモデルでは新しい精度は許容範囲内です。float16変換にはチューニングデータは不要であるため、量子化よりも好まれる場合があります。
Float16変換
Section titled “Float16変換”次の手順に従って、モデルをfloat16に変換します。
-
onnxとonnxconverter-commonをインストールします
pip install onnx onnxconverter-common -
pythonで
convert_float_to_float16関数を使用します。import onnxfrom onnxconverter_common import float16model = onnx.load("path/to/model.onnx")model_fp16 = float16.convert_float_to_float16(model)onnx.save(model_fp16, "path/to/model_fp16.onnx")
Float16ツールの引数
Section titled “Float16ツールの引数”変換されたモデルが機能しない場合や精度が低い場合は、追加の引数を設定する必要がある場合があります。
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.0、nan、inf、および-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_precisionimport 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")混合精度ツールの引数
Section titled “混合精度ツールの引数”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を返す関数。rtolとatolの代わり、またはそれに加えて使用できます。rtol,atol: 検証に使用される絶対許容誤差と相対許容誤差。詳細については、numpy.allcloseを参照してください。keep_io_types: モデルの入出力をfloat32のままにするかどうか。
混合精度ツールは、演算子のクラスターをfloat16に変換することで機能します。クラスターが失敗した場合、半分に分割され、両方のクラスターが独立して試行されます。ツールが動作すると、クラスターサイズの視覚化が出力されます。