Kecerdasan Buatan
SGLang: Eksekusi Program Model Bahasa Terstruktur yang Efisien

Model bahasa besar (LLM) semakin banyak digunakan untuk tugas-tugas kompleks yang memerlukan panggilan beberapa generasi, teknik dorongan tingkat lanjut, aliran kontrol, dan input/output terstruktur. Namun, sistem yang efisien untuk memprogram dan menjalankan aplikasi ini masih kurang. SGLang, sistem yang baru diperkenalkan, bertujuan untuk mengatasi hal ini dengan menyediakan eksekusi program model bahasa kompleks yang efisien. SGLang terdiri dari bahasa frontend dan runtime. Frontend menyederhanakan pemrograman dengan primitif untuk pembangkitan dan kontrol paralelisme, sementara runtime mempercepat eksekusi melalui optimalisasi baru seperti RadixAttention untuk penggunaan kembali cache KV dan mesin status terbatas terkompresi untuk decoding keluaran terstruktur yang lebih cepat. Eksperimen menunjukkan bahwa SGLang mencapai throughput hingga 6.4Ć lebih tinggi dibandingkan dengan sistem inferensi canggih pada berbagai model bahasa dan multimodal yang besar, menangani tugas-tugas seperti kontrol agen, penalaran logis, tolok ukur pembelajaran beberapa langkah, decoding JSON, pengambilan -jaringan pipa generasi tambahan, dan obrolan multi-putaran.
Kemajuan terkini dalam kemampuan LLM telah memperluas kegunaannya, memungkinkan mereka menangani tugas umum yang lebih luas dan berfungsi sebagai agen otonom. Dalam aplikasi ini, LLM terlibat dalam perencanaan multi-putaran, penalaran, dan interaksi dengan lingkungan eksternal. Hal ini difasilitasi melalui penggunaan alat, berbagai modalitas masukan, dan berbagai teknik dorongan, seperti pembelajaran beberapa langkah, konsistensi diri, kerangka pemikiran, dan pohon pemikiran. Kasus penggunaan baru ini memerlukan beberapa panggilan pembangkitan LLM yang seringkali bergantung, yang menunjukkan tren penggunaan struktur multi-panggilan untuk menyelesaikan tugas yang kompleks.
Pergeseran ini menandai transisi dari obrolan sederhana ke penggunaan LLM terprogram yang lebih canggih, di mana program menjadwalkan dan mengontrol proses pembuatan LLM. Program-program ini disebut sebagai āProgram Model Bahasaā (Program LM). Teknik dorongan tingkat lanjut dan alur kerja agen berada dalam cakupan program LM. Ada dua sifat umum program LM: (1) Program LM biasanya melibatkan beberapa panggilan LLM yang diselingi dengan aliran kontrol untuk menyelesaikan tugas-tugas kompleks dan meningkatkan kualitas secara keseluruhan. (2) Program LM menerima masukan terstruktur dan menghasilkan keluaran terstruktur, memungkinkan komposisi program LM dan integrasi ke dalam sistem perangkat lunak yang ada.
Dalam artikel ini, kita akan mempelajari lebih dalam kerangka SGLang, mengeksplorasi arsitekturnya, menganalisis kinerjanya, dan membandingkannya dengan kerangka canggih. Jadi mari kita mulai.
Pengantar SGLang
Meskipun program LM digunakan secara luas, sistem yang ada saat ini untuk mengekspresikan dan melaksanakannya masih belum efisien. SGLang mengidentifikasi dua tantangan utama yang terkait dengan efisiensi penggunaan program LM:
- Kompleksitas Pemrograman: Mengembangkan program LM membosankan dan sulit karena sifat LLM yang non-deterministik. Hal ini melibatkan manipulasi string yang ekstensif, penyetelan prompt secara eksperimental, penguraian keluaran yang rapuh, penanganan berbagai modalitas masukan, dan penerapan mekanisme paralelisme. Kompleksitas ini secara signifikan mengurangi keterbacaan program sederhana sekalipun.
- Inefisiensi Eksekusi: Eksekusi program LM tidak efisien karena komputasi dan penggunaan memori yang berlebihan. Mesin inferensi canggih, yang dioptimalkan untuk mengurangi latensi dan meningkatkan throughput, tidak memiliki pengetahuan langsung tentang beban kerja, sehingga mengakibatkan inefisiensi yang signifikan. Contoh penting adalah penggunaan kembali cache Nilai Kunci (KV), yang terdiri dari tensor perantara yang dapat digunakan kembali yang penting untuk inferensi generatif. Sistem saat ini tidak memiliki mekanisme yang efektif untuk memfasilitasi penggunaan kembali cache KV di banyak tempat LLM panggilan yang memiliki awalan yang sama, sehingga menyebabkan komputasi yang tidak diperlukan dan memori yang terbuang. Selain itu, decoding terbatas untuk output terstruktur, seperti mode JSON, kurang optimal karena sistem yang ada hanya mendekode satu token dalam satu waktu.
Untuk mengatasi tantangan ini, SGLang memperkenalkan Bahasa Generasi Terstruktur untuk LLM. Ide intinya adalah mengeksploitasi struktur multi-panggilan secara sistematis dalam program LM untuk eksekusi yang efisien. Seperti yang ditunjukkan pada gambar berikut, SGLang memiliki dua bagian: bahasa front-end dan runtime back-end.
Front-end menyederhanakan pemrograman program LM, dan runtime mempercepat eksekusinya. Bagian-bagian ini dapat bekerja sama untuk kinerja yang lebih baik atau berfungsi secara mandiri.
SGLang adalah bahasa khusus domain yang tertanam dalam Python, menyediakan primitif untuk pembangkitan (misalnya, perluasan, gen, pilih) dan kontrol paralelisme (misalnya, fork, gabung). Ini kompatibel dengan aliran kontrol dan pustaka Python, memungkinkan pengguna untuk mengembangkan alur kerja prompt tingkat lanjut dengan mudah menggunakan sintaksis asli Python. SGLang menyertakan juru bahasa dan kompiler. Penerjemah mengelola status prompt sebagai aliran dan mengirimkan operasi primitif ke aliran untuk eksekusi asinkron, memastikan kontrol yang tepat atas sinkronisasi dan paralelisme intra-program. Selain itu, program SGLang dapat ditelusuri dan dikompilasi untuk optimasi lebih lanjut. Runtime SGLang mengusulkan beberapa optimasi baru untuk mempercepat pelaksanaan program LM:
- RadixAttention: Teknik ini memungkinkan penggunaan kembali cache KV secara otomatis di beberapa panggilan generasi. Di mesin inferensi yang ada, cache KV dari suatu permintaan dibuang setelah pemrosesan, mencegah penggunaan kembali di beberapa panggilan dan memperlambat eksekusi. SGLang memelihara cache LRU dari cache KV dalam pohon radix, mengelola cache KV sebagai cache tradisional dan menggunakan pohon radix untuk pencocokan, penyisipan, dan penggusuran yang efisien. Hal ini memungkinkan runtime untuk menangani berbagai pola penggunaan kembali secara efisien.
- Mesin Keadaan Hingga Terkompresi: Teknik ini memungkinkan decoding terbatas yang lebih cepat untuk keluaran terstruktur. Sistem yang ada hanya mengikuti batasan untuk token berikutnya, sehingga dapat memecahkan kode satu token dalam satu waktu. Sebaliknya, SGLang menganalisis kendala dan membangun mesin keadaan terbatas terkompresi untuk mewakili kendala tersebut, mengompresi jalur multi-token menjadi jalur satu langkah bila memungkinkan, memungkinkan penguraian kode beberapa token sekaligus untuk kecepatan lebih cepat.
- Eksekusi Spekulatif API: Untuk model khusus API seperti GPT-4 OpenAI, SGLang memperkenalkan eksekusi spekulatif API untuk mengoptimalkan program multi-panggilan.
Dengan menggunakan SGLang, berbagai aplikasi LLM diimplementasikan, termasuk kontrol agen, penalaran logis, tolok ukur pembelajaran beberapa langkah, decoding JSON, saluran pembuatan augmented pengambilan, obrolan multi-putaran, dan pemrosesan multi-modalitas. Performanya diuji pada model termasuk Llama-7B/70B, Mistral-8x7B, LLaVA-v1.5-7B (gambar), dan LLaVA-NeXT-34B (video) pada GPU NVIDIA A10G dan A100. Hasil eksperimen menunjukkan bahwa SGLang mencapai throughput hingga 6.4Ć lebih tinggi di berbagai beban kerja, model, dan pengaturan perangkat keras, dibandingkan dengan sistem pemrograman dan inferensi yang ada, termasuk Guidance, vLLM, dan LMQL.
SGLang: Model dan Metodologi Pemrograman
Model pemrograman SGLang diperkenalkan melalui contoh yang sedang berjalan, menjelaskan primitif bahasa dan mode eksekusi, dan menguraikan peluang optimasi runtime. Model ini menyederhanakan operasi yang membosankan dalam alur kerja multi-panggilan (misalnya, manipulasi string, pemanggilan API, spesifikasi batasan, paralelisme) dengan menyediakan primitif yang fleksibel dan dapat disusun. SGLang adalah bahasa khusus domain yang tertanam dalam Python. Gambar berikut menunjukkan program yang mengevaluasi esai tentang gambar menggunakan metode prompt pemecahan cabang.
Fungsi hakim_multi_dimensi mengambil tiga argumen: `s`, `jalur`, dan `esai`. s mengelola status prompt, jalur adalah jalur file gambar, dan esai adalah teks esai. String baru dan primitif SGLang dapat ditambahkan ke state untuk dieksekusi menggunakan += operator. Pertama, fungsi menambahkan gambar dan esai ke prompt. Kemudian memeriksa apakah esai terkait dengan gambar menggunakan pilih, menyimpan hasilnya s["terkait"]. Jika terkait, perintah tersebut dibagi menjadi tiga salinan untuk evaluasi paralel dari dimensi berbeda, menggunakan gen untuk menyimpan hasilnya f["penghakiman"]. Selanjutnya, ia menggabungkan penilaian, menghasilkan ringkasan, dan memberikan nilai huruf. Terakhir, ia mengembalikan hasil dalam format JSON, mengikuti skema yang ditentukan oleh batasan ekspresi reguler regex. SGLang sangat menyederhanakan program ini, karena program setara yang menggunakan antarmuka mirip API OpenAI akan membutuhkan 2.1Ć lebih banyak baris kode karena manipulasi string manual dan kontrol paralelisme.
SGLang menyediakan primitif untuk mengontrol status prompt, pembangkitan, dan paralelisme, yang dapat digunakan dengan sintaksis dan pustaka Python. Berikut ini primitifnya:
Genre: Memanggil model untuk menghasilkan dan menyimpan hasilnya dalam variabel dengan nama yang ditentukan dalam argumen pertamanya. Ini mendukung argumen `regex` untuk membatasi output agar mengikuti tata bahasa yang ditentukan oleh ekspresi reguler (misalnya, skema JSON).
- pilih: Memanggil model untuk memilih opsi dengan probabilitas tertinggi dari daftar.
- += atau perpanjang: Menambahkan string ke prompt.
- [nama_variabel]: Mengambil hasil suatu generasi.
- fork: Membuat percabangan paralel dari status prompt.
- join: Bergabung kembali dengan status prompt.
- gambar dan video: Menerima input gambar dan video.
Cara paling sederhana untuk mengeksekusi program SGLang adalah melalui interpreter, dimana prompt diperlakukan sebagai aliran asynchronous. Primitif seperti memperluas, gen, dan pilih dikirimkan ke aliran untuk eksekusi asinkron. Panggilan non-pemblokiran ini memungkinkan kode Python untuk terus berjalan tanpa menunggu pembuatannya selesai, mirip dengan meluncurkan kernel CUDA secara asinkron. Setiap prompt dikelola oleh pelaksana aliran di thread latar belakang, memungkinkan paralelisme intra-program. Pengambilan hasil pembuatan akan diblokir hingga siap, memastikan sinkronisasi yang benar. Alternatifnya, program SGLang dapat dikompilasi sebagai grafik komputasi dan dieksekusi dengan pelaksana grafik, sehingga memungkinkan optimasi lebih lanjut. Makalah ini menggunakan mode interpreter secara default dan membahas hasil mode compiler di Lampiran D. SGLang mendukung model bobot terbuka dengan SGLang Runtime (SRT) miliknya sendiri, serta model API seperti OpenAI dan model Antropik.
Sistem pemrograman untuk LLM dapat diklasifikasikan menjadi tingkat tinggi (misalnya LangChain, DSPy) dan tingkat rendah (misalnya LMQL, Guidance, SGLang). Sistem tingkat tinggi menyediakan perintah yang telah ditentukan sebelumnya atau dibuat secara otomatis, seperti pengoptimal perintah DSPy. Sistem tingkat rendah biasanya tidak mengubah perintah tetapi memungkinkan manipulasi langsung terhadap perintah dan primitif. SGLang adalah sistem tingkat rendah yang mirip dengan LMQL dan Guidance. Tabel berikut membandingkan fitur-fiturnya.
SGLang lebih berfokus pada efisiensi waktu proses dan hadir dengan waktu proses yang dirancang bersama, memungkinkan pengoptimalan baru. Bahasa tingkat tinggi (misalnya DSPy) dapat dikompilasi ke bahasa tingkat rendah (misalnya SGLang). Integrasi SGLang sebagai backend di DSPy untuk efisiensi runtime yang lebih baik akan ditunjukkan nanti.
Contoh di atas mengilustrasikan operasi RadixAttention dengan kebijakan penggusuran LRU di sembilan titik waktu, yang menampilkan evolusi dinamis pohon radix sebagai respons terhadap berbagai permintaan. Permintaan ini mencakup dua sesi obrolan, serangkaian pertanyaan pembelajaran singkat, dan pengambilan sampel konsistensi diri. Setiap tepi pohon membawa label yang menunjukkan substring atau rangkaian token. Node diberi kode warna untuk mencerminkan keadaan yang berbeda: hijau untuk node yang baru ditambahkan, biru untuk node cache yang diakses selama titik waktu tersebut, dan merah untuk node yang telah dikeluarkan.
Langkah 1: Pohon radix awalnya kosong.
Langkah 2: Server memproses pesan pengguna yang masuk āHaloā dan merespons dengan output LLM āHaiā. Perintah sistem āAnda adalah asisten yang sangat membantuā, pesan pengguna āHalo!ā, dan balasan LLM āHai!ā dikonsolidasikan ke dalam pohon sebagai satu sisi yang terhubung ke node baru.
Langkah 3: Prompt baru tiba, dan server menemukan awalan prompt (yaitu, putaran pertama percakapan) di pohon radix dan menggunakan kembali cache KV-nya. Giliran baru ditambahkan ke pohon sebagai simpul baru.
Langkah 4: Sesi obrolan baru dimulai. Node dari Langkah 3 dibagi menjadi dua node untuk memungkinkan dua sesi obrolan berbagi prompt sistem.
Langkah 5: Sesi obrolan kedua berlanjut. Namun, karena keterbatasan memori, node dari Langkah 4 harus dikeluarkan. Giliran baru ditambahkan setelah simpul yang tersisa dari Langkah 4.
Langkah 6: Server menerima beberapa permintaan pembelajaran, memprosesnya, dan memasukkannya ke dalam pohon. Node akar terpecah karena kueri baru tidak berbagi awalan apa pun dengan node yang sudah ada.
Langkah 7: Server menerima sejumlah kueri pembelajaran beberapa langkah tambahan. Kueri ini berbagi kumpulan contoh beberapa contoh yang sama, sehingga simpul dari Langkah 6 dipisahkan untuk memungkinkan berbagi.
Langkah 8: Server menerima pesan baru dari sesi obrolan pertama. Ini akan menghapus semua node dari sesi obrolan kedua karena node tersebut terakhir digunakan.
Langkah 9: Server menerima permintaan untuk mengambil sampel lebih banyak jawaban untuk pertanyaan-pertanyaan dalam sebuah node dari Langkah 8, kemungkinan besar untuk permintaan konsistensi diri. Untuk memberi ruang bagi permintaan ini, beberapa node dikeluarkan.
Contoh ini menunjukkan bagaimana RadixAttention menangani alokasi dinamis dan pengusiran node sebagai respons terhadap berbagai jenis permintaan, memastikan penggunaan kembali cache KV dan manajemen memori yang efisien.
SGLang: Evaluasi dan Hasil
Hasil Model Open-Weight
Hasil latensi dan throughput ditunjukkan pada gambar berikut. SGLang meningkatkan throughput hingga 6.4Ć dan mengurangi latensi hingga 3.7Ć. Peningkatan ini dihasilkan dari penggunaan kembali cache KV, eksploitasi paralelisme dalam satu program, dan decoding terbatas yang lebih cepat.
Pada tolok ukur ini, tingkat cache hit berkisar antara 50% hingga 99%. Gambar 13 (Lampiran) mencantumkan tingkat cache hit yang dicapai dan optimal untuk semuanya, menunjukkan bahwa penjadwalan cache-aware SGLang rata-rata mendekati 96% dari tingkat hit optimal.
Hasil pada Model Lebih Besar dengan Paralelisme Tensor
Model yang lebih besar, Mixtral-8x7B dan Llama-70B, diuji dengan paralelisme tensor pada serangkaian tolok ukur yang sama, dan hasilnya dilaporkan pada gambar berikut. Percepatan pada model yang lebih besar menunjukkan tren serupa dengan yang diamati pada model yang lebih kecil, yang menunjukkan bahwa pengoptimalan SGLang dapat digeneralisasikan dengan baik pada model yang lebih besar. Panduan dan LMQL dihilangkan karena kurangnya implementasi paralelisme tensor yang efisien.
Hasil Model Multi-Modal
SGLang memiliki dukungan asli untuk model multi-modal dengan gambar dan video primitif. Optimasi dalam makalah ini kompatibel dengan model multi-modal. Untuk RadixAttention, hash dari gambar masukan dihitung dan digunakan sebagai kunci di pohon radix, sehingga memungkinkan penggunaan kembali cache KV dari token gambar dari gambar yang sama. LLaVA-v1.5-7B (gambar) dijalankan di llava-bench-in-the-wild dan LLaVA-NeXT-34B (video) di ActivityNet. Karena model ini tidak didukung dengan baik oleh sistem dasar lainnya, implementasi asli penulis model dalam Hugging Face Transformers digunakan sebagai dasar. Seperti yang ditunjukkan dalam tabel berikut, SGLang memberikan throughput hingga 6Ć lebih tinggi pada tolok ukur ini. Di llava-bench-in-the-wild, beberapa pertanyaan tentang gambar yang sama ditangani, dan runtime SGLang menggunakan kembali cache KV dalam kasus ini.
penyebaran produksi
SGLang telah diterapkan di Chatbot Arena untuk melayani model open-weight. Karena lalu lintas yang rendah untuk beberapa model, hanya satu pekerja SGLang yang melayani masing-masing model. Setelah satu bulan, tingkat hit cache RadixAttention sebesar 52.4% untuk LLaVA-Next-34B dan 74.1% untuk Vicuna-33B diamati. Cache hit berasal dari pesan sistem yang umum, contoh gambar yang sering digunakan kembali, dan riwayat obrolan multi-turn. Hal ini mengurangi latensi token pertama rata-rata 1.7Ć untuk Vicuna-33B.
Final Thoughts
Pada artikel ini, kita telah membahas tentang SGLang, sebuah sistem yang baru diperkenalkan, yang bertujuan untuk mengatasi hal ini dengan menyediakan eksekusi yang efisien dari program model bahasa yang kompleks. SGLang terdiri dari bahasa frontend dan runtime. Frontend menyederhanakan pemrograman dengan primitif untuk pembangkitan dan kontrol paralelisme, sementara runtime mempercepat eksekusi melalui optimalisasi baru seperti RadixAttention untuk penggunaan kembali cache KV dan mesin status terbatas terkompresi untuk decoding keluaran terstruktur yang lebih cepat. Eksperimen menunjukkan bahwa SGLang mencapai throughput hingga 6.4Ć lebih tinggi dibandingkan dengan sistem inferensi canggih pada berbagai model bahasa dan multimodal yang besar, menangani tugas-tugas seperti kontrol agen, penalaran logis, tolok ukur pembelajaran beberapa langkah, decoding JSON, pengambilan -jaringan pipa generasi tambahan, dan obrolan multi-putaran.