Service Mesh (ASM) memungkinkan Anda membatasi jumlah token yang diminta oleh klien tertentu berdasarkan atribut permintaan, seperti atribut TCP, Header HTTP, path, host, dan tujuan entri rute. Topik ini menjelaskan cara membatasi jumlah token yang dikonsumsi selama suatu permintaan berdasarkan header permintaan LLM. Jika batas token tercapai, proxy akan mengembalikan respons tanpa meneruskan permintaan ke layanan eksternal.
Informasi latar belakang
Ikhtisar fungsi
Fitur pembatasan laju token LLM di ASM diimplementasikan menggunakan plug-in WebAssembly (Wasm) dan terdiri dari dua komponen: plug-in pembatasan laju dan layanan pembatasan laju. Plug-in pembatasan laju mencegat permintaan, mengekstrak kunci pembatasan laju, lalu menanyakan layanan pembatasan laju untuk menentukan apakah permintaan tersebut perlu dibatasi lajunya. Selama fase respons LLM, layanan pembatasan laju dipanggil kembali untuk memperbarui catatan pembatasan laju untuk kunci yang ditentukan.
Seperti yang ditunjukkan pada gambar sebelumnya, pengembalian respons LLM dan pembaruan catatan pembatasan laju pada Langkah ⑥ dilakukan secara asinkron dan tidak saling menghalangi.
Layanan pembatasan laju dikelola oleh klien. Plug-in pembatasan laju ASM memanggil layanan ini menggunakan antarmuka HTTP standar. Anda dapat memilih algoritma pembatasan laju yang berbeda, seperti token bucket, leaky bucket, atau jendela geser, untuk menerapkan aturan pembatasan laju spesifik sesuai skenario bisnis. Anda juga dapat menyesuaikan aturan pembatasan laju secara dinamis berdasarkan beban layanan backend. Selain itu, ASM menyediakan implementasi pembatasan laju default yang menggunakan algoritma token bucket. Implementasi ini bergantung pada database Redis untuk menyimpan catatan pembatasan laju.
Skenario
Fitur ini berlaku untuk dua skenario berikut:
Klien memanggil layanan model bahasa besar eksternal: Layanan model bahasa besar eksternal biasanya ditagih berdasarkan jumlah token yang dikonsumsi oleh permintaan. Anda dapat menggunakan pembatasan laju token LLM untuk mengontrol biaya klien secara efektif.
Penyedia layanan inferensi: Klien eksternal memanggil layanan inferensi di dalam kluster. Layanan inferensi membutuhkan sumber daya komputasi dalam jumlah besar. Anda dapat menggunakan pembatasan laju token LLM untuk mencegah satu pelanggan mengonsumsi sumber daya secara berlebihan dalam periode singkat, yang dapat menyebabkan layanan untuk pengguna lain menjadi tidak tersedia.
Prasyarat
Anda telah menambahkan kluster ke instans ASM, dan instans ASM menggunakan versi 1.23 atau yang lebih baru.
Anda telah membaca dan mengikuti Langkah 1 dan 2 dalam Perutean trafik: Gunakan ASM untuk mengelola trafik LLM secara efisien guna menerapkan LLMProvider dan sumber daya terkaitnya.
Anda telah menerapkan layanan Redis di kluster atau secara lokal. Anda juga dapat menggunakan Tair (Redis OSS-compatible) untuk membuat instans Redis dengan cepat. Untuk informasi selengkapnya, lihat Ikhtisar Panduan Cepat.
Contoh
Contoh ini mengonfigurasi dua header permintaan dengan nama pengguna regular-user dan subscriber. Saat plug-in Wasm memproses permintaan, plug-in tersebut membaca header permintaan, mengekstrak kunci pembatasan laju, lalu mengirim kunci tersebut ke layanan pembatasan laju. Layanan pembatasan laju kemudian melakukan pengendalian aliran terhadap permintaan berdasarkan aturan pembatasan laju yang dikonfigurasi. Hal ini memungkinkan subscriber mengonsumsi lebih banyak token, sedangkan pengguna reguler hanya dapat mengonsumsi jumlah token yang kecil.
Langkah 1: Terapkan layanan pembatasan laju
Buat file bernama token-limit.yaml yang berisi konten berikut.
File YAML di atas mengonfigurasi variabel lingkungan
RATE_LIMIT_CONFIG. Variabel ini berfungsi sebagai berikut:Jika
rate_limit_key_regexcocok denganregular-user.*dalam header permintaan, aturan pembatasan laju berikut diterapkan: Catatan di Redis kedaluwarsa setelah 300 detik. Bucket token diisi ulang dengan 50 token setiap 30 detik. Kapasitas maksimum bucket token adalah 200 token.Jika
rate_limit_key_regexcocok dengansubscriber.*dalam header permintaan, aturan pembatasan laju berikut diterapkan: Catatan di Redis kedaluwarsa setelah 600 detik. Bucket token diisi ulang dengan 100 token setiap 60 detik. Kapasitas maksimum bucket token adalah 1.000 token.
Gunakan file kubeconfig kluster bidang data untuk menjalankan perintah berikut.
kubectl apply -f token-limit.yamlASM mendukung layanan pembatasan laju kustom dan menyediakan implementasi default yang menggunakan pencocokan tepat di Redis. Untuk informasi selengkapnya, lihat repositori kode. Jika Anda memiliki persyaratan kustom lainnya, Anda dapat mengembangkan layanan pembatasan laju berdasarkan contoh ini.
Langkah 2: Terapkan plug-in pembatasan laju
Buat file bernama wasm.yaml yang berisi konten berikut.
apiVersion: extensions.istio.io/v1alpha1 kind: WasmPlugin metadata: name: llm-token-ratelimit namespace: default spec: failStrategy: FAIL_OPEN imagePullPolicy: IfNotPresent selector: matchLabels: app: sleep match: - mode: CLIENT ports: - number: 80 phase: STATS pluginConfig: matches: - host: exact: "dashscope.aliyuncs.com" rateLimitKeys: - "{{request.headers.user-type}}" rateLimitService: service: asm-llm-token-rate-limit-example.default.svc.cluster.local port: 80 priority: 10 url: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-wasm-llm-token-ratelimit:v1.23.6.34-g92d6a4b-aliyunTabel berikut menjelaskan beberapa item konfigurasi.
Item konfigurasi
Deskripsi
.spec.pluginConfig.matches
Mencocokkan permintaan yang akan diterapkan logika pembatasan lajunya. Permintaan yang tidak cocok diizinkan untuk dilewatkan.
.spec.pluginConfig.rateLimitKeys
Aturan untuk menghasilkan kunci pembatasan laju. Untuk informasi selengkapnya, lihat Attributes. Pada contoh ini, nilainya adalah
{{request.headers.user-type}}..spec.pluginConfig.rateLimitService
Informasi tentang layanan pembatasan laju. Anda harus menentukan nama lengkap (FQDN) dari Service tersebut.
Gunakan file kubeconfig kluster lapisan kontrol untuk menjalankan perintah berikut.
kubectl apply -f wasm.yaml
Langkah 3: Uji fitur
Gunakan file kubeconfig kluster bidang data untuk menjalankan perintah berikut beberapa kali sebagai regular-user dan subscriber.
kubectl exec deployment/sleep -it -- curl 'http://dashscope.aliyuncs.com' \
--header 'Content-Type: application/json' \
--header "user-type: regular-user" \
--data '{
"messages": [
{"role": "user", "content": "Please introduce yourself"}
]
}'kubectl exec deployment/sleep -it -- curl 'http://dashscope.aliyuncs.com' \
--header 'Content-Type: application/json' \
--header "user-type: subscriber" \
--data '{
"messages": [
{"role": "user", "content": "Silakan perkenalkan diri Anda"}
]
}'Output yang diharapkan:
{"choices":[{"message":{"role":"assistant","content":"I am a large language model from Alibaba Cloud. My name is Tongyi Qianwen. I am a super-large language model that can answer questions, create text, express opinions, and write code. My knowledge comes from text on the Internet. After multiple iterations and optimizations, my capabilities have continuously improved. I can now answer questions on various topics, such as technology, culture, history, and entertainment, and can also engage in continuous conversations. If you have any questions or need help, feel free to let me know, and I will do my best to provide support."},"finish_reason":"stop","index":0,"logprobs":null}],"object":"chat.completion","usage":{"prompt_tokens":10,"completion_tokens":95,"total_tokens":105},"created":1735103573,"system_fingerprint":null,"model":"qwen1.5-72b-chat","id":"chatcmpl-7de0bd64-341a-9196-b676-99b5644ec111"}%
regular-user is being rate-limited{"choices":[{"message":{"role":"assistant","content":"I am a large language model from Alibaba Cloud. My name is Tongyi Qianwen. I am a super-large language model that can answer questions, create text, express opinions, and write code. My knowledge comes from text on the Internet. After multiple iterations and optimizations, my capabilities have continuously improved. I can now answer questions on various topics, such as technology, culture, history, and entertainment, and can also engage in continuous conversations. If you have any questions or need help, feel free to let me know, and I will do my best to provide support."},"finish_reason":"stop","index":0,"logprobs":null}],"object":"chat.completion","usage":{"prompt_tokens":10,"completion_tokens":95,"total_tokens":105},"created":1735103890,"system_fingerprint":null,"model":"qwen1.5-72b-chat","id":"chatcmpl-1b284b71-f850-95f5-9a7e-12678812763c"}%
{"choices":[{"message":{"role":"assistant","content":"I am a large language model from Alibaba Cloud. My name is Tongyi Qianwen. I am a super-large language model that can answer questions, create text, express opinions, and write code. My knowledge comes from the massive text data of Alibaba Cloud, including various books, documents, web pages, and papers, which is intended to enable me to understand and answer various topics. If you have any questions or need help, feel free to let me know, and I will do my best to provide support."},"finish_reason":"stop","index":0,"logprobs":null}],"object":"chat.completion","usage":{"prompt_tokens":10,"completion_tokens":81,"total_tokens":91},"created":1735103895,"system_fingerprint":null,"model":"qwen1.5-72b-chat","id":"chatcmpl-0d29d820-c9c5-9e94-9a5a-d054233ed35a"}
subscriber is being rate-limited