Elastic Algorithm Service (EAS) menyediakan EasyRec processor bawaan untuk menerapkan model rekomendasi yang dilatih dengan EasyRec atau TensorFlow sebagai layanan skoring dengan rekayasa fitur terintegrasi. Processor ini secara bersama mengoptimalkan rekayasa fitur dan model TensorFlow guna menghadirkan layanan skoring berkinerja tinggi. Topik ini menjelaskan cara menerapkan dan memanggil layanan model EasyRec.
Latar Belakang
EasyRec processor adalah layanan inferensi yang dikembangkan berdasarkan spesifikasi processor PAI-EAS (Kembangkan processor kustom menggunakan C atau C++). Processor ini digunakan dalam dua skenario:
Untuk model pembelajaran mendalam yang dilatih dengan Ikhtisar dan konfigurasi pembangkit fitur (FG) dan EasyRec, EasyRec processor secara signifikan meningkatkan kinerja skoring. Hal ini dicapai dengan menyimpan cache fitur item di memori serta mengoptimalkan transformasi fitur dan kinerja inferensi. Solusi ini juga menggunakan FeatureStore untuk mengelola fitur online dan real-time. Dengan memanfaatkan solusi kustom dari platform pengembangan sistem rekomendasi PAI-Rec, mesin PAI-Rec menghasilkan kode yang diperlukan dan menyederhanakan seluruh alur kerja mulai dari pelatihan hingga penerapan. Pendekatan ini mempercepat peluncuran layanan, mengurangi biaya, dan meningkatkan efisiensi pengembangan.
Untuk model yang dilatih dengan EasyRec atau TensorFlow, Anda juga dapat menerapkannya sebagai layanan tanpa menggunakan Feature Generator. Untuk melakukannya, Anda memanggil EasyRec processor dalam mode bypass.
Diagram berikut menggambarkan arsitektur mesin rekomendasi berbasis EasyRec processor.

Catatan: Arsitektur ini mendukung MaxCompute sebagai sumber data offline.
EasyRec processor mencakup modul utama berikut:
Item Feature Cache: Menyimpan cache fitur dari FeatureStore di memori untuk mengurangi overhead jaringan dan beban pada FeatureStore. Cache ini juga mendukung pembaruan inkremental, seperti pembaruan untuk fitur real-time.
Feature Generator: Modul rekayasa fitur ini (Ikhtisar dan konfigurasi pembangkit fitur) menggunakan implementasi yang sama untuk memastikan konsistensi antara pemrosesan fitur offline dan online. Modul ini menerapkan solusi rekayasa fitur terbukti dari Taobao. Untuk informasi lebih lanjut tentang konsep FG, lihat Konsep bidang data, fitur data, dan fitur FG dalam EasyRec. Untuk menyesuaikan dan memperluas operator FG, lihat Sesuaikan operator fitur.
TFModel: Memuat file Saved_Model yang diekspor oleh EasyRec dan menggunakan Blade untuk mengoptimalkan inferensi pada CPU dan GPU.
Modul Feature instrumentation dan Incremental model update: Modul-modul ini biasanya digunakan dalam skenario pelatihan real-time. Untuk informasi lebih lanjut, lihat Pelatihan real-time.
Batasan
Inferensi CPU: Hanya didukung pada keluarga instans tujuan umum g6, g7, dan g8 yang menggunakan CPU Intel.
Inferensi GPU: Didukung pada GPU T4, A10, GU30, L20, 3090, dan 4090, tetapi tidak didukung pada P100.
Untuk detail lebih lanjut, lihat Tujuan umum (seri g).
Daftar versi
EasyRec processor sedang dalam pengembangan aktif. Kami merekomendasikan penggunaan versi terbaru untuk menerapkan layanan inferensi guna memanfaatkan fitur baru dan peningkatan kinerja inferensi.
Langkah 1: Terapkan layanan
Untuk menerapkan layanan model EasyRec menggunakan klien eascmd, Anda harus mengatur tipe processor menjadi easyrec-{version}. Untuk detail tentang penerapan layanan dengan klien, lihat Penerapan layanan: EASCMD. Bagian berikut memberikan contoh file konfigurasi layanan.
Contoh: Library FeatureGenerator baru (fg_mode=normal)
Contoh berikut menunjukkan cara menggunakan tipe node PyOdps3 untuk penerapan. Dalam mode ini, Anda dapat menggunakan versi baru FeatureGenerator, yang menyediakan kumpulan kaya operator transformasi fitur bawaan, memungkinkan Anda menyesuaikan operator FeatureGenerator, mendukung fitur input bertipe kompleks seperti array dan map, serta menangani ketergantungan antar-fitur dalam mode grafik asiklik terarah (DAG).
Contoh ini menggunakan PAI-FeatureStore untuk mengelola data fitur. Dalam skrip, ganti variabel ${fs_project} dan ${fs_model} dengan nilai aktual. Untuk detailnya, lihat Langkah 2: Buat dan terapkan layanan model PAI-EAS.
import json
import os
service_name = 'ali_rec_rnk_with_fg'
config = {
'name': service_name,
'metadata': {
"cpu": 8,
#"cuda": "11.2",
"gateway": "default",
"gpu": 0,
"memory": 32000,
"rolling_strategy": {
"max_unavailable": 1
},
"rpc": {
"enable_jemalloc": 1,
"max_queue_size": 256
}
},
"processor_envs": [
{
"name": "ADAPTE_FG_CONFIG",
"value": "true"
}
],
"model_path": "",
"processor": "easyrec-3.1",
"storage": [
{
"mount_path": "/home/admin/docker_ml/workspace/model/",
"oss": {
"path": "oss://easyrec/ali_rec_sln_acc_rnk/20250722/export/final_with_fg"
}
}
],
# Saat Anda mengubah fg_mode, metode pemanggilan juga harus diubah.
# Jika fg_mode diatur ke normal atau tf, gunakan SDK EasyRecRequest.
# Jika fg_mode diatur ke bypass, gunakan SDK TFRequest.
'model_config': {
'outputs': 'probs_ctr,probs_cvr',
'fg_mode': 'normal',
'steady_mode': True,
'period': 2880,
'access_key_id': f'{o.account.access_id}',
'access_key_secret': f'{o.account.secret_access_key}',
"load_feature_from_offlinestore": True,
'region': 'cn-shanghai',
'fs_project': '${fs_project}',
'fs_model': '${fs_model}',
'fs_entity': 'item',
'featuredb_username': 'guest',
'featuredb_password': '123456',
'log_iterate_time_threshold': 100,
'iterate_featuredb_interval': 5,
'mc_thread_pool_num': 1,
}
}
with open('echo.json', 'w') as output_file:
json.dump(config, output_file)
os.system(f'/home/admin/usertools/tools/eascmd -i {o.account.access_id} -k {o.account.secret_access_key} -e pai-eas.cn-shanghai.aliyuncs.com create echo.json')
# os.system(f'/home/admin/usertools/tools/eascmd -i {o.account.access_id} -k {o.account.secret_access_key} -e pai-eas.cn-shanghai.aliyuncs.com modify {service_name} -s echo.json')Catatan: Ganti nilai parameter featuredb_username dan featuredb_password dengan username dan password yang valid.
Contoh: Mode operator TF untuk FG (fg_mode=tf)
Catatan: Versi operator TF FeatureGenerator hanya mendukung kumpulan fitur bawaan terbatas: id_feature, raw_feature, combo_feature, lookup_feature, match_feature, dan sequence_feature. Operator FeatureGenerator kustom tidak didukung.
Contoh berikut menggunakan skrip shell untuk penerapan. Skrip ini berisi AccessKeyID dan AccessKeySecret dalam teks biasa. Metode ini sederhana tetapi tidak mencakup PAI-FeatureStore atau menjelaskan cara memuat data tabel dari MaxCompute untuk mengurangi beban pada Hologres.
Kami merekomendasikan penggunaan PAI-FeatureStore dan pemuatan data dari MaxCompute. Untuk informasi lebih lanjut, lihat Langkah 2: Buat dan terapkan layanan model PAI-EAS. Perhatikan bahwa dokumen yang dirujuk menunjukkan metode penerapan yang lebih aman menggunakan skrip Python, objek DataWorks bawaan o, dan token Security Token Service (STS) sementara. Dalam contoh tersebut, load_feature_from_offlinestore diatur ke True.
bizdate=$1
# Saat Anda mengubah fg_mode, metode pemanggilan juga harus diubah. Jika fg_mode diatur ke normal atau tf, gunakan SDK EasyRecRequest. Jika fg_mode diatur ke bypass, gunakan SDK TFRequest.
cat << EOF > echo.json
{
"name":"ali_rec_rnk_with_fg",
"metadata": {
"instance": 2,
"rpc": {
"enable_jemalloc": 1,
"max_queue_size": 100
}
},
"cloud": {
"computing": {
"instance_type": "ecs.g7.large",
"instances": null
}
},
"model_config": {
"remote_type": "hologres",
"url": "postgresql://<AccessKeyID>:<AccessKeySecret>@<domain_name>:<port>/<database>",
"tables": [{"name":"<schema>.<table_name>","key":"<index_column_name>","value": "<column_name>"}],
"period": 2880,
"fg_mode": "tf",
"outputs":"probs_ctr,probs_cvr",
},
"model_path": "",
"processor": "easyrec-3.1",
"storage": [
{
"mount_path": "/home/admin/docker_ml/workspace/model/",
"oss": {
"path": "oss://easyrec/ali_rec_sln_acc_rnk/20221122/export/final_with_fg"
}
}
]
}
EOF
# Jalankan perintah penerapan.
eascmd create echo.json
# eascmd -i <AccessKeyID> -k <AccessKeySecret> -e <endpoint> create echo.json
# Jalankan perintah pembaruan.
eascmd update ali_rec_rnk_with_fg -s echo.jsonContoh: Jangan gunakan FeatureGenerator (fg_mode=bypass)
Jika Anda tidak menggunakan FeatureGenerator, susun permintaan sebelum memanggil EasyRec processor. Untuk informasi lebih lanjut, lihat Integrasikan layanan inferensi di PAI-EAS tanpa pelatihan EasyRec.
bizdate=$1
# Saat Anda mengubah fg_mode, metode pemanggilan juga harus diubah. Jika fg_mode diatur ke normal atau tf, gunakan SDK EasyRecRequest. Jika fg_mode diatur ke bypass, gunakan SDK TFRequest.
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-3.1",
"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
# Jalankan perintah penerapan.
eascmd create echo.json
# eascmd -i <AccessKeyID> -k <AccessKeySecret> -e <endpoint> create echo.json
# Jalankan perintah pembaruan.
eascmd update ali_rec_rnk_no_fg -s echo.jsonTabel berikut menjelaskan parameter kunci. Untuk parameter lainnya, lihat Penerapan JSON.
Parameter | Wajib | Deskripsi | Contoh |
processor | Ya | Processor EasyRec. |
|
fg_mode | Ya | Menentukan mode rekayasa fitur. Anda harus menggunakan SDK dan metode penyusunan permintaan yang sesuai berdasarkan mode yang dipilih.
|
|
outputs | Ya | Nama variabel output yang diprediksi oleh model TensorFlow, seperti | "outputs":"probs_ctr,probs_cvr" |
save_req | Tidak | Menentukan apakah akan menyimpan file data yang diperoleh dari permintaan ke direktori model. File yang disimpan dapat digunakan untuk warm-up layanan dan pengujian kinerja. Nilai yang valid:
| "save_req": "false" |
Parameter cache fitur item | |||
period | Ya | Interval pembaruan berkala fitur dalam cache fitur item. Satuan: menit. Jika fitur item diperbarui setiap hari, Anda dapat mengatur parameter ini ke nilai lebih dari satu hari, misalnya 2880 (1.440 menit per hari). Dalam kasus ini, pembaruan intra-hari tidak diperlukan karena fitur diperbarui selama pembaruan layanan harian. |
|
remote_type | Ya | Sumber data fitur item. Nilai yang valid:
|
|
tables | Tidak | Tabel fitur item. Parameter ini wajib saat remote_type diatur ke hologres. Termasuk sub-parameter berikut:
Anda dapat membaca data item dari beberapa tabel. Formatnya sebagai berikut:
Jika tabel memiliki kolom dengan nama yang sama, kolom dari tabel yang tercantum belakangan dalam array akan menimpa kolom dari tabel sebelumnya. |
|
url | Tidak | Alamat akses Hologres. |
|
Parameter untuk akses processor ke PAI-FeatureStore | |||
fs_project | Tidak | Nama proyek PAI-FeatureStore. Parameter ini wajib saat Anda menggunakan PAI-FeatureStore. Untuk informasi lebih lanjut, lihat Konfigurasikan proyek FeatureStore. | "fs_project": "fs_demo" |
fs_model | Tidak | Nama fitur model di PAI-FeatureStore. | "fs_model": "fs_rank_v1" |
fs_entity | Tidak | Nama entitas di PAI-FeatureStore. | "fs_entity": "item" |
region | Tidak | Wilayah tempat PAI-FeatureStore berada. | "region": "cn-beijing" |
access_key_id | Tidak | ID AccessKey yang digunakan untuk mengakses PAI-FeatureStore. | "access_key_id": "xxxxx" |
access_key_secret | Tidak | Rahasia AccessKey yang digunakan untuk mengakses PAI-FeatureStore. | "access_key_secret": "xxxxx" |
featuredb_username | Tidak | Username untuk FeatureDB. | "featuredb_username": "xxxxx" |
featuredb_password | Tidak | Password untuk FeatureDB. | "featuredb_password": "xxxxx" |
load_feature_from_offlinestore | Tidak | Menentukan apakah akan memperoleh fitur offline langsung dari offline store PAI-FeatureStore. Nilai yang valid:
| "load_feature_from_offlinestore": True |
iterate_featuredb_interval | Tidak | Interval pembaruan untuk fitur statistik real-time, dalam detik. Interval pembaruan yang lebih pendek meningkatkan kinerja real-time fitur tetapi dapat meningkatkan biaya baca jika fitur real-time sering berubah. Seimbangkan akurasi dengan biaya. | "iterate_featuredb_interval": 5 |
input_tile: Parameter ekstensi fitur otomatis | |||
INPUT_TILE | Tidak | Atur variabel lingkungan INPUT_TILE ke 1 untuk mengaktifkan broadcasting otomatis fitur item. Untuk fitur yang memiliki nilai sama dalam satu permintaan (seperti user_id), Anda hanya perlu meneruskan satu nilai. Saat variabel lingkungan INPUT_TILE diatur ke 2, operasi
Catatan
| "processor_envs": [ { "name": "INPUT_TILE", "value": "2" } ] |
ADAPTE_FG_CONFIG | Tidak | Aktifkan variabel ini untuk kompatibilitas dengan model yang dilatih menggunakan versi lama FeatureGenerator. | "processor_envs": [ { "name": "ADAPTE_FG_CONFIG", "value": "true" } ] |
DISABLE_FG_PRECISION | Tidak | Gunakan variabel ini untuk kompatibilitas dengan model berbasis versi lama FeatureGenerator. Versi lama secara default membatasi fitur float hingga enam digit signifikan, sedangkan versi baru tidak. Atur variabel ini ke | "processor_envs": [ { "name": "DISABLE_FG_PRECISION", "value": "false" } ] |
Parameter optimasi inferensi untuk EasyRec processor
Parameter | Wajib | Deskripsi | Contoh |
TF_XLA_FLAGS | Tidak | Pada GPU, gunakan Accelerated Linear Algebra (XLA) untuk mengompilasi dan mengoptimalkan model dengan secara otomatis menggabungkan operator. | "processor_envs": [ { "name": "TF_XLA_FLAGS", "value": "--tf_xla_auto_jit=2" }, { "name": "XLA_FLAGS", "value": "--xla_gpu_cuda_data_dir=/usr/local/cuda/" }, { "name": "XLA_ALIGN_SIZE", "value": "64" } ] |
Parameter penjadwalan TF | Tidak |
Untuk CPU 32-core, mengatur parameter ini ke 16 biasanya menghasilkan kinerja tinggi. Jumlah kedua parameter ini tidak boleh melebihi jumlah core CPU. | "model_config": { "inter_op_parallelism_threads": 16, "intra_op_parallelism_threads": 16, } |
rpc.worker_threads | Tidak | Parameter dalam bagian metadata konfigurasi PAI-EAS. Atur parameter ini ke jumlah core CPU instans. Misalnya, jika instans memiliki 15 core CPU, atur | "metadata": { "rpc": { "worker_threads": 15 } |
Langkah 2: Panggil layanan
2.1 Konfigurasi jaringan
Mesin PAI-Rec dan layanan skoring model diterapkan di PAI EAS. Pengaturan ini memerlukan koneksi jaringan langsung. Di halaman instans PAI EAS, klik VPC di pojok kanan atas dan konfigurasikan layanan agar menggunakan VPC, vSwitch, dan security group yang sama. Untuk informasi lebih lanjut, lihat Akses sumber daya publik atau internal dari EAS. Jika Anda menggunakan Hologres, pastikan juga menggunakan pengaturan VPC yang sama. Gambar berikut menunjukkan contohnya.

2.2 Dapatkan informasi layanan
Setelah layanan model EasyRec diterapkan, buka halaman Elastic Algorithm Service (EAS). Di kolom Service Method untuk layanan yang diinginkan, klik Invocation Method untuk melihat titik akhir akses dan token-nya.
2.3 Contoh pemanggilan SDK
Layanan model EasyRec menggunakan format Protocol Buffers (Protobuf) baik untuk input maupun output. Oleh karena itu, Anda tidak dapat menguji layanan secara langsung dari konsol PAI EAS.
Sebelum memanggil layanan, Anda harus mengidentifikasi fg_mode yang Anda atur dalam model_config selama penerapan di Langkah 1. Mode yang berbeda memerlukan metode pemanggilan klien yang sepenuhnya berbeda.
Mode penerapan (fg_mode) | Kelas permintaan SDK |
normal atau tf (dengan rekayasa fitur bawaan) | EasyRecRequest |
bypass (tanpa rekayasa fitur bawaan) | TFRequest |
Termasuk FG:fg_mode=normal atau tf
Java
Untuk informasi tentang cara mengonfigurasi lingkungan Maven, lihat Petunjuk SDK Java. Kode berikut menunjukkan contoh pengiriman permintaan ke layanan ali_rec_rnk_with_fg:
import com.aliyun.openservices.eas.predict.http.*;
import com.aliyun.openservices.eas.predict.request.EasyRecRequest;
PredictClient client = new PredictClient(new HttpConfig());
// Untuk mengakses layanan melalui gateway publik, gunakan endpoint yang diawali dengan ID pengguna (UID) Anda. Informasi ini dapat ditemukan di detail pemanggilan layanan di konsol EAS.
client.setEndpoint("xxxxxxx.vpc.cn-hangzhou.pai-eas.aliyuncs.com");
client.setModelName("ali_rec_rnk_with_fg");
// Ganti ini dengan token layanan Anda.
client.setToken("******");
EasyRecRequest easyrecRequest = new EasyRecRequest(separator);
// userFeatures: Fitur pengguna. Fitur dipisahkan oleh \u0002 (CTRL_B), dan nama fitur serta nilai dipisahkan oleh titik dua (:).
// user_fea0:user_fea0_val\u0002user_fea1:user_fea1_val
// Untuk format nilai fitur, lihat https://easyrec.readthedocs.io/en/latest/feature/rtp_fg.html.
easyrecRequest.appendUserFeatureString(userFeatures);
// Anda juga dapat menambahkan satu fitur pengguna sekaligus:
// easyrecRequest.addUserFeature(String userFeaName, T userFeaValue).
// Tipe T dari nilai fitur dapat berupa String, float, long, atau int.
// contextFeatures: Fitur konteks. Fitur dipisahkan oleh \u0002 (CTRL_B). Nama fitur dan nilai dipisahkan oleh titik dua (:). Beberapa nilai untuk satu fitur juga dipisahkan oleh titik dua.
// ctxt_fea0:ctxt_fea0_ival0:ctxt_fea0_ival1:ctxt_fea0_ival2\u0002ctxt_fea1:ctxt_fea1_ival0:ctxt_fea1_ival1:ctxt_fea1_ival2
easyrecRequest.appendContextFeatureString(contextFeatures);
// Anda juga dapat menambahkan satu fitur konteks sekaligus:
// easyrecRequest.addContextFeature(String ctxtFeaName, List<Object> ctxtFeaValue).
// Tipe ctxtFeaValue dapat berupa String, Float, Long, atau Integer.
// itemIdStr: Daftar ID item untuk diprediksi, dipisahkan oleh koma (,).
easyrecRequest.appendItemStr(itemIdStr, ",");
// Anda juga dapat menambahkan satu ID item sekaligus:
// easyrecRequest.appendItemId(String itemId)
easyrecPredictProtos.PBResponse response = client.predict(easyrecRequest);
for (Map.Entry<String, easyrecPredictProtos.Results> entry : response.getResultsMap().entrySet()) {
String key = entry.getKey();
easyrecPredictProtos.Results value = entry.getValue();
System.out.print("key: " + key);
for (int i = 0; i < value.getScoresCount(); i++) {
System.out.format("value: %.6g\n", value.getScores(i));
}
}
// Dapatkan fitur setelah diproses oleh FG untuk memeriksa konsistensi dengan fitur offline.
// Atur DebugLevel ke 1 untuk mengembalikan fitur yang dihasilkan.
easyrecRequest.setDebugLevel(1);
easyrecPredictProtos.PBResponse response = client.predict(easyrecRequest);
Map<String, String> genFeas = response.getGenerateFeaturesMap();
for(String itemId: genFeas.keySet()) {
System.out.println(itemId);
System.out.println(genFeas.get(itemId));
}Python
Untuk informasi tentang cara mengonfigurasi lingkungan, lihat Petunjuk SDK Python. Kami merekomendasikan penggunaan klien Java untuk aplikasi produksi. Kode berikut merupakan contoh:
from eas_prediction import PredictClient
from eas_prediction.easyrec_request import EasyRecRequest
from eas_prediction.easyrec_predict_pb2 import PBFeature
from eas_prediction.easyrec_predict_pb2 import PBRequest
if __name__ == '__main__':
endpoint = 'http://xxxxxxx.vpc.cn-hangzhou.pai-eas.aliyuncs.com'
service_name = 'ali_rec_rnk_with_fg'
token = '******'
client = PredictClient(endpoint, service_name)
client.set_token(token)
client.init()
req = PBRequest()
uid = PBFeature()
uid.string_feature = 'u0001'
req.user_features['user_id'] = uid
age = PBFeature()
age.int_feature = 12
req.user_features['age'] = age
weight = PBFeature()
weight.float_feature = 129.8
req.user_features['weight'] = weight
req.item_ids.extend(['item_0001', 'item_0002', 'item_0003'])
easyrec_req = EasyRecRequest()
easyrec_req.add_feed(req, debug_level=0)
res = client.predict(easyrec_req)
print(res)Parameter dijelaskan sebagai berikut:
endpoint: Titik akhir layanan, yang harus diawali dengan ID pengguna (UID) Anda. Di halaman PAI EAS Online Model Service, klik Invocation Method di kolom Service Method untuk layanan Anda guna mendapatkan endpoint.
service_name: Nama layanan. Anda dapat menemukannya di halaman PAI EAS Online Model Service.
token: Token layanan. Anda dapat memperolehnya dari kotak dialog Invocation Method.
Tanpa FG: fg_mode=bypass
Java
Untuk informasi tentang cara mengonfigurasi lingkungan Maven, lihat Petunjuk SDK Java. Kode berikut menunjukkan contoh pengiriman permintaan ke 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[]{3}, new String []{ "u0001", "u0001", "u0001"});
request.addFeed("age", TFDataType.DT_FLOAT,
new long[]{3}, new float []{ 18.0f, 18.0f, 18.0f});
// Catatan: Jika Anda mengatur INPUT_TILE=2, fitur yang memiliki nilai sama untuk semua item hanya perlu diteruskan sekali:
// 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[]{3}, new String []{ "i0001", "i0002", "i0003"});
request.addFetch("probs");
return request;
}
public static void main(String[] args) throws Exception {
PredictClient client = new PredictClient(new HttpConfig());
// Untuk menggunakan koneksi jaringan langsung, panggil metode setDirectEndpoint. Contoh:
// client.setDirectEndpoint("pai-eas-vpc.cn-shanghai.aliyuncs.com");
// Koneksi jaringan langsung harus diaktifkan di konsol EAS. Anda harus menyediakan vSwitch sumber yang digunakan untuk mengakses layanan EAS.
// Koneksi jaringan langsung memberikan stabilitas dan kinerja yang lebih baik.
client.setEndpoint("xxxxxxx.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' adalah nama field output model. Anda dapat menggunakan perintah curl untuk melihat input dan output model:
// curl xxxxxxx.vpc.cn-hangzhou.pai-eas.aliyuncs.com -H "Authorization:{token}"
List<Float> result = response.getFloatVals("probs");
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();
}
}Python
Untuk informasi lebih lanjut, lihat Petunjuk SDK Python. Karena kinerja Python yang lebih rendah, kami merekomendasikan penggunaannya hanya untuk debugging dan menggunakan SDK Java untuk lingkungan produksi. Kode berikut menunjukkan contoh pengiriman permintaan ke layanan ali_rec_rnk_no_fg:
#!/usr/bin/env python
from eas_prediction import PredictClient
from eas_prediction import StringRequest
from eas_prediction import TFRequest
if __name__ == '__main__':
client = PredictClient('http://xxxxxxx.vpc.cn-hangzhou.pai-eas.aliyuncs.com', 'ali_rec_rnk_no_fg')
client.set_token('')
client.init()
# Catatan: Ganti 'server_default' dengan signature_name aktual model Anda. Untuk detailnya, lihat dokumentasi SDK.
req = TFRequest('server_default')
req.add_feed('user_id', [3], TFRequest.DT_STRING, ['u0001'] * 3)
req.add_feed('age', [3], TFRequest.DT_FLOAT, [18.0] * 3)
# Catatan: Setelah Anda mengaktifkan optimasi INPUT_TILE=2, fitur yang memiliki nilai sama untuk semua item hanya perlu diteruskan sekali.
# 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', [3], TFRequest.DT_STRING,
['i0001', 'i0002', 'i0003'])
for x in range(0, 100):
resp = client.predict(req)
print(resp)2.4 Bangun permintaan layanan kustom
Untuk memanggil layanan menggunakan bahasa selain Python atau Java, Anda harus membuat kode permintaan prediksi secara manual dari file .proto. Anda dapat menggunakan definisi Protocol Buffers berikut untuk menghasilkan kode yang diperlukan:
tf_predict.proto: Definisi permintaan untuk model TensorFlow
syntax = "proto3"; option cc_enable_arenas = true; option go_package = ".;tf"; option java_package = "com.aliyun.openservices.eas.predict.proto"; option java_outer_classname = "PredictProtos"; enum ArrayDataType { // Bukan nilai legal untuk DataType. Digunakan untuk menunjukkan bahwa field DataType // belum diatur. DT_INVALID = 0; // Tipe data yang didukung oleh semua perangkat komputasi. DT_FLOAT = 1; DT_DOUBLE = 2; DT_INT32 = 3; DT_UINT8 = 4; DT_INT16 = 5; DT_INT8 = 6; DT_STRING = 7; DT_COMPLEX64 = 8; // Kompleks presisi tunggal DT_INT64 = 9; DT_BOOL = 10; DT_QINT8 = 11; // int8 terkuantisasi DT_QUINT8 = 12; // uint8 terkuantisasi DT_QINT32 = 13; // int32 terkuantisasi DT_BFLOAT16 = 14; // Float32 dipotong menjadi 16 bit. Hanya untuk operasi cast. DT_QINT16 = 15; // int16 terkuantisasi DT_QUINT16 = 16; // uint16 terkuantisasi DT_UINT16 = 17; DT_COMPLEX128 = 18; // Kompleks presisi ganda DT_HALF = 19; DT_RESOURCE = 20; DT_VARIANT = 21; // Tipe data C++ arbitrer } // Dimensi array message ArrayShape { repeated int64 dim = 1 [packed = true]; } // Protokol buffer yang merepresentasikan array message ArrayProto { // Tipe data. ArrayDataType dtype = 1; // Bentuk array. ArrayShape array_shape = 2; // DT_FLOAT. repeated float float_val = 3 [packed = true]; // DT_DOUBLE. repeated double double_val = 4 [packed = true]; // DT_INT32, DT_INT16, DT_INT8, DT_UINT8. repeated int32 int_val = 5 [packed = true]; // DT_STRING. repeated bytes string_val = 6; // DT_INT64. repeated int64 int64_val = 7 [packed = true]; // DT_BOOL. repeated bool bool_val = 8 [packed = true]; } // PredictRequest menentukan model TensorFlow mana yang akan dijalankan, serta // bagaimana input dipetakan ke tensor dan bagaimana output difilter sebelum // dikembalikan kepada pengguna. message PredictRequest { // Signature bernama untuk dievaluasi. Jika tidak ditentukan, signature default // akan digunakan. string signature_name = 1; // Tensor input. // Nama tensor input adalah nama alias. Pemetaan dari alias ke nama tensor input // nyata diharapkan disimpan sebagai signature generik bernama di bawah kunci "inputs" // dalam ekspor model. // Setiap alias yang tercantum dalam signature generik bernama "inputs" harus diberikan // tepat satu kali agar prediksi dapat dijalankan. map<string, ArrayProto> inputs = 2; // Filter output. // Nama yang ditentukan adalah nama alias. Pemetaan dari alias ke nama tensor output // nyata diharapkan disimpan sebagai signature generik bernama di bawah kunci "outputs" // dalam ekspor model. // Hanya tensor yang ditentukan di sini yang akan dijalankan/diambil dan dikembalikan. Jika tidak ada // yang ditentukan, semua tensor yang ditentukan dalam signature bernama akan // dijalankan/diambil dan dikembalikan. repeated string output_filter = 3; // Bendera debug // 0: Mengembalikan hanya hasil prediksi, tanpa informasi debug. // 100: Mengembalikan hasil prediksi dan menyimpan permintaan ke model_dir. // 101: Menyimpan timeline ke model_dir. int32 debug_level = 100; } // Respons untuk PredictRequest yang berhasil. message PredictResponse { // Tensor output. map<string, ArrayProto> outputs = 1; }easyrec_predict.proto: Definisi permintaan untuk model TensorFlow dengan FG
syntax = "proto3"; option cc_enable_arenas = true; option go_package = ".;easyrec"; option java_package = "com.aliyun.openservices.eas.predict.proto"; option java_outer_classname = "EasyRecPredictProtos"; import "tf_predict.proto"; // fitur konteks message ContextFeatures { repeated PBFeature features = 1; } message PBFeature { oneof value { int32 int_feature = 1; int64 long_feature = 2; string string_feature = 3; float float_feature = 4; } } // PBRequest menentukan permintaan untuk aggregator. message PBRequest { // Bendera debug // 0: Mengembalikan hanya hasil prediksi, tanpa informasi debug. // 3: Mengembalikan fitur yang dihasilkan oleh modul FG dalam format string. Nilai fitur dipisahkan oleh \u0002. // Ini dapat digunakan untuk memeriksa konsistensi fitur dan menghasilkan sampel pembelajaran mendalam daring. // 100: Mengembalikan hasil prediksi dan menyimpan permintaan ke model_dir. // 101: Menyimpan timeline ke model_dir. // 102: Untuk model Recall seperti DSSM dan MIND, mengembalikan tidak hanya hasil yang diambil oleh Faiss // tetapi juga vektor penyematan pengguna. int32 debug_level = 1; // fitur pengguna map<string, PBFeature> user_features = 2; // ID Item. Fitur item statis (diperbarui harian) // diambil berdasarkan item_ids dari cache fitur yang berada // di setiap node prosesor. repeated string item_ids = 3; // Fitur konteks untuk setiap item. Fitur item secara waktu nyata // dapat diteruskan sebagai fitur konteks. map<string, ContextFeatures> context_features = 4; // Jumlah tetangga untuk pengambilan penyematan. int32 faiss_neigh_num = 5; } // Hasil pengembalian message Results { repeated double scores = 1 [packed = true]; } enum StatusCode { OK = 0; INPUT_EMPTY = 1; EXCEPTION = 2; } // PBResponse menentukan tanggapan untuk aggregator. message PBResponse { // hasil map<string, Results> results = 1; // fitur item map<string, string> item_features = 2; // fitur yang dihasilkan oleh FG map<string, string> generate_features = 3; // fitur konteks map<string, ContextFeatures> context_features = 4; string error_msg = 5; StatusCode status_code = 6; // ID item repeated string item_ids = 7; repeated string outputs = 8; // semua fitur input FG map<string, string> raw_features = 9; // tensor keluaran map<string, ArrayProto> tf_outputs = 10; }