EAS SDKを使用すると、シンプルで安定した方法でモデルサービスを呼び出すことができます。 このトピックでは、EAS SDK for Javaのメソッドについて説明し、文字列入力と出力、テンソル入力と出力、キューサービス、リクエストデータ圧縮などの一般的なユースケースのサンプルコードを提供します。
依存関係の追加
EAS SDK for Javaをプロジェクトに統合するには、pom.xmlファイルにeas-sdk依存関係を追加します。 SDKの最新バージョンについては、Mavenリポジトリをご参照ください。 サンプルコード:
<dependency>
<groupId>com.aliyun.openservices.eas</groupId>
<artifactId>eas-sdk</artifactId>
<version>2.0.14</version>
</dependency>
バージョン2.0.5以降、SDKは非同期リクエストの優先度を管理するキューサービスをサポートしています。 互換性の問題なしにキューサービスを使用するには、次の依存関係の必要なバージョンを追加します。
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.5.1</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.1</version>
</dependency>
変更方法
クラス | 移動方法 | 説明 |
PredictClient |
|
|
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
| 説明: リクエストのURLをカスタマイズします。 | |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
HttpConfig |
|
|
|
| |
|
| |
|
| |
|
| |
|
| |
| 最後の呼び出しのステータスコードを返します。 | |
| 最後の呼び出しのエラーメッセージを返します。 | |
TFRequest |
|
|
|
| |
|
| |
TFResponse |
|
|
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
QueueClient |
|
|
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
| 説明: キューサービスを停止します。 | |
DataFrame |
|
|
|
| |
|
|
デモ
文字列入力と出力の使用
PMML (Predictive model Markup Language) モデルなどのモデルをデプロイするためにカスタムプロセッサを使用する場合、リクエストコンテンツは文字列としてフォーマットされることがよくあります。 サンプルコード:
import com.aliyun.openservices.eas.predict.http.PredictClient;
import com.aliyun.openservices.eas.predict.http.HttpConfig;
public class TestString {
public static void main(String[] args) throws Exception {
// Start and initialize a client. A PredictClient instance is shared by multiple requests. Do not create a PredictClient instance for each request.
PredictClient client = new PredictClient(new HttpConfig());
client.setToken("YWFlMDYyZDNmNTc3M2I3MzMwYmY0MmYwM2Y2MTYxMTY4NzBkNzdj****");
// To use the VPC direct connection feature, call the setDirectEndpoint method.
// Example: client.setDirectEndpoint("pai-eas-vpc.cn-shanghai.aliyuncs.com");
// You must enable the VPC direct connection feature and configure a vSwitch in the PAI console. After you enable the feature, you can call the service without the need to passing a gateway, which improves stability and performance.
// Note: To call a service by using a gateway, use the endpoint that starts with your user ID. To obtain the endpoint, find the service that you want to call on the EAS-Online Model Services page and click Invocation Method in the Service Type column. In the dialog box that appears, you can view the endpoint. To call a service by using the VPC direct connection feature, use the endpoint in the pai-eas-vpc.{region_id}.aliyuncs.com format.
client.setEndpoint("182848887922****.vpc.cn-shanghai.pai-eas.aliyuncs.com");
client.setModelName("scorecard_pmml_example");
// Define the input string.
String request = "[{\"money_credit\": 3000000}, {\"money_credit\": 10000}]";
System.out.println(request);
// EAS returns a string.
try {
String response = client.predict(request);
System.out.println(response);
} catch (Exception e) {
e.printStackTrace();
}
// Close the client.
client.shutdown();
return;
}
}
上記のサンプルコードは、次の手順を実行します。
PredictClient
メソッドを呼び出して、サービスのクライアントを作成します。 複数のサービスが関係する場合は、複数のクライアントを作成します。クライアントのトークン、エンドポイント、モデル名のパラメーターを設定します。
入力としてSTRING型のrequest変数を作成し、
client.predict
メソッドを呼び出してHTTPリクエストを送信します。 サービスはresponseパラメーターを返します。
TensorFlow入出力の使用
サービスがTensorFlowモデルを使用している場合、入力はTFRequest形式を使用し、出力はTFResponse形式を使用する必要があります。 サンプルコード:
import java.util.List;
import com.aliyun.openservices.eas.predict.http.PredictClient;
import com.aliyun.openservices.eas.predict.http.HttpConfig;
import com.aliyun.openservices.eas.predict.request.TFDataType;
import com.aliyun.openservices.eas.predict.request.TFRequest;
import com.aliyun.openservices.eas.predict.response.TFResponse;
public class TestTF {
public static TFRequest buildPredictRequest() {
TFRequest request = new TFRequest();
request.setSignatureName("predict_images");
float[] content = new float[784];
for (int i = 0; i < content.length; i++) {
content[i] = (float) 0.0;
}
request.addFeed("images", TFDataType.DT_FLOAT, new long[]{1, 784}, content);
request.addFetch("scores");
return request;
}
public static void main(String[] args) throws Exception {
PredictClient client = new PredictClient(new HttpConfig());
// To use the VPC direct connection feature, call the setDirectEndpoint method.
// Example: client.setDirectEndpoint("pai-eas-vpc.cn-shanghai.aliyuncs.com");
// You must enable the VPC direct connection feature and configure a vSwitch in the PAI console. After you enable the feature, you can call the service without the need to passing a gateway, which improves stability and performance.
// Note: To call a service by using a gateway, use the endpoint that starts with your user ID. To obtain the endpoint, find the service that you want to call on the EAS-Online Model Services page and click Invocation Method in the Service Type column. In the dialog box that appears, you can view the endpoint. To call a service by using the VPC direct connection feature, use the endpoint in the pai-eas-vpc.{region_id}.aliyuncs.com format.
client.setEndpoint("182848887922****.vpc.cn-shanghai.pai-eas.aliyuncs.com");
client.setModelName("mnist_saved_model_example");
client.setToken("YTg2ZjE0ZjM4ZmE3OTc0NzYxZDMyNmYzMTJjZTQ1YmU0N2FjMTAy****");
long startTime = System.currentTimeMillis();
int count = 1000;
for (int i = 0; i < count; i++) {
try {
TFResponse response = client.predict(buildPredictRequest());
List<Float> result = response.getFloatVals("scores");
System.out.print("Predict Result: [");
for (int j = 0; j < result.size(); j++) {
System.out.print(result.get(j).floatValue());
if (j != result.size() - 1) {
System.out.print(", ");
}
}
System.out.print("]\n");
} catch (Exception e) {
e.printStackTrace();
}
}
long endTime = System.currentTimeMillis();
System.out.println("Spend Time: " + (endTime - startTime) + "ms");
client.shutdown();
}
}
上記のサンプルコードは、次の手順を実行します。
PredictClient
メソッドを呼び出して、サービスのクライアントを作成します。 複数のサービスが関係する場合は、複数のクライアントを作成します。クライアントのトークン、エンドポイント、モデル名のパラメーターを設定します。
TFRequestクラスを使用して入力をカプセル化し、TFResponseクラスを使用して出力をカプセル化します。
キューサービスの使用
キューサービスを実装するには、QueueClientクラスを使用します。 サンプルコード:
import com.alibaba.fastjson.JSONObject;
import com.aliyun.openservices.eas.predict.http.HttpConfig;
import com.aliyun.openservices.eas.predict.http.QueueClient;
import com.aliyun.openservices.eas.predict.queue_client.QueueUser;
import com.aliyun.openservices.eas.predict.queue_client.WebSocketWatcher;
public class DemoWatch {
public static void main(String[] args) throws Exception {
/** Create a client for the queue service. */
String queueEndpoint = "18*******.cn-hangzhou.pai-eas.aliyuncs.com";
String inputQueueName = "test_queue_service";
String sinkQueueName = "test_queue_service/sink";
String queueToken = "test-token";
/** Create the input queue. After you add data to the input queue, the inference service automatically reads the request data from the input queue. */
QueueClient inputQueue =
new QueueClient(queueEndpoint, inputQueueName, queueToken, new HttpConfig(), new QueueUser());
/** Create the output queue. After the inference service processes the input data, the result is written to the output queue. */
QueueClient sinkQueue =
new QueueClient(queueEndpoint, sinkQueueName, queueToken, new HttpConfig(), new QueueUser());
/** Clear data in the queue. Use with caution. */
inputQueue.clear();
sinkQueue.clear();
/** Add data to the input queue. */
int count = 10;
for (int i = 0; i < count; ++i) {
String data = Integer.toString(i);
inputQueue.put(data.getBytes(), null);
/** The queue service supports multi-priority queues. You can call the put method to set the data priority. The default priority is 0. */
// inputQueue.put(data.getBytes(), 0L, null);
}
/** Call the watch method to subscribe to the data of the output queue. The window size is 5. */
WebSocketWatcher watcher = inputQueue.watch(0L, 5L, false, true, null);
/** You can configure the WatchConfig parameter to specify the number of retries, the retry interval (in seconds), and whether to retry indefinitely. If you do not configure the WatchConfig parameter, the default number of retries is 3 and the default retry interval is 5. */
// WebSocketWatcher watcher = sink_queue.watch(0L, 5L, false, true, null, new WatchConfig(3, 1));
// WebSocketWatcher watcher = sink_queue.watch(0L, 5L, false, true, null, new WatchConfig(true, 10));
/** Obtain output data. */
for (int i = 0; i < count; ++i) {
try {
/** Call the getDataFrame method to obtain data of the DataFrame type. If no data is available, the method blocks until data is available. */
byte[] data = watcher.getDataFrame().getData();
System.out.println("[watch] data = " + new String(data));
} catch (RuntimeException ex) {
System.out.println("[watch] error = " + ex.getMessage());
break;
}
}
/** Close the watcher. Each client can have only one watcher. If you do not close a watcher, an error is reported when you create another client for the queue service. */
watcher.close();
Thread.sleep(2000);
JSONObject attrs = sinkQueue.attributes();
System.out.println(attrs.toString());
/** Close the client. */
inputQueue.shutdown();
sinkQueue.shutdown();
}
}
上記のサンプルコードは、次の手順を実行します。
QueueClient
メソッドを呼び出して、キューサービス用のクライアントを作成します。 推論サービスに必要な入力キューと出力キューを必ず作成してください。put()
メソッドを呼び出して入力キューにデータを送信し、watch()
メソッドを呼び出して出力キューのデータをサブスクライブします。説明説明の便宜上、この例ではデータを送信し、同じスレッドでデータをサブスクライブします。 実際の実装では、さまざまなスレッドでデータを送信したり、データをサブスクライブしたりできます。
要求データの圧縮
リクエストデータのサイズが大きい場合、EAS SDKを使用すると、データをサーバーに送信する前にZlibまたはGzip形式でデータを圧縮できます。 データ圧縮機能を使用するには、サービスのデプロイ時にrpc.de compressor
パラメーターを設定します。
サービス展開のサンプル構成:
"metadata": {
"rpc": {
"decompressor": "zlib"
}
}
圧縮データを送信するためのサンプルコード:
package com.aliyun.openservices.eas.predict;
import com.aliyun.openservices.eas.predict.http.Compressor;
import com.aliyun.openservices.eas.predict.http.PredictClient;
import com.aliyun.openservices.eas.predict.http.HttpConfig;
public class TestString {
public static void main(String[] args) throws Exception{
// Start and initialize a client.
PredictClient client = new PredictClient(new HttpConfig());
client.setEndpoint("18*******.cn-hangzhou.pai-eas.aliyuncs.com");
client.setModelName("echo_compress");
client.setToken("YzZjZjQwN2E4NGRkMDMxNDk5NzhhZDcwZDBjOTZjOGYwZDYxZGM2****");
// You can also set the compressor to Compressor.Gzip.
client.setCompressor(Compressor.Zlib);
// Define the input string.
String request = "[{\"money_credit\": 3000000}, {\"money_credit\": 10000}]";
System.out.println(request);
// EAS returns a string.
String response = client.predict(request);
System.out.println(response);
// Close the client.
client.shutdown();
return;
}
}
関連ドキュメント
レスポンスのステータスコードは、リクエストが成功したかどうかを示します。 詳細については、「付録: ステータスコード」をご参照ください。
モデルサービスを呼び出す他のメソッドについては、 サービスを呼び出すメソッド。