ディープラーニングモデル推論パフォーマンスチューニングガイド

このセクションでは、Databricks でのモデル推論のデバッグとパフォーマンス チューニングに関するヒントをいくつか紹介します。 概要については、「 ディープラーニング推論ワークフロー」を参照してください。

通常、モデル推論には、データ入力パイプラインとモデル推論という 2 つの主要な部分があります。 データ入力パイプラインはデータ I/O 入力に重く、モデルの推論は計算に重きを置いています。 ワークフローのボトルネックを特定するのは簡単です。 ここにいくつかのアプローチがあります:

  • モデルを自明なモデルに減らし、毎秒の例を測定します。 完全なモデルと自明なモデルの間のエンドツーエンドの時間の差が最小である場合は、データ入力パイプラインがボトルネックである可能性が高く、それ以外の場合はモデル推論がボトルネックになります。

  • GPU でモデル推論を実行する場合は、GPU 使用率 メトリクスを確認します。 GPU 使用率が継続的に高くない場合は、データ入力パイプラインがボトルネックになっている可能性があります。

データ入力パイプライン の最適化

GPUを使用すると、モデル推論の実行速度を効率的に最適化できます。 GPU やその他のアクセラレータが高速化するにつれて、データ入力パイプラインが需要に追いつくことが重要です。 データ入力パイプラインは、データを Spark データフレームに読み取り、変換して、モデル推論の入力として読み込みます。 データ入力がボトルネックになっている場合は、I/O スループットを向上させるためのヒントをいくつか紹介します。

  • バッチあたりの最大レコード数を設定します。 最大レコード数が多いほど、レコードがメモリに収まる限り、UDF 関数を呼び出すための I/O オーバーヘッドを削減できます。 バッチ サイズを設定するには、次の構成を設定します。

    spark.conf.set("spark.sql.execution.arrow.maxRecordsPerBatch", "5000")
    
  • データをバッチでロードし、pandas UDF で入力データを前処理するときにプリフェッチします。

    TensorFlow の場合、Databricks では tf.data API の使用を推奨しています。 map 関数で num_parallel_calls を設定し、プリフェッチとバッチ処理のために prefetchbatch を呼び出すことで、マップを並行して解析できます。

    dataset.map(parse_example, num_parallel_calls=num_process).prefetch(prefetch_size).batch(batch_size)
    

    PyTorch の場合、 Databricks では DataLoader クラスを使用することをお勧めします。 バッチ処理の batch_size と並列データ読み込みの num_workers を設定できます。

    torch.utils.data.DataLoader(images, batch_size=batch_size, num_workers=num_process)