Untuk skenario inferensi model yang kompleks, seperti AIGC dan pemrosesan video, waktu pemrosesan yang lama dapat menyebabkan masalah seperti timeout koneksi dan beban instans yang tidak seimbang. Beban kerja ini tidak cocok untuk inferensi sinkron. Untuk mengatasi tantangan tersebut, Platform for AI (PAI) menyediakan Layanan Inferensi Asinkron yang memungkinkan Anda mengambil hasil inferensi melalui polling atau melalui model langganan. Dokumen ini menjelaskan cara menggunakan Layanan Inferensi Asinkron.
Informasi latar belakang
Deskripsi fitur
Inferensi Asinkron
Skenario inferensi online yang memerlukan latensi rendah biasanya menggunakan inferensi sinkron, di mana klien mengirim permintaan dan menunggu respons dalam koneksi yang sama.
Namun, untuk skenario dengan waktu pemrosesan yang lama atau tidak dapat diprediksi, menunggu respons sinkron menyebabkan masalah seperti putusnya koneksi HTTP dan timeout di sisi klien. Inferensi asinkron mengatasi masalah ini. Klien mengirim permintaan ke server dan, alih-alih menunggu, dapat memeriksa hasil secara berkala atau berlangganan notifikasi yang dikirim saat tugas selesai.
Layanan Antrean
Untuk skenario inferensi near-real-time, seperti pemrosesan video pendek, aliran video, atau citra yang intensif komputasi, hasil tidak diperlukan secara instan tetapi harus tersedia dalam batas waktu tertentu. Skenario ini menghadirkan beberapa tantangan:
Metode load balancing sederhana seperti algoritma round-robin tidak cukup. Permintaan harus didistribusikan berdasarkan beban aktual setiap instans.
Jika terjadi kegagalan instans, tugas yang sedang diproses oleh instans yang gagal harus dialihkan ke instans yang sehat.
PAI menyediakan kerangka kerja layanan antrian khusus untuk mengatasi tantangan distribusi permintaan ini.
Cara kerja
Saat Anda membuat Layanan Inferensi Asinkron, dua sub-layanan diintegrasikan di dalamnya: sub-layanan inferensi dan sub-layanan antrian. Sub-layanan antrian berisi dua antrian pesan bawaan: antrian input dan antrian sink. Permintaan layanan pertama kali dikirim ke antrian input dari sub-layanan antrian. Kerangka kerja EAS dalam instans sub-layanan inferensi secara otomatis berlangganan ke antrian tersebut untuk mengambil data permintaan secara streaming, memanggil antarmuka inferensi untuk memproses data, dan menulis respons ke antrian sink.
Jika antrian sink penuh dan tidak dapat menerima data baru, kerangka kerja layanan berhenti mengonsumsi data dari Antrian Input. Mekanisme back-pressure ini mencegah data diproses ketika hasil tidak dapat disimpan.
Jika Anda tidak memerlukan antrian sink, misalnya jika Anda menulis hasil langsung ke Object Storage Service (OSS) atau middleware pesan milik Anda sendiri, Anda dapat mengembalikan respons kosong dari antarmuka inferensi HTTP sinkron Anda. Dalam kasus ini, antrian sink diabaikan.
Sub-layanan antrian yang highly available dibuat untuk menerima permintaan klien. Instans sub-layanan inferensi berlangganan sejumlah permintaan tertentu berdasarkan kapasitas pemrosesan konkuren mereka. Sub-layanan antrian memastikan jumlah permintaan aktif pada setiap instans sub-layanan inferensi tidak melebihi ukuran jendela langganan, sehingga mencegah overload instans. Hasil akhir kemudian dikembalikan ke klien melalui langganan atau polling.
CatatanSebagai contoh, jika setiap instans sub-layanan inferensi hanya dapat memproses lima aliran audio secara konkuren, atur ukuran jendela menjadi 5 saat berlangganan ke sub-layanan antrian. Setelah instans selesai memproses satu aliran dan meng-commit hasilnya, sub-layanan antrian mendorong aliran baru ke instans tersebut. Hal ini memastikan bahwa instans tersebut menangani maksimal lima aliran kapan saja.
Sub-layanan antrian melakukan pemeriksaan kesehatan dengan memantau status koneksi instans sub-layanan inferensi. Jika koneksi terputus karena kegagalan instans, sub-layanan antrian menandai instans tersebut sebagai tidak sehat. Permintaan yang telah dikirim ke instans tersebut secara otomatis dimasukkan kembali ke antrian dan dikirim ke instans sehat lainnya, sehingga memastikan tidak ada kehilangan data selama kegagalan.
Membuat layanan inferensi asinkron
Saat Anda membuat layanan inferensi asinkron, kelompok layanan dengan nama yang sama secara otomatis dibuat. Sub-layanan antrian juga dibuat secara otomatis dan diintegrasikan ke dalam layanan inferensi asinkron. Secara default, sub-layanan antrian dimulai dengan satu instans dan diskalakan secara dinamis sesuai jumlah instans sub-layanan inferensi, hingga maksimal dua instans. Setiap instans sub-layanan antrian dikonfigurasi dengan 1 core dan memori 4 GB secara default. Jika konfigurasi default tidak memenuhi kebutuhan Anda, lihat bagian Konfigurasi parameter untuk sub-layanan antrian dalam topik ini.
Layanan inferensi asinkron EAS mengubah logika inferensi sinkron menjadi pola asinkron dan mendukung dua metode penerapan:
Terapkan layanan menggunakan Konsol
Buka halaman Custom Deployment dan konfigurasikan parameter utama berikut. Untuk informasi lebih lanjut tentang pengaturan parameter lainnya, lihat Custom Deployment.
Deployment Method: Pilih Image-based Deployment atau Processor-based Deployment.
Asynchronous Services: Aktifkan Asynchronous Services.

Setelah Anda mengonfigurasi parameter, klik Deploy.
Terapkan layanan menggunakan client EASCMD
Siapkan file konfigurasi layanan bernama service.json.
Metode penerapan: Terapkan layanan menggunakan model dan processor.
{ "processor": "pmml", "model_path": "http://example.oss-cn-shanghai.aliyuncs.com/models/lr.pmml", "metadata": { "name": "pmmlasync", "type": "Async", "cpu": 4, "instance": 1, "memory": 8000 } }Perhatikan parameter berikut. Untuk informasi tentang pengaturan parameter lainnya, lihat Penerapan JSON.
type: Atur parameter ini ke Async untuk membuat layanan inferensi asinkron.
model_path: Ganti ini dengan path ke model Anda.
Metode penerapan: Terapkan layanan menggunakan citra.
{ "metadata": { "name": "image_async", "instance": 1, "rpc.worker_threads": 4, "type": "Async" }, "cloud": { "computing": { "instance_type": "ecs.gn6i-c16g1.4xlarge" } }, "queue": { "cpu": 1, "min_replica": 1, "memory": 4000, "resource": "" }, "containers": [ { "image": "eas-registry-vpc.cn-beijing.cr.aliyuncs.com/pai-eas/chat-llm-webui:3.0.1", "script": "python webui/webui_server.py --port=8000 --model-path=Qwen/Qwen-7B-Chat", "port": 8000 } ] }Perhatikan parameter berikut. Untuk informasi tentang parameter lainnya, lihat Parameter layanan model.
type: Atur parameter ini ke Async untuk membuat layanan inferensi asinkron.
instances: Jumlah instans untuk sub-layanan inferensi. Ini tidak termasuk instans sub-layanan antrian.
rpc.worker_threads: Jumlah thread pekerja dalam kerangka kerja layanan EAS untuk layanan inferensi asinkron. Parameter ini sesuai dengan ukuran jendela untuk berlangganan data dari antrian. Pengaturan
4berarti maksimal empat pesan dapat berlangganan dari antrian sekaligus. Sub-layanan antrian tidak mendorong data baru ke sub-layanan inferensi hingga keempat pesan tersebut diproses.Sebagai contoh, pertimbangkan layanan pemrosesan aliran video di mana satu instans sub-layanan inferensi hanya dapat menangani dua aliran sekaligus. Atur parameter ini ke
2. Sub-layanan antrian kemudian mendorong maksimal dua URL aliran video ke sub-layanan inferensi. Sub-layanan antrian tidak mendorong URL baru hingga instans mengembalikan hasil untuk salah satu aliran. Setelah aliran diproses dan hasil dikembalikan, sub-layanan antrian mendorong URL aliran baru, memastikan satu instans tidak pernah menangani lebih dari dua aliran secara bersamaan.
Buat layanan inferensi asinkron.
Setelah login ke client eascmd, jalankan perintah
createuntuk membuat layanan inferensi asinkron. Untuk informasi lebih lanjut tentang cara login ke client EASCMD, lihat Unduh dan autentikasi client. Berikut adalah contohnya.eascmd create service.json
Mengakses layanan inferensi asinkron
Seperti dijelaskan sebelumnya, kelompok layanan dengan nama yang sama dengan layanan inferensi asinkron Anda dibuat secara default. Karena sub-layanan antrian dalam kelompok ini berfungsi sebagai ingress traffic, akses sub-layanan antrian secara langsung menggunakan path berikut. Untuk informasi lebih lanjut, lihat Akses layanan antrian.
Tipe endpoint | Format alamat | Contoh |
Alamat antrian input |
|
|
Alamat antrian output |
|
|
Kelola layanan inferensi asinkron
Anda dapat mengelola layanan inferensi asinkron seperti layanan biasa. Sub-layanan-nya dikelola secara otomatis oleh sistem. Misalnya, saat Anda menghapus layanan inferensi asinkron, baik sub-layanan antrian maupun sub-layanan inferensi dihapus. Saat Anda memperbarui sub-layanan inferensi, sub-layanan antrian tetap tidak berubah untuk memastikan ketersediaan maksimum.
Karena arsitektur sub-layanan, bahkan jika Anda mengonfigurasi satu instans untuk layanan inferensi asinkron Anda, daftar instans menampilkan satu instans tambahan untuk sub-layanan antrian.

Jumlah instans untuk layanan inferensi asinkron mengacu pada jumlah instans sub-layanan inferensi. Jumlah instans sub-layanan antrian menyesuaikan secara otomatis berdasarkan jumlah instans sub-layanan inferensi. Misalnya, saat Anda memperluas kapasitas sub-layanan inferensi menjadi tiga instans, sub-layanan antrian memperluas kapasitas menjadi dua instans.

Rasio instans antara kedua sub-layanan mengikuti aturan berikut:
Saat layanan inferensi asinkron dihentikan, jumlah instans untuk sub-layanan antrian dan sub-layanan inferensi diskalakan turun ke 0. Daftar instans kosong.
Saat sub-layanan inferensi memiliki 1 instans, sub-layanan antrian juga memiliki 1 instans, kecuali Anda menyesuaikan parameter sub-layanan antrian.
Saat jumlah instans sub-layanan inferensi melebihi 2, jumlah instans sub-layanan antrian tetap pada 2, kecuali Anda menyesuaikan parameternya.
Jika Anda mengonfigurasi Penyesuaian Skala Otomatis untuk layanan inferensi asinkron dengan jumlah instans minimum 0, satu instans sub-layanan antrian tetap aktif bahkan saat sub-layanan inferensi diskalakan turun ke 0.
Parameter dan deskripsi sub-layanan antrian
Dalam kebanyakan kasus, konfigurasi default untuk sub-layanan antrian sudah cukup. Jika Anda memiliki persyaratan khusus, Anda dapat mengonfigurasi instans antrian melalui blok queue di tingkat atas file JSON Anda. Kode berikut memberikan contoh:
{
"queue": {
"sink": {
"memory_ratio": 0.3
},
"source": {
"auto_evict": true,
}
}Bagian berikut menjelaskan opsi konfigurasi secara detail.
Konfigurasikan resource sub-layanan antrian
Secara default, resource untuk sub-layanan antrian dikonfigurasi berdasarkan bidang dalam bagian metadata. Namun, dalam beberapa kasus penggunaan, Anda mungkin perlu mengonfigurasi resource-nya secara terpisah seperti dijelaskan dalam bagian ini.
Gunakan
queue.resourceuntuk menentukan kelompok resource untuk sub-layanan antrian.{ "queue": { "resource": eas-r-slzkbq4tw0p6xd**** # Secara default, kelompok resource sub-layanan inferensi digunakan. } }Sub-layanan antrian menggunakan kelompok resource yang sama dengan sub-layanan inferensi secara default.
Jika Anda ingin menerapkan sub-layanan antrian ke kelompok resource publik, Anda dapat mendeklarasikan
resourcesebagai string kosong (""). Hal ini berguna ketika kelompok resource khusus Anda memiliki CPU atau memori yang tidak mencukupi.CatatanTerapkan sub-layanan antrian ke kelompok resource publik.
Gunakan
queue.cpudanqueue.memoryuntuk menentukan CPU (dalam core) dan memori (dalam MB) untuk setiap instans sub-layanan antrian.{ "queue": { "cpu": 2, # Nilai default: 1. "memory": 8000 # Nilai default: 4000. } }Jika Anda tidak mengonfigurasi resource ini, sub-layanan antrian secara default menggunakan 1 core CPU dan memori 4 GB, yang cukup untuk sebagian besar skenario.
PentingJika Anda memiliki lebih dari 200 subscriber, seperti instans sub-layanan inferensi, konfigurasikan 2 core CPU atau lebih.
Jangan mengurangi alokasi memori untuk sub-layanan antrian di lingkungan produksi.
Gunakan
queue.min_replicauntuk mengonfigurasi jumlah minimum instans sub-layanan antrian.{ "queue": { "min_replica": 3 # Nilai default: 1. } }Saat Anda menggunakan layanan inferensi asinkron, jumlah instans sub-layanan antrian secara otomatis menyesuaikan berdasarkan jumlah runtime instans sub-layanan inferensi. Rentang penyesuaian default adalah
[1, min(2, jumlah instans Sub-layanan Inferensi)]. Dalam kasus khusus di mana Anda mengonfigurasi aturan penskalaan otomatis yang memungkinkan penskalaan turun ke 0 instans, satu instans sub-layanan antrian secara otomatis dipertahankan. Anda dapat menggunakanqueue.min_replicauntuk menyesuaikan jumlah minimum instans yang dipertahankan ini.CatatanMenambah jumlah instans sub-layanan antrian meningkatkan ketersediaan tetapi tidak meningkatkan performa.
Konfigurasikan fitur sub-layanan antrian
Sub-layanan antrian memiliki beberapa fitur yang dapat dikonfigurasi.
Gunakan
queue.sink.auto_evictatauqueue.source.auto_evictuntuk mengaktifkan eviksi data otomatis untuk antrian sink dan antrian input, masing-masing.{ "queue": { "sink": { "auto_evict": true # Aktifkan eviksi otomatis untuk antrian output. Nilai default: false. }, "source": { "auto_evict": true # Aktifkan eviksi otomatis untuk antrian input. Nilai default: false. } } }Secara default, eviksi data otomatis dinonaktifkan. Jika antrian penuh, Anda tidak dapat menulis data baru ke dalamnya. Dalam skenario di mana overflow data dapat diterima, aktifkan fitur ini. Antrian secara otomatis menghapus data tertua untuk memberi ruang bagi data baru.
Gunakan
queue.max_deliveryuntuk mengonfigurasi jumlah maksimum upaya pengiriman.{ "queue": { "max_delivery": 10 # Atur jumlah maksimum pengiriman data menjadi 10. Nilai default: 5. Jika Anda mengatur nilainya ke 0, data dapat dikirim tanpa batas jumlah kali. } }Saat jumlah upaya pengiriman untuk satu pesan melebihi ambang batas ini, pesan tersebut dianggap tidak dapat diproses dan ditandai sebagai pesan dead-letter. Untuk informasi lebih lanjut, lihat kebijakan dead-letter.
Gunakan
queue.max_idleuntuk mengonfigurasi waktu pemrosesan maksimum untuk sebuah pesan.{ "queue": { "max_idle": "1m" # Atur waktu pemrosesan maksimum untuk satu entri data menjadi 1 menit. Jika waktu pemrosesan melebihi batas ini, entri data dikirim ke subscriber lain dan jumlah pengiriman ditambah 1. Nilai default adalah 0, yang berarti tidak ada batas waktu pemrosesan maksimum. } }Nilai waktu dalam contoh adalah 1 menit. Beberapa satuan waktu didukung, seperti
h(jam),m(menit), dans(detik). Jika waktu pemrosesan pesan melebihi durasi yang dikonfigurasi, salah satu dari dua hal berikut terjadi:Jika jumlah pengiriman belum mencapai ambang batas
queue.max_delivery, pesan tersebut dikirim ulang ke subscriber lain.Jika ambang batas
queue.max_deliverytelah tercapai, kebijakan dead-letter dieksekusi untuk pesan tersebut.
Gunakan
queue.dead_message_policyuntuk mengonfigurasi kebijakan dead-letter.{ "queue": { "dead_message_policy": "Rear" # Nilai yang valid adalah Rear (default) dan Drop. Rear memindahkan pesan ke akhir antrian, dan Drop menghapus pesan. } }
Konfigurasikan panjang antrian maksimum atau volume data maksimum
Panjang maksimum dan ukuran muatan maksimum sub-layanan antrian saling berbanding terbalik. Hubungan ini dihitung sebagai berikut:
Memori instans sub-layanan antrian bersifat tetap. Oleh karena itu, meningkatkan ukuran muatan maksimum per pesan akan mengurangi panjang maksimum antrian.
Dengan konfigurasi memori default 4 GB dan ukuran muatan maksimum default 8 KB, baik Antrian Input maupun Antrian Sink dapat menampung 230.399 pesan. Jika Anda perlu menyimpan lebih banyak item, Anda dapat meningkatkan ukuran memori seperti dijelaskan dalam bagian konfigurasi resource. Sistem menyisihkan 10% dari total memori.
Anda tidak dapat mengonfigurasi panjang maksimum dan ukuran muatan maksimum untuk antrian yang sama.
Gunakan
queue.sink.max_lengthatauqueue.source.max_lengthuntuk mengonfigurasi panjang maksimum antrian sink atau antrian input, masing-masing.{ "queue": { "sink": { "max_length": 8000 # Atur panjang maksimum antrian output menjadi 8000 entri. }, "source": { "max_length": 2000 # Atur panjang maksimum antrian input menjadi 2000 entri. } } }Gunakan
queue.sink.max_payload_size_kbatauqueue.source.max_payload_size_kbuntuk mengonfigurasi ukuran muatan maksimum untuk satu pesan di antrian sink atau antrian input, masing-masing.{ "queue": { "sink": { "max_payload_size_kb": 10 # Atur ukuran maksimum satu entri data di antrian output menjadi 10 KB. Nilai default: 8 KB. }, "source": { "max_payload_size_kb": 1024 # Atur ukuran maksimum satu entri data di antrian input menjadi 1024 KB (1 MB). Nilai default: 8 KB. } } }
Mengonfigurasi kemiringan alokasi memori
Gunakan
queue.sink.memory_ratiountuk menyesuaikan alokasi memori antara antrian input dan antrian sink.{ "queue": { "sink": { "memory_ratio": 0.9 # Tentukan rasio memori antrian output. Nilai default: 0.5. } } }CatatanSecara default, antrian input dan antrian sink membagi memori instans sub-layanan antrian secara merata. Jika layanan Anda menerima teks sebagai input dan menghasilkan citra sebagai output, dan Anda ingin menyimpan lebih banyak data di antrian sink, Anda dapat meningkatkan
queue.sink.memory_ratio. Sebaliknya, jika layanan Anda menerima citra sebagai input dan menghasilkan teks sebagai output, Anda dapat mengurangiqueue.sink.memory_ratio.
Konfigurasikan Penyesuaian Skala Horizontal Otomatis
Cara kerja
Dalam skenario inferensi asinkron, sistem dapat menskalakan jumlah instans layanan inferensi secara dinamis berdasarkan status antrian. Sistem juga mendukung penskalaan jumlah instans turun ke nol saat antrian kosong untuk mengurangi biaya. Diagram berikut menggambarkan cara kerja Penyesuaian Skala Otomatis untuk layanan inferensi asinkron:
Metode konfigurasi
Di daftar layanan, klik nama layanan target untuk membuka halaman detail layanan.
Beralih ke tab Auto Scaling, di area Auto Scaling, klik Enable Auto Scaling.
Di kotak dialog Auto Scaling Settings, konfigurasikan parameter.
Konfigurasi dasar:
Parameter
Catatan
Nilai contoh
Jumlah instans minimum
Jumlah minimum instans yang dapat diskalakan oleh layanan. Nilai minimum adalah 0.
0
Jumlah maksimum instans
Jumlah maksimum instans yang dapat diskalakan oleh layanan. Nilai maksimum adalah 1000.
10
Metrik penskalaan standar
Metrik performa bawaan yang digunakan untuk memicu penskalaan.
Asynchronous Queue Length merepresentasikan jumlah rata-rata tugas per instans dalam antrian.
Pilih Asynchronous Queue Length dan atur ambang batas ke 10.
Konfigurasi lanjutan:
Parameter
Catatan
Nilai contoh
Durasi scale-out
Jendela observasi untuk keputusan scale-out. Setelah scale-out dipicu, sistem mengamati metrik selama periode ini. Jika nilai metrik turun di bawah ambang batas, scale-out dibatalkan. Satuannya adalah detik.
Nilai default adalah
0detik. Nilai 0 mengeksekusi scale-out segera.0
Waktu efektif scale-in
Jendela observasi untuk keputusan scale-in, yang merupakan parameter kunci untuk mencegah jitter layanan. Scale-in hanya terjadi setelah metrik tetap di bawah ambang batas selama durasi ini. Satuannya adalah detik.
Default-nya adalah
300detik. Ini adalah perlindungan utama terhadap peristiwa scale-in yang sering akibat fluktuasi traffic. Jangan atur nilai ini terlalu rendah karena dapat memengaruhi stabilitas layanan.300
Durasi efektif scale-in ke 0
Saat Minimum Number Of Instances adalah
0, parameter ini menentukan waktu tunggu sebelum jumlah instans dikurangi menjadi0.600
Jumlah instans yang diskalakan keluar dari nol
Jumlah instans yang ditambahkan saat layanan diskalakan keluar dari
0instans.1
Untuk informasi lebih lanjut tentang deskripsi parameter dan cara menggunakan client eascmd, lihat Penyesuaian skala horizontal otomatis.