Platform for AI (PAI) のElastic Algorithm Service (EAS) は、モデルウォームアップ機能を提供して、オンラインモデルサービスに送信される最初の要求を処理するのに必要な時間を短縮します。 この機能は、モデルサービスがオンラインで公開される前にモデルをウォームアップします。 これにより、モデルサービスがオンラインで公開された直後に期待どおりに機能します。 このトピックでは、モデルのウォームアップ機能の使用方法について説明します。
背景情報
初期要求がモデルサービスに送信されると、モデルはランタイム環境に基づいて初期化操作を実行します。 ほとんどの場合、初期化動作は、完了するのに長い時間を必要とする。 その結果、モデルサービスのスケールアウトまたは更新時にリクエストタイムアウトエラーが発生することがあります。 たとえば、Javaプロセッサを初めて起動すると、Java仮想マシン (JVM) がコールドスタートするため、最初のいくつかの要求を処理するのに多くの時間が必要になります。 特定のTensorFlowモデルサービスを初めて呼び出すと、システムはモデル関連のファイルとパラメータをメモリにロードします。 このプロセスには大量の時間が必要です。 その結果、最初のいくつかのリクエストの応答時間が長くなり、408タイムアウトエラーまたは450エラーが返される可能性があります。 上記の問題を解決するために、EASはモデルのウォームアップ機能を提供します。 この機能は、モデルサービスがオンラインで公開される前にウォームアッププロセスとして呼び出され、モデルサービスがオンラインで公開された直後に期待どおりに機能できるようにします。
モデルをウォームアップするために、EASのサービスエンジンは、モデルサービスがオンラインで公開される前に、ウォームアップ要求をそれ自体に送信する。 ウォームアップ要求は、キープアライブ時間の2倍の10秒間隔で送信されます。 あるいは、ウォームアップ要求は、前の要求に対する成功応答が受信された直後に送信されてもよい。 各リクエストファイルは5回連続して送信されます。 モデルサービスの最初のリクエストが10秒以内に処理される場合、それ以降のリクエストは短時間で処理できます。 この場合, 一般的な温度は10 秒未満である. 最初の要求が10秒を超えて処理される必要がある場合、ウォームアップ期間は数十秒かかることがある。
EASのモデルウォームアップ機能を使用するには、ウォームアップ要求ファイルを生成する必要があります。 次に、モデルサービスのデプロイに使用するJSONファイルでウォームアップ要求ファイルを指定します。 モデルサービスを開発したり更新した場合, EASのサービスエンジンは, モデルサービスを暖めるためにホップアップ要求を送る.
モデルのウォームアップ機能を使用する
ウォームアップ要求ファイルを生成するには、モデルサービスがオンラインで公開された後に送信できる要求に基づいて要求ファイルを構築する必要があります。 ウォームアップ要求ファイルは、ウォームアップ処理中に読み出されるか、または呼び出される。 サービスを呼び出すために使用されるEAS SDKを使用して、リクエストファイルを作成できます。 詳細は、「SDK」をご参照ください。 次の例では、モデルのウォームアップ機能を使用してTensorFlowモデルをウォームアップする方法について説明します。
ウォームアップ要求ファイルを生成します。
次の例では、TensorFlowモデルサービスのリクエストファイルを作成する方法を説明するために、Python用EAS SDKとJava用EAS SDKを使用します。 他のタイプのモデルをウォームアップする場合は、対応するSDKを使用して、TensorFlowモデルサービスのリクエストファイルの構築に使用されている方法に基づいてリクエストファイルを構築できます。 入力として文字列を使用するモデルサービスの場合、要求を文字列としてTXTファイルに格納できます。 各TXTファイルには複数のリクエストを含めることができます。 各リクエストはTXTファイルのデータ行を占有します。 EASはファイルフォーマットを自動的に識別し, 様々な形式でホッケーを送信する.
重要テンソールFlow モデルを暖めるために使用された要求のインターネットや出力は, モデルサービスがオンラインを出版した後で送信する必要がある.
次のサンプルコードでは、SDKを使用してTensorFlowモデルサービスのリクエストファイルを作成する方法の例を示します。
SDK for Pythonの使用
#!/usr/bin/env python from eas_prediction import PredictClient from eas_prediction import StringRequest from eas_prediction import TFRequest if __name__ == '__main__': # The sample warm-up request. Construct a warm-up request based on your actual requirements. The inputs and outputs of the requests used for warm-up must be the same as those of the requests that are sent after the model service is published online. req = TFRequest('serving_default') req.add_feed('sentence1', [200, 15], TFRequest.DT_INT32, [1] * 200 * 15) req.add_feed('sentence2', [200, 15], TFRequest.DT_INT32, [1] * 200 * 15) req.add_feed('y', [200, 2], TFRequest.DT_INT32, [2] * 200 * 2) req.add_feed('keep_rate', [], TFRequest.DT_FLOAT, [0.2]) req.add_feed('images', [1, 784], TFRequest.DT_FLOAT, [1] * 784) req.add_fetch('sorted_labels') req.add_fetch('sorted_probs') # print(req.request_data) # Display the request data. with open("warm_up.bin", "wb") as fw : fw.write(req.to_string()); # Save the warm_up.bin file as the warm-up request file.
SDK for Javaの使用
使用するにはEASMavenプロジェクトのJava用SDKには、eas-sdkの <dependencies> への依存pom.xmlファイルを作成します。 Mavenリポジトリの最新バージョンが優先されます。 サンプルコード:
<dependency> <groupId>com.aliyun.openservices.eas</groupId> <artifactId>eas-sdk</artifactId> <version>2.0.13</version> </dependency>
SDK for Javaのサンプルコード:
#!/usr/bin/env python from eas_prediction import PredictClient from eas_prediction import StringRequest from eas_prediction import TFRequest if __name__ == '__main__': # The sample warm-up request. Construct a warm-up request based on your actual requirements. The inputs and outputs of the requests used for warm-up must be the same as those of the requests that are sent after the model service is published online. req = TFRequest('serving_default') req.add_feed('sentence1', [200, 15], TFRequest.DT_INT32, [1] * 200 * 15) req.add_feed('sentence2', [200, 15], TFRequest.DT_INT32, [1] * 200 * 15) req.add_feed('y', [200, 2], TFRequest.DT_INT32, [2] * 200 * 2) req.add_feed('keep_rate', [], TFRequest.DT_FLOAT, [0.2]) req.add_feed('images', [1, 784], TFRequest.DT_FLOAT, [1] * 784) req.add_fetch('sorted_labels') req.add_fetch('sorted_probs') # print(req.request_data) # Display the request data. with open("warm_up.bin", "wb") as fw : fw.write(req.to_string()); # Save the warm_up.bin file as the warm-up request file.
リクエストファイルを確認します。
次のいずれかの方法を使用して、リクエストファイルを確認できます。
方法1: 検証のためにサービス要求を送信する
次のコマンドを実行して、モデルサービスにリクエストを送信します。返されたコンテンツが大きすぎて端末で印刷できない場合は、
-- output <filePath>
フィールドを追加して、結果をファイルに保存できます。curl --data-binary @"</path/to/warmup.bin>" -H 'Authorization: <yourToken>' <serviceAddress>
次のパラメータを実際の値に置き換えます。
</path/to/warmup.bin>: 前の手順で生成されたウォームアップ要求ファイルのパス。
<yourToken>: モデルサービスへのアクセスに使用されるトークン。
<serviceAddress>: モデルサービスのエンドポイント。
方法2: 検証のためにリクエストファイルを解析する
Pythonの使用
from eas_prediction import TFRequest req = TFRequest() with open('/path/to/warm_up1.bin', 'rb') as wm: req.request_data.ParseFromString(wm.read()) print(req.request_data)
Javaを使用する
import com.aliyun.openservices.eas.predict.proto.PredictProtos; import org.apache.commons.io.FileUtils; import java.io.File; public class Test { public static void main(String[] args) throws Exception { File refile = new File("/path/to/warm_up1.bin"); byte[] data = FileUtils.readFileToByteArray(refile); PredictProtos.PredictRequest pb = PredictProtos.PredictRequest.parseFrom(data); System.out.println(pb); } }
モデルサービスを設定します。
生成されたウォームアップ要求ファイルをOSSにアップロードします。
モデルサービスのパラメーターを設定します。
JSON形式のモデル記述ファイルで、モデルサービスのパラメーターを設定します。
{ "name":"warm_up_demo", "model_path":"oss://path/to/model", "warm_up_data_path":"oss://path/to/warm_up_test.bin", // The path of the warm-up request file in OSS. "processor":"tensorflow_cpu_1.15", "metadata":{ "cpu":2, "instance":1, "rpc": { "warm_up_count": 5, // The number of times each warm-up request is sent. If you do not specify a value for this parameter, 5 is used as the default value. } } }
以下のウォームアップパラメータが使用される。 その他のパラメーターについては、「サービスの作成」をご参照ください。
warm_up_data_path: OSSのウォームアップ要求ファイルのパス。 モデルサービスがオンラインで公開される前に、システムは自動的にファイルを検索し、ファイルを使用してモデルをウォームアップします。
warm_up_count: 各ウォームアップ要求が送信された回数。 このパラメーターに値を指定しない場合は、デフォルト値として5が使用されます。
モデルサービスをデプロイまたは更新します。 詳細については、「サービスの作成」または「サービスの変更」をご参照ください。
モデルサービスを展開または更新すると、EASのサービスエンジンがウォームアップ要求を送信してモデルサービスをウォームアップします。
TensorFlowモデルのウォームアップに関するFAQ
発行
実際のビジネスシナリオでは、TensorFlowモデルサービスが更新されると、モデルサービスの安定性が影響を受ける可能性があります。 ウォームアップ機能を追加するために、プロセッサの実装ロジックにモデルサービスを呼び出すための推論関数を追加できます。 ただし、TensorFlowプロセッサにウォームアップ機能が追加されても、前述の問題は残ります。 異なる関係者によって行われたテストでは、新しい入力または出力が関与するたびに、サービスエンジンが要求ファイルをリロードしてモデルをウォームアップすることが示されています。 すべての入力と出力がウォームアップのためにロードされていても、特定の入力と出力が関係している場合は、要求ファイルをリロードするために多くの時間が必要です。
原因
上記の問題は、
session->Run(input, output_tensor_names, {}, &outputs)
に基づいて、各セッションのinputおよびoutput_tensor_namesパラメーターに対してハッシュベースの検証が実行されるために発生します。 入力または出力が変更された場合、サービスエンジンは、ファイルをリロードする必要があるかどうかをチェックせずに、リクエストファイルをリロードします。次のサンプルコードは、サンプルTensorFlowモデルの入力を示しています。
Inputs: threshold: []; DT_FLOAT model_id: []; DT_STRING input_holder: [-1]; DT_STRING
次のサンプルコードは、TensorFlowモデルの出力を示しています。
Outputs: model_version_id: []; DT_STRING sorted_labels: [-1, 3]; DT_STRING sorted_probs: [-1, 3]; DT_FLOAT
次のサンプルのウォームアップ要求が送信されます。
request.addFeed("input_holder",TFDataType.DT_STRING, new long[]{1}, input); request.addFeed("threshold", TFDataType.DT_FLOAT, new long[] {}, th); request.addFeed("model_id", TFDataType.DT_STRING, new long[]{}, model_name); request.addFetch("sorted_labels"); request.addFetch("sorted_probs");
TensorFlowモデルのウォームアップ後、次のリクエストが送信されます。 ウォームアップ要求と比較して、次の要求の出力には追加のパラメータが含まれています。 この場合、リクエストファイルをリロードする必要があります。
request.addFeed("input_holder",TFDataType.DT_STRING, new long[]{1}, input); request.addFeed("threshold", TFDataType.DT_FLOAT, new long[] {}, th); request.addFeed("model_id", TFDataType.DT_STRING, new long[]{}, model_name); request.addFetch("sorted_labels"); request.addFetch("sorted_probs"); request.addFetch("model_version_id"); // An additional parameter is returned.
解決策
各TensorFlowモデルは、実際のサービス要求に基づいてウォームアップする必要があります。 ウォームアップ結果は、指定されたサービス要求の入力と出力にのみ適用されます。 実際のサービス要求に基づいてEASのモデルウォームアップ機能を使用する必要があります。
TensorFlowモデルをウォームアップするには、実際のサービス要求に基づいて
session-> run
コマンドを1回だけ実行します。 一度にアップロードできるウォームアップ要求ファイルは1つだけで、指定した要求の入力と出力を使用してモデルをウォームアップできます。