精度の制御

データタイプの選択は推論ランタイムにとって不可欠であり、パフォーマンスやその他のメトリックに大きな影響を与える可能性があります。通常、次の 2 種類の精度が識別されます。

  1. モデルストレージ精度 (IR 精度)

  2. モデル推論精度

推論の精度は IR の精度に依存しなくなりました。つまり、ユーザーにはモデルのパフォーマンスと精度のバランスを見つけるいくつかのオプションがあります。

基本的に、IR の精度は重みの精度を下げることでモデルを圧縮しますが、デバイスがモデルを実行する方法には影響しません。この変更により、デフォルトでは GPU 上で高性能モデルを実行できなかったり、デバイス間の動作が異なったりする多くの問題が解消されました。

このガイドでは、推論の精度を制御する方法に注目します。また、小さなデータタイプほど計算帯域幅が高くなる傾向があり、ハードウェアには小さなデータタイプのみ効率的な積和演算を行う特別なブロックが備わっていることが多いため、精度を低くすることがパフォーマンス上重要です (例: GPU 上のインテル® Xe マトリクス・エクステンション (インテル® XMX)) および CPU 上のインテル® アドバンスト・マトリクス・エクステンション (インテル® AMX) は f32 をサポートしません)。また、テンソルのバイト・サイズが小さいため、I/O 操作に必要なメモリーも少なくなります。このガイドでは、推論の精度を制御する方法に注目します。

実行モデル

ov::hint::execution_mode は、ユーザーが最高の精度を維持したいか (ACCURACY モード)、またはデバイスがパフォーマンス上の理由で精度を低下させる最適化を実行するか (PERFORMANCE モード) を制御する高レベルのヒントです。

  • ACCURACY モードでは、デバイスは浮動小数点テンソルをより小さい浮動小数点タイプに変換できないため、デバイスは精度メトリックを、デバイスの実際の機能と比較して、トレーニング後に取得した元の値にできるだけ近づけようとします。これは、デバイスが f32 精度をサポートしている場合、ほとんどのデバイスがその精度で推論を行うことを意味します。

  • PERFORMANCE モードでは、デバイスはより小さいデータタイプに変換し、精度に影響を与える最適化を適用できますが、それでも精度の損失を最小限に抑えようとし、場合によっては混合精度の実行を行うことがあります。

OpenVINO 最適化ツールやその他の方法でモデルが量子化されている場合、デバイスにそのタイプのハードウェア・アクセラレーションがあれば、量子化された操作はターゲットの整数精度で実行されます。例えば、デバイスが浮動小数点タイプと比較して 8 ビットのデータタイプで高い計算帯域幅を提供する場合、量子化された int8 プリミティブは、ACCURACY モードと PERFORMANCE モードの両方で int8 精度で実行されます。一方、int8 データタイプのハードウェア・アクセラレーションを備えていないデバイスは、操作を浮動小数点精度に保ち、正確な浮動小数点タイプは、execution_mode プロパティーと inference_precision プロパティーの影響を受けます。

コード例:

import openvino as ov
import openvino.properties.hint as hints

core = ov.Core()
# in case of Accuracy
core.set_property(
    "CPU",
    {hints.execution_mode: hints.ExecutionMode.ACCURACY},
)
# in case of Performance
core.set_property(
    "CPU",
    {hints.execution_mode: hints.ExecutionMode.PERFORMANCE},
)
    ov::Core core;
    // in case of Accuracy
    core.set_property("CPU", ov::hint::execution_mode(ov::hint::ExecutionMode::ACCURACY));
    // in case of Performance
    core.set_property("CPU", ov::hint::execution_mode(ov::hint::ExecutionMode::PERFORMANCE));

推論精度

ov::hint::inference_precision 精度は、ユーザーが必要とする正確な精度を指定できる下位レベルのプロパティーですが、移植性は低くなります。例えば、CPU は一部のプラットフォームで f32 推論精度と bf16 をサポートし、GPU は f32f16 をサポートするため、ユーザーが複数のデバイスを使用するアプリケーションを必要とする場合、これらすべての組み合わせを手動で処理するか、より高い精度の execution_mode プロパティーを使用して OV が自動的に実行できるようにします。もう 1 つは、inference_precision もヒントであることから、指定された値がランタイムで確実に使用される保証がないことです (現在のデバイスに必要なハードウェア機能がない場合)。

ランタイムでは量子化を実行できないため、すべてのデバイスは inference_precision 属性の値として浮動小数点データタイプ (f32f16bf16) のみをサポートします。