LiteRT の GPU デリゲート

画像処理装置(GPU)を使用して機械学習(ML)モデルを実行する モデルのパフォーマンスとユーザー エクスペリエンスの いくつか見てみましょうLiteRT では GPU や Cloud Logging を ハードウェアドライバを通じて、他の専用プロセッサに 代理人。LiteRT ML で GPU の使用を有効にする 次のような利点があります。

  • 速度 - GPU は超並列処理の高スループットに対応 説明します。この設計により、ディープ ニューラル ネットワーク(ニューラル ネットワーク)に 膨大な数の演算子で構成され、それぞれが入力テンソルで 並列処理できるため、通常はレイテンシが短縮されます。イン GPU でモデルを実行すると 新しいリアルタイム アプリケーションを開発できます。
  • 電力効率 - GPU は非常に効率的な手法で ML 計算を実行します。 最適化され、一般的に消費電力と発電量が少なくなります。 同じタスクよりも熱くなります

このドキュメントでは、LiteRT での GPU サポートの概要について説明します。 GPU プロセッサの高度な用途です。P-MAX についての 特定のプラットフォームに GPU サポートを実装する方法については、次のガイドをご覧ください。

GPU ML オペレーションのサポート

TensorFlow ML の演算(ops)には、いくつかの制限があります。 LiteRT GPU デリゲートによって高速化されます。デリゲートは、 16 ビットと 32 ビットの浮動小数点精度での次の演算:

  • ADD
  • AVERAGE_POOL_2D
  • CONCATENATION
  • CONV_2D
  • DEPTHWISE_CONV_2D v1-2
  • EXP
  • FULLY_CONNECTED
  • LOGICAL_AND
  • LOGISTIC
  • LSTM v2 (Basic LSTM only)
  • MAX_POOL_2D
  • MAXIMUM
  • MINIMUM
  • MUL
  • PAD
  • PRELU
  • RELU
  • RELU6
  • RESHAPE
  • RESIZE_BILINEAR v1-3
  • SOFTMAX
  • STRIDED_SLICE
  • SUB
  • TRANSPOSE_CONV

デフォルトでは、すべての演算はバージョン 1 でのみサポートされています。量子化を有効にする support で、該当するバージョン(ADD など)が有効になっている v2 です。

GPU サポートのトラブルシューティング

一部の op が GPU デリゲートでサポートされていない場合、フレームワークは グラフの一部のみを GPU で実行し、残りの部分を CPU で実行します。期限 高コストの CPU/GPU 同期が可能です。 ネットワーク全体を Google Cloud で実行する場合よりも、 使用できます。この場合、アプリケーションによって次のような警告が生成されます。

WARNING: op code #42 cannot be handled by this delegate.

このタイプの障害は実際の事象ではないため、このような障害に対するコールバックはありません。 実行時エラー。GPU デリゲートを使用してモデルの実行をテストする場合、 これらの警告に注意する必要がありますこのような警告の数が多いと モデルが GPU アクセラレーションの使用に最適でないことを示し、 モデルのリファクタリングが必要になることがあります。

サンプルモデル

次のサンプルモデルは、GPU アクセラレーションを利用するように構築されています。 参照とテスト用に提供されています。

GPU の最適化

次の手法を使用すると、モデルの実行時にパフォーマンスを向上させることができます。 GPU ハードウェアで LiteRT GPU デリゲートを使用する場合:

  • 再形成演算 - CPU 上で高速になる一部の演算では、 モバイルデバイスでの GPU にかかる負荷が高くなります再構築オペレーションは、 実行コストが高い(BATCH_TO_SPACESPACE_TO_BATCHSPACE_TO_DEPTH など再構成の使用については、 データ探索にのみ適用されたと考えてください モデルの初期イテレーションに適していますこれらを削除すると、 パフォーマンスが向上します。

  • 画像データ チャンネル - GPU では、テンソルデータは 4 チャンネルに分割されます。 そのため、形状 [B,H,W,5] のテンソルに対する計算は、 形状 [B,H,W,8] のテンソルでは同じですが、 [B,H,W,4]。お使いのカメラ ハードウェアが 4 チャンネル入力をフィードする方がはるかに高速です。 3 チャンネル RGB から 4 チャンネル RGBX へのメモリコピー。

  • モバイル デバイス向けモデル - 最適なパフォーマンスを得るには、 モバイル デバイス向けのネットワーク アーキテクチャで分類器を再トレーニングする。 オンデバイスの推論を最適化することで、レイテンシを大幅に短縮し、 消費電力を削減できます。

高度な GPU サポート

その他の高度な手法を GPU 処理で使用して、 モデルのパフォーマンスが向上します(量子化やシリアル化など)。 以降のセクションでは、これらの手法について詳しく説明します。

量子化モデルの使用

このセクションでは、GPU デリゲートが 8 ビットの量子化モデルを高速化する仕組みについて説明します。 例:

パフォーマンスを最適化するには、浮動小数点入力と浮動小数点演算の両方を持つ 生成します。

仕組み

GPU バックエンドは浮動小数点実行のみをサポートしているため、 モデルに与える方法です。。 大まかな流れは次のとおりです。

  • 定数テンソル(重み/バイアスなど)は一度量子化解除され、 GPU メモリ。このオペレーションは、委任が有効になっているときに LiteRT。

  • GPU プログラムへの入力と出力(8 ビットの量子化されている場合) それぞれの推論で非量子化と量子化が行われます。このオペレーション LiteRT の最適化されたカーネルを使用して CPU で行われます。

  • 量子化シミュレータが演算の間に挿入され、量子化シミュレータが模倣されます。 確認します。このアプローチは、オペレーションがアクティベーションを想定しているモデルに必要です 学習します。

GPU デリゲートを使用してこの機能を有効にする方法については、 次のとおりです。

シリアル化による初期化時間の短縮

GPU デリゲート機能を使用すると、コンパイル済みのカーネルコードから読み込み、 以前の実行からシリアル化され、ディスクに保存されたモデルデータ。この方法では 実行時間が短縮され、起動時間が最大 90% 短縮されます。この改善は ディスク容量を交換して時間を節約できますこの機能を有効にするには いくつかの構成オプションがあります。

C++

    TfLiteGpuDelegateOptionsV2 options = TfLiteGpuDelegateOptionsV2Default();
    options.experimental_flags |= TFLITE_GPU_EXPERIMENTAL_FLAGS_ENABLE_SERIALIZATION;
    options.serialization_dir = kTmpDir;
    options.model_token = kModelToken;

    auto* delegate = TfLiteGpuDelegateV2Create(options);
    if (interpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk) return false;
      

Java

    GpuDelegate delegate = new GpuDelegate(
      new GpuDelegate.Options().setSerializationParams(
        /* serializationDir= */ serializationDir,
        /* modelToken= */ modelToken));

    Interpreter.Options options = (new Interpreter.Options()).addDelegate(delegate);
      

シリアル化機能を使用する場合は、コードが以下の要件を満たすようにしてください。 実装ルール:

  • 他のユーザーがアクセスできないディレクトリにシリアル化データを保存する 。Android デバイスでは、次のコマンドを使用します。 getCodeCacheDir() 現在のアプリケーション専用の場所を指します。
  • モデルトークンは、特定のモデルのデバイスに固有のものである必要があります。Google Chat では モデルトークンを計算するには、 などのライブラリ farmhash::Fingerprint64
で確認できます。