Model bahasa besar (LLM) seperti Gemma sangat kuat dan serbaguna. Mereka bisa menerjemahkan bahasa, menulis berbagai jenis isi teks, dan menjawab pertanyaan Anda secara informatif. Namun, men-deploy LLM ini ke dalam produksi, terutama untuk kasus penggunaan streaming, merupakan tantangan yang signifikan.
Postingan blog ini akan mengeksplorasi cara menggunakan dua alat canggih, vLLM dan Dataflow, untuk men-deploy LLM secara efisien dalam skala besar dengan kode minimal. Pertama, kami akan menjelaskan cara vLLM menggunakan continuous batching untuk menyalurkan LLM dengan lebih efisien. Kedua, kami akan menjelaskan cara pengelola model Dataflow membuat penerapan vLLM dan framework model besar lainnya menjadi mudah.
vLLM adalah library open source yang dirancang khusus untuk inferensi LLM dengan throughput tinggi dan latensi rendah. Ia mengoptimalkan penyajian LLM dengan menggunakan beberapa teknik khusus, termasuk continuous batching.
Untuk memahami cara kerja continuous batching, pertama-tama mari kita lihat cara model tradisional melakukan batch input. GPU unggul dalam pemrosesan paralel, di mana beberapa komputasi dilakukan secara bersamaan. Batching memungkinkan GPU memanfaatkan semua core yang tersedia untuk mengerjakan seluruh batch data sekaligus, alih-alih memproses setiap input satu per satu. Ini secara signifikan mempercepat proses inferensi; sering kali, melakukan inferensi pada 8 rekaman input sekaligus menggunakan resource yang sama dengan melakukan inferensi pada satu rekaman.
Anda bisa mengibaratkan batching mirip dengan dapur restoran: alih-alih menyiapkan setiap hidangan satu per satu, koki bisa mengelompokkan pesanan yang serupa dan memasaknya bersama-sama, sehingga menghemat waktu dan sumber daya. Jika Anda memiliki 8 kompor, dibutuhkan waktu dan tenaga yang hampir sama untuk membuat satu telur dadar atau 8 telur dadar.
Namun, ada beberapa kelemahan dari metode batching tradisional. Yang paling krusial dalam konteks ini, batching tidak bekerja dengan baik ketika dibutuhkan waktu yang berbeda untuk melakukan inferensi. Karena sebagian besar framework tidak memiliki akses atau pengetahuan tentang mekanisme mendasar untuk melakukan inferensi, mereka biasanya hanya menunggu semua permintaan diselesaikan sebelum mengambil batch baru. Ini berarti bahwa satu rekaman lambat bisa memakai seluruh kapasitas GPU meskipun rekaman lain dalam batch tersebut telah selesai, yang menyebabkan tugas menjadi lebih lambat dan berbiaya tinggi.
Ketika menjalankan inferensi dengan Model Bahasa Besar (LLM), menunggu seluruh batch selesai dapat menjadi sangat lambat dan mahal. Ini karena jumlah waktu yang diperlukan untuk menghasilkan inferensi untuk sebuah rekaman memiliki korelasi 1:1 dengan panjang rekaman. Sebagai contoh, bayangkan bila kita membuat batch 2 permintaan berikut ini ke LLM:
2. Apa saja perbedaan dan persamaan budaya antara Meksiko dan Amerika Serikat?
Kita mengharapkan jawaban singkat untuk pertanyaan (1) dan jawaban panjang untuk pertanyaan (2). Namun, karena dibutuhkan waktu lebih lama untuk menjawab pertanyaan (2), kita harus menunggu pertanyaan tersebut selesai sementara ia memonopoli GPU sebelum kita dapat menampilkan hasil dari batch.
Continuous batching memungkinkan vLLM mengupdate batch ketika permintaan masih berjalan. Hal ini dilakukan dengan memanfaatkan cara LLM melakukan inferensi: proses looping yang berulang kali menghasilkan token berikutnya dalam respons mereka. Jadi sebenarnya, ketika menghasilkan kalimat "Ibu kota Meksiko adalah Mexico City", kita menjalankan inferensi sebanyak 7 kali (satu kali per kata output). Alih-alih mengelompokkan input satu kali, teknik continuous batching vLLM memungkinkannya mengomputasi ulang batch setiap kali LLM berjalan menghasilkan seperangkat token untuk sebuah batch. Ia bisa menambahkan permintaan ke batch dengan cepat dan menampilkan hasil awal ketika satu rekaman dari batch sudah selesai.
Batching dinamis vLLM dan pengoptimalan lainnya telah terbukti meningkatkan throughput inferensi sebesar 2-4x untuk LLM populer dalam beberapa kasus, menjadikannya alat yang sangat berguna untuk penyajian model. Untuk informasi selengkapnya tentang vLLM, lihat info produk ini.
Men-deploy instance vLLM dalam pipeline streaming tidaklah mudah. Secara tradisional, Anda harus melakukan ini:
Ini melibatkan banyak multipemrosesan, yang mungkin memakan waktu, rentan error, dan membutuhkan keahlian khusus. Ia juga membutuhkan pemahaman yang mendalam tentang topologi yang mendasarinya. Topologi ini sering kali juga bisa berubah jika Anda ingin mencoba konfigurasi mesin yang berbeda (misalnya untuk membandingkan performa pada mesin 8 core dan mesin 16 core).
Untungnya, Dataflow menyederhanakan proses ini dengan pengelola model. Fitur ini menyederhanakan kompleksitas pengelolaan dan penerapan model dalam pipeline. Secara default, Dataflow menyediakan satu proses worker per core yang tersedia pada mesin worker-nya. Proses-proses ini bertanggung jawab untuk menangani I/O masuk dan keluar dari worker serta setiap transformasi yang dilakukan pada data, dan mereka beroperasi sepenuhnya secara independen. Untuk sebagian besar pipeline, termasuk pipeline persiapan data untuk kasus penggunaan ML, ini adalah topologi yang optimal.
Namun, hal ini tidak berlaku untuk pipeline yang harus menyalurkan model-model besar seperti salah satu model Gemma. Tidaklah efisien dari segi biaya maupun performa untuk memuat salinan model besar ke dalam setiap proses karena pipeline kemungkinan besar akan mengalami masalah kehabisan memori. Topologi yang ideal untuk kebanyakan pipeline seperti itu adalah memuat hanya satu salinan model besar.
Pengelola model Dataflow dibangun agar pengguna dapat mengontrol secara tepat jumlah salinan model yang di-deploy dalam pipeline mereka, terlepas dari topologi jaringan. Ketika Anda menerapkan transformasi RunInference, Dataflow bisa memahami intent sehingga dapat membuat topologi yang ideal untuk pipeline Anda dan men-deploy jumlah model dengan optimal. Yang perlu Anda lakukan hanyalah menyediakan beberapa parameter konfigurasi.
Ketika menggunakan vLLM, alih-alih memuat model, pengelola model Dataflow akan menjalankan sebuah instance vLLM dalam proses inferensi khusus. Proses worker kemudian bisa secara efisien mengirim rekaman ke instance ini untuk inferensi.
Pengelola model ini memungkinkan Dataflow memanfaatkan sepenuhnya continuous batching vLLM; ketika worker menerima permintaan masuk, ia secara asinkron menambahkannya ke antrean permintaan vLLM dan menunggu respons, sehingga vLLM bisa secara dinamis membuat batch permintaan sebanyak mungkin.
Pengelola model Dataflow dan transformasi RunInference memudahkan pengintegrasian vLLM ke dalam pipeline Anda. Anda hanya perlu menentukan sejumlah detail konfigurasi dan beberapa baris kode. Karena Dataflow dapat memahami intent dasar, ia mengonfigurasi seluruh topologi pipeline untuk Anda. Dalam 5 baris kode, Anda bisa menulis pipeline secara menyeluruh untuk membaca data, menjalankannya melalui vLLM, dan mengeluarkan output ke sink.
model_handler = VLLMCompletionsModelHandler('google/gemma-2b')
with beam.Pipeline() as p:
_ = (p | beam.ReadFromSource(<config>)
| RunInference(model_handler) # Send the prompts to vLLM and get responses.
| beam.WriteToSink(<config>))
Anda bisa menemukan pipeline lengkap dan menjalankannya sendiri di sini: https://cloud.google.com/dataflow/docs/notebooks/run_inference_vllm
vLLM secara signifikan meningkatkan performa inferensi LLM dalam pipeline Dataflow. Untuk membandingkan performa vLLM dengan pipeline sederhana yang menggunakan batch berukuran tetap, kami menjalankan 2 pipeline dengan satu worker dengan GPU T4. Setiap pipeline membaca prompt dari set data P3, menjalankannya terhadap model google/gemma-2b, dan mencatat hasilnya.
Saat menggunakan strategi batching sederhana (default), dibutuhkan waktu 59,137 jam vCPU untuk memproses 10.000 prompt. Saat menggunakan vLLM dengan continuous batching, hanya dibutuhkan 2,481 jam vCPU untuk memproses 10.000 prompt yang sama. Ini merupakan peningkatan lebih dari 23x lipat!
Ada beberapa catatan di sini: secara khusus, tidak dilakukan penyetelan pada kedua pipeline, dan pipeline sederhana kemungkinan akan berkinerja jauh lebih baik jika disetel untuk menggunakan batch yang lebih besar atau seragam. Dengan demikian, itulah bagian dari keajaiban vLLM; dengan kurang dari 20 baris kode dan tanpa penyetelan, kami mampu menghasilkan pipeline penyajian LLM yang berkinerja tinggi! Jika kita ingin membandingkan model lain, kita bisa melakukannya secara cepat dengan mengubah satu string dalam pengendali model kita!
Dengan menggabungkan kekuatan vLLM dan Dataflow, Anda bisa men-deploy dan menskalakan LLM secara efisien untuk aplikasi streaming dengan mudah. Untuk mempelajari lebih lanjut tentang cara melakukan hal ini, cobalah membaca notebook contoh ini: https://cloud.google.com/dataflow/docs/notebooks/run_inference_vllm.
Untuk mempelajari lebih lanjut tentang model Gemma dan beberapa hal yang bisa Anda lakukan dengan model tersebut, lihat dokumen Gemma: https://ai.google.dev/gemma/docs
Untuk mempelajari lebih lanjut tentang vLLM dan beberapa mekanisme lain yang digunakannya untuk mengoptimalkan penyajian, kunjungi dokumen vLLM: https://docs.vllm.ai/en/latest/