Untuk beban kerja inferensi berdurasi panjang seperti AIGC dan pemrosesan video, inferensi sinkron dapat menyebabkan timeout koneksi dan beban replika yang tidak merata. Inferensi asinkron PAI memungkinkan Anda mengirim permintaan dan mengambil hasilnya melalui langganan atau polling.
Informasi latar belakang
Fitur
-
Inferensi asinkron
Inferensi online berlatensi rendah biasanya menggunakan inferensi sinkron: klien mengirim permintaan dan menunggu hasil pada koneksi yang sama.
Ketika waktu inferensi panjang atau tidak dapat diprediksi, penantian sinkron dapat menyebabkan koneksi HTTP terputus dan timeout klien. Dengan inferensi asinkron, klien mengirim permintaan dan mengambil hasilnya nanti melalui polling atau berlangganan notifikasi.
-
Layanan antrian
Skenario near-real-time seperti pemrosesan video pendek, analisis aliran audio/video, atau pemrosesan gambar intensif harus mengembalikan hasil dalam batas waktu tertentu. Skenario ini menghadapi tantangan berikut:
-
Algoritma penyeimbangan beban round-robin tidak sesuai. Permintaan harus didistribusikan berdasarkan beban aktual setiap replika.
-
Jika sebuah replika gagal, tugas yang belum selesai harus dialihkan ke replika sehat lainnya untuk diproses.
PAI menyediakan kerangka kerja layanan antrian untuk mengatasi masalah distribusi permintaan ini.
-
Cara kerja
-
Layanan inferensi asinkron terdiri dari dua layanan sub: layanan sub-inferensi dan layanan sub-antrian. Layanan sub-antrian memiliki dua antrian bawaan: antrian input dan antrian sink. Permintaan pertama kali masuk ke antrian input. Setiap replika layanan sub-inferensi berlangganan antrian input, memproses permintaan, dan menulis respons ke antrian sink.
-
Ketika antrian sink penuh, kerangka kerja layanan berhenti mengonsumsi dari antrian input untuk mencegah hasil yang tidak dapat dikirimkan.
Jika Anda menulis hasil inferensi langsung ke OSS atau middleware pesan milik Anda sendiri, kembalikan respons kosong dari antarmuka inferensi HTTP. Antrian sink kemudian akan diabaikan.
-
Layanan sub-antrian menerima permintaan klien dan mendistribusikannya ke replika inferensi berdasarkan kapasitas konkurensi. Setiap replika berlangganan jendela permintaan, mencegah kelebihan beban dan memastikan semua data akhirnya dikembalikan ke klien.
CatatanSebagai contoh, jika setiap replika dapat memproses lima aliran audio, atur ukuran jendela menjadi 5. Ketika replika menyelesaikan satu aliran dan meng-commit hasilnya, layanan sub-antrian mendorong aliran baru. Hal ini membatasi setiap replika pada maksimal lima aliran konkuren.
-
Layanan sub-antrian memantau koneksi replika. Jika sebuah replika gagal, permintaan yang belum diproses akan didistribusikan ulang ke replika sehat, sehingga tidak ada data yang hilang.
Buat layanan inferensi asinkron
Membuat layanan inferensi asinkron secara otomatis membuat kelompok layanan dengan nama yang sama beserta layanan sub-antrian. Layanan sub-antrian secara default memiliki satu replika (1 core, memori 4 GB) dan diskalakan hingga dua replika bersamaan dengan layanan sub-inferensi. Untuk menyesuaikan, ubah parameter layanan sub-antrian.
EAS mendukung dua metode penerapan untuk inferensi asinkron:
Penerapan melalui Konsol
-
Buka halaman Penerapan Kustom dan konfigurasikan parameter utama berikut. Parameter lainnya dijelaskan dalam Penerapan Kustom.
-
Deployment Method: Pilih Image-based Deployment atau Processor-based Deployment, lalu centang kotak Asynchronous Queue.
-
-
Setelah mengonfigurasi parameter, klik Deploy.
Penerapan melalui klien eascmd
-
Siapkan file konfigurasi layanan bernama service.json.
-
Gunakan penerapan berbasis 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 } }Parameter utama dijelaskan di bawah ini. Parameter lainnya dibahas dalam Penerapan berbasis JSON.
-
type: Atur parameter ini ke
Asyncuntuk membuat layanan inferensi asinkron. -
model_path: Ganti nilai dengan path ke model Anda.
-
-
Gunakan penerapan berbasis image.
{ "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 utama dijelaskan di bawah ini. Parameter lainnya dibahas dalam Penerapan berbasis JSON.
-
type: Atur parameter ini ke Async untuk membuat layanan inferensi asinkron.
-
instance: Jumlah replika untuk layanan sub-inferensi. Ini tidak mencakup replika layanan sub-antrian.
-
rpc.worker_threads: Jumlah thread untuk kerangka kerja layanan EAS, yang sama dengan ukuran jendela langganan. Layanan sub-antrian mendorong paling banyak sejumlah pesan ini secara konkuren dan menunggu hasil sebelum mengirim lebih banyak.
Sebagai contoh, untuk layanan aliran video di mana setiap replika menangani dua aliran sekaligus, atur nilai ini ke 2. Layanan sub-antrian mendorong paling banyak dua URL aliran video dan hanya mengirim yang baru setelah menerima hasil.
-
-
-
Buat layanan.
Setelah login ke klien eascmd (Unduh dan autentikasi klien), jalankan perintah create:
eascmd create service.json
Akses layanan inferensi asinkron
Sistem membuat kelompok layanan dengan nama yang sama. Karena layanan sub-antrian menangani trafik masuk, akses langsung melalui titik akhir berikut. Akses layanan antrian.
|
Jenis titik akhir |
Format |
Contoh |
|
Titik akhir antrian input |
|
|
|
Titik akhir antrian sink |
|
|
Kelola layanan inferensi asinkron
Kelola layanan inferensi asinkron seperti layanan biasa. Sistem mengelola layanan sub secara otomatis: menghapus layanan akan menghapus kedua layanan sub, sedangkan memperbarui layanan sub-inferensi tidak mengubah layanan sub-antrian.
Meskipun hanya mengonfigurasi satu replika, daftar instans menampilkan satu instans layanan sub-antrian tambahan.
Jumlah replika mengacu pada replika layanan sub-inferensi. Replika layanan sub-antrian diskalakan secara otomatis. Sebagai contoh, menaikkan replika inferensi menjadi 3 akan meningkatkan replika antrian menjadi 2.
Aturan penskalaan replika:
-
Ketika layanan dihentikan, kedua layanan sub diskalakan ke 0 replika.
-
Dengan satu replika inferensi, layanan sub-antrian juga memiliki satu replika (kecuali dikonfigurasi lain).
-
Dengan dua atau lebih replika inferensi, layanan sub-antrian mempertahankan dua replika (kecuali dikonfigurasi lain).
-
Jika Penyesuaian Skala Otomatis mengizinkan minimum 0 replika, layanan sub-antrian mempertahankan satu replika siaga ketika replika inferensi diskalakan ke 0.
Parameter layanan sub-antrian
Layanan sub-antrian berfungsi dengan konfigurasi default pada sebagian besar kasus. Sesuaikan dalam field tingkat atas queue pada file JSON:
{
"queue": {
"sink": {
"memory_ratio": 0.3
},
"source": {
"auto_evict": true,
}
}
Bagian berikut menjelaskan opsi konfigurasi.
Sumber daya layanan sub-antrian
Secara default, sumber daya layanan sub-antrian diwariskan dari metadata. Konfigurasikan secara terpisah jika diperlukan.
-
Deklarasikan kelompok sumber daya untuk layanan sub-antrian menggunakan queue.resource.
{ "queue": { "resource": "eas-r-slzkbq4tw0p6xd****" // Secara default, menggunakan kelompok sumber daya layanan sub-inferensi. } }-
Default-nya adalah kelompok sumber daya layanan sub-inferensi.
-
Untuk menerapkan layanan sub-antrian di kelompok sumber daya publik, atur resource ke string kosong (
""). Ini berguna ketika kelompok sumber daya khusus Anda kekurangan CPU atau memori.CatatanTerapkan layanan sub-antrian di kelompok sumber daya publik bila memungkinkan.
-
-
Deklarasikan CPU (dalam core) dan memori (dalam MB) untuk setiap replika layanan sub-antrian menggunakan queue.cpu dan queue.memory.
{ "queue": { "cpu": 2, // Default: 1. "memory": 8000 // Default: 4000. } }Konfigurasi default (1 core CPU, memori 4 GB) cukup untuk sebagian besar skenario.
Penting-
Untuk lebih dari 200 subscriber (replika layanan sub-inferensi), konfigurasikan 2 core CPU atau lebih.
-
Jangan kurangi memori layanan sub-antrian di lingkungan produksi.
-
-
Konfigurasikan jumlah minimum replika untuk layanan sub-antrian menggunakan queue.min_replica.
{ "queue": { "min_replica": 3 // Default: 1. } }Replika layanan sub-antrian diskalakan secara otomatis sesuai dengan replika inferensi yang berjalan. Rentang default adalah
[1, min{2, jumlah replika layanan sub-inferensi}]. Jika Penyesuaian Skala Otomatis mengizinkan penskalaan ke 0, satu replika antrian tetap dipertahankan. Gunakan queue.min_replica untuk menyesuaikan nilai minimum ini.CatatanLebih banyak replika antrian meningkatkan ketersediaan, bukan performa.
Fitur layanan sub-antrian
Layanan sub-antrian mendukung konfigurasi fitur berikut.
-
Konfigurasikan penghapusan data otomatis untuk antrian sink dan antrian input menggunakan queue.sink.auto_evict atau queue.source.auto_evict, masing-masing.
{ "queue": { "sink": { "auto_evict": true // Mengaktifkan penghapusan otomatis untuk antrian sink. Default: false. }, "source": { "auto_evict": true // Mengaktifkan penghapusan otomatis untuk antrian input. Default: false. } } }Penghapusan otomatis dinonaktifkan secara default—ketika antrian penuh, data baru ditolak. Aktifkan penghapusan untuk menghapus data terlama dan memberi ruang bagi entri baru.
-
Konfigurasikan jumlah maksimum upaya pengiriman menggunakan queue.max_delivery.
{ "queue": { "max_delivery": 10 // Jumlah maksimum upaya pengiriman adalah 10. Default: 5. Jika diatur ke 0, fitur ini dinonaktifkan, dan data dapat dikirimkan tanpa batas. } }Ketika upaya pengiriman melebihi ambang batas, pesan ditandai sebagai dead letter. Kebijakan dead-letter.
-
Konfigurasikan waktu pemrosesan maksimum untuk sebuah pesan menggunakan queue.max_idle.
{ "queue": { "max_idle": "1m" // Mengonfigurasi waktu pemrosesan maksimum untuk satu pesan menjadi 1 menit. Jika waktu ini terlampaui, pesan dikirimkan ke subscriber lain, dan hitungan pengiriman dinaikkan. Nilai default adalah 0, yang berarti tidak ada batas waktu pemrosesan maksimum. } }Unit waktu yang didukung:
h(jam),m(menit), dans(detik). Jika pemrosesan melebihi durasi yang dikonfigurasi:-
Jika ambang batas
queue.max_deliverybelum terlampaui, pesan dikirim ulang ke subscriber lain. -
Jika ambang batas
queue.max_deliveryterlampaui, kebijakan dead-letter diterapkan.
-
-
Konfigurasikan kebijakan dead-letter menggunakan queue.dead_message_policy.
{ "queue": { "dead_message_policy": "Rear" // Nilainya bisa Rear (default) atau Drop. Rear memindahkan pesan ke akhir antrian. Drop menghapus pesan. } }
Panjang antrian atau ukuran muatan maksimum
Memori replika antrian bersifat tetap: meningkatkan ukuran muatan maksimum per pesan akan mengurangi panjang antrian maksimum.
-
Dengan pengaturan default (memori 4 GB, muatan maksimum 8 KB), setiap antrian dapat menyimpan hingga 230.399 pesan. Untuk menyimpan lebih banyak, tingkatkan memori. Sistem menyisihkan 10% dari total memori.
-
Anda tidak dapat mengonfigurasi panjang maksimum dan ukuran muatan maksimum secara bersamaan untuk antrian yang sama.
-
Konfigurasikan panjang maksimum antrian sink dan antrian input menggunakan queue.sink.max_length atau queue.source.max_length, masing-masing.
{ "queue": { "sink": { "max_length": 8000 // Mengonfigurasi panjang maksimum antrian sink menjadi 8.000 pesan. }, "source": { "max_length": 2000 // Mengonfigurasi panjang maksimum antrian input menjadi 2.000 pesan. } } } -
Konfigurasikan ukuran muatan maksimum per pesan untuk antrian sink dan antrian input menggunakan queue.sink.max_payload_size_kb atau queue.source.max_payload_size_kb, masing-masing.
{ "queue": { "sink": { "max_payload_size_kb": 10 // Mengonfigurasi ukuran muatan maksimum per pesan untuk antrian sink menjadi 10 KB. Default: 8 KB. }, "source": { "max_payload_size_kb": 1024 // Mengonfigurasi ukuran muatan maksimum per pesan untuk antrian input menjadi 1024 KB (1 MB). Default: 8 KB. } } }
Rasio alokasi memori
-
Sesuaikan alokasi memori antara antrian input dan antrian sink menggunakan queue.sink.memory_ratio.
{ "queue": { "sink": { "memory_ratio": 0.9 // Mengonfigurasi rasio memori untuk antrian sink. Default: 0.5. } } }CatatanSecara default, antrian input dan antrian sink berbagi memori secara merata. Tingkatkan
queue.sink.memory_ratiojika antrian sink membutuhkan lebih banyak ruang (misalnya, input teks dan output gambar), atau turunkan untuk kondisi sebaliknya.
Penyesuaian skala horizontal otomatis
Cara kerja
Sistem secara dinamis menskalakan replika inferensi berdasarkan status antrian, termasuk menskalakan ke nol ketika antrian kosong. Diagram berikut menggambarkan mekanisme tersebut.
Prosedur
-
Di daftar layanan, klik nama layanan target.
-
Buka tab Auto Scaling. Di bagian Auto Scaling, klik Enable Auto Scaling.
-
Di kotak dialog Auto Scaling Settings, konfigurasikan parameter.
-
Pengaturan dasar:
Parameter
Deskripsi
Contoh
Minimum Replicas
Replika minimum untuk operasi scale-in. Nilai minimum: 0.
0
Maximum Replicas
Replika 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 replika.
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 dilakukan 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 terjaga.300
Scale-in to 0 Instance Starts in
Ketika Minimum Replicas adalah
0, parameter ini menentukan waktu tunggu sebelum jumlah replika dikurangi menjadi0.600
Scale-from-Zero Replica Count
Jumlah replika yang ditambahkan ketika layanan diskalakan dari
0replika.1
Detail parameter lengkap dan penggunaan eascmd tersedia di Penyesuaian skala horizontal otomatis.
-