このガイドでは、Java SDK を使用して Elastic Algorithm Service (EAS) モデルサービスを呼び出す方法を説明するとともに、入出力の例とサンプルプログラムも提供します。
SDK のユースケースと原則については、「サービス呼び出し SDK」をご参照ください。
前提条件
Maven プロジェクトで EAS Java SDK を使用するには、pom.xml ファイルの <dependencies> セクションに eas-sdk 依存関係を追加します。最新バージョンについては、Maven リポジトリを確認してください。
<dependency>
<groupId>com.aliyun.openservices.eas</groupId>
<artifactId>eas-sdk</artifactId>
<version>2.0.20</version>
</dependency>EAS SDK 2.0.5 以降には、マルチプライオリティ非同期キューサービス用の QueueService クライアント機能が含まれています。この機能を使用し、依存関係の競合を回避するには、次の 2 つの依存関係を追加し、必要に応じてバージョンを調整してください。
<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>クイックスタート
Java SDK でサービスを呼び出すには、次の 3 つのステップに従います。
呼び出し情報の取得:EAS コンソールのサービス詳細ページで、[呼び出し情報] タブに移動して、エンドポイント、サービス名、トークンを取得します。
リクエストタイプの選択とコードの記述:モデルの入力データ形式に基づいて適切な Request/Response クラスを選択し、以下の最小限の例を使用してコードを記述します。
説明組み込みプロセッサ を使用してサービスをデプロイした場合、SDK は対応する入出力クラスを提供します。 たとえば、組み込みの TensorFlow プロセッサ は
TFRequestに対応します。 詳細については、組み込みプロセッサの各プロセッサのドキュメントをご参照ください。実行と検証:クライアントプログラムを実行し、レスポンスを検証します。 エラーが発生した場合は、トラブルシューティングガイドをご参照ください。
次のコードは、文字列リクエストのエンドツーエンドにおける最小限の例です。 その他の例については、プログラム例をご参照ください。
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 {
PredictClient client = new PredictClient(new HttpConfig());
// VPC 専用接続を使用するには、setDirectEndpoint メソッドを呼び出します。形式は通常 {uid}.vpc.{region-id}.pai-eas.aliyuncs.com です。
client.setDirectEndpoint("182848887922****.vpc.cn-shanghai.aliyuncs.com");
// EAS サービスのパブリックエンドポイント。形式は通常 {uid}.{region-id}.pai-eas.aliyuncs.com です。
// client.setEndpoint("182848887922****.cn-shanghai.pai-eas.aliyuncs.com");
// EAS サービスの名前。
client.setModelName("your_service_name");
client.setToken("YOUR_SERVICE_TOKEN");
// リクエストパス。完全なリクエスト URL は http://<endpoint>/api/direct/<modelName>/<requestPath> です。
client.setRequestPath("your_custom_path");
// リクエストボディを作成します。サポートされている入力クラスは SDK によって異なります。この例では String を使用します。
String request = "[{}]";
String response = client.predict(request);
System.out.println(response);
client.shutdown();
}
}API リファレンス
Java SDK には、次のクラスが用意されています:
グループ | クラスの説明 |
メインクライアントクラス |
|
接続設定 |
|
入出力 |
|
キューサービス |
|
PredictClient クラス
メインのクライアントクラスです。サービス情報を設定し、リクエストを送信して予測結果を取得します。
API | 説明 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| カスタムのリクエスト URL を設定します。 |
|
|
|
|
|
|
|
|
|
|
|
|
HttpConfig クラス
タイムアウト、スレッド数、コネクションプールなど、基盤となる HTTP 接続パラメーターを設定します。
API | 説明 |
|
|
|
重要 このタイムアウトは、接続の確立後にのみ適用されます。 |
|
重要 このタイムアウトは、接続の確立、データ転送、サーバー処理を含むリクエストライフサイクル全体を対象とします。 |
|
|
|
|
|
|
|
|
| 直近の API 呼び出しのステータスコードを返します。 |
| 直近の API 呼び出しのステータスメッセージを返します。 |
TFRequest クラス
TensorFlow モデルの入力データを構築します。
API | 説明 |
|
|
|
|
|
|
TFResponse クラス
TensorFlow モデルの予測から出力データを解析し、アクセスします。
API | 説明 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QueueClient クラス
EAS キューサービスと連携して、データの生成、消費、管理を行います。
API | 説明 |
|
|
|
|
|
|
|
|
|
|
|
|
|
重要
|
|
|
|
|
| キューサービスへの接続を閉じます。 |
DataFrame クラス
キューサービスからのデータ項目のラッパーです。
API | 説明 |
|
|
|
|
|
|
コード例
同期推論の例
サービスの入出力形式に一致する例を選択してください。
文字列
カスタムプロセッサでサービスをデプロイした場合、通常は文字列を使用してサービスを呼び出します。 次の例に示すように、この方法は PMML モデルサービスで一般的です。
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 {
// クライアントを初期化します。 クライアントオブジェクトは共有してください。 リクエストごとに新しいクライアントオブジェクトを作成しないでください。
PredictClient client = new PredictClient(new HttpConfig());
client.setToken("YWFlMDYyZDNmNTc3M2I3MzMwYmY0MmYwM2Y2MTYxMTY4NzBkNzdj****");
// 直接ネットワーク接続を使用するには、setDirectEndpoint メソッドを呼び出します。
// 例:client.setDirectEndpoint("182848887922****.vpc.cn-shanghai.aliyuncs.com");
// 直接ネットワーク接続を有効にするには、EAS コンソールでこの機能を有効にし、EAS サービスへのアクセスに使用するソース vSwitch を指定する必要があります。 これにより、ゲートウェイがバイパスされ、ソフトウェアロードバランシングを介してサービスインスタンスに直接アクセスできるため、安定性とパフォーマンスが向上します。
// 注:標準のゲートウェイアクセスでは、ユーザー ID から始まるエンドポイントを使用します。 このエンドポイントは、EAS コンソールのサービスの [Call Information] で確認できます。 直接ネットワーク接続の場合は、182848887922****.vpc.{region_id}.aliyuncs.com という形式のドメイン名を使用します。
client.setEndpoint("182848887922****.vpc.cn-shanghai.pai-eas.aliyuncs.com");
client.setModelName("scorecard_pmml_example");
// 入力文字列を定義します。
String request = "[{\"money_credit\": 3000000}, {\"money_credit\": 10000}]";
System.out.println(request);
// EAS からレスポンス文字列を取得します。
try {
String response = client.predict(request);
System.out.println(response);
} catch (Exception e) {
e.printStackTrace();
}
// クライアントをシャットダウンします。
client.shutdown();
return;
}
}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());
// 直接ネットワーク接続を使用するには、setDirectEndpoint メソッドを呼び出します。 エンドポイントの形式は {uid}.vpc.{region_id}.aliyuncs.com です。
// client.setDirectEndpoint("182848887922****.vpc.cn-shanghai.aliyuncs.com");
// 標準のゲートウェイアクセスでは、ユーザー ID から始まるエンドポイントを使用します。 このエンドポイントは、EAS コンソールのサービスにある [Call Information] で確認できます。
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();
}
}キューサービスの例
キューサービスにアクセスするには、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 {
/** キューサービス クライアントを作成します。 */
String queueEndpoint = "18*******.cn-hangzhou.pai-eas.aliyuncs.com";
String inputQueueName = "test_queue_service";
String sinkQueueName = "test_queue_service/sink";
String queueToken = "test-token";
/** 入力キュー。 推論サービスは、このキューからリクエストデータを自動的に読み取ります。 */
QueueClient inputQueue =
new QueueClient(queueEndpoint, inputQueueName, queueToken, new HttpConfig(), new QueueUser());
/** 出力キュー。 推論サービスが入力データを処理した後、結果をこのキューに書き込みます。 */
QueueClient sinkQueue =
new QueueClient(queueEndpoint, sinkQueueName, queueToken, new HttpConfig(), new QueueUser());
/** キューデータをクリアします。 慎重に使用してください。 */
inputQueue.clear();
sinkQueue.clear();
/** 入力キューにデータを追加します。 */
int count = 10;
for (int i = 0; i < count; ++i) {
String data = Integer.toString(i);
inputQueue.put(data.getBytes(), null);
/** キューサービスは複数の優先度をサポートしています。 put メソッドを使用して、データの優先度を設定できます。 デフォルトの優先度は 0 です。 */
// inputQueue.put(data.getBytes(), 0L, null);
}
/** watch メソッドを使用して、出力キューからデータをサブスクライブします。 ウィンドウサイズは 5 です。 */
WebSocketWatcher watcher = sinkQueue.watch(0L, 5L, false, true, null);
/** WatchConfig パラメーターを使用して、リトライ回数、リトライ間隔 (秒単位)、および無期限にリトライするかどうかをカスタマイズします。 WatchConfig を構成しない場合、システムはデフォルトで 5 秒間隔で 3 回リトライします。 */
// WebSocketWatcher watcher = sinkQueue.watch(0L, 5L, false, true, null, new WatchConfig(3, 1));
// WebSocketWatcher watcher = sinkQueue.watch(0L, 5L, false, true, null, new WatchConfig(true, 10));
/** 出力データを取得します。 */
for (int i = 0; i < count; ++i) {
try {
/** getDataFrame() メソッドで DataFrame データを取得します。 この呼び出しは、データが利用可能になるまでブロックされます。 */
byte[] data = watcher.getDataFrame().getData();
System.out.println("[watch] data = " + new String(data));
} catch (RuntimeException ex) {
System.out.println("[watch] error = " + ex.getMessage());
break;
}
}
/** watcher オブジェクトを閉じます。 各クライアントインスタンスは 1 つの watcher オブジェクトのみをサポートします。 watcher を閉じないと、次回の実行時にエラーが発生します。 */
watcher.close();
Thread.sleep(2000);
JSONObject attrs = sinkQueue.attributes();
System.out.println(attrs.toString());
/** クライアントをシャットダウンします。 */
inputQueue.shutdown();
sinkQueue.shutdown();
}
}Java SDK を使用したサービスの呼び出しには、次の手順が含まれます:
QueueClientインターフェイスを使用してキューサービス クライアント オブジェクトを作成します。 推論サービスを作成する場合は、入力キュー オブジェクトと出力キュー オブジェクトも作成する必要があります。put()関数を使用して入力キューにデータを送信し、watch()関数を使用して出力キューからデータをサブスクライブします。説明本番環境では、データの送信とサブスクリプションに、それぞれ別のスレッドを使用する必要があります。 この例では、デモンストレーションのために、これらの操作を同じスレッドで実行します。
リクエストデータの圧縮
大量のデータを含むリクエストの場合、EAS は、サーバーサイドに送信する前に Zlib または Gzip 形式を使用してデータを圧縮することに対応しています。 この機能を有効にするには、サービス構成で rpc.decompressor を指定する必要があります。
サービス構成は次のとおりです:
"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{
// クライアントを初期化します。
PredictClient client = new PredictClient(new HttpConfig());
client.setEndpoint("18*******.cn-hangzhou.pai-eas.aliyuncs.com");
client.setModelName("echo_compress");
client.setToken("YzZjZjQwN2E4NGRkMDMxNDk5NzhhZDcwZDBjOTZjOGYwZDYxZGM2****");
// Compressor.Gzip を使用することもできます。
client.setCompressor(Compressor.Zlib);
// 入力文字列を定義します。
String request = "[{\"money_credit\": 3000000}, {\"money_credit\": 10000}]";
System.out.println(request);
// EAS からレスポンス文字列を取得します。
String response = client.predict(request);
System.out.println(response);
// クライアントをシャットダウンします。
client.shutdown();
return;
}
}トラブルシューティング
Java SDK の呼び出し例外のトラブルシューティングについては、認証、ルーティング、接続、およびサーバー側のエラーに関する一般的な問題を含め、「サービス呼び出し SDK」の「呼び出し例外のトラブルシューティング」セクションをご参照ください。
サービスステータスコード、エラーメッセージの意味、および推奨されるアクションの完全なリストについては、「付録:サービスステータスコードと一般的なエラー」をご参照ください。