All Products
Search
Document Center

Platform For AI:TorchEasyRec Processor

Last Updated:Mar 18, 2026

Processor TorchEasyRec bawaan di Elastic Algorithm Service (EAS) memungkinkan Anda menyebarkan model rekomendasi yang dilatih dengan TorchEasyRec atau PyTorch sebagai layanan scoring. Processor ini juga mengintegrasikan kemampuan rekayasa fitur. Dengan mengoptimalkan secara bersamaan rekayasa fitur dan model PyTorch, processor ini menghadirkan layanan scoring berkinerja tinggi. Topik ini menjelaskan cara menyebarkan dan memanggil layanan model TorchEasyRec.

Informasi latar belakang

Gambar berikut menunjukkan arsitektur mesin rekomendasi berbasis processor TorchEasyRec.

image

Processor TorchEasyRec terdiri atas modul-modul berikut:

  • Item Feature Cache: Menyimpan cache fitur sisi item dari FeatureStore di memori. Hal ini mengurangi overhead jaringan dan tekanan permintaan terhadap FeatureStore, sekaligus meningkatkan kinerja layanan inferensi. Jika fitur sisi item mencakup fitur real-time, FeatureStore menangani sinkronisasi.

  • Feature Generator (FG): Modul generasi fitur. Anda mendefinisikan proses transformasi fitur dalam file konfigurasi. Satu set kode C++ memastikan logika konsisten untuk pemrosesan fitur offline dan online.

  • TorchModel: Model PyTorch yang diekspor sebagai ScriptedModel setelah pelatihan dengan TorchEasyRec atau PyTorch.

Batasan

Hanya seri instans tujuan umum g6, g7, atau g8 yang didukung. Model GPU seperti T4 dan A10 juga didukung. Untuk informasi lebih lanjut, lihat general-purpose instance families (g series). Jika Anda menyebarkan layanan GPU, pastikan versi CUDA Driver adalah 535 atau lebih baru.

Daftar versi

Processor TorchEasyRec sedang dalam pengembangan aktif. Kami merekomendasikan penggunaan versi terbaru untuk menyebarkan layanan inferensi karena menyediakan fitur tambahan dan peningkatan kinerja inferensi. Versi yang telah dirilis tercantum di bawah ini:

Nama processor

Tanggal rilis

Versi Torch

Versi FG

Fitur baru

easyrec-torch-0.1

20240910

2.4

0.2.9

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

  • Mendukung inferensi CPU atau GPU untuk model Torch.

  • Mendukung ekspansi otomatis fitur kelas User Input_Tile.

  • Mendukung recall vektor Faiss.

  • Mendukung pemanasan model dalam mode normal.

easyrec-torch-0.2

20240930

2.4

0.2.9

  • FeatureDB mendukung tipe kompleks.

  • Mempercepat waktu pemuatan data untuk inisialisasi FeatureStore.

  • Mengoptimalkan debug_level dalam mode bypass.

  • Mengoptimalkan H2D.

easyrec-torch-0.3

20241014

2.4

0.2.9

  • FeatureStore mendukung inisialisasi JSON.

  • Mendefinisikan ulang proto.

easyrec-torch-0.4

20241028

2.4

0.3.1

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

easyrec-torch-0.5

20241114

2.4

0.3.1

  • Mengoptimalkan logika konsistensi online dan offline. Saat Debug diaktifkan, informasi fitur dihasilkan setelah FG terlepas dari keberadaan item tersebut.

easyrec-torch-0.6

20241118

2.4

0.3.6

  • Mengoptimalkan proses pengemasan untuk menghapus file header yang redundan.

easyrec-torch-0.7

20241206

2.5

0.3.9

  • Kunci primer sequence mendukung array.

  • Memperbarui versi Torch ke 2.5.

  • Memperbarui versi FG ke 0.3.9.

easyrec-torch-0.8

20241225

2.5

0.3.9

  • Memperbarui versi SDK TensorRT ke 2.5.

  • Input model Torcheasyrec mendukung tipe int64.

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

  • Mengoptimalkan efisiensi dan logika eksekusi selama debugging.

  • Menambahkan item_features ke proto untuk mendukung pengiriman fitur item dari sisi permintaan.

easyrec-torch-0.9

20250115

2.5

0.4.1

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

easyrec-torch-1.0

20250206

2.5

0.4.2

  • Mendukung Weighted Feature.

  • Memperbarui versi Feature Generator (FG) ke 0.4.2.

  • Mendukung CPU AMD.

easyrec-torch-1.1

20250423

2.5

0.5.9

  • Memperbarui SDK FeatureStore untuk menambahkan dukungan konektivitas berkecepatan tinggi ke FeatureDB melalui jaringan VPC. Juga mendukung penyaringan data fitur real-time yang kedaluwarsa di memori berdasarkan event_time dan ttl.

  • Memperbarui versi Feature Generator (FG) untuk menambahkan dukungan fitur sequence kustom dan memperbaiki masalah terkait fitur combo.

easyrec-torch-1.2

20250512

2.5

0.6.0

  • Memperbarui FG ke 0.6.0.

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

  • Mengeluarkan ID item dalam permintaan yang tidak ada di FeatureStore selama debugging.

easyrec-torch-1.3

20250529

2.5

0.6.5

  • Memperbarui FG ke 0.6.5.

  • Fitur ID berbobot mendukung FSMAP.

  • Mendukung tokenisasi WordPiece.

  • Mendukung operator filter boolean_mask.

  • Mengoptimalkan dan memperbarui operator fitur ekspresi.

easyrec-torch-1.4

20250715

2.5

0.6.9

  • Memperbarui FG ke 0.6.9.

  • Menambahkan beberapa fungsi baru ke operator fitur ekspresi.

  • Memindahkan logika generasi Debug String dari processor ke pustaka FG.

easyrec-torch-1.5

20250918

2.5

0.7.3

  • Memperbarui FG ke 0.7.3.

  • Mendukung memperoleh permintaan online untuk pemanasan model.

  • Memperbarui SDK FeatureStore ke 20250826 untuk mendukung skema tabel tiga level di MaxCompute, panggilan zero-trust tanpa AccessKey, dan kompatibilitas penambahan fitur ke tampilan fitur.

easyrec-torch-1.6

20251021

2.5

0.7.4

  • Mengoptimalkan kontrol log untuk mencegah output log berlebihan memengaruhi kinerja saat terdapat banyak permintaan callback.

  • Mengoptimalkan pemrosesan fitur konteks.

  • Membagikan kolam thread antara pra-pemrosesan fitur dan FG untuk menghemat sumber daya thread.

  • Memperbarui FG ke 0.7.4.

easyrec-torch-1.7

20251104

2.5

0.7.4

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

easyrec-torch-1.8

20251201

2.5

0.7.4

  • Mengoptimalkan kolam thread SDK FeatureStore untuk mencegah kegagalan pembuatan thread saat sumber daya terbatas.

  • Memperbarui FS SDK ke 20251117.

easyrec-torch-1.9

20260109

2.5

1.0.0

  • Inferensi GPU mendukung multi-stream CUDA untuk meningkatkan throughput dan kinerja sistem.

  • Memperbarui FG ke 1.0.0.

easyrec-torch-1.10

20260123

2.5

1.0.1

  • Secara otomatis mencatat waktu eksekusi permintaan lambat dalam log.

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

easyrec-torch-1.11

20260210

2.5

1.0.1

  • Memperbaiki masalah kontinuitas memori tensor output dalam beberapa skenario.

  • Memperbarui FS SDK ke 20260202.

easyrec-torch-1.12

20260313

2.5

1.0.1

  • Saat mode debug diaktifkan untuk badan permintaan mesin PAI-Rec, layanan model secara asinkron menyimpan permintaan asli dan fitur sisi item (sebelum dan sesudah FG) ke disk dalam format protobuf. Gunakan parameter request_log_path untuk menentukan path penyimpanan dan pasang path OSS ke path tersebut saat startup.

  • Memperbarui FS SDK ke 20260305.

Catatan untuk versi 2.0 dan seterusnya:

Versi GLIBC dari image dasar backend EAS ditingkatkan pada easyrec-torch-2.0. Oleh karena itu, saat Anda menyebarkan processor versi 2.0 atau lebih baru:

  1. Jika Anda membuat layanan EAS baru, ikuti proses penyebaran standar. Proses ini identik dengan penyebaran versi 0.x/1.x.

  2. Jika Anda memperbarui layanan EAS yang sudah ada yang dibuat sebelum 15 Maret 2026, hubungi pakar teknis Alibaba Cloud Anda untuk memperbarui image dasar backend EAS layanan yang sudah ada sebelum memperbarui dan menyebarkan processor. Jika tidak, penyebaran dapat gagal karena ketidakcocokan lingkungan.

easyrec-torch-2.0

20260317

2.8

1.0.1

  • Memperbarui runtime PyTorch ke 2.8.

  • Memperbarui runtime CUDA ke 12.6.

  • Memperbarui runtime fbgemm_gpu ke 1.3.

  • Memperbarui GLIBC image dasar ke 2.38.

Langkah 1: Menyebarkan layanan

  1. Siapkan file konfigurasi layanan torcheasyrec.json.

    Atur tipe processor ke easyrec-torch-{version}. Untuk {version}, lihat Daftar versi. Kode berikut memberikan contoh konfigurasi JSON:

    Contoh menggunakan FG (fg_mode='normal')

    {
      "metadata": {
        "instance": 1,
        "name": "alirec_rank_with_fg",
        "rpc": {
          "enable_jemalloc": 1,
          "max_queue_size": 256,
          "worker_threads": 16
        }
      },
      "cloud": {
            "computing": {
                "instance_type": "ecs.gn6i-c16g1.4xlarge"
            }
      },
      "model_config": {
        "fg_mode": "normal",
        "fg_threads": 8,
        "region": "YOUR_REGION",
        "fs_project": "YOUR_FS_PROJECT",
        "fs_model": "YOUR_FS_MODEL",
        "fs_entity": "item",
        "load_feature_from_offlinestore": true,
        "access_key_id":"YOUR_ACCESS_KEY_ID",
        "access_key_secret":"YOUR_ACCESS_KEY_SECRET"
      },
      "storage": [
        {
          "mount_path": "/home/admin/docker_ml/workspace/model/",
          "oss": {
            "path": "oss://xxx/xxx/export",
            "readOnly": false
          },
          "properties": {
            "resource_type": "code"
          }
        }
      ],
      "processor":"easyrec-torch-1.12"
    }

    Contoh tidak menggunakan FG (fg_mode='bypass')

    {
      "metadata": {
        "instance": 1,
        "name": "alirec_rank_no_fg",
        "rpc": {
          "enable_jemalloc": 1,
          "max_queue_size": 256,
          "worker_threads": 16
        }
      },
      "cloud": {
            "computing": {
                "instance_type": "ecs.gn6i-c16g1.4xlarge"
            }
      },
      "model_config": {
        "fg_mode": "bypass"
      },
      "storage": [
        {
          "mount_path": "/home/admin/docker_ml/workspace/model/",
          "oss": {
            "path": "oss://xxx/xxx/export",
            "readOnly": false
          },
          "properties": {
            "resource_type": "code"
          }
        }
      ],
      "processor":"easyrec-torch-1.12"
    }

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

    Parameter

    Wajib

    Deskripsi

    Contoh

    processor

    Ya

    Processor TorchEasyRec.

    "processor":"easyrec-torch-1.12"

    path

    Ya

    Path Object Storage Service (OSS) yang dipasang ke penyimpanan layanan. Path ini digunakan untuk menyimpan file model.

    "path": "oss://examplebucket/xxx/export"

    fg_mode

    Tidak

    Menentukan mode rekayasa fitur. Nilai yang valid:

    • bypass (default): Tidak menggunakan FG. Hanya model Torch yang disebarkan.

      • Mode ini cocok untuk skenario di mana Anda menggunakan pemrosesan fitur kustom.

      • Dalam mode ini, Anda tidak perlu mengonfigurasi parameter agar processor dapat mengakses FeatureStore.

    • normal: Menggunakan FG. Mode ini biasanya digunakan bersama TorchEasyRec untuk pelatihan model.

    "fg_mode": "normal"

    fg_threads

    Tidak

    Jumlah thread konkuren untuk mengeksekusi FG untuk satu permintaan.

    "fg_threads": 15

    outputs

    Tidak

    Nama variabel output yang diprediksi oleh model Torch, seperti probs_ctr. Jika terdapat beberapa nama, pisahkan dengan koma (,). Secara default, semua variabel dikeluarkan.

    "outputs":"probs_ctr,probs_cvr"

    item_empty_score

    Tidak

    Skor default saat ID Item tidak ada. Nilai default adalah 0.

    "item_empty_score": -1

    Parameter recall processor

    faiss_neigh_num

    Tidak

    Jumlah vektor yang direcall menggunakan FAISS. Secara default, nilai ini diambil dari field faiss_neigh_num dalam badan permintaan. Jika field ini tidak disediakan, nilai faiss_neigh_num dalam konfigurasi model_config digunakan. Nilai default adalah 1.

    "faiss_neigh_num": 200

    faiss_nprobe

    Tidak

    Parameter nprobe menentukan jumlah kluster yang diambil selama proses pengambilan. Nilai default adalah 800. Indeks daftar posting di FAISS membagi data menjadi beberapa kluster kecil, atau kelompok, dan mempertahankan daftar posting untuk setiap kluster. Nilai nprobe yang lebih besar biasanya menghasilkan presisi pencarian yang lebih tinggi tetapi meningkatkan biaya komputasi dan waktu pencarian. Nilai yang lebih kecil mengurangi presisi tetapi mempercepat pencarian.

    "faiss_nprobe" : 700

    Parameter agar processor dapat mengakses FeatureStore

    fs_project

    Tidak

    Nama proyek FeatureStore. Anda harus menentukan parameter ini saat menggunakan FeatureStore. Untuk informasi lebih lanjut tentang FeatureStore, lihat Mengonfigurasi proyek FeatureStore.

    "fs_project": "fs_demo"

    fs_model

    Tidak

    Nama fitur model di FeatureStore.

    "fs_model": "fs_rank_v1"

    fs_entity

    Tidak

    Nama entitas di FeatureStore.

    "fs_entity": "item"

    region

    Tidak

    Wilayah tempat produk FeatureStore berada. Misalnya, atur nilainya ke cn-beijing untuk wilayah China (Beijing). Untuk informasi lebih lanjut tentang konfigurasi wilayah, lihat Endpoints.

    "region": "cn-beijing"

    access_key_id

    Tidak

    ID AccessKey untuk produk FeatureStore.

    "access_key_id": "xxxxx"

    access_key_secret

    Tidak

    Rahasia AccessKey untuk produk FeatureStore.

    "access_key_secret": "xxxxx"

    load_feature_from_offlinestore

    Tidak

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

    • True: Ya. Data diperoleh dari FeatureStore OfflineStore.

    • False (default): Tidak. Data diperoleh dari FeatureStore OnlineStore.

    "load_feature_from_offlinestore": True

    featuredb_username

    Tidak

    Username untuk FeatureDB.

    "featuredb_username":"xxx"

    featuredb_password

    Tidak

    Password untuk FeatureDB.

    "featuredb_passwd":"xxx"

    input_tile: Parameter untuk ekspansi fitur otomatis

    INPUT_TILE

    Tidak

    Mendukung ekspansi fitur otomatis. Untuk fitur yang memiliki nilai sama dalam satu permintaan, seperti user_id, Anda hanya perlu mengirimkan satu nilai. Hal ini membantu mengurangi ukuran permintaan, waktu transmisi jaringan, dan waktu komputasi.

    Fitur ini harus digunakan dalam mode normal dan dengan TorchEasyRec. Anda juga harus mengatur variabel lingkungan yang sesuai saat mengekspor model. Sistem saat ini membaca nilai INPUT_TILE dari file model_acc.json di direktori model yang diekspor dari TorchEasyRec. Jika file tersebut tidak ada, sistem membaca nilai dari variabel lingkungan.

    Setelah fitur ini diaktifkan:

    • Jika variabel lingkungan diatur ke 2, FG untuk fitur sisi pengguna hanya dihitung sekali.

    • Jika variabel lingkungan diatur ke 3, FG untuk fitur sisi pengguna hanya dihitung sekali. Sistem menghitung penyematan untuk pengguna dan item secara terpisah, dan penyematan sisi pengguna hanya dihitung sekali. Ini cocok untuk skenario dengan banyak fitur sisi pengguna.

    "processor_envs":

    [

    {

    "name": "INPUT_TILE",

    "value": "2"

    }

    ]

    NO_GRAD_GUARD

    Tidak

    Menonaktifkan perhitungan gradien selama inferensi. Ini menghentikan pelacakan operasi dan mencegah pembentukan graf komputasi.

    Catatan

    Saat diatur ke 1, beberapa model mungkin tidak kompatibel. Jika Anda mengalami tersendat selama eksekusi inferensi kedua, Anda dapat menambahkan variabel lingkungan PYTORCH_TENSOREXPR_FALLBACK=2 untuk mengatasi masalah tersebut. Ini melewati langkah kompilasi sambil mempertahankan beberapa fitur optimasi graf.

    "processor_envs":

    [

    {

    "name": "NO_GRAD_GUARD",

    "value": "1"

    }

    ]

    Parameter pemanasan model

    warmup_data_path

    Tidak

    Mengaktifkan fitur pemanasan model dan menentukan path untuk menyimpan file pemanasan. Untuk memastikan file pemanasan tidak hilang, tambahkan mount OSS ke path ini dalam konfigurasi penyimpanan.

    "warmup_data_path": "/warmup"

    warmup_cnt_per_file

    Tidak

    Jumlah kali pemanasan untuk setiap file protobuf pemanasan. Meningkatkan parameter ini dapat memastikan pemanasan yang cukup, tetapi periode ramp-up akan lebih lama. Nilai default adalah 20.

    "warmup_cnt_per_file": 20,

    warmup_pb_files_count

    Tidak

    Jumlah permintaan online yang disimpan. Permintaan disimpan sebagai file protobuf untuk pemanasan startup berikutnya. Path penyimpanan ditentukan oleh parameter warmup_data_path. Nilai default adalah 64.

    "warmup_pb_files_count": 64

    Pencatatan log dan penyimpanan permintaan lambat

    long_request_threshold

    Tidak

    Ambang batas waktu untuk permintaan lambat, dalam ms. Untuk permintaan yang melebihi ambang batas, waktu eksekusi setiap tahap secara otomatis dicatat dalam log. Nilai default adalah 200 ms.

    "long_request_threshold": 200

    save_long_request

    Tidak

    Parameter boolean. Menentukan apakah akan menyimpan permintaan sebagai file protobuf saat terjadi permintaan lambat (melebihi long_request_threshold). Nilai default adalah false.

    "save_long_request": true

    Menulis permintaan asli dan fitur item ke penyimpanan OSS

    request_log_path

    Tidak

    Path tempat file protobuf disimpan ke disk. Dalam konfigurasi layanan model, gunakan mount OSS untuk path ini.

    "request_log_path": "/online_log_pb"

    background_feature_thread_num

    Tidak

    Jumlah thread yang bertanggung jawab atas tugas backend penyimpanan ke disk. Nilai default adalah 4. Jika tugas penyimpanan ke disk berat, Anda dapat meningkatkan nilai ini untuk mempercepat penyimpanan file protobuf.

    "background_feature_thread_num": 8

  2. Sebarkan layanan model TorchEasyRec. Anda dapat memilih salah satu metode penyebaran berikut:

    Penyebaran lokal menggunakan JSON (Direkomendasikan)

    Prosedur:

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

    2. Pada halaman Elastic Algorithm Service (EAS), klik Deploy Service, lalu di bagian Custom Model Deployment, klik JSON On-Premises Deployment.

    3. Masukkan konten konfigurasi JSON yang telah disiapkan ke dalam kotak teks JSON, lalu klik Deploy.

    Penyebaran menggunakan eascmd

    1. Unduh dan autentikasi klien. Topik ini menggunakan versi Windows 64-bit sebagai contoh.

    2. Buka tool terminal. Di direktori tempat file JSON berada, jalankan perintah berikut untuk membuat layanan. Untuk informasi lebih lanjut tentang operasi, lihat Referensi perintah.

      eascmdwin64.exe create <service.json>

      Ganti <service.json> dengan nama file JSON yang Anda buat, seperti torcheasyrec.json.

Langkah 2: Memanggil layanan

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

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

  2. Klik Invocation Information di kolom Service Method layanan target untuk melihat informasi titik akhir dan token layanan.image

Input dan output layanan model TorchEasyRec menggunakan format protobuf. Metode pemanggilan bervariasi tergantung pada apakah Anda menggunakan FG:

Menggunakan FG (fg_mode='normal')

Dua metode pemanggilan berikut didukung:

Menggunakan EAS Java SDK

Sebelum menjalankan kode, konfigurasikan lingkungan Maven. Untuk informasi lebih lanjut, lihat Menggunakan Java SDK. Untuk versi terbaru Java SDK, lihat https://github.com/pai-eas/eas-java-sdk. Kode berikut memberikan contoh cara meminta layanan alirec_rank_with_fg:

package com.aliyun.openservices.eas.predict;

import com.aliyun.openservices.eas.predict.http.Compressor;
import com.aliyun.openservices.eas.predict.http.HttpConfig;
import com.aliyun.openservices.eas.predict.http.PredictClient;
import com.aliyun.openservices.eas.predict.proto.TorchRecPredictProtos;
import com.aliyun.openservices.eas.predict.request.TorchRecRequest;
import com.aliyun.openservices.eas.predict.proto.TorchPredictProtos.ArrayProto;

import java.util.*;


public class TorchRecPredictTest {
    public static PredictClient InitClient() {
        return new PredictClient(new HttpConfig());
    }

    public static TorchRecRequest buildPredictRequest() {
        TorchRecRequest TorchRecRequest = new TorchRecRequest();
        TorchRecRequest.appendItemId("7033");

        TorchRecRequest.addUserFeature("user_id", 33981,"int");

        ArrayList<Double> list = new ArrayList<>();
        list.add(0.24689289764507472);
        list.add(0.005758482924454689);
        list.add(0.6765301324940026);
        list.add(0.18137273055602343);
        TorchRecRequest.addUserFeature("raw_3", list,"List<double>");

        Map<String,Integer> myMap =new LinkedHashMap<>();
        myMap.put("866", 4143);
        myMap.put("1627", 2451);
        TorchRecRequest.addUserFeature("map_1", myMap,"map<string,int>");

        ArrayList<ArrayList<Float>> list2 = new ArrayList<>();
        ArrayList<Float> innerList1 = new ArrayList<>();
        innerList1.add(1.1f);
        innerList1.add(2.2f);
        innerList1.add(3.3f);
        list2.add(innerList1);
        ArrayList<Float> innerList2 = new ArrayList<>();
        innerList2.add(4.4f);
        innerList2.add(5.5f);
        list2.add(innerList2);
        TorchRecRequest.addUserFeature("click", list2,"list<list<float>>");

        TorchRecRequest.addContextFeature("id_2", list,"List<double>");
        TorchRecRequest.addContextFeature("id_2", list,"List<double>");

        System.out.println(TorchRecRequest.request);
        return TorchRecRequest;
    }

    public static void main(String[] args) throws Exception{
        PredictClient client = InitClient();
        client.setToken("tokenGeneratedFromService");
        client.setEndpoint("175805416243****.cn-beijing.pai-eas.aliyuncs.com");
        client.setModelName("alirec_rank_with_fg");
        client.setRequestTimeout(100000);


        testInvoke(client);
        testDebugLevel(client);
        client.shutdown();
    }

    public static void testInvoke(PredictClient client) throws Exception {
        long startTime = System.currentTimeMillis();
        TorchRecPredictProtos.PBResponse response = client.predict(buildPredictRequest());
        for (Map.Entry<String, ArrayProto> entry : response.getMapOutputsMap().entrySet()) {

            System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
        }
        long endTime = System.currentTimeMillis();
        System.out.println("Spend Time: " + (endTime - startTime) + "ms");

    }

    public static void testDebugLevel(PredictClient client) throws Exception {
        long startTime = System.currentTimeMillis();
        TorchRecRequest request = buildPredictRequest();
        request.setDebugLevel(1);
        TorchRecPredictProtos.PBResponse response = client.predict(request);
        Map<String, String> genFeas = response.getGenerateFeaturesMap();
        for(String itemId: genFeas.keySet()) {
            System.out.println(itemId);
            System.out.println(genFeas.get(itemId));
        }
        long endTime = System.currentTimeMillis();
        System.out.println("Spend Time: " + (endTime - startTime) + "ms");

    }
}

Di mana:

  • client.setToken("tokenGeneratedFromService"): Ganti parameter dalam tanda kurung dengan token layanan Anda. Contohnya, MmFiMDdlO****wYjhhNjgwZmZjYjBjMTM1YjliZmNkODhjOGVi****.

  • client.setEndpoint("175805416243****.cn-beijing.pai-eas.aliyuncs.com"): Ganti parameter dalam tanda kurung dengan titik akhir layanan Anda. Contohnya, 175805416243****.cn-beijing.pai-eas.aliyuncs.com.

  • client.setModelName("alirec_rank_with_fg"): Ganti parameter dalam tanda kurung dengan nama layanan Anda.

Menggunakan EAS Python SDK

Sebelum menjalankan kode, jalankan perintah pip install -U eas-prediction --user untuk menginstal atau memperbarui pustaka eas-prediction. Untuk informasi lebih lanjut, lihat Menggunakan Python SDK. Kode berikut memberikan contoh:

from eas_prediction import PredictClient
from eas_prediction.torchrec_request import TorchRecRequest


if __name__ == '__main__':
    endpoint = 'http://localhost:6016'

    client = PredictClient(endpoint, '<YOUR_SERVICE_NAME>')
    client.set_token('<your_service_token>')
    client.init()
    torchrec_req = TorchRecRequest()

    torchrec_req.add_user_fea('user_id', 'u001d', "STRING")
    torchrec_req.add_user_fea('age', 12, "INT")
    torchrec_req.add_user_fea('weight', 129.8, "FLOAT")
    torchrec_req.add_item_id('item_0001')
    torchrec_req.add_item_id('item_0002')
    torchrec_req.add_item_id('item_0003')
    torchrec_req.add_user_fea("raw_3", [0.24689289764507472, 0.005758482924454689, 0.6765301324940026, 0.18137273055602343], "list<double>")
    torchrec_req.add_user_fea("raw_4", [0.9965264740966043, 0.659596586238391, 0.16396649403055896, 0.08364986620265635], "list<double>")
    torchrec_req.add_user_fea("map_1", {"0":0.37845234405201145}, "map<int,float>")
    torchrec_req.add_user_fea("map_2", {"866":4143,"1627":2451}, "map<int,int>")
    torchrec_req.add_context_fea("id_2", [866], "list<int>" )
    torchrec_req.add_context_fea("id_2", [7022,1], "list<int>" )
    torchrec_req.add_context_fea("id_2", [7022,1], "list<int>" )
    torchrec_req.add_user_fea("click", [[0.94433516,0.49145547], [0.94433516, 0.49145597]], "list<list<float>>")

    res = client.predict(torchrec_req)
    print(res)

Tabel berikut menjelaskan parameter utama.

  • endpoint: Atur ke titik akhir layanan Anda, contohnya, http://175805416243****.cn-beijing.pai-eas.aliyuncs.com/.

  • <your_service_name>: Ganti ini dengan nama layanan Anda.

  • <your_service_token>: Ganti ini dengan token layanan Anda, contohnya, MmFiMDdlO****wYjhhNjgwZmZjYjBjMTM1YjliZmNkODhjOGVi****.

Tidak menggunakan FG (fg_mode='bypass')

Menggunakan EAS Java SDK

Sebelum menjalankan kode, konfigurasikan lingkungan Maven. Untuk informasi lebih lanjut, lihat Menggunakan Java SDK. Periksa halaman GitHub untuk nomor versi terbaru SDK. Kode berikut memberikan contoh cara meminta layanan alirec_rank_no_fg:

package com.aliyun.openservices.eas.predict;

import java.util.List;
import java.util.Arrays;


import com.aliyun.openservices.eas.predict.http.PredictClient;
import com.aliyun.openservices.eas.predict.http.HttpConfig;
import com.aliyun.openservices.eas.predict.request.TorchDataType;
import com.aliyun.openservices.eas.predict.request.TorchRequest;
import com.aliyun.openservices.eas.predict.response.TorchResponse;

public class Test_Torch {
    public static PredictClient InitClient() {
        return new PredictClient(new HttpConfig());
    }

    public static TorchRequest buildPredictRequest() {
        TorchRequest request = new TorchRequest();
        float[] content = new float[2304000];
        for (int i = 0; i < content.length; i++) {
            content[i] = (float) 0.0;
        }
        long[] content_i = new long[900];
        for (int i = 0; i < content_i.length; i++) {
            content_i[i] = 0;
        }

        long[] a = Arrays.copyOfRange(content_i, 0, 300);
        float[] b = Arrays.copyOfRange(content, 0, 230400);
        request.addFeed(0, TorchDataType.DT_INT64, new long[]{300,3}, content_i);
        request.addFeed(1, TorchDataType.DT_FLOAT, new long[]{300,10,768}, content);
        request.addFeed(2, TorchDataType.DT_FLOAT, new long[]{300,768}, b);
        request.addFeed(3, TorchDataType.DT_INT64, new long[]{300}, a);
        request.addFetch(0);
        request.setDebugLevel(903);
        return request;
    }

    public static void main(String[] args) throws Exception {
        PredictClient client = InitClient();
        client.setToken("tokenGeneratedFromService");
        client.setEndpoint("175805416243****.cn-beijing.pai-eas.aliyuncs.com");
        client.setModelName("alirec_rank_no_fg");
        client.setIsCompressed(false);
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 10; i++) {
            TorchResponse response = null;
            try {
                response = client.predict(buildPredictRequest());
                List<Float> result = response.getFloatVals(0);
                System.out.print("Predict Result: [");
                for (int j = 0; j < result.size(); j++) {
                    System.out.print(result.get(j).floatValue());
                    if (j != result.size() - 1) {
                        System.out.print(", ");
                    }
                }
                System.out.print("]\n");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        long endTime = System.currentTimeMillis();
        System.out.println("Spend Time: " + (endTime - startTime) + "ms");
        client.shutdown();
    }
}

Di mana:

  • client.setToken("tokenGeneratedFromService"): Ganti parameter dalam tanda kurung dengan token layanan Anda. Contohnya, MmFiMDdlO****wYjhhNjgwZmZjYjBjMTM1YjliZmNkODhjOGVi****.

  • client.setEndpoint("175805416243****.cn-beijing.pai-eas.aliyuncs.com"): Ganti parameter dalam tanda kurung dengan titik akhir layanan Anda. Contohnya, 175805416243****.cn-beijing.pai-eas.aliyuncs.com.

  • client.setModelName("alirec_rank_no_fg"): Ganti parameter dalam tanda kurung dengan nama layanan Anda.

Menggunakan EAS Python SDK

Sebelum menjalankan kode, jalankan perintah pip install -U eas-prediction --user untuk menginstal atau memperbarui pustaka eas-prediction. Untuk informasi lebih lanjut, lihat Menggunakan Python SDK. Kode berikut memberikan contoh cara meminta layanan alirec_rank_no_fg:

from eas_prediction import PredictClient
from eas_prediction import TorchRequest

# snappy data
req = TorchRequest(False)

req.add_feed(0, [300, 3], TorchRequest.DT_INT64, [1] * 900)
req.add_feed(1, [300, 10, 768], TorchRequest.DT_FLOAT, [1.0] * 3 * 768000)
req.add_feed(2, [300, 768], TorchRequest.DT_FLOAT, [1.0] * 3 * 76800)
req.add_feed(3, [300], TorchRequest.DT_INT64, [1] * 300)


client = PredictClient('<your_endpoint>', '<your_service_name>')
client.set_token('<your_service_token>')

client.init()

resp = client.predict(req)
print(resp)

Tabel berikut menjelaskan parameter utama.

  • <your_endpoint>: Ganti ini dengan titik akhir layanan Anda, contohnya, http://175805416243****.cn-beijing.pai-eas.aliyuncs.com/.

  • <your_service_name>: Ganti ini dengan nama layanan Anda.

  • <your_service_token>: Ganti ini dengan token layanan Anda, contohnya, MmFiMDdlO****wYjhhNjgwZmZjYjBjMTM1YjliZmNkODhjOGVi****.

Untuk informasi lebih lanjut tentang kode status yang dikembalikan saat mengakses layanan, lihat Deskripsi kode status layanan. Anda juga dapat membuat permintaan layanan secara manual. Untuk informasi lebih lanjut, lihat Format permintaan.

Format permintaan

Saat klien memanggil layanan, Anda dapat menghasilkan file kode permintaan prediksi secara manual berdasarkan file .proto. Untuk membuat permintaan layanan secara manual, rujuk definisi protobuf berikut untuk menghasilkan kode yang sesuai:

pytorch_predict.proto: Definisi permintaan untuk model Torch

syntax = "proto3";

package pytorch.eas;
option cc_enable_arenas = true;
option java_package = "com.aliyun.openservices.eas.predict.proto";
option java_outer_classname = "TorchPredictProtos";

enum ArrayDataType {
  // Not a legal value for DataType. Used to indicate a DataType field
  // has not been set.
  DT_INVALID = 0;
  
  // Data types that all computation devices are expected to be
  // capable to support.
  DT_FLOAT = 1;
  DT_DOUBLE = 2;
  DT_INT32 = 3;
  DT_UINT8 = 4;
  DT_INT16 = 5;
  DT_INT8 = 6;
  DT_STRING = 7;
  DT_COMPLEX64 = 8;  // Single-precision complex
  DT_INT64 = 9;
  DT_BOOL = 10;
  DT_QINT8 = 11;     // Quantized int8
  DT_QUINT8 = 12;    // Quantized uint8
  DT_QINT32 = 13;    // Quantized int32
  DT_BFLOAT16 = 14;  // Float32 truncated to 16 bits.  Only for cast ops.
  DT_QINT16 = 15;    // Quantized int16
  DT_QUINT16 = 16;   // Quantized uint16
  DT_UINT16 = 17;
  DT_COMPLEX128 = 18;  // Double-precision complex
  DT_HALF = 19;
  DT_RESOURCE = 20;
  DT_VARIANT = 21;  // Arbitrary C++ data types
}

// Dimensions of an array
message ArrayShape {
  repeated int64 dim = 1 [packed = true];
}

// Protocol buffer representing an array
message ArrayProto {
  // Data Type.
  ArrayDataType dtype = 1;

  // Shape of the array.
  ArrayShape array_shape = 2;

  // DT_FLOAT.
  repeated float float_val = 3 [packed = true];

  // DT_DOUBLE.
  repeated double double_val = 4 [packed = true];

  // DT_INT32, DT_INT16, DT_INT8, DT_UINT8.
  repeated int32 int_val = 5 [packed = true];

  // DT_STRING.
  repeated bytes string_val = 6;

  // DT_INT64.
  repeated int64 int64_val = 7 [packed = true];

}


message PredictRequest {

  // Input tensors.
  repeated ArrayProto inputs = 1;

  // Output filter.
  repeated int32 output_filter = 2;

  // Input tensors for rec
  map<string, ArrayProto> map_inputs = 3;

  // debug_level for rec
  int32 debug_level = 100;
}

// Response for PredictRequest on successful run.
message PredictResponse {
  // Output tensors.
  repeated ArrayProto outputs = 1;
  // Output tensors for rec.
  map<string, ArrayProto> map_outputs = 2;
}

torchrec_predict.proto: Definisi permintaan untuk model Torch dengan FG

syntax = "proto3";

option go_package = ".;torch_predict_protos";
option java_package = "com.aliyun.openservices.eas.predict.proto";
option java_outer_classname = "TorchRecPredictProtos";
package com.alibaba.pairec.processor;
import "pytorch_predict.proto";

//long->others
message LongStringMap {
  map<int64, string> map_field = 1;
}
message LongIntMap {
  map<int64, int32> map_field = 1;
}
message LongLongMap {
  map<int64, int64> map_field = 1;
}
message LongFloatMap {
  map<int64, float> map_field = 1;
}
message LongDoubleMap {
  map<int64, double> map_field = 1;
}

//string->others
message StringStringMap {
  map<string, string> map_field = 1;
}
message StringIntMap {
  map<string, int32> map_field = 1;
}
message StringLongMap {
  map<string, int64> map_field = 1;
}
message StringFloatMap {
  map<string, float> map_field = 1;
}
message StringDoubleMap {
  map<string, double> map_field = 1;
}

//int32->others
message IntStringMap {
  map<int32, string> map_field = 1;
}
message IntIntMap {
  map<int32, int32> map_field = 1;
}
message IntLongMap {
  map<int32, int64> map_field = 1;
}
message IntFloatMap {
  map<int32, float> map_field = 1;
}
message IntDoubleMap {
  map<int32, double> map_field = 1;
}

// list
message IntList {
  repeated int32 features = 1;
}
message LongList {
  repeated int64 features  = 1;
}

message FloatList {
  repeated float features = 1;
}
message DoubleList {
  repeated double features = 1;
}
message StringList {
  repeated string features = 1;
}

// lists
message IntLists {
  repeated IntList lists = 1;
}
message LongLists {
  repeated LongList lists = 1;
}

message FloatLists {
  repeated FloatList lists = 1;
}
message DoubleLists {
  repeated DoubleList lists = 1;
}
message StringLists {
  repeated StringList lists = 1;
}

message PBFeature {
  oneof value {
    int32 int_feature = 1;
    int64 long_feature = 2;
    string string_feature = 3;
    float float_feature = 4;
    double double_feature=5;

    LongStringMap long_string_map = 6; 
    LongIntMap long_int_map = 7; 
    LongLongMap long_long_map = 8; 
    LongFloatMap long_float_map = 9; 
    LongDoubleMap long_double_map = 10; 
    
    StringStringMap string_string_map = 11; 
    StringIntMap string_int_map = 12; 
    StringLongMap string_long_map = 13; 
    StringFloatMap string_float_map = 14; 
    StringDoubleMap string_double_map = 15; 

    IntStringMap int_string_map = 16; 
    IntIntMap int_int_map = 17; 
    IntLongMap int_long_map = 18; 
    IntFloatMap int_float_map = 19; 
    IntDoubleMap int_double_map = 20; 

    IntList int_list = 21; 
    LongList long_list =22;
    StringList string_list = 23;
    FloatList float_list = 24;
    DoubleList double_list = 25;

    IntLists int_lists = 26;
    LongLists long_lists =27;
    StringLists string_lists = 28;
    FloatLists float_lists = 29;
    DoubleLists double_lists = 30;
    
  }
}

// context features
message ContextFeatures {
  repeated PBFeature features = 1;
}

// PBRequest specifies the request for aggregator
message PBRequest {
  // debug mode
  int32 debug_level = 1;

  // user features, key is user input name
  map<string, PBFeature> user_features = 2;

  // item ids
  repeated string item_ids = 3;

  // context features for each item, key is context input name 
  map<string, ContextFeatures> context_features = 4;

  // number of nearest neighbors(items) to retrieve
  // from faiss
  int32 faiss_neigh_num = 5;

  // item features for each item, key is item input name 
  map<string, ContextFeatures> item_features = 6;
  
  // optional meta data
  map<string, string> meta_data = 7;
}

// PBResponse specifies the response for aggregator
message PBResponse {
  // torch output tensors
  map<string, pytorch.eas.ArrayProto> map_outputs = 1;

  // fg ouput features
  map<string, string> generate_features = 2;

  // all fg input features
  map<string, string> raw_features = 3;

  // item ids
  repeated string item_ids = 4;

}

Tabel berikut menjelaskan debug_level.

Catatan

Secara default, Anda tidak perlu mengonfigurasi parameter ini. Kirimkan hanya saat debugging.

debug_level

Deskripsi

0

Layanan melakukan prediksi secara normal.

1

Dalam mode normal, ini memvalidasi kunci permintaan dan bentuk input serta output FG. Ini juga mengembalikan fitur input dan output tetapi tidak melakukan prediksi.

2

Dalam mode normal, ini memvalidasi kunci permintaan dan bentuk input serta output FG. Ini mengembalikan fitur input dan output, bersama dengan tensor input model, dan melakukan prediksi.

3

Dalam mode normal, ini memvalidasi kunci permintaan dan bentuk input serta output FG. Ini mengembalikan fitur output tetapi tidak melakukan prediksi.

100

Dalam mode normal, ini menyimpan permintaan prediksi. File protobuf yang disimpan berisi permintaan asli dan fitur input serta output sisi item. Path penyimpanan ditentukan oleh parameter request_log_path.

102

Dalam mode normal, ini melakukan recall vektor, memvalidasi kunci permintaan, dan memvalidasi bentuk input serta output FG. Ini menyimpan fitur input dan output, tensor input model, dan hasil User Embedding.

903

Mencetak waktu prediksi untuk setiap tahap.

904

Memvalidasi bidang fitur yang hilang dalam permintaan dan mencatatnya dalam log.

Deskripsi kode status layanan

Tabel berikut menjelaskan kode status utama yang mungkin dikembalikan saat Anda mengakses layanan TorchEasyRec. Untuk informasi lebih lanjut tentang kode status yang dikembalikan saat mengakses layanan EAS, lihat Lampiran: Kode status layanan dan kesalahan umum.

Kode status

Deskripsi

200

Layanan mengembalikan respons normal.

400

Input permintaan tidak valid.

500

Prediksi gagal. Periksa log layanan untuk detailnya.

Menyimpan dan mengurai file Request pb

Untuk versi processor 1.12 dan seterusnya, saat debug=True diaktifkan untuk badan permintaan mesin PAI-Rec, processor menyimpan permintaan asli serta fitur input dan output sisi item ke file protobuf di disk. Fitur ini mendukung analisis dan verifikasi fitur selanjutnya. File protobuf berisi data permintaan asli, fitur input sisi item, dan fitur yang ditransformasi sisi item. Untuk menggunakan fitur ini, konfigurasikan parameter request_log_path untuk menentukan path penyimpanan dan pasang path OSS ke path tersebut. Contohnya:

"model_config": {
        "fg_mode": "normal",
        "fg_threads": 8,
        "request_log_path": "/request_log",
        "background_feature_thread_num": 8
},
 "storage": [
    {
        "mount_path": "/request_log",
        "oss": {
            "path": "oss://my-bucket/my-model/myrequests/",
            "readOnly": false
        }
    },
    {
        "mount_path": "/home/admin/docker_ml/workspace/model/",
        "oss": {
            "path": "oss://my-bucket/my-model/20260316",
            "readOnly": false
        }
    }
]

Processor membuat subdirektori date_hour di path yang ditentukan oleh request_log_path dan menyimpan data permintaan. Penulisan ke disk dilakukan secara asinkron oleh thread latar belakang. Jumlah thread latar belakang dapat dikonfigurasi melalui parameter model_config.background_feature_thread_num. Nilai default adalah 4. Anda dapat meningkatkan nilai ini untuk mempercepat kecepatan penulisan. Nama file protobuf yang disimpan mengikuti format <request_id>_<random_str>.pb. Karena bandwidth tulis OSS terbatas, trafik badan permintaan dengan mode debug diaktifkan di mesin PAI-Rec harus tetap moderat. Jika trafik terlalu tinggi dan penulisan tertinggal, antrian internal layanan model akan membuang permintaan baru tanpa menyimpannya.

Untuk mengurai file protobuf yang diperoleh, gunakan EAS-Python-SDK versi 0.35 atau lebih baru, atau EAS-Java-SDK versi 2.0.29 atau lebih baru. Kode berikut memberikan contoh Python:

from eas_prediction.torchrec_predict_pb2 import PBLogData
with open('xxxx.pb', 'rb') as f:
    pb_data = f.read() 
pb_log = PBLogData()
pb_log.ParseFromString(pb_data)
print(pb_log) # Print all logs

print(pb_log.request) # Print the request
print(pb_log.raw_features) # Print the raw item-side features
print(pb_log.generate_features) # Print the item-side features after feature generation (fg)