次の方法で共有


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

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

通常、モデル推論には、データ入力パイプラインとモデル推論という 2 つの主要部分があります。 データ入力パイプラインはデータ I/O 入力の負荷が重く、モデルの推論は計算の負荷が重いです。 ワークフローのボトルネックは簡単に判断できます。 いくつかのアプローチを次に示します。

  • モデルを簡易モデルに縮小して、1 秒あたりの例を測定します。 完全なモデルと簡易モデル間の終了時間の差が最小限の場合、データ入力パイプラインがボトルネックである可能性があります。それ以外の場合は、モデル推論がボトルネックです。
  • GPU でモデル推論を実行する場合は、GPU 使用率のメトリックを検査します。 GPU 使用率が継続的に高くない場合は、データ入力パイプラインがボトルネックになっている可能性があります。

データ入力パイプラインを最適化する

GPU を使用すると、モデル推論の実行速度を効率的に最適化できます。 GPU や他のアクセラレータの高速化にともない、データ入力パイプラインが要求に対応できることが重要になります。 データはデータ入力パイプラインによって Spark データフレームに読み込まれて変換され、モデル推論への入力として読み込まれます。 データ入力がボトルネックである場合は、次のヒントを参考に I/O スループットを向上させます。

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

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

    TensorFlow の場合、Azure 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 の場合、Azure Databricks では DataLoader クラスを使用することをお勧めします。 batch_size を設定してバッチ処理を、num_workers を設定して並列データ読み込みを実行できます。

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