Layanan inferensi asinkron PAI memisahkan pengiriman permintaan dari pengambilan hasil, sehingga menghindari timeout pada tugas berdurasi panjang seperti AIGC dan pemrosesan video.
Latar Belakang
Fitur
-
Inferensi asinkron
Skenario latensi rendah biasanya menggunakan inferensi sinkron, di mana klien mengirim permintaan dan menunggu hasilnya melalui koneksi yang sama.
Ketika waktu inferensi panjang atau tidak dapat diprediksi, penantian secara sinkron dapat menyebabkan koneksi HTTP terputus dan timeout pada sisi klien. Inferensi asinkron memisahkan proses pengiriman dan pengambilan: klien mengirim permintaan lalu kemudian melakukan polling untuk hasilnya atau berlangganan notifikasi.
-
Layanan antrian (queue service)
Skenario inferensi near-real-time, seperti pemrosesan video pendek, analisis aliran video atau audio, atau pemrosesan gambar yang intensif komputasi, tidak memerlukan respons segera tetapi harus mengembalikan hasil dalam jangka waktu tertentu. Skenario ini menghadapi tantangan berikut:
-
Algoritma penyeimbangan beban round-robin tidak sesuai. Permintaan harus didistribusikan berdasarkan beban aktual setiap instans.
-
Jika suatu instans gagal, tugas yang belum selesai harus dialihkan ke instans sehat lainnya.
PAI menyediakan kerangka kerja layanan antrian untuk mengatasi tantangan tersebut.
-
Cara kerja
-
Saat Anda membuat layanan inferensi asinkron, dua sub-layanan diintegrasikan di dalamnya: sub-layanan inferensi dan sub-layanan antrian. Sub-layanan antrian memiliki dua antrian pesan bawaan: antrian input dan antrian sink. Kerangka kerja EAS pada setiap instans sub-layanan inferensi secara otomatis berlangganan ke antrian input, mengambil data permintaan melalui streaming, memanggil antarmuka lokal untuk memproses data, lalu menulis hasilnya ke antrian sink.
-
Jika antrian sink penuh, kerangka kerja layanan berhenti mengonsumsi dari antrian input. Hal ini mencegah pemrosesan permintaan yang hasilnya tidak dapat ditulis ke antrian sink.
Jika Anda tidak memerlukan antrian sink—misalnya, jika Anda menulis hasil inferensi langsung ke OSS atau middleware pesan milik Anda sendiri—Anda dapat mengembalikan respons kosong dari antarmuka inferensi HTTP sinkron. Dalam kasus ini, antrian sink diabaikan.
-
Sub-layanan antrian yang sangat tersedia menerima permintaan klien. Instans sub-layanan inferensi berlangganan permintaan berdasarkan kapasitas konkurensinya. Sub-layanan antrian memastikan bahwa jumlah permintaan aktif pada setiap instans tidak melebihi jendela langgannya.
CatatanMisalnya, jika setiap instans sub-layanan inferensi hanya dapat memproses lima aliran voice, atur ukuran jendela menjadi 5. Saat suatu instans selesai memproses satu aliran dan meng-commit hasilnya, sub-layanan antrian akan mendorong aliran baru ke instans tersebut. Hal ini memastikan tidak ada instans yang memproses lebih dari lima aliran secara bersamaan.
-
Jika suatu instans gagal, sub-layanan antrian menandainya sebagai tidak sehat, meng-antri ulang permintaan aktifnya, lalu mendistribusikannya ke instans sehat lainnya, sehingga memastikan tidak ada data yang hilang.
Buat layanan inferensi asinkron
Membuat layanan inferensi asinkron juga membuat kelompok layanan dengan nama yang sama. Sub-layanan antrian dibuat secara otomatis dalam kelompok ini. Secara default, sub-layanan antrian dimulai dengan satu instans dan diskalakan secara dinamis bersama instans sub-layanan inferensi, hingga maksimal dua instans. Setiap instans menggunakan 1 core CPU dan memori 4 GB secara default. Untuk menyesuaikan pengaturan ini, lihat Parameter sub-layanan antrian.
Layanan inferensi asinkron EAS menyesuaikan logika inferensi sinkron untuk eksekusi asinkron. Metode penerapan berikut didukung:
Konsol
-
Buka halaman Penerapan Kustom dan konfigurasikan parameter kunci berikut. Untuk informasi tentang parameter lainnya, lihat Penerapan Kustom.
-
Deployment Method: Pilih Image-based Deployment atau Processor-based Deployment, lalu centang kotak Asynchronous Queue.

-
-
Setelah mengonfigurasi parameter, klik Deploy.
CLI
-
Siapkan file konfigurasi layanan service.json.
-
Untuk processor-based deployment:
{ "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 } }Parameter kunci:
-
type: Atur ke Async untuk membuat layanan inferensi asinkron.
-
model_path: Ganti nilai dengan path ke model Anda.
-
-
Untuk image-based deployment:
{ "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 } ] }Parameter kunci:
-
type: Atur ke Async untuk membuat layanan inferensi asinkron.
-
instance: Jumlah instans sub-layanan inferensi, tidak termasuk instans sub-layanan antrian.
-
rpc.worker_threads: Jumlah thread pekerja dalam kerangka kerja EAS. Nilai ini menentukan ukuran jendela langganan dari antrian. Jika jumlah thread diatur ke 4, maksimal empat entri data dapat dilanggan dari antrian sekaligus. Sub-layanan antrian tidak akan mendorong pesan baru ke instans tersebut hingga salah satu pesan saat ini selesai diproses.
Misalnya, untuk layanan pemrosesan aliran video di mana satu instans sub-layanan inferensi hanya dapat memproses dua aliran video sekaligus, Anda dapat mengatur parameter ini ke 2. Sub-layanan antrian akan mendorong maksimal dua URL aliran video ke sub-layanan inferensi. URL baru tidak akan dikirim hingga instans tersebut menyelesaikan pemrosesan salah satu URL sebelumnya. Hal ini memastikan instans tidak pernah menangani lebih dari dua aliran sekaligus.
-
-
-
Buat layanan tersebut.
Setelah login ke klien EASCMD, jalankan perintah create untuk membuat layanan. Untuk informasi cara login ke klien EASCMD, lihat Unduh dan autentikasi klien. Contoh:
eascmd create service.json
Akses layanan inferensi asinkron
Kelompok layanan dengan nama yang sama dengan layanan inferensi asinkron dibuat secara default. Sub-layanan antrian berfungsi sebagai titik masuk trafik. Akses melalui path berikut. Untuk informasi lebih lanjut, lihat Akses layanan antrian.
|
Jenis Titik Akhir |
Format |
Contoh |
|
Titik akhir antrian input |
|
|
|
Titik akhir antrian sink |
|
|
Kelola layanan inferensi asinkron
Mengelola layanan inferensi asinkron sama seperti mengelola layanan biasa, karena sistem menangani sub-layanan secara otomatis. Misalnya, menghapus layanan inferensi asinkron akan menghapus kedua sub-layanan—baik antrian maupun inferensi. Memperbarui sub-layanan inferensi tidak mengubah sub-layanan antrian untuk memastikan ketersediaan maksimal.
Karena arsitektur sub-layanan, mengonfigurasi satu instans layanan menghasilkan dua instans yang muncul dalam daftar: satu untuk sub-layanan inferensi dan satu untuk sub-layanan antrian.

Jumlah instans untuk layanan inferensi asinkron mengacu pada jumlah instans sub-layanan inferensi. Jumlah instans sub-layanan antrian berubah secara otomatis sesuai dengan jumlah instans sub-layanan inferensi. Misalnya, saat Anda memperluas kapasitas jumlah instans sub-layanan inferensi menjadi 3, jumlah instans sub-layanan antrian juga diperluas menjadi 2.

Aturan berikut mengatur rasio instans antara kedua sub-layanan tersebut:
-
Saat layanan inferensi asinkron dihentikan, jumlah instans baik untuk sub-layanan antrian maupun sub-layanan inferensi diskala-masuk menjadi 0. Daftar instans akan kosong.
-
Saat jumlah instans sub-layanan inferensi adalah 1, jumlah instans sub-layanan antrian juga 1, kecuali ditentukan lain dalam konfigurasi sub-layanan antrian.
-
Jika terdapat lebih dari dua instans inferensi, jumlah instans antrian tetap pada angka dua, kecuali ditentukan lain dalam konfigurasi sub-layanan antrian.
-
Jika Anda mengonfigurasi Penyesuaian Skala Otomatis dengan minimum 0 instans, sub-layanan antrian mempertahankan 1 instans siaga bahkan saat sub-layanan inferensi diskala-masuk ke 0.
Parameter sub-layanan antrian
Sub-layanan antrian berfungsi dengan baik menggunakan konfigurasi default pada sebagian besar kasus. Untuk menyesuaikannya, konfigurasikan bidang queue di tingkat atas file JSON. Contoh:
{
"queue": {
"sink": {
"memory_ratio": 0.3
},
"source": {
"auto_evict": true
}
}
Bagian berikut menjelaskan item konfigurasi secara detail.
Konfigurasikan sumber daya sub-layanan antrian
Secara default, sumber daya sub-layanan antrian dikonfigurasi sesuai dengan bidang dalam metadata. Namun, dalam beberapa kasus penggunaan, Anda mungkin perlu mengonfigurasi sumber daya sub-layanan antrian secara terpisah.
-
Gunakan queue.resource untuk menentukan kelompok sumber daya bagi sub-layanan antrian.
{ "queue": { "resource": "eas-r-slzkbq4tw0p6xd****" # Secara default, mengikuti kelompok sumber daya sub-layanan inferensi. } }-
Secara default, sub-layanan antrian menggunakan kelompok sumber daya yang sama dengan sub-layanan inferensi.
-
Untuk menerapkan sub-layanan antrian dalam kelompok sumber daya publik, atur resource ke string kosong (""). Ini berguna ketika kelompok sumber daya khusus Anda memiliki CPU dan memori yang tidak mencukupi.
CatatanKami merekomendasikan menerapkan sub-layanan antrian dalam kelompok sumber daya publik.
-
-
Gunakan queue.cpu dan queue.memory untuk menentukan CPU (dalam core) dan memori (dalam MB) untuk setiap instans sub-layanan antrian.
{ "queue": { "cpu": 2, # Default: 1. "memory": 8000 # Default: 4000. } }Jika Anda tidak mengonfigurasi sumber daya, setiap instans sub-layanan antrian menggunakan 1 core CPU dan memori 4 GB secara default. Konfigurasi ini memenuhi kebutuhan sebagian besar skenario.
Penting-
Jika Anda memiliki lebih dari 200 subscriber (misalnya, instans sub-layanan inferensi), kami merekomendasikan mengatur jumlah core CPU menjadi 2 atau lebih.
-
Kami tidak merekomendasikan mengurangi konfigurasi memori sub-layanan antrian di lingkungan produksi.
-
-
Gunakan queue.min_replica untuk mengonfigurasi jumlah minimum instans sub-layanan antrian.
{ "queue": { "min_replica": 3 # Default: 1. } }Saat menggunakan layanan inferensi asinkron, jumlah instans sub-layanan antrian disesuaikan secara otomatis berdasarkan jumlah instans sub-layanan inferensi yang berjalan. Rentang penyesuaian default adalah
[1, min(2, jumlah instans sub-layanan inferensi)]. Dalam kasus khusus, jika Anda mengonfigurasi Penyesuaian Skala Otomatis untuk layanan inferensi asinkron dan mengizinkan jumlah instans diskala-masuk ke 0, satu instans sub-layanan antrian akan dipertahankan secara otomatis. Anda juga dapat menggunakan queue.min_replica untuk menyesuaikan jumlah minimum instans sub-layanan antrian yang dipertahankan.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_evict atau queue.source.auto_evict untuk mengaktifkan penghapusan data otomatis untuk antrian sink atau antrian input, masing-masing.
{ "queue": { "sink": { "auto_evict": true # Aktifkan penghapusan untuk antrian sink. Default: false. }, "source": { "auto_evict": true # Aktifkan penghapusan untuk antrian input. Default: false. } } }Secara default, penghapusan data otomatis dinonaktifkan. Jika antrian penuh, Anda tidak dapat menulis data tambahan. Jika Anda mengizinkan overflow data, aktifkan penghapusan otomatis, yang menyebabkan antrian menghapus pesan terlama untuk memberi ruang bagi pesan baru.
-
Gunakan queue.max_delivery untuk mengonfigurasi jumlah maksimum upaya pengiriman.
{ "queue": { "max_delivery": 10 # Maksimum upaya pengiriman: 10. Default: 5. Jika diatur ke 0, maksimum upaya pengiriman dinonaktifkan dan pesan dapat dikirimkan tanpa batas. } }Jika upaya pengiriman suatu pesan melebihi ambang batas ini, pesan tersebut ditandai sebagai dead letter. Untuk informasi lebih lanjut, lihat kebijakan dead-letter.
-
Gunakan queue.max_idle untuk mengonfigurasi waktu pemrosesan maksimum untuk suatu pesan.
{ "queue": { "max_idle": "1m" # Atur waktu pemrosesan maksimum untuk satu pesan menjadi 1 menit. Jika waktu ini terlampaui, pesan akan dikirimkan ke subscriber lain. Setelah pengiriman, jumlah pengiriman bertambah 1. Nilai default adalah 0, yang berarti tidak ada batas waktu pemrosesan maksimum. } }Durasi waktu yang dikonfigurasi dalam contoh adalah 1 menit. Beberapa satuan waktu didukung, seperti h (jam), m (menit), dan s (detik). Jika waktu pemrosesan satu pesan melebihi durasi yang dikonfigurasi, salah satu hal berikut terjadi:
-
Jika ambang batas yang ditetapkan oleh queue.max_delivery belum terlampaui, pesan dikirimkan ke subscriber lain.
-
Jika ambang batas yang ditetapkan oleh queue.max_delivery telah terlampaui, kebijakan dead-letter diterapkan pada pesan tersebut.
-
-
Gunakan queue.dead_message_policy untuk mengonfigurasi kebijakan dead-letter.
{ "queue": { "dead_message_policy": "Rear" # Nilai yang valid: Rear (default) atau Drop. Rear memindahkan pesan ke akhir antrian. Drop menghapus pesan. } }
Konfigurasikan batas antrian
Panjang antrian maksimum dan ukuran muatan maksimum saling berbanding terbalik. Mereka mengikuti rumus berikut:
Memori instans sub-layanan antrian bersifat tetap. Oleh karena itu, jika Anda meningkatkan ukuran muatan maksimum per pesan, panjang antrian maksimum berkurang.
-
Dengan konfigurasi memori default 4 GB, di mana ukuran muatan maksimum default adalah 8 KB, antrian input dan sink masing-masing dapat menyimpan 230.399 pesan. Jika Anda perlu menyimpan lebih banyak pesan dalam sub-layanan antrian, tingkatkan ukuran memori sesuai kebutuhan, seperti yang dijelaskan dalam bagian konfigurasi memori di atas. Sistem menyisihkan 10% dari total memori.
-
Untuk antrian yang sama, Anda tidak dapat mengonfigurasi panjang maksimum dan ukuran muatan maksimum secara bersamaan.
-
Gunakan queue.sink.max_length atau queue.source.max_length untuk mengonfigurasi panjang maksimum antrian sink atau antrian input, masing-masing.
{ "queue": { "sink": { "max_length": 8000 # Konfigurasikan panjang maksimum antrian sink menjadi 8.000 pesan. }, "source": { "max_length": 2000 # Konfigurasikan panjang maksimum antrian input menjadi 2.000 pesan. } } } -
Gunakan queue.sink.max_payload_size_kb atau queue.source.max_payload_size_kb untuk mengonfigurasi ukuran muatan maksimum per pesan untuk antrian sink atau antrian input, masing-masing.
{ "queue": { "sink": { "max_payload_size_kb": 10 # Konfigurasikan ukuran muatan maksimum per pesan dalam antrian sink menjadi 10 KB. Default: 8 KB. }, "source": { "max_payload_size_kb": 1024 # Konfigurasikan ukuran muatan maksimum per pesan dalam antrian input menjadi 1024 KB (1 MB). Default: 8 KB. } } }
Konfigurasikan rasio alokasi memori
-
Gunakan queue.sink.memory_ratio untuk menyesuaikan alokasi memori antara antrian input dan antrian sink.
{ "queue": { "sink": { "memory_ratio": 0.9 # Konfigurasikan rasio memori untuk antrian sink. Nilai default: 0.5. } } }CatatanSecara default, antrian input dan antrian sink membagi memori instans sub-layanan antrian secara merata. Jika data keluaran Anda (misalnya, gambar) lebih besar daripada data masukan Anda (misalnya, teks), Anda dapat meningkatkan queue.sink.memory_ratio untuk mengalokasikan lebih banyak memori ke antrian sink. Sebaliknya, jika layanan Anda menerima gambar sebagai input dan menghasilkan teks, Anda dapat menurunkan queue.sink.memory_ratio.
Penyesuaian Skala Horizontal Otomatis
Cara kerja
Sistem secara dinamis menskalakan instans inferensi berdasarkan panjang antrian, termasuk menskalakan ke nol saat antrian kosong untuk mengurangi biaya. Diagram berikut menggambarkan Penyesuaian Skala Otomatis untuk layanan inferensi asinkron.
Prosedur
-
Dalam daftar layanan, klik nama layanan target untuk membuka halaman detail layanan.
-
Beralih ke tab Auto Scaling. Di bagian Auto Scaling, klik Enable Auto Scaling.
-
Dalam kotak dialog Auto Scaling Settings, konfigurasikan parameter.
-
Pengaturan dasar:
Parameter
Deskripsi
Contoh
Minimum Replicas
Replica minimum untuk operasi scale-in. Nilai minimum: 0.
0
Maximum Replicas
Replica maksimum untuk operasi scale-out. Nilai maksimum: 1000.
10
General Scaling Metrics
Metrik performa bawaan yang digunakan untuk memicu penskalaan.
Asynchronous Queue Length merepresentasikan rata-rata jumlah tugas dalam antrian per instans.
Select Asynchronous Queue Length dan atur ambang batas ke 10.
-
Pengaturan lanjutan:
Parameter
Deskripsi
Contoh
Scale-out Starts in
Jendela observasi untuk keputusan scale-out. Setelah pemicu scale-out aktif, sistem mengamati metrik selama periode ini. Jika nilai metrik turun di bawah ambang batas, scale-out dibatalkan. Satuan: detik.
Nilai default adalah
0detik, yang berarti scale-out dieksekusi segera.0
Scale-in Starts in
Jendela observasi untuk keputusan scale-in—parameter kunci untuk mencegah jitter layanan. Scale-in hanya terjadi setelah metrik tetap di bawah ambang batas selama durasi penuh ini. Satuan: detik.
Default:
300detik. Ini melindungi dari peristiwa scale-in yang sering akibat fluktuasi trafik. Jangan atur terlalu rendah agar stabilitas layanan tetap terjaga.300
Scale-in to 0 Instance Starts in
Saat Minimum Replicas diatur ke
0, parameter ini menentukan waktu tunggu sebelum jumlah replica berkurang menjadi0.600
Scale-from-Zero Replica Count
Jumlah replica yang ditambahkan saat layanan diskalakan dari
0replica.1
Untuk informasi lebih lanjut tentang parameter dan penggunaan klien EASCMD, lihat Penyesuaian Skala Horizontal Otomatis.
-