Processor TorchEasyRec bawaan di Elastic Algorithm Service (EAS) memungkinkan Anda menyebarkan model rekomendasi yang dilatih dengan TorchEasyRec atau PyTorch sebagai layanan scoring. Processor ini juga mengintegrasikan kemampuan rekayasa fitur. Dengan mengoptimalkan secara bersamaan rekayasa fitur dan model PyTorch, processor ini menghadirkan layanan scoring berkinerja tinggi. Topik ini menjelaskan cara menyebarkan dan memanggil layanan model TorchEasyRec.
Informasi latar belakang
Gambar berikut menunjukkan arsitektur mesin rekomendasi berbasis processor TorchEasyRec.
Processor TorchEasyRec terdiri atas modul-modul berikut:
Item Feature Cache: Menyimpan cache fitur sisi item dari FeatureStore di memori. Hal ini mengurangi overhead jaringan dan tekanan permintaan terhadap FeatureStore, sekaligus meningkatkan kinerja layanan inferensi. Jika fitur sisi item mencakup fitur real-time, FeatureStore menangani sinkronisasi.
Feature Generator (FG): Modul generasi fitur. Anda mendefinisikan proses transformasi fitur dalam file konfigurasi. Satu set kode C++ memastikan logika konsisten untuk pemrosesan fitur offline dan online.
TorchModel: Model PyTorch yang diekspor sebagai ScriptedModel setelah pelatihan dengan TorchEasyRec atau PyTorch.
Batasan
Hanya seri instans tujuan umum g6, g7, atau g8 yang didukung. Model GPU seperti T4 dan A10 juga didukung. Untuk informasi lebih lanjut, lihat general-purpose instance families (g series). Jika Anda menyebarkan layanan GPU, pastikan versi CUDA Driver adalah 535 atau lebih baru.
Daftar versi
Processor TorchEasyRec sedang dalam pengembangan aktif. Kami merekomendasikan penggunaan versi terbaru untuk menyebarkan layanan inferensi karena menyediakan fitur tambahan dan peningkatan kinerja inferensi. Versi yang telah dirilis tercantum di bawah ini:
Nama processor | Tanggal rilis | Versi Torch | Versi FG | Fitur baru |
easyrec-torch-0.1 | 20240910 | 2.4 | 0.2.9 |
|
easyrec-torch-0.2 | 20240930 | 2.4 | 0.2.9 |
|
easyrec-torch-0.3 | 20241014 | 2.4 | 0.2.9 |
|
easyrec-torch-0.4 | 20241028 | 2.4 | 0.3.1 |
|
easyrec-torch-0.5 | 20241114 | 2.4 | 0.3.1 |
|
easyrec-torch-0.6 | 20241118 | 2.4 | 0.3.6 |
|
easyrec-torch-0.7 | 20241206 | 2.5 | 0.3.9 |
|
easyrec-torch-0.8 | 20241225 | 2.5 | 0.3.9 |
|
easyrec-torch-0.9 | 20250115 | 2.5 | 0.4.1 |
|
easyrec-torch-1.0 | 20250206 | 2.5 | 0.4.2 |
|
easyrec-torch-1.1 | 20250423 | 2.5 | 0.5.9 |
|
easyrec-torch-1.2 | 20250512 | 2.5 | 0.6.0 |
|
easyrec-torch-1.3 | 20250529 | 2.5 | 0.6.5 |
|
easyrec-torch-1.4 | 20250715 | 2.5 | 0.6.9 |
|
easyrec-torch-1.5 | 20250918 | 2.5 | 0.7.3 |
|
easyrec-torch-1.6 | 20251021 | 2.5 | 0.7.4 |
|
easyrec-torch-1.7 | 20251104 | 2.5 | 0.7.4 |
|
easyrec-torch-1.8 | 20251201 | 2.5 | 0.7.4 |
|
easyrec-torch-1.9 | 20260109 | 2.5 | 1.0.0 |
|
easyrec-torch-1.10 | 20260123 | 2.5 | 1.0.1 |
|
easyrec-torch-1.11 | 20260210 | 2.5 | 1.0.1 |
|
easyrec-torch-1.12 | 20260313 | 2.5 | 1.0.1 |
|
Catatan untuk versi 2.0 dan seterusnya: Versi GLIBC dari image dasar backend EAS ditingkatkan pada easyrec-torch-2.0. Oleh karena itu, saat Anda menyebarkan processor versi 2.0 atau lebih baru:
| ||||
easyrec-torch-2.0 | 20260317 | 2.8 | 1.0.1 |
|
Langkah 1: Menyebarkan layanan
Siapkan file konfigurasi layanan torcheasyrec.json.
Atur tipe processor ke easyrec-torch-{version}. Untuk {version}, lihat Daftar versi. Kode berikut memberikan contoh konfigurasi JSON:
Contoh menggunakan FG (fg_mode='normal')
{ "metadata": { "instance": 1, "name": "alirec_rank_with_fg", "rpc": { "enable_jemalloc": 1, "max_queue_size": 256, "worker_threads": 16 } }, "cloud": { "computing": { "instance_type": "ecs.gn6i-c16g1.4xlarge" } }, "model_config": { "fg_mode": "normal", "fg_threads": 8, "region": "YOUR_REGION", "fs_project": "YOUR_FS_PROJECT", "fs_model": "YOUR_FS_MODEL", "fs_entity": "item", "load_feature_from_offlinestore": true, "access_key_id":"YOUR_ACCESS_KEY_ID", "access_key_secret":"YOUR_ACCESS_KEY_SECRET" }, "storage": [ { "mount_path": "/home/admin/docker_ml/workspace/model/", "oss": { "path": "oss://xxx/xxx/export", "readOnly": false }, "properties": { "resource_type": "code" } } ], "processor":"easyrec-torch-1.12" }Contoh tidak menggunakan FG (fg_mode='bypass')
{ "metadata": { "instance": 1, "name": "alirec_rank_no_fg", "rpc": { "enable_jemalloc": 1, "max_queue_size": 256, "worker_threads": 16 } }, "cloud": { "computing": { "instance_type": "ecs.gn6i-c16g1.4xlarge" } }, "model_config": { "fg_mode": "bypass" }, "storage": [ { "mount_path": "/home/admin/docker_ml/workspace/model/", "oss": { "path": "oss://xxx/xxx/export", "readOnly": false }, "properties": { "resource_type": "code" } } ], "processor":"easyrec-torch-1.12" }Tabel berikut menjelaskan parameter utama. Untuk informasi tentang parameter lainnya, lihat Penyebaran JSON.
Parameter
Wajib
Deskripsi
Contoh
processor
Ya
Processor TorchEasyRec.
"processor":"easyrec-torch-1.12"
path
Ya
Path Object Storage Service (OSS) yang dipasang ke penyimpanan layanan. Path ini digunakan untuk menyimpan file model.
"path": "oss://examplebucket/xxx/export"
fg_mode
Tidak
Menentukan mode rekayasa fitur. Nilai yang valid:
bypass (default): Tidak menggunakan FG. Hanya model Torch yang disebarkan.
Mode ini cocok untuk skenario di mana Anda menggunakan pemrosesan fitur kustom.
Dalam mode ini, Anda tidak perlu mengonfigurasi parameter agar processor dapat mengakses FeatureStore.
normal: Menggunakan FG. Mode ini biasanya digunakan bersama TorchEasyRec untuk pelatihan model.
"fg_mode": "normal"
fg_threads
Tidak
Jumlah thread konkuren untuk mengeksekusi FG untuk satu permintaan.
"fg_threads": 15
outputs
Tidak
Nama variabel output yang diprediksi oleh model Torch, seperti probs_ctr. Jika terdapat beberapa nama, pisahkan dengan koma (,). Secara default, semua variabel dikeluarkan.
"outputs":"probs_ctr,probs_cvr"
item_empty_score
Tidak
Skor default saat ID Item tidak ada. Nilai default adalah 0.
"item_empty_score": -1
Parameter recall processor
faiss_neigh_num
Tidak
Jumlah vektor yang direcall menggunakan FAISS. Secara default, nilai ini diambil dari field
faiss_neigh_numdalam badan permintaan. Jika field ini tidak disediakan, nilaifaiss_neigh_numdalam konfigurasimodel_configdigunakan. Nilai default adalah 1."faiss_neigh_num": 200
faiss_nprobe
Tidak
Parameter nprobe menentukan jumlah kluster yang diambil selama proses pengambilan. Nilai default adalah 800. Indeks daftar posting di FAISS membagi data menjadi beberapa kluster kecil, atau kelompok, dan mempertahankan daftar posting untuk setiap kluster. Nilai
nprobeyang lebih besar biasanya menghasilkan presisi pencarian yang lebih tinggi tetapi meningkatkan biaya komputasi dan waktu pencarian. Nilai yang lebih kecil mengurangi presisi tetapi mempercepat pencarian."faiss_nprobe" : 700
Parameter agar processor dapat mengakses FeatureStore
fs_project
Tidak
Nama proyek FeatureStore. Anda harus menentukan parameter ini saat menggunakan FeatureStore. Untuk informasi lebih lanjut tentang FeatureStore, lihat Mengonfigurasi proyek FeatureStore.
"fs_project": "fs_demo"
fs_model
Tidak
Nama fitur model di FeatureStore.
"fs_model": "fs_rank_v1"
fs_entity
Tidak
Nama entitas di FeatureStore.
"fs_entity": "item"
region
Tidak
Wilayah tempat produk FeatureStore berada. Misalnya, atur nilainya ke cn-beijing untuk wilayah China (Beijing). Untuk informasi lebih lanjut tentang konfigurasi wilayah, lihat Endpoints.
"region": "cn-beijing"
access_key_id
Tidak
ID AccessKey untuk produk FeatureStore.
"access_key_id": "xxxxx"
access_key_secret
Tidak
Rahasia AccessKey untuk produk FeatureStore.
"access_key_secret": "xxxxx"
load_feature_from_offlinestore
Tidak
Menentukan apakah akan memperoleh data fitur offline langsung dari FeatureStore OfflineStore. Nilai yang valid:
True: Ya. Data diperoleh dari FeatureStore OfflineStore.
False (default): Tidak. Data diperoleh dari FeatureStore OnlineStore.
"load_feature_from_offlinestore": True
featuredb_username
Tidak
Username untuk FeatureDB.
"featuredb_username":"xxx"
featuredb_password
Tidak
Password untuk FeatureDB.
"featuredb_passwd":"xxx"
input_tile: Parameter untuk ekspansi fitur otomatis
INPUT_TILE
Tidak
Mendukung ekspansi fitur otomatis. Untuk fitur yang memiliki nilai sama dalam satu permintaan, seperti user_id, Anda hanya perlu mengirimkan satu nilai. Hal ini membantu mengurangi ukuran permintaan, waktu transmisi jaringan, dan waktu komputasi.
Fitur ini harus digunakan dalam mode normal dan dengan TorchEasyRec. Anda juga harus mengatur variabel lingkungan yang sesuai saat mengekspor model. Sistem saat ini membaca nilai INPUT_TILE dari file model_acc.json di direktori model yang diekspor dari TorchEasyRec. Jika file tersebut tidak ada, sistem membaca nilai dari variabel lingkungan.
Setelah fitur ini diaktifkan:
Jika variabel lingkungan diatur ke 2, FG untuk fitur sisi pengguna hanya dihitung sekali.
Jika variabel lingkungan diatur ke 3, FG untuk fitur sisi pengguna hanya dihitung sekali. Sistem menghitung penyematan untuk pengguna dan item secara terpisah, dan penyematan sisi pengguna hanya dihitung sekali. Ini cocok untuk skenario dengan banyak fitur sisi pengguna.
"processor_envs":
[
{
"name": "INPUT_TILE",
"value": "2"
}
]
NO_GRAD_GUARD
Tidak
Menonaktifkan perhitungan gradien selama inferensi. Ini menghentikan pelacakan operasi dan mencegah pembentukan graf komputasi.
CatatanSaat diatur ke 1, beberapa model mungkin tidak kompatibel. Jika Anda mengalami tersendat selama eksekusi inferensi kedua, Anda dapat menambahkan variabel lingkungan
PYTORCH_TENSOREXPR_FALLBACK=2untuk mengatasi masalah tersebut. Ini melewati langkah kompilasi sambil mempertahankan beberapa fitur optimasi graf."processor_envs":
[
{
"name": "NO_GRAD_GUARD",
"value": "1"
}
]
Parameter pemanasan model
warmup_data_path
Tidak
Mengaktifkan fitur pemanasan model dan menentukan path untuk menyimpan file pemanasan. Untuk memastikan file pemanasan tidak hilang, tambahkan mount OSS ke path ini dalam konfigurasi penyimpanan.
"warmup_data_path": "/warmup"
warmup_cnt_per_file
Tidak
Jumlah kali pemanasan untuk setiap file protobuf pemanasan. Meningkatkan parameter ini dapat memastikan pemanasan yang cukup, tetapi periode ramp-up akan lebih lama. Nilai default adalah 20.
"warmup_cnt_per_file": 20,
warmup_pb_files_count
Tidak
Jumlah permintaan online yang disimpan. Permintaan disimpan sebagai file protobuf untuk pemanasan startup berikutnya. Path penyimpanan ditentukan oleh parameter warmup_data_path. Nilai default adalah 64.
"warmup_pb_files_count": 64
Pencatatan log dan penyimpanan permintaan lambat
long_request_threshold
Tidak
Ambang batas waktu untuk permintaan lambat, dalam ms. Untuk permintaan yang melebihi ambang batas, waktu eksekusi setiap tahap secara otomatis dicatat dalam log. Nilai default adalah 200 ms.
"long_request_threshold": 200
save_long_request
Tidak
Parameter boolean. Menentukan apakah akan menyimpan permintaan sebagai file protobuf saat terjadi permintaan lambat (melebihi long_request_threshold). Nilai default adalah false.
"save_long_request": true
Menulis permintaan asli dan fitur item ke penyimpanan OSS
request_log_path
Tidak
Path tempat file protobuf disimpan ke disk. Dalam konfigurasi layanan model, gunakan mount OSS untuk path ini.
"request_log_path": "/online_log_pb"
background_feature_thread_num
Tidak
Jumlah thread yang bertanggung jawab atas tugas backend penyimpanan ke disk. Nilai default adalah 4. Jika tugas penyimpanan ke disk berat, Anda dapat meningkatkan nilai ini untuk mempercepat penyimpanan file protobuf.
"background_feature_thread_num": 8
Sebarkan layanan model TorchEasyRec. Anda dapat memilih salah satu metode penyebaran berikut:
Penyebaran lokal menggunakan JSON (Direkomendasikan)
Prosedur:
-
Masuk ke Konsol PAI. Pilih wilayah di bagian atas halaman, lalu pilih ruang kerja yang diinginkan dan klik Elastic Algorithm Service (EAS).
Pada halaman Elastic Algorithm Service (EAS), klik Deploy Service, lalu di bagian Custom Model Deployment, klik JSON On-Premises Deployment.
Masukkan konten konfigurasi JSON yang telah disiapkan ke dalam kotak teks JSON, lalu klik Deploy.
Penyebaran menggunakan eascmd
Unduh dan autentikasi klien. Topik ini menggunakan versi Windows 64-bit sebagai contoh.
Buka tool terminal. Di direktori tempat file JSON berada, jalankan perintah berikut untuk membuat layanan. Untuk informasi lebih lanjut tentang operasi, lihat Referensi perintah.
eascmdwin64.exe create <service.json>Ganti <service.json> dengan nama file JSON yang Anda buat, seperti torcheasyrec.json.
-
Langkah 2: Memanggil layanan
Setelah layanan model TorchEasyRec disebarkan, ikuti langkah-langkah berikut untuk melihat informasi pemanggilan layanan:
Masuk ke Konsol PAI, pilih wilayah tujuan di bagian atas halaman dan ruang kerja target di sebelah kanan, lalu klik Enter EAS.
Klik Invocation Information di kolom Service Method layanan target untuk melihat informasi titik akhir dan token layanan.

Input dan output layanan model TorchEasyRec menggunakan format protobuf. Metode pemanggilan bervariasi tergantung pada apakah Anda menggunakan FG:
Menggunakan FG (fg_mode='normal')
Dua metode pemanggilan berikut didukung:
Menggunakan EAS Java SDK
Sebelum menjalankan kode, konfigurasikan lingkungan Maven. Untuk informasi lebih lanjut, lihat Menggunakan Java SDK. Untuk versi terbaru Java SDK, lihat https://github.com/pai-eas/eas-java-sdk. Kode berikut memberikan contoh cara meminta layanan alirec_rank_with_fg:
package com.aliyun.openservices.eas.predict;
import com.aliyun.openservices.eas.predict.http.Compressor;
import com.aliyun.openservices.eas.predict.http.HttpConfig;
import com.aliyun.openservices.eas.predict.http.PredictClient;
import com.aliyun.openservices.eas.predict.proto.TorchRecPredictProtos;
import com.aliyun.openservices.eas.predict.request.TorchRecRequest;
import com.aliyun.openservices.eas.predict.proto.TorchPredictProtos.ArrayProto;
import java.util.*;
public class TorchRecPredictTest {
public static PredictClient InitClient() {
return new PredictClient(new HttpConfig());
}
public static TorchRecRequest buildPredictRequest() {
TorchRecRequest TorchRecRequest = new TorchRecRequest();
TorchRecRequest.appendItemId("7033");
TorchRecRequest.addUserFeature("user_id", 33981,"int");
ArrayList<Double> list = new ArrayList<>();
list.add(0.24689289764507472);
list.add(0.005758482924454689);
list.add(0.6765301324940026);
list.add(0.18137273055602343);
TorchRecRequest.addUserFeature("raw_3", list,"List<double>");
Map<String,Integer> myMap =new LinkedHashMap<>();
myMap.put("866", 4143);
myMap.put("1627", 2451);
TorchRecRequest.addUserFeature("map_1", myMap,"map<string,int>");
ArrayList<ArrayList<Float>> list2 = new ArrayList<>();
ArrayList<Float> innerList1 = new ArrayList<>();
innerList1.add(1.1f);
innerList1.add(2.2f);
innerList1.add(3.3f);
list2.add(innerList1);
ArrayList<Float> innerList2 = new ArrayList<>();
innerList2.add(4.4f);
innerList2.add(5.5f);
list2.add(innerList2);
TorchRecRequest.addUserFeature("click", list2,"list<list<float>>");
TorchRecRequest.addContextFeature("id_2", list,"List<double>");
TorchRecRequest.addContextFeature("id_2", list,"List<double>");
System.out.println(TorchRecRequest.request);
return TorchRecRequest;
}
public static void main(String[] args) throws Exception{
PredictClient client = InitClient();
client.setToken("tokenGeneratedFromService");
client.setEndpoint("175805416243****.cn-beijing.pai-eas.aliyuncs.com");
client.setModelName("alirec_rank_with_fg");
client.setRequestTimeout(100000);
testInvoke(client);
testDebugLevel(client);
client.shutdown();
}
public static void testInvoke(PredictClient client) throws Exception {
long startTime = System.currentTimeMillis();
TorchRecPredictProtos.PBResponse response = client.predict(buildPredictRequest());
for (Map.Entry<String, ArrayProto> entry : response.getMapOutputsMap().entrySet()) {
System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}
long endTime = System.currentTimeMillis();
System.out.println("Spend Time: " + (endTime - startTime) + "ms");
}
public static void testDebugLevel(PredictClient client) throws Exception {
long startTime = System.currentTimeMillis();
TorchRecRequest request = buildPredictRequest();
request.setDebugLevel(1);
TorchRecPredictProtos.PBResponse response = client.predict(request);
Map<String, String> genFeas = response.getGenerateFeaturesMap();
for(String itemId: genFeas.keySet()) {
System.out.println(itemId);
System.out.println(genFeas.get(itemId));
}
long endTime = System.currentTimeMillis();
System.out.println("Spend Time: " + (endTime - startTime) + "ms");
}
}
Di mana:
client.setToken("tokenGeneratedFromService"): Ganti parameter dalam tanda kurung dengan token layanan Anda. Contohnya,
MmFiMDdlO****wYjhhNjgwZmZjYjBjMTM1YjliZmNkODhjOGVi****.client.setEndpoint("175805416243****.cn-beijing.pai-eas.aliyuncs.com"): Ganti parameter dalam tanda kurung dengan titik akhir layanan Anda. Contohnya,
175805416243****.cn-beijing.pai-eas.aliyuncs.com.client.setModelName("alirec_rank_with_fg"): Ganti parameter dalam tanda kurung dengan nama layanan Anda.
Menggunakan EAS Python SDK
Sebelum menjalankan kode, jalankan perintah pip install -U eas-prediction --user untuk menginstal atau memperbarui pustaka eas-prediction. Untuk informasi lebih lanjut, lihat Menggunakan Python SDK. Kode berikut memberikan contoh:
from eas_prediction import PredictClient
from eas_prediction.torchrec_request import TorchRecRequest
if __name__ == '__main__':
endpoint = 'http://localhost:6016'
client = PredictClient(endpoint, '<YOUR_SERVICE_NAME>')
client.set_token('<your_service_token>')
client.init()
torchrec_req = TorchRecRequest()
torchrec_req.add_user_fea('user_id', 'u001d', "STRING")
torchrec_req.add_user_fea('age', 12, "INT")
torchrec_req.add_user_fea('weight', 129.8, "FLOAT")
torchrec_req.add_item_id('item_0001')
torchrec_req.add_item_id('item_0002')
torchrec_req.add_item_id('item_0003')
torchrec_req.add_user_fea("raw_3", [0.24689289764507472, 0.005758482924454689, 0.6765301324940026, 0.18137273055602343], "list<double>")
torchrec_req.add_user_fea("raw_4", [0.9965264740966043, 0.659596586238391, 0.16396649403055896, 0.08364986620265635], "list<double>")
torchrec_req.add_user_fea("map_1", {"0":0.37845234405201145}, "map<int,float>")
torchrec_req.add_user_fea("map_2", {"866":4143,"1627":2451}, "map<int,int>")
torchrec_req.add_context_fea("id_2", [866], "list<int>" )
torchrec_req.add_context_fea("id_2", [7022,1], "list<int>" )
torchrec_req.add_context_fea("id_2", [7022,1], "list<int>" )
torchrec_req.add_user_fea("click", [[0.94433516,0.49145547], [0.94433516, 0.49145597]], "list<list<float>>")
res = client.predict(torchrec_req)
print(res)
Tabel berikut menjelaskan parameter utama.
endpoint: Atur ke titik akhir layanan Anda, contohnya,
http://175805416243****.cn-beijing.pai-eas.aliyuncs.com/.<your_service_name>: Ganti ini dengan nama layanan Anda.
<your_service_token>: Ganti ini dengan token layanan Anda, contohnya,
MmFiMDdlO****wYjhhNjgwZmZjYjBjMTM1YjliZmNkODhjOGVi****.
Tidak menggunakan FG (fg_mode='bypass')
Menggunakan EAS Java SDK
Sebelum menjalankan kode, konfigurasikan lingkungan Maven. Untuk informasi lebih lanjut, lihat Menggunakan Java SDK. Periksa halaman GitHub untuk nomor versi terbaru SDK. Kode berikut memberikan contoh cara meminta layanan alirec_rank_no_fg:
package com.aliyun.openservices.eas.predict;
import java.util.List;
import java.util.Arrays;
import com.aliyun.openservices.eas.predict.http.PredictClient;
import com.aliyun.openservices.eas.predict.http.HttpConfig;
import com.aliyun.openservices.eas.predict.request.TorchDataType;
import com.aliyun.openservices.eas.predict.request.TorchRequest;
import com.aliyun.openservices.eas.predict.response.TorchResponse;
public class Test_Torch {
public static PredictClient InitClient() {
return new PredictClient(new HttpConfig());
}
public static TorchRequest buildPredictRequest() {
TorchRequest request = new TorchRequest();
float[] content = new float[2304000];
for (int i = 0; i < content.length; i++) {
content[i] = (float) 0.0;
}
long[] content_i = new long[900];
for (int i = 0; i < content_i.length; i++) {
content_i[i] = 0;
}
long[] a = Arrays.copyOfRange(content_i, 0, 300);
float[] b = Arrays.copyOfRange(content, 0, 230400);
request.addFeed(0, TorchDataType.DT_INT64, new long[]{300,3}, content_i);
request.addFeed(1, TorchDataType.DT_FLOAT, new long[]{300,10,768}, content);
request.addFeed(2, TorchDataType.DT_FLOAT, new long[]{300,768}, b);
request.addFeed(3, TorchDataType.DT_INT64, new long[]{300}, a);
request.addFetch(0);
request.setDebugLevel(903);
return request;
}
public static void main(String[] args) throws Exception {
PredictClient client = InitClient();
client.setToken("tokenGeneratedFromService");
client.setEndpoint("175805416243****.cn-beijing.pai-eas.aliyuncs.com");
client.setModelName("alirec_rank_no_fg");
client.setIsCompressed(false);
long startTime = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
TorchResponse response = null;
try {
response = client.predict(buildPredictRequest());
List<Float> result = response.getFloatVals(0);
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();
}
}Di mana:
client.setToken("tokenGeneratedFromService"): Ganti parameter dalam tanda kurung dengan token layanan Anda. Contohnya,
MmFiMDdlO****wYjhhNjgwZmZjYjBjMTM1YjliZmNkODhjOGVi****.client.setEndpoint("175805416243****.cn-beijing.pai-eas.aliyuncs.com"): Ganti parameter dalam tanda kurung dengan titik akhir layanan Anda. Contohnya,
175805416243****.cn-beijing.pai-eas.aliyuncs.com.client.setModelName("alirec_rank_no_fg"): Ganti parameter dalam tanda kurung dengan nama layanan Anda.
Menggunakan EAS Python SDK
Sebelum menjalankan kode, jalankan perintah pip install -U eas-prediction --user untuk menginstal atau memperbarui pustaka eas-prediction. Untuk informasi lebih lanjut, lihat Menggunakan Python SDK. Kode berikut memberikan contoh cara meminta layanan alirec_rank_no_fg:
from eas_prediction import PredictClient
from eas_prediction import TorchRequest
# snappy data
req = TorchRequest(False)
req.add_feed(0, [300, 3], TorchRequest.DT_INT64, [1] * 900)
req.add_feed(1, [300, 10, 768], TorchRequest.DT_FLOAT, [1.0] * 3 * 768000)
req.add_feed(2, [300, 768], TorchRequest.DT_FLOAT, [1.0] * 3 * 76800)
req.add_feed(3, [300], TorchRequest.DT_INT64, [1] * 300)
client = PredictClient('<your_endpoint>', '<your_service_name>')
client.set_token('<your_service_token>')
client.init()
resp = client.predict(req)
print(resp)
Tabel berikut menjelaskan parameter utama.
<your_endpoint>: Ganti ini dengan titik akhir layanan Anda, contohnya,
http://175805416243****.cn-beijing.pai-eas.aliyuncs.com/.<your_service_name>: Ganti ini dengan nama layanan Anda.
<your_service_token>: Ganti ini dengan token layanan Anda, contohnya,
MmFiMDdlO****wYjhhNjgwZmZjYjBjMTM1YjliZmNkODhjOGVi****.
Untuk informasi lebih lanjut tentang kode status yang dikembalikan saat mengakses layanan, lihat Deskripsi kode status layanan. Anda juga dapat membuat permintaan layanan secara manual. Untuk informasi lebih lanjut, lihat Format permintaan.
Format permintaan
Saat klien memanggil layanan, Anda dapat menghasilkan file kode permintaan prediksi secara manual berdasarkan file .proto. Untuk membuat permintaan layanan secara manual, rujuk definisi protobuf berikut untuk menghasilkan kode yang sesuai:
pytorch_predict.proto: Definisi permintaan untuk model Torch
syntax = "proto3";
package pytorch.eas;
option cc_enable_arenas = true;
option java_package = "com.aliyun.openservices.eas.predict.proto";
option java_outer_classname = "TorchPredictProtos";
enum ArrayDataType {
// Not a legal value for DataType. Used to indicate a DataType field
// has not been set.
DT_INVALID = 0;
// Data types that all computation devices are expected to be
// capable to support.
DT_FLOAT = 1;
DT_DOUBLE = 2;
DT_INT32 = 3;
DT_UINT8 = 4;
DT_INT16 = 5;
DT_INT8 = 6;
DT_STRING = 7;
DT_COMPLEX64 = 8; // Single-precision complex
DT_INT64 = 9;
DT_BOOL = 10;
DT_QINT8 = 11; // Quantized int8
DT_QUINT8 = 12; // Quantized uint8
DT_QINT32 = 13; // Quantized int32
DT_BFLOAT16 = 14; // Float32 truncated to 16 bits. Only for cast ops.
DT_QINT16 = 15; // Quantized int16
DT_QUINT16 = 16; // Quantized uint16
DT_UINT16 = 17;
DT_COMPLEX128 = 18; // Double-precision complex
DT_HALF = 19;
DT_RESOURCE = 20;
DT_VARIANT = 21; // Arbitrary C++ data types
}
// Dimensions of an array
message ArrayShape {
repeated int64 dim = 1 [packed = true];
}
// Protocol buffer representing an array
message ArrayProto {
// Data Type.
ArrayDataType dtype = 1;
// Shape of the 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];
}
message PredictRequest {
// Input tensors.
repeated ArrayProto inputs = 1;
// Output filter.
repeated int32 output_filter = 2;
// Input tensors for rec
map<string, ArrayProto> map_inputs = 3;
// debug_level for rec
int32 debug_level = 100;
}
// Response for PredictRequest on successful run.
message PredictResponse {
// Output tensors.
repeated ArrayProto outputs = 1;
// Output tensors for rec.
map<string, ArrayProto> map_outputs = 2;
}
torchrec_predict.proto: Definisi permintaan untuk model Torch dengan FG
syntax = "proto3";
option go_package = ".;torch_predict_protos";
option java_package = "com.aliyun.openservices.eas.predict.proto";
option java_outer_classname = "TorchRecPredictProtos";
package com.alibaba.pairec.processor;
import "pytorch_predict.proto";
//long->others
message LongStringMap {
map<int64, string> map_field = 1;
}
message LongIntMap {
map<int64, int32> map_field = 1;
}
message LongLongMap {
map<int64, int64> map_field = 1;
}
message LongFloatMap {
map<int64, float> map_field = 1;
}
message LongDoubleMap {
map<int64, double> map_field = 1;
}
//string->others
message StringStringMap {
map<string, string> map_field = 1;
}
message StringIntMap {
map<string, int32> map_field = 1;
}
message StringLongMap {
map<string, int64> map_field = 1;
}
message StringFloatMap {
map<string, float> map_field = 1;
}
message StringDoubleMap {
map<string, double> map_field = 1;
}
//int32->others
message IntStringMap {
map<int32, string> map_field = 1;
}
message IntIntMap {
map<int32, int32> map_field = 1;
}
message IntLongMap {
map<int32, int64> map_field = 1;
}
message IntFloatMap {
map<int32, float> map_field = 1;
}
message IntDoubleMap {
map<int32, double> map_field = 1;
}
// list
message IntList {
repeated int32 features = 1;
}
message LongList {
repeated int64 features = 1;
}
message FloatList {
repeated float features = 1;
}
message DoubleList {
repeated double features = 1;
}
message StringList {
repeated string features = 1;
}
// lists
message IntLists {
repeated IntList lists = 1;
}
message LongLists {
repeated LongList lists = 1;
}
message FloatLists {
repeated FloatList lists = 1;
}
message DoubleLists {
repeated DoubleList lists = 1;
}
message StringLists {
repeated StringList lists = 1;
}
message PBFeature {
oneof value {
int32 int_feature = 1;
int64 long_feature = 2;
string string_feature = 3;
float float_feature = 4;
double double_feature=5;
LongStringMap long_string_map = 6;
LongIntMap long_int_map = 7;
LongLongMap long_long_map = 8;
LongFloatMap long_float_map = 9;
LongDoubleMap long_double_map = 10;
StringStringMap string_string_map = 11;
StringIntMap string_int_map = 12;
StringLongMap string_long_map = 13;
StringFloatMap string_float_map = 14;
StringDoubleMap string_double_map = 15;
IntStringMap int_string_map = 16;
IntIntMap int_int_map = 17;
IntLongMap int_long_map = 18;
IntFloatMap int_float_map = 19;
IntDoubleMap int_double_map = 20;
IntList int_list = 21;
LongList long_list =22;
StringList string_list = 23;
FloatList float_list = 24;
DoubleList double_list = 25;
IntLists int_lists = 26;
LongLists long_lists =27;
StringLists string_lists = 28;
FloatLists float_lists = 29;
DoubleLists double_lists = 30;
}
}
// context features
message ContextFeatures {
repeated PBFeature features = 1;
}
// PBRequest specifies the request for aggregator
message PBRequest {
// debug mode
int32 debug_level = 1;
// user features, key is user input name
map<string, PBFeature> user_features = 2;
// item ids
repeated string item_ids = 3;
// context features for each item, key is context input name
map<string, ContextFeatures> context_features = 4;
// number of nearest neighbors(items) to retrieve
// from faiss
int32 faiss_neigh_num = 5;
// item features for each item, key is item input name
map<string, ContextFeatures> item_features = 6;
// optional meta data
map<string, string> meta_data = 7;
}
// PBResponse specifies the response for aggregator
message PBResponse {
// torch output tensors
map<string, pytorch.eas.ArrayProto> map_outputs = 1;
// fg ouput features
map<string, string> generate_features = 2;
// all fg input features
map<string, string> raw_features = 3;
// item ids
repeated string item_ids = 4;
}
Tabel berikut menjelaskan debug_level.
Secara default, Anda tidak perlu mengonfigurasi parameter ini. Kirimkan hanya saat debugging.
debug_level | Deskripsi |
0 | Layanan melakukan prediksi secara normal. |
1 | Dalam mode normal, ini memvalidasi kunci permintaan dan bentuk input serta output FG. Ini juga mengembalikan fitur input dan output tetapi tidak melakukan prediksi. |
2 | Dalam mode normal, ini memvalidasi kunci permintaan dan bentuk input serta output FG. Ini mengembalikan fitur input dan output, bersama dengan tensor input model, dan melakukan prediksi. |
3 | Dalam mode normal, ini memvalidasi kunci permintaan dan bentuk input serta output FG. Ini mengembalikan fitur output tetapi tidak melakukan prediksi. |
100 | Dalam mode normal, ini menyimpan permintaan prediksi. File protobuf yang disimpan berisi permintaan asli dan fitur input serta output sisi item. Path penyimpanan ditentukan oleh parameter request_log_path. |
102 | Dalam mode normal, ini melakukan recall vektor, memvalidasi kunci permintaan, dan memvalidasi bentuk input serta output FG. Ini menyimpan fitur input dan output, tensor input model, dan hasil User Embedding. |
903 | Mencetak waktu prediksi untuk setiap tahap. |
904 | Memvalidasi bidang fitur yang hilang dalam permintaan dan mencatatnya dalam log. |
Deskripsi kode status layanan
Tabel berikut menjelaskan kode status utama yang mungkin dikembalikan saat Anda mengakses layanan TorchEasyRec. Untuk informasi lebih lanjut tentang kode status yang dikembalikan saat mengakses layanan EAS, lihat Lampiran: Kode status layanan dan kesalahan umum.
Kode status | Deskripsi |
200 | Layanan mengembalikan respons normal. |
400 | Input permintaan tidak valid. |
500 | Prediksi gagal. Periksa log layanan untuk detailnya. |
Menyimpan dan mengurai file Request pb
Untuk versi processor 1.12 dan seterusnya, saat debug=True diaktifkan untuk badan permintaan mesin PAI-Rec, processor menyimpan permintaan asli serta fitur input dan output sisi item ke file protobuf di disk. Fitur ini mendukung analisis dan verifikasi fitur selanjutnya. File protobuf berisi data permintaan asli, fitur input sisi item, dan fitur yang ditransformasi sisi item. Untuk menggunakan fitur ini, konfigurasikan parameter request_log_path untuk menentukan path penyimpanan dan pasang path OSS ke path tersebut. Contohnya:
"model_config": {
"fg_mode": "normal",
"fg_threads": 8,
"request_log_path": "/request_log",
"background_feature_thread_num": 8
},
"storage": [
{
"mount_path": "/request_log",
"oss": {
"path": "oss://my-bucket/my-model/myrequests/",
"readOnly": false
}
},
{
"mount_path": "/home/admin/docker_ml/workspace/model/",
"oss": {
"path": "oss://my-bucket/my-model/20260316",
"readOnly": false
}
}
]Processor membuat subdirektori date_hour di path yang ditentukan oleh request_log_path dan menyimpan data permintaan. Penulisan ke disk dilakukan secara asinkron oleh thread latar belakang. Jumlah thread latar belakang dapat dikonfigurasi melalui parameter model_config.background_feature_thread_num. Nilai default adalah 4. Anda dapat meningkatkan nilai ini untuk mempercepat kecepatan penulisan. Nama file protobuf yang disimpan mengikuti format <request_id>_<random_str>.pb. Karena bandwidth tulis OSS terbatas, trafik badan permintaan dengan mode debug diaktifkan di mesin PAI-Rec harus tetap moderat. Jika trafik terlalu tinggi dan penulisan tertinggal, antrian internal layanan model akan membuang permintaan baru tanpa menyimpannya.
Untuk mengurai file protobuf yang diperoleh, gunakan EAS-Python-SDK versi 0.35 atau lebih baru, atau EAS-Java-SDK versi 2.0.29 atau lebih baru. Kode berikut memberikan contoh Python:
from eas_prediction.torchrec_predict_pb2 import PBLogData
with open('xxxx.pb', 'rb') as f:
pb_data = f.read()
pb_log = PBLogData()
pb_log.ParseFromString(pb_data)
print(pb_log) # Print all logs
print(pb_log.request) # Print the request
print(pb_log.raw_features) # Print the raw item-side features
print(pb_log.generate_features) # Print the item-side features after feature generation (fg)