All Products
Search
Document Center

Platform For AI:TorchEasyRec Processor

Last Updated:May 15, 2026

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

  • Mendukung Feature Generator (FG) dan Item Feature Cache FeatureStore.

  • Mendukung inferensi CPU dan GPU untuk model Torch.

  • Mendukung ekspansi otomatis fitur pengguna Input_Tile.

  • Mendukung recall vektor menggunakan Faiss.

  • Mendukung warm-up dalam mode normal.

easyrec-torch-0.2

2024-09-30

2.4

0.2.9

  • FeatureDB kini mendukung tipe kompleks.

  • Pemuatan data dipercepat untuk inisialisasi FeatureStore.

  • Mengoptimalkan debug_level dalam mode bypass.

  • Mengoptimalkan transfer data host-to-device (H2D).

easyrec-torch-0.3

2024-10-14

2.4

0.2.9

  • Mendukung inisialisasi berbasis JSON di FeatureStore.

  • Mendefinisikan ulang definisi Protobuf.

easyrec-torch-0.4

2024-10-28

2.4

0.3.1

  • Memperbaiki masalah tipe kompleks di Feature Generator (FG).

easyrec-torch-0.5

2024-11-14

2.4

0.3.1

  • Mengoptimalkan konsistensi online dan offline. Saat mode debug diaktifkan, processor menghasilkan informasi fitur setelah pemrosesan FG, terlepas dari keberadaan item tersebut.

easyrec-torch-0.6

2024-11-18

2.4

0.3.6

  • Mengoptimalkan proses pengemasan dengan menghapus file header yang redundan.

easyrec-torch-0.7

2024-12-06

2.5

0.3.9

  • Mendukung tipe array untuk kunci utama sekuens.

  • Memutakhirkan Torch ke versi 2.5.

  • Memutakhirkan FG ke versi 0.3.9.

easyrec-torch-0.8

2024-12-25

2.5

0.3.9

  • Memutakhirkan SDK TensorRT ke versi 2.5.

  • Mendukung tipe data int64 untuk input model.

  • Memutakhirkan versi FeatureStore untuk menyelesaikan masalah kueri fitur di Hologres.

  • Mengoptimalkan efisiensi waktu proses dan logika debugging.

  • Menambahkan item_features ke definisi Protobuf untuk mendukung pengiriman fitur item dalam permintaan.

easyrec-torch-0.9

2025-01-15

2.5

0.4.1

  • Memutakhirkan Feature Generator (FG) ke versi 0.4.1 untuk mengoptimalkan waktu inisialisasi di lingkungan multi-threaded.

easyrec-torch-1.0

2025-02-06

2.5

0.4.2

  • Mendukung fitur berbobot.

  • Memutakhirkan Feature Generator (FG) ke versi 0.4.2.

  • Mendukung CPU AMD.

easyrec-torch-1.1

2025-04-23

2.5

0.5.9

  • Memutakhirkan SDK FeatureStore. Versi ini menambahkan konektivitas berkecepatan tinggi ke FeatureDB melalui jaringan VPC dan mendukung penyaringan fitur real-time yang kedaluwarsa di memori berdasarkan event_time dan TTL.

  • Memutakhirkan Feature Generator (FG). Versi ini menambahkan dukungan untuk fitur sekuens kustom dan memperbaiki masalah terkait fitur combo.

easyrec-torch-1.2

2025-05-12

2.5

0.6.0

  • Memutakhirkan FG ke versi 0.6.0.

  • Mendukung pembacaan fitur dari beberapa entitas FeatureStore, misalnya, config["fs_entity"] = "item,raw";.

  • Dalam mode debug, processor kini mengeluarkan ID item dari permintaan yang tidak ditemukan di FeatureStore.

easyrec-torch-1.3

2025-05-29

2.5

0.6.5

  • Memutakhirkan FG ke versi 0.6.5.

  • Menambahkan dukungan FSMAP untuk fitur ID berbobot.

  • Mendukung tokenisasi WordPiece.

  • Menambahkan operator filter boolean_mask.

  • Menyempurnakan operator fitur ekspresi.

easyrec-torch-1.4

2025-07-15

2.5

0.6.9

  • Memutakhirkan FG ke versi 0.6.9.

  • Menambahkan beberapa fungsi baru ke operator fitur ekspresi.

  • Memindahkan logika pembuatan string debug dari processor ke pustaka FG.

easyrec-torch-1.5

2025-09-18

2.5

0.7.3

  • Memutakhirkan FG ke versi 0.7.3.

  • Mendukung penangkapan permintaan online untuk warm-up model.

  • Memutakhirkan SDK FeatureStore ke versi 20250826. Versi ini mendukung skema tabel tiga tingkat di MaxCompute, panggilan zero-trust tanpa AccessKey, dan kompatibel dengan penambahan fitur ke tampilan fitur.

easyrec-torch-1.6

2025-10-21

2.5

0.7.4

  • Mengoptimalkan kontrol log untuk mencegah logging berlebihan yang menurunkan kinerja selama volume permintaan callback tinggi.

  • Mengoptimalkan pemrosesan fitur konteks.

  • Pra-pemrosesan fitur dan FG kini berbagi kolam thread untuk menghemat sumber daya thread.

  • Memutakhirkan FG ke versi 0.7.4.

easyrec-torch-1.7

2025-11-04

2.5

0.7.4

  • Mengoptimalkan logika penyimpanan tensor debug untuk mencegah pembuatan file berlebihan yang dipicu oleh callback.

easyrec-torch-1.8

2025-12-01

2.5

0.7.4

  • Mengoptimalkan kolam thread SDK FeatureStore untuk mencegah kegagalan pembuatan thread di bawah tekanan sumber daya tinggi.

  • Memutakhirkan FS SDK ke versi 20251117.

easyrec-torch-1.9

2026-01-09

2.5

1.0.0

  • Mengaktifkan multi-stream CUDA untuk inferensi GPU guna meningkatkan throughput dan kinerja sistem.

  • Memutakhirkan FG ke versi 1.0.0.

easyrec-torch-1.10

2026-01-23

2.5

1.0.1

  • Mengaktifkan pencatatan otomatis waktu eksekusi untuk permintaan lambat.

  • Menambahkan parameter konfigurasi untuk menyimpan data permintaan saat permintaan lambat terdeteksi.

easyrec-torch-1.11

2026-02-10

2.5

1.0.1

  • Memperbaiki masalah kontiguitas memori dengan tensor output dalam skenario tertentu.

  • Memutakhirkan FS SDK ke versi 20260202.

easyrec-torch-1.12

2026-03-13

2.5

1.0.1

  • Saat mode debug diaktifkan untuk permintaan mesin PAI-Rec, layanan model menyimpan asinkron permintaan asli dan fitur sisi item (sebelum dan sesudah pemrosesan FG) ke disk dalam format Protobuf. Anda dapat menentukan jalur penyimpanan dengan menggunakan parameter request_log_path dan memasang bucket OSS ke jalur ini saat startup.

  • Memutakhirkan FS SDK ke versi 20260305.

Catatan tentang versi 2.0 dan seterusnya

easyrec-torch-2.0 mencakup versi GLIBC yang dimutakhirkan dalam image dasar backend EAS. Oleh karena itu, saat Anda menerapkan processor versi 2.0 atau yang lebih baru:

  1. Jika Anda membuat layanan EAS baru, ikuti prosedur penerapan standar. Prosesnya identik dengan penerapan versi 0.x dan 1.x.

  2. Jika Anda memutakhirkan layanan EAS yang sudah ada yang dibuat sebelum 15 Maret 2026, Anda harus menghubungi pakar teknis Alibaba Cloud untuk memutakhirkan image dasar backend layanan Anda sebelum memutakhirkan processor. Jika tidak, penerapan mungkin gagal karena lingkungan waktu proses yang tidak kompatibel.

easyrec-torch-2.0

2026-03-17

2.8

1.0.1

  • Memutakhirkan runtime PyTorch ke 2.8.

  • Memutakhirkan runtime CUDA ke 12.6.

  • Memutakhirkan runtime FBGEMM_GPU ke 1.3.

  • Memutakhirkan versi GLIBC dalam image dasar ke 2.38.

easyrec-torch-2.1

2026-04-09

2.8

1.0.2

  • Memperbaiki masalah konsistensi online dan offline yang disebabkan oleh nilai fitur yang hilang.

  • Menetapkan nilai default parameter fg_threads ke jumlah core CPU logis.

  • Mendukung penangkapan log kinerja menggunakan profiler Kineto.

  • Memutakhirkan FS SDK ke versi 20260402.

easyrec-torch-2.2

2026-04-29

2.8

1.0.5

  • Mendukung inferensi DLRM-HSTU.

  • Memperbaiki kesalahan penerapan yang terjadi di lingkungan hanya-CPU untuk versi 2.0 dan 2.1.

  • Memutakhirkan FS SDK ke versi 20260416.

Langkah 1: Terapkan layanan

  1. 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_num dalam permintaan. Jika field ini tidak disediakan, nilai faiss_neigh_num dalam konfigurasi model_config digunakan, yang default-nya adalah 1.

    "faiss_neigh_num": 200

    faiss_nprobe

    Tidak

    Parameter nprobe menentukan 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. Nilai nprobe yang 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-beijing untuk 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 normal dan model yang diekspor dari TorchEasyRec dengan variabel lingkungan yang sesuai diatur. Secara default, sistem membaca nilai INPUT_TILE dari 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.

    Catatan

    Mengatur ini ke 1 mungkin menyebabkan masalah ketidakcocokan dengan beberapa model. Jika layanan hang selama menjalankan inferensi kedua, Anda dapat menyelesaikan masalah dengan mengatur variabel lingkungan PYTORCH_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_threshold sebagai file PB. Nilai default adalah false. File PB disimpan ke folder torch_req di 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

  2. Terapkan layanan model TorchEasyRec menggunakan salah satu metode berikut:

    Penerapan JSON (Direkomendasikan)

    Ikuti langkah-langkah berikut:

    1. Masuk ke Konsol PAI. Pilih wilayah di bagian atas halaman, lalu pilih ruang kerja yang diinginkan dan klik Elastic Algorithm Service (EAS).

    2. Di halaman Elastic Algorithm Service (EAS), klik Deploy Service. Di bagian Custom Model Deployment, klik JSON Deployment.

    3. Di editor JSON, tempel konfigurasi JSON Anda dan klik Deploy.

    Klien eascmd

    1. Unduh dan autentikasi klien. Contoh ini menggunakan versi Windows 64-bit klien.

    2. 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, seperti torcheasyrec.json.

Langkah 2: Panggil layanan

Setelah menerapkan layanan model TorchEasyRec, ikuti langkah-langkah berikut untuk melihat informasi pemanggilan layanan:

  1. Masuk ke Konsol PAI, pilih wilayah di bagian atas halaman dan ruang kerja di sebelah kanan, lalu klik Enter EAS.

  2. Di kolom Service Type, klik Invocation Information untuk melihat titik akhir dan token layanan.image

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:

Catatan

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 request_log_path menentukan jalur file. File berisi permintaan asli dan fitur input serta output sisi item.

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 features

Warm-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.