Topik ini menjelaskan cara menggunakan Elastic Algorithm Service (EAS) dari Platform for AI (PAI) untuk inferensi model ketika EasyRec tidak digunakan untuk pelatihan model. Untuk informasi lebih lanjut, lihat Prosesor EasyRec.
Informasi latar belakang
Dalam beberapa kasus, pengguna mungkin telah menyelesaikan pelatihan model di lingkungan lain, tetapi mereka tetap ingin memanfaatkan layanan berperforma tinggi yang disediakan oleh EAS untuk inferensi model.
Langkah 1: Siapkan model
Pastikan Anda telah mengekspor model TensorFlow dalam format SavedModel dan mengunggahnya ke lokasi penyimpanan yang dapat diakses, seperti bucket dari Object Storage Service (OSS) Alibaba Cloud.
Langkah 2: Konfigurasikan file konfigurasi layanan
Buat file konfigurasi layanan, seperti echo.json, dan konfigurasikan parameter terkait. Kode berikut memberikan contoh file konfigurasi.
bizdate=$1
cat << EOF > echo.json
{
"name":"ali_rec_rnk_no_fg",
"metadata": {
"instance": 2,
"rpc": {
"enable_jemalloc": 1,
"max_queue_size": 100
}
},
"cloud": {
"computing": {
"instance_type": "ecs.g7.large"",
"instances": null
}
},
"model_config": {
"fg_mode": "bypass"
},
"processor": "easyrec-1.9",
"processor_envs": [
{
"name": "INPUT_TILE",
"value": "2"
}
],
"storage": [
{
"mount_path": "/home/admin/docker_ml/workspace/model/",
"oss": {
"path": "oss://easyrec/ali_rec_sln_acc_rnk/20221122/export/final/"
}
}
],
"warm_up_data_path": "oss://easyrec/ali_rec_sln_acc_rnk/rnk_warm_up.bin"
}
EOF
Dalam contoh ini, nilai bidang fg_mode diatur ke bypass, yang menunjukkan bahwa pembangkitan fitur (FG) tidak diaktifkan dan hanya model TensorFlow yang diterapkan.
Tabel berikut menjelaskan parameter utama. Untuk informasi tentang parameter lainnya, lihat Parameter untuk Penyebaran JSON.
Parameter | Diperlukan | Deskripsi | Contoh |
processor | Ya | Nama prosesor EasyRec. | "processor": "easyrec" |
fg_mode | Ya | Mode rekayasa fitur. Nilai valid:
| "fg_mode": "tf" |
outputs | Ya | Nama variabel keluaran model TensorFlow. Contoh: probs_ctr. Pisahkan beberapa nama dengan koma (,). Untuk mendapatkan nama variabel keluaran, jalankan perintah TensorFlow saved_model_cli. | "outputs":"probs_ctr,probs_cvr" |
save_req | Tidak | Menentukan apakah akan menyimpan file data yang dikembalikan ke direktori model. File-file tersebut dapat digunakan untuk pemanasan dan pengujian performa. Nilai valid:
| "save_req": "false" |
Parameter terkait Item Feature Cache | |||
period | Ya | Interval pembaruan fitur item. Unit: menit. Jika pembaruan terjadi setiap beberapa hari, atur parameter ini ke nilai lebih besar dari satu hari (misalnya, 2880), karena fitur item diperbarui setiap hari saat layanan diperbarui. | "period": 2880 |
remote_type | Ya | Sumber data fitur item. Nilai valid:
| "remote_type": "hologres" |
tables | Tidak | Tabel fitur item. Parameter ini diperlukan hanya jika Anda mengatur parameter remote_type ke hologres. Parameter ini berisi bidang-bidang berikut:
Jika Anda ingin membaca data fitur item dari beberapa tabel, konfigurasikan parameter ini dalam format berikut: "tables": [{"key":"table1", ...},{"key":"table2", ...}] Jika tabel memiliki kolom duplikat, kolom tabel berikutnya akan menimpa kolom tabel sebelumnya. | "tables": { "key": "goods_id", "name": "public.ali_rec_item_feature" } |
url | Tidak | Titik akhir untuk menghubungkan ke Hologres. | "url": "postgresql://LTAI****************:yourAccessKeySecret@hgprecn-cn-xxxxx-cn-hangzhou-vpc.hologres.aliyuncs.com:80/bigdata_rec" |
Parameter terkait FeatureStore | |||
fs_project | Tidak | Nama proyek FeatureStore. Parameter ini diperlukan jika Anda menggunakan FeatureStore. Untuk informasi lebih lanjut, lihat Konfigurasikan proyek FeatureStore. | "fs_project": "fs_demo" |
fs_model | Tidak | Nama fitur model di FeatureStore. | "fs_model": "fs_rank_v1" |
fs_entity | Tidak | Nama entitas fitur di FeatureStore. | "fs_entity": "item" |
region | Tidak | Wilayah tempat layanan FeatureStore diterapkan. | "region": "cn-beijing" |
access_key_id | Tidak | ID AccessKey layanan FeatureStore. | "access_key_id": "LTAI****************" |
access_key_secret | Tidak | Rahasia AccessKey layanan FeatureStore. | "access_key_secret": "yourAccessKeySecret" |
load_feature_from_offlinestore | Tidak | Menentukan apakah akan mendapatkan data fitur offline dari toko data offline di FeatureStore. Nilai valid:
| "load_feature_from_offlinestore": True |
Parameter terkait siaran otomatis | |||
INPUT_TILE | Tidak | Mengaktifkan siaran otomatis untuk array fitur item. Jika nilai fitur item (seperti user_id) sama dalam permintaan, tentukan nilainya sekali dan itu akan diduplikasi ke dalam array.
Catatan
| "processor_envs": [ { "name": "INPUT_TILE", "value": "2" } ] |
Langkah 3: Terapkan layanan
Gunakan EASCMD untuk menerapkan file konfigurasi layanan yang dibuat pada langkah sebelumnya.
# Jalankan perintah penyebaran.
eascmd create echo.json
# eascmd -i <AccessKeyID> -k <AccessKeySecret> -e <endpoint> create echo.json
# Jalankan perintah pembaruan.
eascmd modify ali_rec_rnk_no_fg -s echo.jsonPeriksa log keluaran untuk memastikan layanan berhasil diterapkan. Setelah layanan diterapkan, Anda dapat memperoleh alamat akses layanan.
Langkah 4: Panggil layanan
Panggil Layanan Model EasyRec
Jika Anda menggunakan mode bypass, Anda dapat menggunakan Java SDK atau Python SDK untuk memanggil layanan model berdasarkan format permintaan prosesor EasyRec.
Contoh Menggunakan Java SDK
Sebelum menggunakan Java SDK, Anda harus mengonfigurasi lingkungan Maven. Untuk informasi tentang cara mengonfigurasi lingkungan Maven, lihat SDK untuk Java. Contoh kode untuk memanggil layanan ali_rec_rnk_no_fg:
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 TestEasyRec {
public static TFRequest buildPredictRequest() {
TFRequest request = new TFRequest();
request.addFeed("user_id", TFDataType.DT_STRING,
new long[]{5}, new String []{ "u0001", "u0001", "u0001"});
request.addFeed("age", TFDataType.DT_FLOAT,
new long[]{5}, new float []{ 18.0f, 18.0f, 18.0f});
// Catatan: Jika Anda mengatur parameter INPUT_TILE ke 2, Anda dapat menyederhanakan kode dengan cara berikut:
// request.addFeed("user_id", TFDataType.DT_STRING,
// new long[]{1}, new String []{ "u0001" });
// request.addFeed("age", TFDataType.DT_FLOAT,
// new long[]{1}, new float []{ 18.0f});
request.addFeed("item_id", TFDataType.DT_STRING,
new long[]{5}, new String []{ "i0001", "i0002", "i0003"});
request.addFetch("probs");
return request;
}
public static void main(String[] args) throws Exception {
PredictClient client = new PredictClient(new HttpConfig());
// Panggil setDirectEndpoint untuk mengakses layanan menggunakan saluran koneksi langsung virtual private cloud (VPC).
// client.setDirectEndpoint("pai-eas-vpc.cn-shanghai.aliyuncs.com");
// Anda perlu membuat saluran koneksi langsung VPC di halaman EAS dari konsol PAI.
// Dibandingkan dengan menggunakan gateway, menggunakan saluran koneksi langsung meningkatkan stabilitas dan performa.
client.setEndpoint("yourAccessKeySecretx.vpc.cn-hangzhou.pai-eas.aliyuncs.com");
client.setModelName("ali_rec_rnk_no_fg");
client.setToken("");
long startTime = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
try {
TFResponse response = client.predict(buildPredictRequest());
// probs: nama bidang keluaran. Anda dapat menjalankan perintah cURL untuk melihat masukan dan keluaran model.
// curl yourAccessKeySecretx.vpc.cn-hangzhou.pai-eas.aliyuncs.com -H "Authorization:{token}"
List<Float> result = response.getFloatVals("probs");
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();
}
}Contoh Menggunakan Python SDK
Untuk informasi lebih lanjut tentang cara menggunakan Python SDK, lihat SDK untuk Python. Karena performanya terbatas, kami sarankan Anda menggunakan Python SDK hanya untuk tujuan debugging. Contoh kode untuk memanggil layanan ali_rec_rnk_no_fg:
#!/usr/bin/env python
from eas_prediction import PredictClient
from eas_prediction import StringRequest
from eas_prediction.tf_request_pb2 import TFRequest
if __name__ == '__main__':
client = PredictClient('http://yourAccessKeySecretx.vpc.cn-hangzhou.pai-eas.aliyuncs.com', 'ali_rec_rnk_no_fg')
client.set_token('')
client.init()
req = TFRequest()
req.add_feed('user_id', [3], TFRequest.DT_STRING, ['u0001'] * 3)
req.add_feed('age', [3], TFRequest.DT_FLOAT, [18.0] * 3)
# Catatan: Jika Anda mengatur parameter INPUT_TILE ke 2, Anda dapat menyederhanakan kode dengan cara berikut:
# req.add_feed('user_id', [1], TFRequest.DT_STRING, ['u0001'])
# req.add_feed('age', [1], TFRequest.DT_FLOAT, [18.0])
req.add_feed('item_id', [5], TFRequest.DT_STRING,
['i0001', 'i0002', 'i0003'])
for x in range(0, 100):
resp = client.predict(req)
print(resp)Anda juga dapat membuat permintaan layanan kustom. Untuk informasi lebih lanjut, lihat Sintaks Permintaan.
Langkah 5: Pantau dan optimalkan performa layanan
Setelah layanan diterapkan, kami sarankan Anda menguji performa layanan dan mengoptimalkan performa serta stabilitas layanan berdasarkan hasil pengujian.
Ringkasan
Dengan mengikuti langkah-langkah di atas, Anda dapat menggunakan EAS untuk inferensi model tanpa menggunakan EasyRec untuk pelatihan model.