All Products
Search
Document Center

Platform For AI:EasyRec Processor

Last Updated:May 19, 2026

Elastic Algorithm Service (EAS) mencakup processor EasyRec bawaan yang memungkinkan Anda menerapkan model rekomendasi yang dilatih dengan EasyRec atau TensorFlow sebagai layanan skoring dengan rekayasa fitur terintegrasi. Dengan mengoptimalkan secara bersama rekayasa fitur dan model TensorFlow, processor EasyRec menghadirkan layanan skoring berkinerja tinggi. Topik ini menjelaskan cara menerapkan dan memanggil layanan model EasyRec.

Informasi latar belakang

EasyRec Processor adalah layanan inferensi berdasarkan spesifikasi processor PAI-EAS (Kembangkan processor kustom menggunakan C atau C++). Processor ini digunakan dalam dua skenario:

  • Untuk model pembelajaran mendalam yang dilatih dengan feature generation (FG) dan EasyRec, EasyRec Processor secara signifikan meningkatkan kinerja skoring dengan menyimpan cache fitur item di memori serta mengoptimalkan transformasi fitur dan kinerja inferensi. Anda juga dapat menggunakan FeatureStore untuk mengelola fitur online dan real-time. Solusi rekomendasi kustom yang dibangun di atas platform pengembangan sistem rekomendasi PAI-Rec menghasilkan kode yang menyederhanakan pelatihan, transformasi fitur, dan optimasi inferensi. Dikombinasikan dengan Mesin DPI PAI-Rec, pendekatan ini memungkinkan penerapan model dan integrasi layanan yang cepat, sehingga mengurangi biaya dan meningkatkan efisiensi pengembangan.

  • EasyRec Processor juga dapat melayani model yang dilatih dengan EasyRec atau TensorFlow tanpa Feature Generator. Proses ini disebut menjalankan EasyRec Processor dalam mode bypass.

Gambar berikut menunjukkan arsitektur mesin rekomendasi berbasis EasyRec Processor.

easyrec

Catatan: Processor ini juga mendukung data offline dari MaxCompute.

EasyRec Processor mencakup modul-modul berikut:

  • Item Feature Cache: Menyimpan cache fitur dari FeatureStore di memori untuk mengurangi overhead jaringan dan beban pada FeatureStore. Modul ini juga mendukung pembaruan inkremental, seperti pembaruan fitur real-time.

  • Feature Generator: Modul rekayasa fitur (Ikhtisar dan konfigurasi feature generation) yang menggunakan implementasi yang sama untuk pemrosesan fitur offline dan online guna memastikan konsistensi. Implementasi rekayasa fitur ini memanfaatkan solusi terbukti dari Taobao. Untuk informasi lebih lanjut tentang konsep terkait FG, lihat Konsep bidang data, fitur data, dan fitur FG dalam EasyRec. Untuk memperluas FG dengan operator fitur kustom, lihat Sesuaikan operator fitur.

  • TFModel: Memuat file SavedModel yang diekspor dari EasyRec dan menggunakan Blade untuk mengoptimalkan inferensi model pada CPU dan GPU.

  • Modul Feature Instrumentation dan Incremental Model Update: Modul-modul ini terutama mendukung skenario pelatihan real-time. Untuk informasi lebih lanjut, lihat Pelatihan real-time.

Batasan

Inferensi CPU hanya didukung pada keluarga instans tujuan umum g6, g7, dan g8 (CPU Intel saja).

Inferensi GPU didukung pada GPU T4, A10, GU30, L20, 3090, dan 4090, tetapi tidak didukung pada P100.

Untuk detailnya, lihat Tujuan umum (seri g).

Versi

EasyRec Processor terus dikembangkan secara aktif. Kami menyarankan menggunakan versi terbaru untuk menerapkan layanan inferensi Anda. Versi yang lebih baru menawarkan lebih banyak fitur dan peningkatan kinerja.

Daftar versi

Nama processor

Tanggal rilis

Versi TensorFlow

Fitur baru

easyrec

20230608

2.10

  • Mendukung FeatureGenerator dan cache fitur item.

  • Mendukung pembelajaran mendalam online.

  • 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 dengan save_req.

easyrec-1.7

20231013

2.10

  • Mengoptimalkan kinerja model Keras.

easyrec-1.8

20231101

2.10

  • Mendukung versi cloud dari feature store.

easyrec-kv-1.8

20231220

DeepRec

(deeprec2310)

  • Mendukung DeepRec EmbeddingVariable.

easyrec-1.9

20231222

2.10

  • Memperbaiki masalah optimasi graf untuk TagFeature dan RawFeature.

easyrec-2.4

20240826

2.10

  • Mendukung FeatureDB dalam SDK C++ feature store.

  • Mendukung token STS dalam SDK C++ feature store.

  • Mendukung tipe data double (float64) untuk permintaan.

easyrec-2.9

20250718

2.10

  • Mengintegrasikan versi 0.7.0 pustaka FeatureGenerator.

easyrec-3.0

20251025

2.10

  • Mengintegrasikan versi 0.7.4 pustaka FeatureGenerator.

  • Meningkatkan kinerja.

  • Memperbaiki masalah penguraian operator baru dari pustaka FG yang diperbarui.

easyrec-3.1

20260116

2.10.1

  • Memperbarui pustaka FG ke versi 1.0.1.

  • Memperbarui SDK FS ke versi 20251117.

easyrec-3.2

20260209

2.10.1

Memperbarui SDK FS ke versi 20260202.

easyrec-3.3

20260330

2.10.1

Memperbarui pustaka FG ke versi 1.0.2.

Memperbarui SDK FS ke versi 20260305.

easyrec-3.4

20260415

2.10.1

Memperbarui pustaka FG ke versi 1.0.3.

easyrec-3.5

20260515

2.10.1

Memperbarui pustaka FG ke versi 1.0.5.

Langkah 1: Terapkan layanan

Saat menerapkan layanan model EasyRec dengan klien eascmd, atur Jenis processor menjadi easyrec-{version}. Untuk informasi selengkapnya tentang cara menerapkan layanan menggunakan klien, lihat Penerapan layanan: EASCMD. Bagian berikut menyediakan contoh file konfigurasi layanan.

Pustaka FeatureGenerator baru (fg_mode=normal)

Contoh ini menggunakan tipe node PyOdps3. Dalam mode ini, Anda dapat menggunakan versi baru pustaka FeatureGenerator. Pustaka ini menyediakan kumpulan kaya operator transformasi bawaan dan mendukung operator kustom, tipe input kompleks seperti array dan map, serta dependensi fitur berbasis DAG.

Contoh berikut menggunakan PAI-FeatureStore untuk mengelola data fitur. Ganti variabel ${fs_project},${fs_model} dalam skrip dengan nilai aktualnya. Untuk detail lebih lanjut, 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-3.5",
  "storage": [
    {
      "mount_path": "/home/admin/docker_ml/workspace/model/",
      "oss": {
        "path": "oss://easyrec/ali_rec_sln_acc_rnk/20250722/export/final_with_fg"
      }
    }
  ],
  # Saat Anda mengubah fg_mode, metode pemanggilan juga harus diubah.
  # Jika fg_mode adalah 'normal' atau 'tf', gunakan SDK EasyRecRequest.
  # Jika fg_mode adalah 'bypass', gunakan SDK TFRequest.
  'model_config': {
    'outputs': 'probs_ctr,probs_cvr',
    'fg_mode': 'normal',
    'steady_mode': True,
    'period': 2880,
    'access_key_id': f'{o.account.access_id}',
    'access_key_secret': f'{o.account.secret_access_key}',
    "load_feature_from_offlinestore": True,
    'region': 'cn-shanghai',
    'fs_project': '${fs_project}',
    'fs_model': '${fs_model}',
    'fs_entity': 'item',
    'featuredb_username': 'guest',
    'featuredb_password': '123456',
    'log_iterate_time_threshold': 100,
    'iterate_featuredb_interval': 5,
    'mc_thread_pool_num': 1,
  }
}

with open('echo.json', 'w') as output_file:
    json.dump(config, output_file)

os.system(f'/home/admin/usertools/tools/eascmd -i {o.account.access_id} -k {o.account.secret_access_key} -e pai-eas.cn-shanghai.aliyuncs.com create echo.json')
# os.system(f'/home/admin/usertools/tools/eascmd -i {o.account.access_id} -k {o.account.secret_access_key} -e pai-eas.cn-shanghai.aliyuncs.com modify {service_name} -s echo.json')

Catatan: Ubah nilai parameter featuredb_username dan featuredb_password menjadi username dan password yang valid.

Versi operator TF dari FeatureGenerator (fg_mode=tf)

Penting: Versi operator TF dari FeatureGenerator hanya mendukung kumpulan fitur bawaan terbatas: id_feature, raw_feature, combo_feature, lookup_feature, match_feature, dan sequence_feature. Operator FeatureGenerator kustom tidak didukung.

Skrip shell berikut digunakan untuk penerapan. Skrip ini menyertakan ID AccessKey dan Secret AccessKey dalam teks biasa. Pendekatan ini langsung namun tidak menunjukkan cara menggunakan PAI-FeatureStore atau memuat data dari MaxCompute untuk mengurangi beban pada Hologres.

Kami menyarankan Anda menggunakan PAI-FeatureStore dan memuat data dari MaxCompute. Untuk informasi lebih lanjut, lihat Langkah 2: Buat dan terapkan layanan model EAS. Topik yang dirujuk menjelaskan metode penerapan yang lebih aman menggunakan skrip Python, objek o bawaan DataWorks, dan token Security Token Service (STS) sementara. Dalam contoh tersebut, load_feature_from_offlinestore diatur ke True.

bizdate=$1
# Saat Anda mengubah fg_mode, metode pemanggilan juga harus diubah. Jika fg_mode adalah 'normal' atau 'tf', gunakan SDK EasyRecRequest. Jika fg_mode adalah '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>@<endpoint>:<port>/<database>",
    "tables": [{"name":"<schema>.<table_name>","key":"<index_column_name>","value": "<column_name>"}],
    "period": 2880,
    "fg_mode": "tf",
    "outputs":"probs_ctr,probs_cvr",
  },
  "model_path": "",
  "processor": "easyrec-3.5",
  "storage": [
    {
      "mount_path": "/home/admin/docker_ml/workspace/model/",
      "oss": {
        "path": "oss://easyrec/ali_rec_sln_acc_rnk/20221122/export/final_with_fg"
      }
    }
  ]
}

EOF
# Jalankan perintah penerapan.
eascmd  create echo.json
# eascmd -i <AccessKeyID>  -k  <AccessKeySecret>   -e <endpoint> create echo.json
# Jalankan perintah pembaruan.
eascmd update ali_rec_rnk_with_fg -s echo.json

Lewati FeatureGenerator (fg_mode=bypass)

Jika Anda tidak menggunakan FeatureGenerator, Anda harus merakit permintaan di sisi klien sebelum memanggil processor EasyRec. Untuk informasi lebih lanjut, lihat Cara menggunakan EAS untuk inferensi tanpa pelatihan dengan EasyRec.

bizdate=$1
# Saat Anda mengubah fg_mode, metode pemanggilan juga harus diubah. Jika fg_mode adalah 'normal' atau 'tf', gunakan SDK EasyRecRequest. Jika fg_mode adalah '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.5",
  "processor_envs": [
    {
      "name": "INPUT_TILE",
      "value": "2"
    }
  ],
  "storage": [
    {
      "mount_path": "/home/admin/docker_ml/workspace/model/",
      "oss": {
        "path": "oss://easyrec/ali_rec_sln_acc_rnk/20221122/export/final/"
      }
    }
  ],
  "warm_up_data_path": "oss://easyrec/ali_rec_sln_acc_rnk/rnk_warm_up.bin"
}

EOF
# Jalankan perintah penerapan.
eascmd  create echo.json
# eascmd -i <AccessKeyID>  -k  <AccessKeySecret>   -e <endpoint> create echo.json
# Jalankan perintah pembaruan.
eascmd update ali_rec_rnk_no_fg -s echo.json

Tabel berikut menjelaskan parameter utama. Untuk informasi tentang parameter lainnya, lihat Penerapan JSON.

Parameter

Wajib

Deskripsi

Contoh

processor

Ya

Nama processor EasyRec.

"processor": "easyrec"

fg_mode

Ya

Mode rekayasa fitur. Berdasarkan mode yang dipilih, Anda harus menggunakan SDK dan metode perakitan permintaan yang sesuai saat memanggil layanan.

  • normal: (Direkomendasikan)

    • Deskripsi: Menggunakan pustaka FeatureGenerator untuk transformasi fitur dan memberikan output ke model. Mode ini menyediakan kumpulan kaya operator FeatureGenerator bawaan, mendukung operator kustom, dan mendukung dependensi fitur berbasis DAG.

    • Metode pemanggilan: Klien harus menggunakan SDK EasyRecRequest dan hanya meneruskan fitur tingkat tinggi, seperti ID pengguna dan daftar ID item.

  • tf:

    • Deskripsi: Menanamkan FeatureGenerator sebagai operator TensorFlow ke dalam graf komputasi TensorFlow dan melakukan optimasi graf untuk kinerja lebih tinggi.

    • Metode pemanggilan: Sama seperti mode normal. Klien harus menggunakan SDK EasyRecRequest.

  • bypass:

    • Deskripsi: Melewati FeatureGenerator bawaan, dan layanan hanya berfungsi sebagai mesin inferensi model TensorFlow. Mode ini cocok untuk skenario di mana Anda menggunakan pemrosesan fitur kustom. Dalam mode ini, Anda tidak perlu mengonfigurasi parameter terkait cache fitur item atau akses processor ke PAI-FeatureStore.

    • Metode pemanggilan: Klien harus menggunakan SDK TFRequest. Pemanggil harus menyiapkan dan merakit semua data fitur mentah yang diperlukan oleh model di sisi klien dan mengatur data ke dalam format Tensor. Mode ini cocok untuk pengguna tingkat lanjut yang memiliki sistem pemrosesan fitur eksternal.

"fg_mode": "normal"

outputs

Ya

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

"outputs":"probs_ctr,probs_cvr"

save_req

Tidak

Menentukan apakah akan menyimpan file data yang diperoleh dari permintaan ke direktori model. File yang disimpan dapat digunakan untuk warm-up dan pengujian kinerja. Nilai yang valid:

  • true: File disimpan.

  • false (default): File tidak disimpan. Atur parameter ini ke false di lingkungan produksi untuk mencegah penurunan kinerja.

"save_req": "false"

Parameter cache fitur item

period

Ya

Interval pembaruan cache fitur item, dalam menit. Jika fitur item diperbarui setiap hari, Anda dapat mengatur parameter ini ke nilai lebih besar dari 1.440 (jumlah menit dalam sehari), misalnya 2.880 untuk interval dua hari. Hal ini mencegah pembaruan fitur yang tidak perlu dalam hari yang sama karena fitur juga diperbarui selama penerapan layanan harian rutin.

"period": 2880

remote_type

Ya

Sumber data untuk fitur item. Nilai yang valid:

  • hologres: Membaca dan menulis data menggunakan antarmuka SQL. Ini cocok untuk menyimpan dan mengkueri jumlah data yang besar.

  • none: Tidak menggunakan cache fitur item. Fitur item diteruskan dalam permintaan. Dalam hal ini, Anda harus mengatur tables ke [].

"remote_type": "hologres"

tables

Tidak

Tabel fitur item. Parameter ini wajib saat remote_type diatur ke hologres. Parameter ini mencakup sub-parameter berikut:

  • key: Wajib. Nama kolom ID item.

  • name: Wajib. Nama tabel fitur.

  • value: Opsional. Nama kolom yang akan dimuat. Pisahkan beberapa nama kolom dengan koma (,).

  • condition: Opsional. Klausul WHERE yang digunakan untuk memfilter item. Contoh: style_id<10000.

  • timekey: Opsional. Menentukan stempel waktu atau nilai integer untuk pembaruan item inkremental. 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. Konfigurasi harus dalam format berikut:

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

Jika tabel berbagi nama kolom, kolom dari tabel yang muncul belakangan dalam daftar akan menimpa kolom dari tabel yang muncul lebih awal.

"tables": {

"key": "goods_id",

"name": "public.ali_rec_item_feature"

}

url

Tidak

Titik akhir Hologres.

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

Parameter untuk akses processor ke PAI-FeatureStore

fs_project

Tidak

Nama proyek PAI-FeatureStore. Parameter ini wajib saat Anda menggunakan PAI-FeatureStore. Untuk informasi lebih lanjut, lihat Konfigurasikan proyek FeatureStore.

"fs_project": "fs_demo"

fs_model

Tidak

Nama fitur model di PAI-FeatureStore.

"fs_model": "fs_rank_v1"

fs_entity

Tidak

Nama entitas di PAI-FeatureStore.

"fs_entity": "item"

region

Tidak

Wilayah tempat proyek PAI-FeatureStore berada.

"region": "cn-beijing"

access_key_id

Tidak

ID AccessKey yang digunakan untuk mengakses PAI-FeatureStore.

"access_key_id": "xxxxx"

access_key_secret

Tidak

Secret AccessKey yang digunakan untuk mengakses PAI-FeatureStore.

"access_key_secret": "xxxxx"

featuredb_username

Tidak

Username untuk FeatureDB.

"featuredb_username": "xxxxx"

featuredb_password

Tidak

Password untuk FeatureDB.

"featuredb_password": "xxxxx"

load_feature_from_offlinestore

Tidak

Menentukan apakah akan memperoleh fitur offline langsung dari OfflineStore PAI-FeatureStore. Nilai yang valid:

  1. True: Memperoleh data dari OfflineStore PAI-FeatureStore dengan membaca dari MaxCompute.

  2. False (default): Memperoleh data dari OnlineStore PAI-FeatureStore.

"load_feature_from_offlinestore": True

iterate_featuredb_interval

Tidak

Interval, dalam detik, untuk memperbarui fitur statistik real-time.

Interval yang lebih pendek meningkatkan kesegaran fitur tetapi meningkatkan biaya baca saat fitur sering berubah. Seimbangkan akurasi dan biaya.

"iterate_featuredb_interval": 5

input_tile: Parameter untuk broadcasting fitur otomatis

INPUT_TILE

Tidak

Atur variabel lingkungan INPUT_TILE ke 1 untuk mengaktifkan broadcasting otomatis fitur item. Hal ini memungkinkan Anda meneruskan satu nilai untuk fitur yang tetap konstan dalam satu permintaan, seperti user_id. Saat variabel lingkungan INPUT_TILE diatur ke 2, operasi tile ditunda hingga setelah penyematan fitur diambil, yang lebih jauh mengurangi beban komputasi.

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

  • Untuk mengaktifkan fitur ini, atur variabel lingkungan INPUT_TILE ke 1 atau 2.

Catatan
  • Optimasi ini didukung di EasyRec 1.3 dan versi selanjutnya.

  • Saat fg_mode adalah tf, optimasi ini diaktifkan secara otomatis, dan Anda tidak perlu mengatur variabel lingkungan ini.

  • Saat fg_mode adalah normal, INPUT_TILE diatur otomatis ke 1 di EasyRec 2.9 dan versi selanjutnya.

"processor_envs":

[

{

"name": "INPUT_TILE",

"value": "2"

}

]

ADAPTE_FG_CONFIG

Tidak

Mengaktifkan kompatibilitas dengan model yang dilatih dengan versi lama FeatureGenerator.

"processor_envs":

[

{

"name": "ADAPTE_FG_CONFIG",

"value": "true"

}

]

DISABLE_FG_PRECISION

Tidak

Untuk kompatibilitas dengan model yang dilatih dengan versi lama FeatureGenerator. Versi lama membatasi fitur tipe float hingga enam digit signifikan secara default, sedangkan versi baru menghapus batasan ini. Untuk menerapkan perilaku lama (batas 6 digit), atur variabel ini ke true.

"processor_envs":

[

{

"name": "DISABLE_FG_PRECISION",

"value": "false"

}

]

Optimasi inferensi processor EasyRec

Parameter

Wajib

Deskripsi

Contoh

TF_XLA_FLAGS

Tidak

Untuk inferensi GPU, parameter ini mengaktifkan XLA untuk mengompilasi dan mengoptimalkan model serta secara otomatis melakukan fusi 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 menjalankan operasi berbeda secara paralel.

intra_op_parallelism_threads: Mengontrol jumlah thread yang digunakan dalam satu operasi.

Untuk CPU 32-core, mengatur parameter ini ke 16 biasanya meningkatkan kinerja. Perhatikan bahwa jumlah total kedua thread tidak boleh melebihi jumlah total core CPU.

"model_config": {

"inter_op_parallelism_threads": 16,

"intra_op_parallelism_threads": 16,

}

rpc.worker_threads

Tidak

Parameter di bawah metadata dalam konfigurasi EAS. Atur parameter ini ke 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 diterapkan di PAI-EAS dan memerlukan koneksi jaringan langsung. Di halaman instans PAI-EAS, klik 'VPC' di pojok kanan atas untuk mengonfigurasi VPC, vSwitch, dan security group yang sama. Untuk informasi lebih lanjut, lihat Akses sumber daya publik atau on-premises dari EAS. Jika Anda menggunakan Hologres, Anda juga harus mengonfigurasi informasi VPC yang sama. Gambar berikut menunjukkan contohnya.

image

2.2 Dapatkan informasi layanan

Setelah layanan model EasyRec diterapkan, buka halaman Elastic Algorithm Service (EAS). Temukan layanan yang ingin Anda panggil, lalu di kolom Metode Layanan, klik Informasi Pemanggilan untuk melihat titik akhir dan token layanan.

2.3 Contoh kode SDK

Layanan model EasyRec menggunakan format Protocol Buffers (Protobuf) untuk input dan output. Oleh karena itu, Anda tidak dapat menguji layanan dari konsol PAI-EAS.

Sebelum memanggil layanan, pastikan fg_mode yang dikonfigurasi dalam model_config selama penerapan di Langkah 1. Mode yang berbeda memerlukan metode pemanggilan klien yang berbeda.

Mode (fg_mode)

Kelas permintaan

normal atau tf (dengan rekayasa fitur bawaan)

EasyRecRequest

bypass (tanpa rekayasa fitur bawaan)

TFRequest

Dengan FG fg_mode=normal atau tf

Java

Untuk konfigurasi lingkungan Maven, lihat panduan SDK Java. Kode berikut menunjukkan cara mengirim permintaan ke layanan ali_rec_rnk_with_fg:

import com.aliyun.openservices.eas.predict.http.*;
import com.aliyun.openservices.eas.predict.request.EasyRecRequest;

PredictClient client = new PredictClient(new HttpConfig());
// Saat Anda mengakses layanan melalui gateway publik, gunakan titik akhir yang diawali dengan UID Anda. Anda dapat memperoleh titik akhir ini dari informasi pemanggilan layanan di konsol EAS.
client.setEndpoint("xxxxxxx.vpc.cn-hangzhou.pai-eas.aliyuncs.com");
client.setModelName("ali_rec_rnk_with_fg");
// Ganti ini dengan token layanan Anda.
client.setToken("******");

EasyRecRequest easyrecRequest = new EasyRecRequest(separator);
// userFeatures: Fitur pengguna. Fitur dipisahkan oleh \u0002 (CTRL_B). Nama fitur dan nilai dipisahkan oleh titik dua (:).
//  user_fea0:user_fea0_val\u0002user_fea1:user_fea1_val
// Untuk informasi lebih lanjut tentang 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 data T dari nilai fitur dapat berupa String, float, long, atau int.

// contextFeatures: Fitur konteks. Fitur dipisahkan oleh \u0002 (CTRL_B). Nama fitur dan nilai dipisahkan oleh titik dua (:). Beberapa nilai untuk fitur yang sama juga dipisahkan oleh titik dua.
//   ctxt_fea0:ctxt_fea0_ival0:ctxt_fea0_ival1:ctxt_fea0_ival2\u0002ctxt_fea1:ctxt_fea1_ival0:ctxt_fea1_ival1:ctxt_fea1_ival2
easyrecRequest.appendContextFeatureString(contextFeatures);
// Anda juga dapat menambahkan satu fitur konteks sekaligus:
// easyrecRequest.addContextFeature(String ctxtFeaName, List<Object> ctxtFeaValue).
// Tipe data ctxtFeaValue dapat berupa String, Float, Long, atau Integer.

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

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

for (Map.Entry<String, easyrecPredictProtos.Results> entry : response.getResultsMap().entrySet()) {
    String key = entry.getKey();
    easyrecPredictProtos.Results value = entry.getValue();
    System.out.print("key: " + key);
    for (int i = 0; i < value.getScoresCount(); i++) {
        System.out.format("value: %.6g\n", value.getScores(i));
    }
}

// Dapatkan fitur setelah pemrosesan FG untuk memeriksa konsistensi dengan fitur offline.
// Atur DebugLevel ke 1 untuk mengembalikan fitur yang dihasilkan.
easyrecRequest.setDebugLevel(1);
easyrecPredictProtos.PBResponse response = client.predict(easyrecRequest);
Map<String, String> genFeas = response.getGenerateFeaturesMap();
for(String itemId: genFeas.keySet()) {
    System.out.println(itemId);
    System.out.println(genFeas.get(itemId));
}
Python

Untuk informasi tentang cara mengonfigurasi lingkungan, lihat panduan SDK Python. Kami menyarankan menggunakan klien Java di lingkungan produksi untuk kinerja yang lebih baik. Kode berikut memberikan contoh:

from eas_prediction import PredictClient

from eas_prediction.easyrec_request import EasyRecRequest
from eas_prediction.easyrec_predict_pb2 import PBFeature
from eas_prediction.easyrec_predict_pb2 import PBRequest

if __name__ == '__main__':
    endpoint = 'http://xxxxxxx.vpc.cn-hangzhou.pai-eas.aliyuncs.com'
    service_name = 'ali_rec_rnk_with_fg'
    token = '******'

    client = PredictClient(endpoint, service_name)
    client.set_token(token)
    client.init()

    req = PBRequest()
    uid = PBFeature()
    uid.string_feature = 'u0001'
    req.user_features['user_id'] = uid
    age = PBFeature()
    age.int_feature = 12
    req.user_features['age'] = age
    weight = PBFeature()
    weight.float_feature = 129.8
    req.user_features['weight'] = weight

    req.item_ids.extend(['item_0001', 'item_0002', 'item_0003'])
    
    easyrec_req = EasyRecRequest()
    easyrec_req.add_feed(req, debug_level=0)
    res = client.predict(easyrec_req)
    print(res)

Parameter dijelaskan sebagai berikut:

  • endpoint: Titik akhir layanan. Untuk memperolehnya, buka halaman Elastic Algorithm Service (EAS), temukan layanan Anda, lalu klik Informasi Pemanggilan di kolom Metode Layanan.

  • service_name: Nama layanan. Peroleh dari halaman Elastic Algorithm Service (EAS).

  • token: Token layanan. Temukan di kotak dialog Invocation Information.

Tanpa FG fg_mode=bypass

Java

Untuk konfigurasi lingkungan Maven, lihat panduan SDK Java. Kode berikut menunjukkan cara mengirim permintaan ke layanan ali_rec_rnk_no_fg:

import java.util.List;

import com.aliyun.openservices.eas.predict.http.PredictClient;
import com.aliyun.openservices.eas.predict.http.HttpConfig;
import com.aliyun.openservices.eas.predict.request.TFDataType;
import com.aliyun.openservices.eas.predict.request.TFRequest;
import com.aliyun.openservices.eas.predict.response.TFResponse;

public class TestEasyRec {
    public static TFRequest buildPredictRequest() {
        TFRequest request = new TFRequest();
 
        request.addFeed("user_id", TFDataType.DT_STRING, 
                        new long[]{3}, new String []{ "u0001", "u0001", "u0001"});
      	request.addFeed("age", TFDataType.DT_FLOAT, 
                        new long[]{3}, new float []{ 18.0f, 18.0f, 18.0f});
        // Catatan: Jika Anda mengatur INPUT_TILE=2, untuk fitur yang memiliki nilai sama, Anda hanya perlu meneruskan nilai sekali:
        //    request.addFeed("user_id", TFDataType.DT_STRING,
        //            new long[]{1}, new String []{ "u0001" });
        //    request.addFeed("age", TFDataType.DT_FLOAT, 
        //            new long[]{1}, new float []{ 18.0f});
      	request.addFeed("item_id", TFDataType.DT_STRING, 
                        new long[]{3}, new String []{ "i0001", "i0002", "i0003"});  
        request.addFetch("probs");
      	return request;
    }

    public static void main(String[] args) throws Exception {
        PredictClient client = new PredictClient(new HttpConfig());

        // Untuk menggunakan koneksi jaringan langsung, gunakan metode setDirectEndpoint. Contoh: 
        //   client.setDirectEndpoint("pai-eas-vpc.cn-shanghai.aliyuncs.com");
        // Anda harus mengaktifkan koneksi jaringan langsung di konsol EAS dan menyediakan vSwitch sumber yang digunakan untuk mengakses layanan EAS.
        // Koneksi jaringan langsung menawarkan stabilitas dan kinerja yang lebih baik.
        client.setEndpoint("xxxxxxx.vpc.cn-hangzhou.pai-eas.aliyuncs.com");
        client.setModelName("ali_rec_rnk_no_fg");
        client.setToken("");
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100; i++) {
            try {
                TFResponse response = client.predict(buildPredictRequest());
                // "probs" adalah bidang 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 petunjuknya, lihat panduan SDK Python. Karena kinerja yang lebih rendah, SDK Python direkomendasikan hanya untuk debugging. Gunakan SDK Java di lingkungan produksi. Kode berikut menunjukkan cara mengirim permintaan ke layanan ali_rec_rnk_no_fg:

#!/usr/bin/env python

from eas_prediction import PredictClient
from eas_prediction import StringRequest
from eas_prediction import TFRequest

if __name__ == '__main__':
    client = PredictClient('http://xxxxxxx.vpc.cn-hangzhou.pai-eas.aliyuncs.com', 'ali_rec_rnk_no_fg')
    client.set_token('')
    client.init()
    
    # Catatan: Ganti server_default dengan signature_name aktual model Anda. Untuk informasi lebih lanjut, lihat panduan 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 meneruskan satu nilai untuk fitur-fitur di atas.
    #   req.add_feed('user_id', [1], TFRequest.DT_STRING, ['u0001'])
    #   req.add_feed('age', [1], TFRequest.DT_FLOAT, [18.0])
    req.add_feed('item_id', [3], TFRequest.DT_STRING, 
        ['i0001', 'i0002', 'i0003'])
    for x in range(0, 100):
        resp = client.predict(req)
        print(resp)

2.4 Bangun permintaan layanan kustom

Untuk memanggil layanan dari bahasa selain Python dan Java, Anda harus membuat kode permintaan prediksi secara manual dari file .proto. Untuk membangun permintaan layanan, gunakan definisi Protocol Buffers berikut untuk menghasilkan kode yang relevan:

  • 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;  // Kompleks presisi tunggal
      DT_INT64 = 9;
      DT_BOOL = 10;
      DT_QINT8 = 11;     // int8 terkuantisasi
      DT_QUINT8 = 12;    // uint8 terkuantisasi
      DT_QINT32 = 13;    // int32 terkuantisasi
      DT_BFLOAT16 = 14;  // Float32 dipotong menjadi 16 bit. Hanya untuk operasi cast.
      DT_QINT16 = 15;    // int16 terkuantisasi
      DT_QUINT16 = 16;   // uint16 terkuantisasi
      DT_UINT16 = 17;
      DT_COMPLEX128 = 18;  // Kompleks presisi ganda
      DT_HALF = 19;
      DT_RESOURCE = 20;
      DT_VARIANT = 21;  // Tipe data C++ arbitrer
    }
    
    // Dimensi array
    message ArrayShape {
      repeated int64 dim = 1 [packed = true];
    }
    
    // Protokol buffer yang merepresentasikan array
    message ArrayProto {
      // Tipe Data.
      ArrayDataType dtype = 1;
    
      // Bentuk array.
      ArrayShape array_shape = 2;
    
      // DT_FLOAT.
      repeated float float_val = 3 [packed = true];
    
      // DT_DOUBLE.
      repeated double double_val = 4 [packed = true];
    
      // DT_INT32, DT_INT16, DT_INT8, DT_UINT8.
      repeated int32 int_val = 5 [packed = true];
    
      // DT_STRING.
      repeated bytes string_val = 6;
    
      // DT_INT64.
      repeated int64 int64_val = 7 [packed = true];
    
      // DT_BOOL.
      repeated bool bool_val = 8 [packed = true];
    }
    
    // PredictRequest menentukan model TensorFlow mana yang akan dijalankan, serta bagaimana input dipetakan ke tensor dan bagaimana output difilter sebelum dikembalikan ke pengguna.
    message PredictRequest {
      // Tanda tangan bernama untuk dievaluasi. Jika tidak ditentukan, tanda tangan default akan digunakan
      string signature_name = 1;
    
      // Tensor input.
      // Nama tensor input adalah nama alias. Pemetaan dari alias ke nama tensor input nyata diharapkan disimpan sebagai tanda tangan generik bernama di bawah kunci "inputs" dalam ekspor model.
      // Setiap alias yang tercantum dalam tanda tangan generik bernama "inputs" harus diberikan tepat satu kali agar prediksi dapat dijalankan.
      map<string, ArrayProto> inputs = 2;
    
      // Filter output.
      // Nama yang ditentukan adalah nama alias. Pemetaan dari alias ke nama tensor output nyata diharapkan disimpan sebagai tanda tangan 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 tanda tangan 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 memeriksa 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 yang diambil 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 waktu nyata
      //    dapat diteruskan sebagai fitur konteks.
      map<string, ContextFeatures> context_features = 4;
    
      // jumlah tetangga pengambilan penyematan.
      int32 faiss_neigh_num = 5;
    }
    
    // mengembalikan hasil
    message Results {
      repeated double scores = 1 [packed = true];
    }
    
    enum StatusCode {
      OK = 0;
      INPUT_EMPTY = 1;
      EXCEPTION = 2;
    }
    
    // PBResponse menentukan tanggapan untuk aggregator
    message PBResponse {
      // hasil
      map<string, Results> results = 1;
    
      // fitur item
      map<string, string> item_features = 2;
    
      // fitur yang dihasilkan fg
      map<string, string> generate_features = 3;
    
      // fitur konteks
      map<string, ContextFeatures> context_features = 4;
    
      string error_msg = 5;
    
      StatusCode status_code = 6;
    
      // ID item
      repeated string item_ids = 7;
    
      repeated string outputs = 8;
    
      // semua fitur input fg
      map<string, string> raw_features = 9;
    
      // tensor keluaran
      map<string, ArrayProto> tf_outputs = 10;
    }