Processor TorchEasyRec bawaan di EAS memungkinkan Anda menerapkan model rekomendasi yang dilatih dengan TorchEasyRec atau PyTorch sebagai layanan skoring dengan rekayasa fitur terintegrasi. Dengan mengoptimalkan secara bersama rekayasa fitur dan model PyTorch, processor ini menyediakan layanan skoring berkinerja tinggi. Topik ini menjelaskan cara menerapkan dan memanggil layanan model TorchEasyRec.
Latar Belakang
Diagram berikut menunjukkan arsitektur mesin rekomendasi berbasis TorchEasyRec Processor:
TorchEasyRec Processor mencakup modul-modul berikut:
Item Feature Cache: Menyimpan cache fitur item dari FeatureStore di memori untuk mengurangi overhead jaringan, menurunkan beban pada FeatureStore, dan meningkatkan kinerja layanan inferensi. Jika fitur-fitur item tersebut mencakup fitur real-time, FeatureStore menangani sinkronisasinya.
feature generator (FG): Memproses transformasi fitur berdasarkan file konfigurasi. Basis kode C++ tunggal menjamin konsistensi logika dalam pemrosesan offline maupun online.
TorchModel: Model PyTorch yang dilatih menggunakan TorchEasyRec atau PyTorch, lalu diekspor sebagai ScriptedModel.
Batasan
Fitur ini hanya mendukung seri instans tujuan umum g6, g7, dan g8, serta model GPU seperti T4 dan A10. Untuk informasi lebih lanjut, lihat general-purpose instance families (g series). Jika Anda menerapkan layanan GPU, pastikan versi CUDA Driver adalah 535 atau lebih baru.
Riwayat versi
TorchEasyRec Processor sedang dalam pengembangan aktif. Kami merekomendasikan penggunaan versi terbaru untuk menerapkan layanan inferensi Anda, karena versi yang lebih baru menyediakan lebih banyak fitur dan kinerja lebih tinggi. Daftar versi yang telah dirilis disediakan di bawah ini:
Nama processor | Tanggal rilis | Versi Torch | Versi FG | Pembaruan |
easyrec-torch-0.1 | 2024-09-10 | 2.4 | 0.2.9 |
|
easyrec-torch-0.2 | 2024-09-30 | 2.4 | 0.2.9 |
|
easyrec-torch-0.3 | 2024-10-14 | 2.4 | 0.2.9 |
|
easyrec-torch-0.4 | 2024-10-28 | 2.4 | 0.3.1 |
|
easyrec-torch-0.5 | 2024-11-14 | 2.4 | 0.3.1 |
|
easyrec-torch-0.6 | 2024-11-18 | 2.4 | 0.3.6 |
|
easyrec-torch-0.7 | 2024-12-06 | 2.5 | 0.3.9 |
|
easyrec-torch-0.8 | 2024-12-25 | 2.5 | 0.3.9 |
|
easyrec-torch-0.9 | 2025-01-15 | 2.5 | 0.4.1 |
|
easyrec-torch-1.0 | 2025-02-06 | 2.5 | 0.4.2 |
|
easyrec-torch-1.1 | 2025-04-23 | 2.5 | 0.5.9 |
|
easyrec-torch-1.2 | 2025-05-12 | 2.5 | 0.6.0 |
|
easyrec-torch-1.3 | 2025-05-29 | 2.5 | 0.6.5 |
|
easyrec-torch-1.4 | 2025-07-15 | 2.5 | 0.6.9 |
|
easyrec-torch-1.5 | 2025-09-18 | 2.5 | 0.7.3 |
|
easyrec-torch-1.6 | 2025-10-21 | 2.5 | 0.7.4 |
|
easyrec-torch-1.7 | 2025-11-04 | 2.5 | 0.7.4 |
|
easyrec-torch-1.8 | 2025-12-01 | 2.5 | 0.7.4 |
|
easyrec-torch-1.9 | 2026-01-09 | 2.5 | 1.0.0 |
|
easyrec-torch-1.10 | 2026-01-23 | 2.5 | 1.0.1 |
|
easyrec-torch-1.11 | 2026-02-10 | 2.5 | 1.0.1 |
|
easyrec-torch-1.12 | 2026-03-13 | 2.5 | 1.0.1 |
|
Catatan tentang versi 2.0 dan seterusnya
| ||||
easyrec-torch-2.0 | 2026-03-17 | 2.8 | 1.0.1 |
|
easyrec-torch-2.1 | 2026-04-09 | 2.8 | 1.0.2 |
|
easyrec-torch-2.2 | 2026-04-29 | 2.8 | 1.0.5 |
|
Langkah 1: Terapkan layanan
Siapkan file konfigurasi layanan
torcheasyrec.json.Atur tipe processor ke easyrec-torch-{version}. Untuk {version}, pilih versi dari daftar versi. Berikut contoh konfigurasi JSON:
Contoh dengan 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 tanpa 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 parameter lainnya, lihat Penerapan JSON.
Parameter
Wajib
Deskripsi
Contoh
processor
Ya
Processor TorchEasyRec.
"processor":"easyrec-torch-1.12"
path
Ya
Jalur OSS yang dipasang ke layanan untuk menyimpan file model.
"path": "oss://examplebucket/xxx/export"
fg_mode
Tidak
Menentukan mode rekayasa fitur (FG). Nilai yang valid:
bypass(default): Menonaktifkan FG. Hanya model Torch yang diterapkan.Mode ini cocok untuk skenario pemrosesan fitur kustom.
Dalam mode ini, Anda tidak perlu mengonfigurasi parameter agar processor mengakses FeatureStore.
normal: Mengaktifkan FG. Mode ini biasanya digunakan dengan TorchEasyRec untuk pelatihan model.
"fg_mode": "normal"
fg_threads
Tidak
Jumlah thread FG konkuren per permintaan.
"fg_threads": 15
outputs
Tidak
Nama variabel output dari model Torch, seperti
probs_ctr. Pisahkan beberapa nama dengan koma (,). Jika tidak ditentukan, semua variabel dikembalikan."outputs":"probs_ctr,probs_cvr"
item_empty_score
Tidak
Skor default yang dikembalikan saat ID item tidak ada. Nilai default: 0.
"item_empty_score": -1
Parameter recall processor
faiss_neigh_num
Tidak
Jumlah item yang diambil untuk recall vektor FAISS. Nilainya diambil dari field
faiss_neigh_numdalam permintaan. Jika field ini tidak disediakan, nilaifaiss_neigh_numdalam konfigurasimodel_configdigunakan, yang default-nya adalah 1."faiss_neigh_num": 200
faiss_nprobe
Tidak
Parameter
nprobemenentukan jumlah cluster yang dicari selama proses pengambilan. Nilai default adalah 800. Di FAISS, indeks file terbalik membagi data menjadi beberapa cluster kecil dan mempertahankan daftar terbalik untuk setiap cluster. Nilainprobeyang lebih besar biasanya menghasilkan akurasi pencarian lebih tinggi tetapi meningkatkan biaya komputasi dan waktu pencarian. Sebaliknya, nilai yang lebih kecil mengurangi akurasi tetapi mempercepat pencarian."faiss_nprobe" : 700
Parameter processor untuk akses FeatureStore
fs_project
Tidak
Nama proyek FeatureStore. Wajib saat menggunakan FeatureStore. Untuk informasi lebih lanjut, lihat Konfigurasi proyek FeatureStore.
"fs_project": "fs_demo"
fs_model
Tidak
Nama model fitur 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, tentukan
cn-beijinguntuk wilayah China (Beijing). Untuk informasi lebih lanjut tentang wilayah, lihat Titik akhir."region": "cn-beijing"
access_key_id
Tidak
ID AccessKey untuk mengakses FeatureStore.
"access_key_id": "xxxxx"
access_key_secret
Tidak
Rahasia AccessKey untuk mengakses FeatureStore.
"access_key_secret": "xxxxx"
load_feature_from_offlinestore
Tidak
Menentukan apakah akan memuat fitur offline langsung dari OfflineStore FeatureStore. Nilai yang valid:
true: Memuat data dari OfflineStore FeatureStore.false(default): Memuat data dari OnlineStore FeatureStore.
"load_feature_from_offlinestore": True
featuredb_username
Tidak
Username untuk FeatureDB.
"featuredb_username":"xxx"
featuredb_password
Tidak
Password untuk FeatureDB.
"featuredb_password":"xxx"
input_tile: Ekspansi fitur otomatis
INPUT_TILE
Tidak
Mengaktifkan ekspansi fitur otomatis. Untuk fitur yang memiliki nilai sama di semua item dalam satu permintaan, seperti
user_id, Anda dapat mengirim nilai hanya sekali. Ini mengurangi ukuran permintaan, latensi jaringan, dan waktu komputasi.Fitur ini memerlukan mode
normaldan model yang diekspor dari TorchEasyRec dengan variabel lingkungan yang sesuai diatur. Secara default, sistem membaca nilaiINPUT_TILEdari file model_acc.json di direktori model yang diekspor. Jika file ini tidak ada, nilai dibaca dari variabel lingkungan.Saat diaktifkan:
Jika diatur ke
2: FG untuk fitur sisi pengguna hanya dihitung sekali.Jika diatur ke
3: FG untuk fitur sisi pengguna hanya dihitung sekali. Sistem menghitung penyematan untuk fitur pengguna dan item secara terpisah, dan penyematan sisi pengguna juga 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.
CatatanMengatur ini ke
1mungkin menyebabkan masalah ketidakcocokan dengan beberapa model. Jika layanan hang selama menjalankan inferensi kedua, Anda dapat menyelesaikan masalah dengan mengatur variabel lingkunganPYTORCH_TENSOREXPR_FALLBACK=2. Ini melewati langkah kompilasi sambil mempertahankan beberapa fungsi optimasi graf."processor_envs":
[
{
"name": "NO_GRAD_GUARD",
"value": "1"
}
]
Parameter warm-up model
warmup_data_path
Tidak
Mengaktifkan fitur warm-up model dan menentukan jalur untuk menyimpan file warm-up. Untuk mencegah file-file ini hilang, Anda harus memasang jalur OSS ke lokasi ini dalam konfigurasi
storage."warmup_data_path": "/warmup"
warmup_cnt_per_file
Tidak
Jumlah iterasi warm-up yang dijalankan untuk setiap file PB warm-up. Nilai yang lebih besar memastikan warm-up lebih menyeluruh tetapi meningkatkan waktu warm-up. Nilai default: 20.
"warmup_cnt_per_file": 20,
warmup_pb_files_count
Tidak
Jumlah permintaan online yang disimpan sebagai file PB untuk warm-up saat startup layanan berikutnya. File disimpan ke jalur yang ditentukan oleh
warmup_data_path. Nilai default: 64."warmup_pb_files_count": 64
Pencatatan dan penyimpanan permintaan lambat
long_request_threshold
Tidak
Ambang batas waktu dalam milidetik (ms) untuk mengidentifikasi permintaan lambat. Jika waktu pemrosesan permintaan melebihi ambang batas ini, sistem secara otomatis mencatat waktu eksekusi setiap tahap dalam log. Nilai default: 200.
"long_request_threshold": 200
save_long_request
Tidak
Menentukan apakah akan menyimpan permintaan yang melebihi
long_request_thresholdsebagai file PB. Nilai default adalahfalse. File PB disimpan ke foldertorch_reqdi bawah direktori model."save_long_request": true
Pencatatan permintaan dan fitur ke OSS
request_log_path
Tidak
Jalur disk tempat file PB disimpan. Dalam konfigurasi layanan model, Anda harus memasang jalur OSS ke lokasi ini.
"request_log_path": "/online_log_pb"
background_feature_thread_num
Tidak
Jumlah thread latar belakang untuk menyimpan file ke disk. Jika beban kerja penulisan disk berat, Anda dapat meningkatkan nilai ini untuk meningkatkan throughput penyimpanan file PB. Nilai default: 4.
"background_feature_thread_num": 8
Terapkan layanan model TorchEasyRec menggunakan salah satu metode berikut:
Penerapan JSON (Direkomendasikan)
Ikuti langkah-langkah berikut:
-
Masuk ke Konsol PAI. Pilih wilayah di bagian atas halaman, lalu pilih ruang kerja yang diinginkan dan klik Elastic Algorithm Service (EAS).
Di halaman Elastic Algorithm Service (EAS), klik Deploy Service. Di bagian Custom Model Deployment, klik JSON Deployment.
Di editor JSON, tempel konfigurasi JSON Anda dan klik Deploy.
Klien eascmd
Unduh dan autentikasi klien. Contoh ini menggunakan versi Windows 64-bit klien.
Buka terminal. Di direktori yang berisi file JSON, jalankan perintah berikut untuk membuat layanan. Untuk informasi perintah lebih lanjut, lihat Referensi perintah.
eascmdwin64.exe create <service.json>Ganti
<service.json>dengan nama file JSON Anda, sepertitorcheasyrec.json.
-
Langkah 2: Panggil layanan
Setelah menerapkan layanan model TorchEasyRec, ikuti langkah-langkah berikut untuk melihat informasi pemanggilan layanan:
Masuk ke Konsol PAI, pilih wilayah di bagian atas halaman dan ruang kerja di sebelah kanan, lalu klik Enter EAS.
Di kolom Service Type, klik Invocation Information untuk melihat titik akhir dan token layanan.

Layanan model TorchEasyRec menggunakan Protobuf untuk input dan output. Metode pemanggilan bergantung pada apakah FG diaktifkan:
Gunakan FG (fg_mode='normal')
Layanan mendukung dua metode berikut:
EAS Java SDK
Sebelum menjalankan kode, konfigurasikan lingkungan Maven Anda. Untuk detailnya, lihat Petunjuk penggunaan Java SDK. Untuk versi terbaru EAS Java SDK, lihat https://github.com/pai-eas/eas-java-sdk. Kode berikut menunjukkan cara mengirim permintaan ke 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");
}
}
Parameter kunci adalah sebagai berikut:
client.setToken("tokenGeneratedFromService"): Ganti nilainya dengan token layanan Anda. Misalnya,
MmFiMDdlO****wYjhhNjgwZmZjYjBjMTM1YjliZmNkODhjOGVi****.client.setEndpoint("175805416243****.cn-beijing.pai-eas.aliyuncs.com"): Ganti nilainya dengan titik akhir layanan Anda. Misalnya,
175805416243****.cn-beijing.pai-eas.aliyuncs.com.client.setModelName("alirec_rank_with_fg"): Ganti nilainya dengan nama layanan Anda.
EAS Python SDK
Sebelum menjalankan kode, jalankan perintah pip install -U eas-prediction --user untuk menginstal atau memutakhirkan pustaka eas-prediction. Untuk informasi lebih lanjut, lihat Petunjuk penggunaan Python SDK. Untuk kode sumber, lihat https://github.com/pai-eas/eas-python-sdk/blob/master/eas_prediction/torchrec_request.py. Kode berikut adalah contohnya:
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)
Parameter kunci adalah sebagai berikut:
endpoint: Atur parameter ini ke titik akhir layanan Anda. Misalnya,
http://175805416243****.cn-beijing.pai-eas.aliyuncs.com/.<your_service_name>: Ganti placeholder ini dengan nama layanan Anda.
<your_service_token>: Ganti placeholder ini dengan token layanan Anda. Misalnya,
MmFiMDdlO****wYjhhNjgwZmZjYjBjMTM1YjliZmNkODhjOGVi****.
Melewati FG (fg_mode='bypass')
EAS Java SDK
Sebelum menjalankan kode, konfigurasikan lingkungan Maven Anda. Untuk detailnya, lihat Petunjuk Penggunaan Java SDK. Untuk versi SDK terbaru, lihat proyek di GitHub. Kode contoh berikut mengirim permintaan ke 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();
}
}Parameter kunci adalah sebagai berikut:
client.setToken("tokenGeneratedFromService"): Ganti nilai dalam tanda kurung dengan token layanan Anda. Misalnya,
MmFiMDdlO****wYjhhNjgwZmZjYjBjMTM1YjliZmNkODhjOGVi****.client.setEndpoint("175805416243****.cn-beijing.pai-eas.aliyuncs.com"): Ganti nilai dalam tanda kurung dengan titik akhir layanan Anda. Misalnya,
175805416243****.cn-beijing.pai-eas.aliyuncs.com.client.setModelName("alirec_rank_no_fg"): Ganti nilai dalam tanda kurung dengan nama layanan Anda.
EAS Python SDK
Sebelum menjalankan kode, jalankan perintah pip install -U eas-prediction --user untuk menginstal atau memutakhirkan pustaka eas-prediction. Untuk detail konfigurasi lebih lanjut, lihat Petunjuk Python SDK. Kode contoh untuk meminta layanan alirec_rank_no_fg adalah sebagai berikut:
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)
Parameter kunci adalah sebagai berikut:
<your_endpoint>: Ganti placeholder ini dengan titik akhir layanan Anda. Misalnya,
http://175805416243****.cn-beijing.pai-eas.aliyuncs.com/.<your_service_name>: Ganti placeholder ini dengan nama layanan Anda.
<your_service_token>: Ganti placeholder ini dengan token layanan Anda. Misalnya,
MmFiMDdlO****wYjhhNjgwZmZjYjBjMTM1YjliZmNkODhjOGVi****.
Untuk detail kode status yang dikembalikan layanan, lihat Kode Status Layanan. Untuk menyusun permintaan layanan, lihat Format Permintaan.
Format permintaan
Untuk memanggil layanan, Anda dapat menghasilkan kode permintaan prediksi secara manual dari file .proto. Atau, jika ingin membuat permintaan layanan sendiri, gunakan definisi Protobuf berikut untuk menghasilkan kode yang sesuai:
Pytorch_predict.proto: Permintaan 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 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 recommendation.
map<string, ArrayProto> map_inputs = 3;
// Debug level for recommendation.
int32 debug_level = 100;
}
// Response to a successful PredictRequest.
message PredictResponse {
// Output tensors.
repeated ArrayProto outputs = 1;
// Output tensors for recommendation.
map<string, ArrayProto> map_outputs = 2;
}
Torchrec_predict.proto: Permintaan 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";
// Mappings from int64 to other types.
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;
}
// Mappings from string to other types.
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;
}
// Mappings from int32 to other types.
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;
}
// Single-level list types.
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;
}
// Nested list types.
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 the aggregator.
message PBRequest {
// Debug mode.
int32 debug_level = 1;
// User features, keyed by the user input name.
map<string, PBFeature> user_features = 2;
// Item IDs.
repeated string item_ids = 3;
// Context features for each item, keyed by the 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, keyed by the item input name.
map<string, ContextFeatures> item_features = 6;
// Optional metadata.
map<string, string> meta_data = 7;
}
// PBResponse specifies the response from the aggregator.
message PBResponse {
// Output tensors from the Torch model.
map<string, pytorch.eas.ArrayProto> map_outputs = 1;
// Output features generated by FG.
map<string, string> generate_features = 2;
// All input features processed by FG.
map<string, string> raw_features = 3;
// Item IDs.
repeated string item_ids = 4;
}
Parameter debug_level adalah sebagai berikut:
Parameter ini opsional dan hanya untuk debugging.
Debug_level | Deskripsi |
0 | Menjalankan prediksi standar. |
1 | Dalam mode normal, memvalidasi kunci permintaan, melakukan validasi bentuk pada input dan output FG, dan mengembalikan fitur input dan output tanpa menjalankan prediksi. |
2 | Dalam mode normal, memvalidasi kunci permintaan, melakukan validasi bentuk pada input dan output FG, mengembalikan fitur input, fitur output, dan tensor input model, serta menjalankan prediksi. |
3 | Dalam mode normal, memvalidasi kunci permintaan, melakukan validasi bentuk pada input dan output FG, dan mengembalikan fitur output tanpa menjalankan prediksi. |
100 | Dalam mode normal, menyimpan permintaan prediksi ke disk sebagai file Protobuf. Parameter |
102 | Dalam mode normal, menjalankan recall vektor: memvalidasi kunci permintaan, melakukan validasi bentuk pada input dan output FG, dan menyimpan fitur input, fitur output, tensor input model, dan penyematan pengguna. |
903 | Mencatat waktu prediksi untuk setiap tahap. |
904 | Memvalidasi permintaan dan mencatat bidang fitur yang hilang. |
Kode status layanan
Layanan TorchEasyRec mengembalikan kode status berikut. Untuk informasi lebih lanjut tentang kode status yang dikembalikan oleh layanan EAS, lihat Lampiran: kode status layanan dan kesalahan umum.
Kode status | Deskripsi |
200 | Permintaan berhasil. |
400 | Permintaan tidak valid. |
500 | Prediksi gagal. Periksa log layanan untuk detailnya. |
Simpan dan urai permintaan Protobuf
Untuk versi processor 1.12 dan yang lebih baru, saat Anda mengaktifkan mode debug dengan mengatur debug=True dalam badan permintaan mesin PAI-REC, processor menyimpan permintaan asli, fitur input sisi item, dan fitur sisi item yang ditransformasi ke file protobuf di disk untuk analisis dan validasi fitur. Untuk menggunakan fitur ini, atur parameter request_log_path ke jalur tujuan yang dipasang melalui OSS. Misalnya:
"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 jalur yang ditentukan oleh request_log_path dan menyimpan data permintaan. Thread latar belakang menulis data ini ke disk secara asinkron. Jumlah thread latar belakang diatur oleh parameter model_config.background_feature_thread_num, yang default-nya adalah 4. Meningkatkan nilai ini dapat meningkatkan throughput penulisan. File Protobuf yang ditulis ke disk diberi nama <request_id>_<random_str>.pb. Karena OSS memiliki bandwidth tulis terbatas, hindari mengirim trafik permintaan berlebihan ke mesin PAI-REC saat mode debug diaktifkan. Jika penulisan tertinggal, antrean internal layanan model akan membuang permintaan baru.
Untuk mengurai file protobuf yang dihasilkan, gunakan EAS-Python-SDK versi 0.35 atau yang lebih baru, atau EAS-Java-SDK versi 2.0.29 atau yang lebih baru. Berikut adalah 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 the entire log
print(pb_log.request) # Print the request
print(pb_log.raw_features) # Print raw item-side features
print(pb_log.generate_features) # Print generated item-side featuresWarm-up layanan model
Layanan model mungkin menunjukkan lonjakan waktu respons awal selama startup atau pemutakhiran karena karakteristik perangkat lunak dan keras. Untuk mencegah lonjakan ini, konfigurasikan fitur warm-up untuk processor. Untuk mengaktifkan fitur ini di versi easyrec-torch-1.5 dan yang lebih baru, tambahkan tiga parameter ke model_config. Misalnya:
"warmup_data_path": "/warmup", # Mengaktifkan warmup dan mengatur direktori untuk file warmup.
"warmup_cnt_per_file": 20, # Jumlah iterasi warmup per file. Nilai yang lebih tinggi menghasilkan warmup lebih menyeluruh.
"warmup_pb_files_count": 64 # Jumlah permintaan online yang disimpan sebagai file protobuf untuk warmup. Nilai yang lebih tinggi mencakup lebih banyak pola data. File disimpan ke direktori `warmup_data_path`.Untuk menyimpan file protobuf, konfigurasikan pemasangan OSS di bagian storage yang mengarah ke warmup_data_path. Misalnya:
"storage": [
...,
{
"mount_path": "/warmup",
"oss": {
"path": "oss://<your-warmup-pb-file-path>",
"readOnly": false
}
}
]
Saat pertama kali dijalankan setelah konfigurasi, processor menangkap dan menyimpan jumlah permintaan langsung yang ditentukan oleh warmup_pb_files_count. Saat restart berikutnya, processor menggunakan file protobuf yang disimpan ini untuk warm-up.