Elastic Algorithm Service (EAS) SDK memungkinkan Anda memanggil layanan model dengan cara yang sederhana dan stabil. Topik ini menjelaskan metode-metode dari EAS SDK untuk Java serta menyediakan contoh kode untuk kasus penggunaan umum seperti input dan output string, input dan output tensor, layanan antrian, serta kompresi data permintaan.
Tambahkan dependensi
Untuk mengintegrasikan EAS SDK untuk Java dalam proyek Anda, tambahkan dependensi eas-sdk di file pom.xml. Untuk informasi tentang versi terbaru SDK, kunjungi repositori Maven. Contoh kode:
<dependency>
<groupId>com.aliyun.openservices.eas</groupId>
<artifactId>eas-sdk</artifactId>
<version>2.0.20</version>
</dependency>Mulai versi 2.0.5, SDK mendukung layanan antrian, yang mengelola prioritas untuk permintaan asinkron. Untuk menggunakan layanan antrian tanpa masalah kompatibilitas, tambahkan versi yang diperlukan dari dependensi berikut:
<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>Antarmuka
Kelas PredictClient
Ini merupakan kelas klien utama yang dapat digunakan untuk mengonfigurasi informasi layanan, mengirim permintaan, serta menerima hasil prediksi.
Antarmuka | Deskripsi |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Menyesuaikan URL permintaan. |
|
|
|
|
|
|
|
|
|
|
|
|
Kelas HttpConfig
Digunakan untuk mengonfigurasi parameter koneksi HTTP tingkat rendah, seperti timeout, jumlah thread, dan kolam koneksi.
Antarmuka | Deskripsi |
|
|
|
|
|
|
|
|
|
|
|
|
| Mengembalikan kode status panggilan terakhir. |
| Mengembalikan pesan kesalahan panggilan terakhir. |
Kelas TFRequest
Digunakan untuk membangun data masukan bagi model TensorFlow.
Antarmuka | Deskripsi |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Kelas QueueClient
Digunakan untuk berinteraksi dengan layanan antrian EAS guna menghasilkan, mengonsumsi, dan mengelola data.
Antarmuka | Deskripsi |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Menghentikan layanan antrian. |
Kelas DataFrame
Objek enkapsulasi untuk item data dalam layanan antrian.
Antarmuka | Deskripsi |
|
|
|
|
|
|
Demo
Use string input and output
Jika Anda menggunakan prosesor kustom untuk menerapkan model, seperti model Predictive Model Markup Language (PMML), konten permintaan sering diformat sebagai string. Contoh kode:
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 {
// Mulai dan inisialisasi klien. Instance PredictClient dibagikan oleh beberapa permintaan. Jangan buat instance PredictClient untuk setiap permintaan.
PredictClient client = new PredictClient(new HttpConfig());
client.setToken("YWFlMDYyZDNmNTc3M2I3MzMwYmY0MmYwM2Y2MTYxMTY4NzBkNzdj****");
// Untuk menggunakan fitur koneksi langsung VPC, panggil metode setDirectEndpoint.
// Contoh: client.setDirectEndpoint("pai-eas-vpc.cn-shanghai.aliyuncs.com");
// Anda harus mengaktifkan fitur koneksi langsung VPC dan mengonfigurasi vSwitch di konsol PAI. Setelah Anda mengaktifkan fitur ini, Anda dapat memanggil layanan tanpa perlu melewati gateway, yang meningkatkan stabilitas dan performa.
// Catatan: Untuk memanggil layanan menggunakan gateway, gunakan titik akhir yang dimulai dengan ID pengguna Anda. Untuk mendapatkan titik akhir, temukan layanan yang ingin Anda panggil di halaman EAS-Online Model Services dan klik Metode Pemanggilan di kolom Jenis Layanan. Di kotak dialog yang muncul, Anda dapat melihat titik akhir. Untuk memanggil layanan menggunakan fitur koneksi langsung VPC, gunakan titik akhir dalam format pai-eas-vpc.{region_id}.aliyuncs.com.
client.setEndpoint("182848887922****.vpc.cn-shanghai.pai-eas.aliyuncs.com");
client.setModelName("scorecard_pmml_example");
// Tentukan string input.
String request = "[{\"money_credit\": 3000000}, {\"money_credit\": 10000}]";
System.out.println(request);
// EAS mengembalikan string.
try {
String response = client.predict(request);
System.out.println(response);
} catch (Exception e) {
e.printStackTrace();
}
// Tutup klien.
client.shutdown();
return;
}
}Kode contoh sebelumnya melakukan langkah-langkah berikut:
Panggil metode
PredictClientuntuk membuat klien untuk layanan. Jika beberapa layanan terlibat, buat beberapa klien.Konfigurasikan parameter token, titik akhir, dan nama model untuk klien.
Buat variabel request tipe STRING sebagai masukan dan panggil metode
client.predictuntuk mengirim permintaan HTTP. Layanan mengembalikan parameter response.
Use TensorFlow input and output
Jika layanan Anda menggunakan model TensorFlow, input harus menggunakan format TFRequest dan output harus menggunakan format TFResponse. Contoh kode:
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());
// Untuk menggunakan fitur koneksi langsung VPC, panggil metode setDirectEndpoint.
// Contoh: client.setDirectEndpoint("pai-eas-vpc.cn-shanghai.aliyuncs.com");
// Anda harus mengaktifkan fitur koneksi langsung VPC dan mengonfigurasi vSwitch di konsol PAI. Setelah Anda mengaktifkan fitur ini, Anda dapat memanggil layanan tanpa perlu melewati gateway, yang meningkatkan stabilitas dan performa.
// Catatan: Untuk memanggil layanan menggunakan gateway, gunakan titik akhir yang dimulai dengan ID pengguna Anda. Untuk mendapatkan titik akhir, temukan layanan yang ingin Anda panggil di halaman EAS-Online Model Services dan klik Metode Pemanggilan di kolom Jenis Layanan. Di kotak dialog yang muncul, Anda dapat melihat titik akhir. Untuk memanggil layanan menggunakan fitur koneksi langsung VPC, gunakan titik akhir dalam format pai-eas-vpc.{region_id}.aliyuncs.com.
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("Hasil Prediksi: [");
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("Waktu yang Dihabiskan: " + (endTime - startTime) + "ms");
client.shutdown();
}
}Kode contoh sebelumnya melakukan langkah-langkah berikut:
Panggil metode
PredictClientuntuk membuat klien untuk layanan. Jika beberapa layanan terlibat, buat beberapa klien.Konfigurasikan parameter token, titik akhir, dan nama model untuk klien.
Kemas input menggunakan kelas TFRequest dan output menggunakan kelas TFResponse.
Gunakan layanan antrian
Gunakan kelas QueueClient untuk mengimplementasikan layanan antrian. Contoh kode:
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 {
/** Buat klien untuk layanan antrian. */
String queueEndpoint = "18*******.cn-hangzhou.pai-eas.aliyuncs.com";
String inputQueueName = "test_queue_service";
String sinkQueueName = "test_queue_service/sink";
String queueToken = "test-token";
/** Buat antrian input. Setelah Anda menambahkan data ke antrian input, layanan inferensi secara otomatis membaca data permintaan dari antrian input. */
QueueClient inputQueue =
new QueueClient(queueEndpoint, inputQueueName, queueToken, new HttpConfig(), new QueueUser());
/** Buat antrian output. Setelah layanan inferensi memproses data input, hasilnya ditulis ke antrian output. */
QueueClient sinkQueue =
new QueueClient(queueEndpoint, sinkQueueName, queueToken, new HttpConfig(), new QueueUser());
/** Bersihkan data dalam antrian. Gunakan dengan hati-hati. */
inputQueue.clear();
sinkQueue.clear();
/** Tambahkan data ke antrian input. */
int count = 10;
for (int i = 0; i < count; ++i) {
String data = Integer.toString(i);
inputQueue.put(data.getBytes(), null);
/** Layanan antrian mendukung antrian multi-prioritas. Anda dapat memanggil metode put untuk mengatur prioritas data. Prioritas default adalah 0. */
// inputQueue.put(data.getBytes(), 0L, null);
}
/** Panggil metode watch untuk berlangganan data antrian output. Ukuran jendela adalah 5. */
WebSocketWatcher watcher = sinkQueue.watch(0L, 5L, false, true, null);
/** Anda dapat mengonfigurasi parameter WatchConfig untuk menentukan jumlah percobaan ulang, interval percobaan ulang (dalam detik), dan apakah akan mencoba ulang tanpa batas. Jika Anda tidak mengonfigurasi parameter WatchConfig, jumlah percobaan ulang default adalah 3 dan interval percobaan ulang default adalah 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));
/** Dapatkan data output. */
for (int i = 0; i < count; ++i) {
try {
/** Panggil metode getDataFrame untuk mendapatkan data bertipe DataFrame. Jika tidak ada data yang tersedia, metode ini akan memblokir hingga data tersedia. */
byte[] data = watcher.getDataFrame().getData();
System.out.println("[watch] data = " + new String(data));
} catch (RuntimeException ex) {
System.out.println("[watch] error = " + ex.getMessage());
break;
}
}
/** Tutup watcher. Setiap klien hanya dapat memiliki satu watcher. Jika Anda tidak menutup watcher, kesalahan akan dilaporkan saat Anda membuat klien lain untuk layanan antrian. */
watcher.close();
Thread.sleep(2000);
JSONObject attrs = sinkQueue.attributes();
System.out.println(attrs.toString());
/** Tutup klien. */
inputQueue.shutdown();
sinkQueue.shutdown();
}
}Kode contoh sebelumnya melakukan langkah-langkah berikut:
Panggil metode
QueueClientuntuk membuat klien untuk layanan antrian. Pastikan Anda membuat antrian masukan dan antrian keluaran, yang diperlukan untuk layanan inferensi.Panggil metode
put()untuk mengirim data ke antrian masukan dan metodewatch()untuk berlangganan data dalam antrian keluaran.CatatanUntuk kemudahan demonstrasi, contoh ini mengirim data dan berlangganan data dalam thread yang sama. Dalam implementasi aktual Anda, Anda dapat mengirim data dan berlangganan data dalam thread yang berbeda.
Kompres data permintaan
Jika ukuran data permintaan besar, EAS SDK memungkinkan Anda mengompres data dalam format Zlib atau Gzip sebelum dikirim ke server. Untuk menggunakan fitur kompresi data, konfigurasikan parameter rpc.decompressor saat menerapkan layanan.
Contoh konfigurasi untuk penerapan layanan:
"metadata": {
"rpc": {
"decompressor": "zlib"
}
}Contoh kode untuk mengirim data terkompresi:
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{
// Mulai dan inisialisasi klien.
PredictClient client = new PredictClient(new HttpConfig());
client.setEndpoint("18*******.cn-hangzhou.pai-eas.aliyuncs.com");
client.setModelName("echo_compress");
client.setToken("YzZjZjQwN2E4NGRkMDMxNDk5NzhhZDcwZDBjOTZjOGYwZDYxZGM2****");
// Anda juga dapat mengatur kompresor ke Compressor.Gzip.
client.setCompressor(Compressor.Zlib);
// Tentukan string input.
String request = "[{\"money_credit\": 3000000}, {\"money_credit\": 10000}]";
System.out.println(request);
// EAS mengembalikan string.
String response = client.predict(request);
System.out.println(response);
// Tutup klien.
client.shutdown();
return;
}
}Referensi
Kode status dalam respons menunjukkan apakah permintaan berhasil. Untuk informasi lebih lanjut, lihat Lampiran: Kode Status.
Untuk informasi tentang metode lain untuk memanggil layanan model, lihat Metode untuk Memanggil Layanan.