全部产品
Search
文档中心

Platform For AI:Prosesor EasyRec (layanan skoring rekomendasi)

更新时间:Jan 28, 2026

Elastic Algorithm Service (EAS) menyediakan prosesor EasyRec bawaan yang menerapkan model rekomendasi yang dilatih oleh EasyRec atau TensorFlow sebagai layanan skoring. Prosesor ini mengintegrasikan kemampuan rekayasa fitur serta mengoptimalkan transformasi fitur dan inferensi model TensorFlow untuk mencapai performa skoring tinggi.

Informasi latar belakang

Prosesor EasyRec adalah layanan inferensi yang dibangun berdasarkan spesifikasi prosesor PAI EAS. Untuk informasi selengkapnya, lihat Kembangkan prosesor kustom menggunakan C atau C++. Prosesor ini mendukung dua skenario:

  • Model pembelajaran mendalam yang dilatih dengan Ikhtisar dan konfigurasi pembangkit fitur (FG) dan EasyRec. Prosesor ini menyimpan cache fitur item di memori dan mengoptimalkan transformasi fitur serta inferensi untuk meningkatkan performa skoring. Anda dapat menggunakan FeatureStore untuk mengelola fitur online dan real-time. Solusi ini terintegrasi dengan platform pengembangan sistem rekomendasi PAI-Rec guna menghubungkan pelatihan, perubahan fitur, dan optimasi inferensi. Dikombinasikan dengan mesin DPI PAI-Rec, solusi ini memungkinkan integrasi cepat antara penerapan model dan layanan online.

  • Model yang dilatih dengan EasyRec atau TensorFlow tanpa memerlukan Feature Generator.

Arsitektur mesin rekomendasi berbasis prosesor EasyRec:

image

Prosesor EasyRec mencakup modul-modul berikut:

  • Item Feature Cache: Menyimpan cache fitur FeatureStore di memori untuk mengurangi overhead jaringan dan beban FeatureStore. Mendukung pembaruan fitur secara inkremental dan real-time.

  • Feature Generator: Modul rekayasa fitur (FG) menjamin konsistensi antara pemrosesan fitur offline dan online, berdasarkan solusi rekayasa fitur Taobao.

  • TFModel: Memuat file Saved_Model yang diekspor oleh EasyRec dan menggunakan Blade untuk mengoptimalkan inferensi pada CPU dan GPU.

  • Modul instrumentasi fitur dan pembaruan model inkremental: Digunakan untuk skenario pelatihan real-time. Untuk informasi selengkapnya, 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 tipe GPU seperti T4, A10, GU30, L20, 3090, dan 4090. P100 tidak didukung.

Untuk informasi selengkapnya, lihat Tujuan umum (seri g).

Daftar versi

Prosesor EasyRec sedang dalam pengembangan aktif. Gunakan versi terbaru untuk mendapatkan fitur dan performa inferensi yang lebih baik. Versi yang telah dirilis:

Daftar versi

Nama prosesor

Tanggal rilis

Versi TensorFlow

Fitur baru

easyrec

20230608

2.10

  • Mendukung FeatureGenerator dan Item Feature Cache.

  • Mendukung Online Deep Learning.

  • Mendukung pengambilan vektor Faiss.

  • Mendukung inferensi GPU.

easyrec-1.2

20230721

2.10

  • Mengoptimalkan penyematan kategori berbobot.

easyrec-1.3

20230802

2.10

  • Mendukung pemuatan fitur item dari MaxCompute ke cache fitur item.

easyrec-1.6

20231006

2.10

  • Ekstensi fitur otomatis.

  • Optimasi penempatan GPU.

  • Mendukung penyimpanan permintaan ke direktori model menggunakan save_req.

easyrec-1.7

20231013

2.10

  • Mengoptimalkan performa model Keras.

easyrec-1.8

20231101

2.10

  • Mendukung versi cloud FeatureStore.

easyrec-kv-1.8

20231220

DeepRec

(deeprec2310)

  • Mendukung DeepRec EmbeddingVariable.

easyrec-1.9

20231222

2.10

  • Memperbaiki masalah optimasi graf TagFeature dan RawFeature.

easyrec-2.4

20240826

2.10

  • SDK C++ Feature Store mendukung FeatureDB.

  • SDK C++ Feature Store mendukung token STS.

  • Permintaan mendukung tipe double (float64).

easyrec-2.9

20250718

2.10

  • Mengintegrasikan pustaka FeatureGenerator versi 0.7.0 yang baru.

easyrec-3.0

20251025

2.10

  • Mengintegrasikan pustakaFeatureGenerator versi 0.7.4 yang baru

  • Optimasi performa

  • Memperbaiki masalah gagal mengurai operator yang baru ditambahkan di pustaka FG yang diperbarui

easyrec-3.1

20260116

2.10.1

  • Memutakhirkan pustaka FG ke versi 1.0.1.

  • Memutakhirkan SDK FS ke versi 20251117.

  • Memperbaiki berbagai bug.

Langkah 1: Terapkan layanan

Untuk menerapkan layanan model EasyRec dengan klien eascmd, atur Jenis prosesor menjadi easyrec-{versi}. Untuk informasi selengkapnya, lihat Penerapan layanan: EASCMD. Berikut adalah contoh konfigurasi.

Contoh menggunakan pustaka FG baru (fg_mode=normal)

Contoh ini menggunakan tipe node PyOdps3 untuk penerapan. Mode ini mendukung FeatureGenerator baru dengan operator transformasi fitur bawaan dan operator FG kustom. Mode ini mendukung tipe input kompleks (array dan map) serta dependensi fitur dalam mode Directed Acyclic Graph (DAG).

Contoh ini menggunakan PAI-FeatureStore untuk mengelola data fitur. Dalam skrip, Anda harus mengganti variabel ${fs_project},${fs_model} dengan nilai aktual Anda. Untuk informasi selengkapnya, lihat Langkah 2: Buat dan terapkan layanan model 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-2.9",
  "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, Anda juga harus mengubah metode pemanggilan yang sesuai.
  # Jika fg_mode bernilai normal atau tf, gunakan SDK EasyRecRequest untuk pemanggilan.
  # Jika fg_mode bernilai bypass, gunakan SDK TFRequest untuk pemanggilan.
  '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')

Contoh menggunakan versi TF OP dari FG (fg_mode=tf)

Catatan: Versi TF OP dari FG hanya mendukung fitur-fitur bawaan berikut: id_feature, raw_feature, combo_feature, lookup_feature, match_feature, dan sequence_feature. Operator FG kustom tidak didukung.

Contoh berikut menggunakan skrip shell untuk penerapan. Skrip ini berisi ID AccessKey dan rahasia AccessKey dalam teks biasa. Metode ini sederhana dan mudah dipahami, tetapi tidak mencakup PAI-FeatureStore atau menjelaskan cara memuat data tabel dari MaxCompute untuk mengurangi beban Hologres. Untuk informasi tentang penggunaan PAI-FeatureStore dan pemuatan data dari MaxCompute, lihat Langkah 2: Buat dan terapkan layanan model EAS. Perlu dicatat bahwa dokumen yang dirujuk menggunakan skrip Python untuk penerapan, yang memanfaatkan objek bawaan DataWorks o dan token Security Token Service (STS) sementara untuk meningkatkan keamanan, serta mengatur load_feature_from_offlinestore ke True.

bizdate=$1
# Saat Anda mengubah fg_mode, Anda juga harus mengubah metode pemanggilan yang sesuai. Jika fg_mode bernilai normal atau tf, gunakan SDK EasyRecRequest. Jika fg_mode bernilai 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>@<nama domain>:<port>/<database>",
    "tables": [{"name":"<skema>.<nama_tabel>","key":"<nama_kolom_indeks>","value": "<nama_kolom>"}],
    "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 <titik akhir> create echo.json
# Jalankan perintah pembaruan.
eascmd update ali_rec_rnk_with_fg -s echo.json

Contoh tanpa FG (fg_mode=bypass)

bizdate=$1
# Saat Anda mengubah fg_mode, Anda juga harus mengubah metode pemanggilan yang sesuai. Jika fg_mode bernilai normal atau tf, gunakan SDK EasyRecRequest. Jika fg_mode bernilai 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 <titik akhir> create echo.json
# Jalankan perintah pembaruan.
eascmd update ali_rec_rnk_no_fg -s echo.json

Parameter utama. Untuk parameter lainnya, lihat Penerapan JSON.

Parameter

Wajib

Deskripsi

Contoh

processor

Ya

Prosesor EasyRec.

"processor": "easyrec"

fg_mode

Ya

Mode rekayasa fitur. Pilih SDK dan metode permintaan yang sesuai berdasarkan mode tersebut.

  • normal: (Direkomendasikan)

    • Menggunakan pustaka FeatureGenerator untuk transformasi fitur dan memberikan hasilnya ke model. Memiliki banyak operator FG bawaan, mendukung operator kustom, dan dependensi fitur DAG.

    • Pemanggilan: Gunakan SDK EasyRecRequest. Kirim fitur tingkat tinggi seperti ID pengguna dan daftar ID item.

  • tf:

    • Menyematkan FG sebagai operator TensorFlow ke dalam graf komputasi dan melakukan optimasi graf untuk performa lebih tinggi.

    • Pemanggilan: Sama seperti mode normal. Gunakan SDK EasyRecRequest.

  • bypass:

    • Melewati FG bawaan. Layanan bertindak sebagai mesin inferensi TensorFlow. Cocok untuk pemrosesan fitur kustom. Anda tidak perlu mengonfigurasi Item Feature Cache atau akses prosesor ke FeatureStore.

    • Pemanggilan: Gunakan SDK TFRequest. Siapkan semua data fitur mentah di sisi klien dan susun dalam format Tensor. Cocok untuk pengguna tingkat lanjut dengan sistem pemrosesan fitur eksternal.

"fg_mode": "normal"

outputs

Ya

Nama variabel output model TensorFlow, seperti probs_ctr. Pisahkan beberapa nama dengan koma. Untuk melihat nama variabel output, jalankan perintah saved_model_cli.

"outputs":"probs_ctr,probs_cvr"

save_req

Tidak

Simpan data permintaan ke direktori model untuk warmup dan pengujian performa. Nilai yang valid:

  • true: Ya.

  • false (default): Tidak. Gunakan false di lingkungan produksi untuk menghindari dampak pada performa.

"save_req": "false"

Parameter terkait Item Feature Cache

period

Ya

Interval pembaruan berkala untuk fitur item dalam menit. Untuk pembaruan harian, atur nilai lebih dari satu hari (misalnya, 2880 = dua hari). Fitur diperbarui selama pembaruan rutin layanan harian.

"period": 2880

remote_type

Ya

Sumber data untuk fitur item. Jenis yang didukung:

  • hologres: Membaca dan menulis data melalui SQL. Cocok untuk penyimpanan dan kueri data dalam jumlah besar.

  • none: Tidak ada cache fitur item. Fitur item dikirim melalui permintaan. Atur tables ke [].

"remote_type": "hologres"

tables

Tidak

Tabel fitur item. Wajib diisi saat remote_type bernilai hologres. Parameter:

  • key: Wajib. Nama kolom item_id.

  • name: Wajib. Nama tabel fitur.

  • value: Opsional. Nama kolom yang akan dimuat. Pisahkan dengan koma.

  • condition: Opsional. Sub-pernyataan WHERE mendukung penyaringan item. Contohnya, style_id<10000.

  • timekey: Opsional. Digunakan untuk pembaruan inkremental item. Menentukan nilai timestamp atau integer untuk pembaruan. Format yang didukung: timestamp dan int.

  • static: Opsional. Menunjukkan fitur statis yang tidak memerlukan pembaruan berkala.

Anda dapat membaca data item input dari beberapa tabel. Format konfigurasinya adalah:

"tables": [{"key":"table1", ...},{"key":"table2", ...}]

Jika beberapa tabel memiliki kolom duplikat, kolom dari tabel yang disebutkan belakangan akan menimpa kolom dari tabel sebelumnya.

"tables": {

"key": "goods_id",

"name": "public.ali_rec_item_feature"

}

url

Tidak

Titik akhir untuk Hologres.

"url": "postgresql://LTAI************@hgprecn-cn-xxxxx-cn-hangzhou-vpc.hologres.aliyuncs.com:80/bigdata_rec"

Parameter untuk akses prosesor ke FeatureStore

fs_project

Tidak

Nama proyek FeatureStore. Tentukan bidang ini saat menggunakan FeatureStore. Untuk informasi selengkapnya, lihat Konfigurasi 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.

"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"

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 mengambil fitur offline langsung dari OfflineStore FeatureStore. Nilai yang valid:

  1. True: Ya. Data diambil dari OfflineStore FeatureStore, artinya data dibaca dari MaxCompute.

  2. False (default): Tidak. Data diambil dari OnlineStore FeatureStore.

"load_feature_from_offlinestore": True

iterate_featuredb_interval

Tidak

Interval dalam detik untuk memperbarui fitur statistik real-time.

Interval yang lebih pendek meningkatkan ketepatan waktu fitur tetapi dapat meningkatkan biaya baca jika fitur real-time sering berubah. Seimbangkan akurasi dan biaya sesuai kebutuhan.

"iterate_featuredb_interval": 5

input_tile: Parameter terkait ekstensi fitur otomatis

INPUT_TILE

Tidak

Mendukung broadcasting otomatis untuk fitur item. Untuk fitur dengan nilai yang sama dalam satu permintaan, seperti user_id, Anda dapat mengirimkan nilai tersebut hanya sekali.

  • Keuntungan: Mengurangi ukuran permintaan, waktu transfer jaringan, dan waktu komputasi.

  • Untuk mengaktifkan: Atur variabel lingkungan INPUT_TILE ke 2.

Catatan
  • Optimasi ini didukung pada easyrec-1.3 dan versi setelahnya.

  • Untuk fg_mode=tf, optimasi ini diaktifkan secara otomatis. Anda tidak perlu mengatur variabel lingkungan ini.

  • Untuk fg_mode=normal, optimasi ini diaktifkan secara otomatis pada easyrec-2.9 dan versi setelahnya. Anda tidak perlu mengatur variabel lingkungan ini.

"processor_envs":

[

{

"name": "INPUT_TILE",

"value": "2"

}

]

ADAPTE_FG_CONFIG

Tidak

Untuk memastikan kompatibilitas dengan model yang diekspor dari sampel pelatihan berbasis versi FG lama, aktifkan variabel ini untuk adaptasi.

"processor_envs":

[

{

"name": "ADAPTE_FG_CONFIG",

"value": "true"

}

]

DISABLE_FG_PRECISION

Tidak

Untuk memastikan kompatibilitas dengan model yang diekspor dari sampel pelatihan berbasis versi FG lama, Anda dapat menonaktifkan variabel ini. Versi FG lama membatasi fitur float hingga enam digit signifikan secara default, sedangkan versi baru menghapus batasan ini.

"processor_envs":

[

{

"name": "DISABLE_FG_PRECISION",

"value": "false"

}

]

Parameter optimasi inferensi untuk EasyRecProcessor

Parameter

Wajib

Deskripsi

Contoh

TF_XLA_FLAGS

Tidak

Saat menggunakan GPU, gunakan XLA untuk mengompilasi dan mengoptimalkan model serta 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

inter_op_parallelism_threads: Mengontrol jumlah thread untuk mengeksekusi operasi yang berbeda.

intra_op_parallelism_threads: Mengontrol jumlah thread yang digunakan dalam satu operasi.

Untuk CPU 32-core, mengatur nilai ini ke 16 umumnya menghasilkan performa lebih tinggi. Catatan: Jumlah total kedua jenis thread tersebut tidak boleh melebihi jumlah core CPU.

"model_config": {

"inter_op_parallelism_threads": 16,

"intra_op_parallelism_threads": 16,

}

rpc.worker_threads

Tidak

Parameter di bawah metadata di PAI EAS. Atur nilai ini sesuai jumlah core CPU instans. Misalnya, jika instans memiliki 15 core CPU, atur worker_threads ke 15.

"metadata": {

"rpc": {

"worker_threads": 15

}

Langkah 2: Panggil layanan

2.1 Konfigurasi jaringan

Mesin PAI-Rec dan layanan skoring model keduanya diterapkan di PAI EAS. Oleh karena itu, produk-produk tersebut harus dikonfigurasi untuk koneksi jaringan langsung. Di halaman instans PAI EAS, seperti yang ditunjukkan pada gambar berikut, klik VPC di pojok kanan atas. Atur VPC, vSwitch, dan security group yang sama. Untuk informasi selengkapnya, lihat Aktifkan EAS untuk mengakses internet dan sumber daya privat. Jika Anda menggunakan Hologres, Anda juga harus mengonfigurasi informasi VPC yang sama.

image

2.2 Dapatkan informasi layanan

Setelah menerapkan layanan model EasyRec, buka halaman Elastic Algorithm Service (EAS). Di kolom Metode Layanan, temukan layanan yang ingin Anda panggil dan klik Metode Pemanggilan untuk melihat informasi titik akhir dan token-nya.

2.3 Contoh kode SDK untuk pemanggilan

Format input dan output untuk layanan model EasyRec keduanya berupa protobuf. Oleh karena itu, Anda tidak dapat menguji layanan ini di halaman produk PAI EAS.

Sebelum memanggil layanan, Anda harus mengidentifikasi fg_mode yang diatur dalam model_config selama penerapan di Langkah 1. Mode yang berbeda memerlukan metode pemanggilan klien yang berbeda.

Mode penerapan (fg_mode)

Kelas permintaan SDK yang digunakan

normal atau tf (termasuk rekayasa fitur bawaan)

EasyRecRequest

bypass (tidak termasuk rekayasa fitur bawaan)

TFRequest

Dengan FG: fg_mode=normal atau tf

Java

Untuk informasi tentang konfigurasi lingkungan Maven, lihat Petunjuk SDK Java. Kode berikut memberikan contoh cara meminta 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());
// Saat mengakses melalui gateway publik, gunakan Endpoint yang diawali UID pengguna. Informasi ini dapat diperoleh dari detail pemanggilan layanan di konsol EAS.
client.setEndpoint("xxxxxxx.vpc.cn-hangzhou.pai-eas.aliyuncs.com");
client.setModelName("ali_rec_rnk_with_fg");
// Ganti dengan informasi token layanan.
client.setToken("******");

EasyRecRequest easyrecRequest = new EasyRecRequest(separator);
// userFeatures: Fitur pengguna. Fitur dipisahkan oleh \u0002 (CTRL_B). Nama fitur dan 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, int.

// contextFeatures: Fitur konteks. Fitur dipisahkan oleh \u0002 (CTRL_B). Nama fitur dan nilai dipisahkan oleh titik dua (:). Beberapa nilai fitur 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, Integer.

// itemIdStr: Daftar itemId untuk prediksi, dipisahkan oleh koma (,).
easyrecRequest.appendItemStr(itemIdStr, ",");
// Anda juga dapat menambahkan satu itemId sekaligus:
// easyrecRequest.appendItemId(String itemId)

PredictProtos.PBResponse response = client.predict(easyrecRequest);

for (Map.Entry<String, PredictProtos.Results> entry : response.getResultsMap().entrySet()) {
    String key = entry.getKey();
    PredictProtos.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 pemrosesan FG untuk membandingkannya dengan fitur offline demi konsistensi.
// Atur DebugLevel ke 1 untuk mengembalikan fitur yang dihasilkan.
easyrecRequest.setDebugLevel(1);
PredictProtos.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 konfigurasi lingkungan, lihat Petunjuk SDK Python. Kami merekomendasikan penggunaan klien Java di lingkungan produksi. Berikut adalah contoh kodenya:

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)

Di mana:

  • endpoint: Titik akhir layanan, yang diawali dengan ID pengguna (UID) Anda. Informasi ini dapat diperoleh di halaman Layanan Model Online PAI EAS dengan mengklik Metode Pemanggilan di kolom Metode Layanan untuk layanan tersebut.

  • service_name: Nama layanan. Anda dapat memperoleh nama layanan dari halaman Layanan Model Online PAI EAS.

  • token: Token layanan. Informasi ini dapat diperoleh dari kotak dialog Invocation Method.

Tanpa FG: fg_mode=bypass

Java

Untuk informasi tentang konfigurasi lingkungan Maven, lihat Petunjuk SDK Java. Kode berikut memberikan contoh cara meminta 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, Anda dapat mengirimkan nilai yang sama untuk fitur hanya 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 fitur koneksi jaringan langsung, gunakan metode setDirectEndpoint, misalnya: 
        //   client.setDirectEndpoint("pai-eas-vpc.cn-shanghai.aliyuncs.com");
        // Koneksi jaringan langsung harus diaktifkan di konsol EAS. Sediakan vSwitch sumber untuk mengakses layanan EAS.
        // Koneksi jaringan langsung menawarkan stabilitas dan performa 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 selengkapnya, lihat Petunjuk SDK Python. Karena Python menawarkan performa lebih rendah, kami merekomendasikan penggunaannya hanya untuk debugging layanan. Di lingkungan produksi, gunakan SDK Java. Kode berikut memberikan contoh cara meminta 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 petunjuk SDK yang disebutkan di atas.
    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 mengaktifkan optimasi INPUT_TILE=2, Anda dapat mengirimkan nilai untuk fitur di atas hanya 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 bahasa pemrograman lain, hasilkan kode permintaan prediksi secara manual dari file .proto. Gunakan definisi protobuf berikut:

  • 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 bidang DataType
      // belum diatur.
      DT_INVALID = 0;
    
      // Tipe data yang diharapkan dapat 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;  // Bilangan 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;  // Bilangan 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, bersama dengan
    // 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
      // sebenarnya diharapkan disimpan sebagai signature generik bernama
      // di bawah kunci "inputs" dalam ekspor model.
      // Setiap alias yang tercantum dalam signature generik bernama "inputs" harus disediakan
      // tepat satu kali untuk menjalankan prediksi.
      map<string, ArrayProto> inputs = 2;
    
      // Filter output.
      // Nama yang ditentukan adalah nama alias. Pemetaan dari alias ke nama tensor output
      // sebenarnya 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, dengan
      // pengecualian bahwa ketika tidak ada yang ditentukan, semua tensor yang ditentukan dalam
      // signature bernama akan dijalankan/diambil dan dikembalikan.
      repeated string output_filter = 3;
      
      // Bendera debug
      // 0: hanya mengembalikan 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 pada eksekusi 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: hanya mengembalikan hasil prediksi, tanpa informasi debug
      // 3: mengembalikan fitur yang dihasilkan oleh modul FG, format string, nilai fitur dipisahkan oleh \u0002, 
      //    dapat digunakan untuk pemeriksaan konsistensi fitur dan menghasilkan sampel pembelajaran mendalam online 
      // 100: mengembalikan hasil prediksi, dan menyimpan permintaan ke model_dir 
      // 101: menyimpan timeline ke model_dir
      // 102: untuk model recall seperti DSSM dan MIND, tidak hanya mengembalikan hasil pengambilan Faiss
      //      tetapi juga mengembalikan vektor penyematan pengguna.
      int32 debug_level = 1;
    
      // fitur pengguna
      map<string, PBFeature> user_features = 2;
    
      // id item, fitur item statis (diperbarui harian) 
      // diambil dari cache fitur yang berada di 
      // setiap node prosesor berdasarkan item_ids
      repeated string item_ids = 3;
    
      // fitur konteks untuk setiap item, fitur item real-time
      //    dapat dikirimkan sebagai fitur konteks.
      map<string, ContextFeatures> context_features = 4;
    
      // jumlah tetangga pengambilan penyematan.
      int32 faiss_neigh_num = 5;
    }
    
    // hasil yang dikembalikan
    message Results {
      repeated double scores = 1 [packed = true];
    }
    
    enum StatusCode {
      OK = 0;
      INPUT_EMPTY = 1;
      EXCEPTION = 2;
    }
    
    // PBResponse menentukan respons untuk aggregator
    message PBResponse {
      // hasil
      map<string, Results> results = 1;
    
      // fitur item
      map<string, string> item_features = 2;
    
      // fitur yang dihasilkan 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 output
      map<string, ArrayProto> tf_outputs = 10;
    }