Antarmuka Pengendali Kecerdasan Buatan (AICI) memungkinkan Anda membangun pengontrol yang membatasi dan mengarahkan output dari model bahasa besar (LLM) secara real time. Pengontrol adalah program fleksibel yang mampu menerapkan decoding terbatas, pengeditan dinamis dari prompt dan teks yang dihasilkan, dan mengoordinasikan eksekusi di beberapa generasi paralel. Pengontrol menggabungkan logika khusus selama decoding token-by-token dan mempertahankan keadaan selama permintaan LLM. Hal ini memungkinkan strategi pengontrol yang beragam, dari decoding berbasis terprogram atau kueri hingga percakapan multi-agen untuk mengeksekusi secara efisien dalam integrasi yang ketat dengan LLM itu sendiri.
Tujuan AICI adalah untuk memudahkan untuk membangun dan bereksperimen dengan strategi pengontrol yang ada dan sepenuhnya baru untuk meningkatkan generasi LLM. Dengan mengabstraksi detail implementasi dari inferensi LLM yang mendasari dan mesin penyajian, AICI bertujuan untuk menyederhanakan pengembangan pengontrol, membuatnya lebih mudah untuk menulis pengontrol cepat, dan memudahkan kompatibilitas di seluruh inferensi LLM dan mesin penyajian.
AICI dirancang untuk eksekusi lokal dan cloud, termasuk (akhirnya) penyebaran LLM multi-tenant. Pengontrol diimplementasikan sebagai modul WebAssembly (WASS) ringan yang berjalan pada mesin yang sama dengan mesin inferensi LLM, memanfaatkan CPU sementara GPU sibuk dengan generasi token. Aici adalah satu lapisan dalam tumpukan inferensi, dan dirancang untuk memungkinkan perpustakaan kontrol seperti panduan, LMQL, dan lainnya untuk berjalan di atasnya dan mendapatkan peningkatan efisiensi dan kinerja, serta portabilitas di seluruh inferensi LLM dan mesin sajian.
AICI saat ini terintegrasi dengan LLAMA.CPP, HuggingFace Transformers, dan RLLM (mesin inferensi LLM berbasis TCH), dengan VLLM dalam karya.
Aici adalah:
Aici adalah prototipe, dirancang dan dibangun di Microsoft Research.
Di quickstart ini, kami akan memandu Anda melalui langkah -langkah berikut:
Untuk mengkompilasi komponen AICI, Anda perlu mengatur lingkungan pengembangan Anda untuk karat. Untuk QuickStart ini, Anda juga memerlukan Python 3.11 atau lebih baru untuk membuat pengontrol.
Catatan
Pengguna Windows : Silakan gunakan WSL2 atau DevContainer yang disertakan. Menambahkan dukungan Windows asli dilacak di sini.
Pengguna MacOS : Pastikan Anda memiliki alat baris perintah XCODE yang diinstal dengan menjalankan xcode-select -p dan, jika tidak diinstal, jalankan xcode-select --install .
CUDA : Build Cuda bergantung pada instalasi libtorch tertentu. Sangat disarankan Anda menggunakan DevContainer yang disertakan.
Jika Anda menggunakan DevContainer, Anda dapat melompat ke bagian berikutnya.
Menggunakan System Package Manager, instal alat yang diperlukan untuk membangun kode di repositori, termasuk git , cmake dan ccache .
Misalnya di WSL / Ubuntu menggunakan apt :
sudo apt-get install --assume-yes --no-install-recommends
build-essential cmake ccache pkg-config libssl-dev libclang-dev clang llvm-dev git-lfs
atau menggunakan homebrew di macOS:
brew install git cmake ccache
Kemudian pasang karat, karat dan kargo , mengikuti instruksi yang disediakan di sini dan di sini:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Setelah instalasi, verifikasi bahwa perintah rustup --version dapat diakses dengan menjalankannya dari terminal. Jika perintah tidak dikenali, coba buka sesi terminal baru.
Selanjutnya instal komponen karat WASM32-WASI:
rustup target add wasm32-wasi
Jika Anda sudah memasang karat, atau mendapatkan keluhan dari kargo tentang versi yang sudah ketinggalan zaman, jalankan:
rustup update
Terakhir, untuk bekerja dengan pengontrol dan skrip Python (seperti tutorial ini), jalankan perintah ini untuk menginstal paket yang diperlukan:
pip install pytest pytest-forked ujson posix_ipc numpy requests
Server RLLM memiliki dua backends, satu berdasarkan libtorch dan cuda ( rllm-cuda ), dan yang lainnya berdasarkan llama.cpp ( rllm-llamacpp ).
Backend rllm-cuda hanya bekerja dengan NVIDIA GPU dengan kemampuan menghitung 8.0 atau lebih baru (A100 dan yang lebih baru; RTX 30x0 dan yang lebih baru) dan membutuhkan pengaturan libtorch secara fiddly-sangat disarankan untuk menggunakan DevContainer yang disertakan. Sementara panduan ini berfokus pada backend rllm-llamacpp , langkah-langkah build adalah sama untuk rllm-cuda , modulo nama folder.
Setelah pengaturan Dev Env di atas, klon Repositori AICI dan lanjutkan dengan langkah -langkah berikutnya yang diuraikan di bawah ini.
Gunakan perintah berikut untuk membangun dan menjalankan aicirt dan rllm-llamacpp :
cd rllm/rllm-llamacpp
./server.sh phi2
Anda dapat meneruskan nama model lain sebagai argumen (run ./server.sh tanpa argumen untuk melihat model yang tersedia). Anda juga dapat menggunakan URL Huggingface ke .gguf file atau jalur lokal ke file .gguf . (Untuk rllm-cuda Gunakan ID Model HuggingFace atau Path to Folder).
./server.sh orca
Anda dapat menemukan detail lebih lanjut tentang rllm-llamacpp di sini.
Server RLLM menyediakan antarmuka HTTP, digunakan untuk tugas konfigurasi dan permintaan pemrosesan. Anda juga dapat menggunakan antarmuka ini untuk segera memverifikasi statusnya. Misalnya, jika Anda membuka http://127.0.0.1:4242/v1/models, Anda akan melihat:
{
"object" : " list " ,
"data" : [
{
"object" : " model " ,
"id" : " TheBloke/phi-2-GGUF " ,
"created" : 946810800 ,
"owned_by" : " owner "
}
]
}mengkonfirmasi bahwa model yang dipilih dimuat.
AICI memungkinkan hosting logika khusus, yang disebut pengontrol , yang memulai, mengakhiri, dan berinteraksi dengan generasi token LLMS. Pengontrol mengambil argumen input, memprosesnya, dan mengembalikan hasil dengan log, token LLM, dan variabel.
Repositori mencakup beberapa contoh, khususnya:
Dalam contoh ini kami akan menggunakan pyctrl untuk mengelola generasi token menggunakan skrip python sederhana. Jika Anda mau, Anda dapat membangun dan mengunggah pyctrl, namun secara default server akan secara otomatis mengunduh rilis terbaru PyCtrl dari GitHub.
Secara umum, pengontrol memerlukan pembangunan dan penempatan, sementara skrip (Python atau JavaScript) dikirim dengan setiap permintaan.
Berikut ini menggambarkan hubungan antara server RLLM, runtime AICI, dan pengontrol:
Erdiagram
Host ||-| {cpu: ""
Host ||-| {GPU: ""
CPU ||-|| "server rllm": mengeksekusi
CPU ||-| {"AICI Runtime": Execute
"Aici runtime" ||-|| "Controller": Instantiate
GPU ||-| {"LLM Token Generation": Execute
Misalkan kita bertujuan untuk membuat model untuk menghasilkan daftar, mematuhi format tertentu dan hanya berisi lima item.
Biasanya, mencapai ini melibatkan rekayasa yang cepat, membuat prompt dengan tepat dengan instruksi yang jelas, seperti:
What are the five most popular types of vehicles?
Return the result as a numbered list.
Do not add explanations, only the list.
Prompt juga akan bervariasi tergantung pada model yang digunakan, mengingat bahwa setiap model cenderung menambahkan penjelasan dan memahami instruksi dengan cara yang berbeda.
Dengan AICI, kami mengalihkan kontrol kembali ke kode, dan kami dapat menyederhanakan prompt untuk:
What are the most popular types of vehicles?
menggunakan kode untuk:
Mari kita buat file Python list-of-five.py dengan konten berikut:
import pyaici . server as aici
# Force the model to generate a well formatted list of 5 items, e.g.
# 1. name 1
# 2. name 2
# 3. name 3
# 4. name 4
# 5. name 5
async def main ():
# This is the prompt we want to run.
# Note how the prompt doesn't mention a number of vehicles or how to format the result.
prompt = "What are the most popular types of vehicles? n "
# Tell the model to generate the prompt string, ie. let's start with the prompt "to complete"
await aici . FixedTokens ( prompt )
# Store the current position in the token generation process
marker = aici . Label ()
for i in range ( 1 , 6 ):
# Tell the model to generate the list number
await aici . FixedTokens ( f" { i } ." )
# Wait for the model to generate a vehicle name and end with a new line
await aici . gen_text ( stop_at = " n " )
await aici . FixedTokens ( " n " )
# Store the tokens generated in a result variable
aici . set_var ( "result" , marker . text_since ())
aici . start ( main ())Menjalankan skrip tidak terlalu berbeda dengan mengirim prompt. Dalam hal ini, kami mengirimkan logika kontrol dan instruksi bersama -sama.
Untuk melihat hasil akhirnya, jalankan perintah berikut:
./aici.sh run list-of-five.py
Hasil:
Running with tagged AICI Controller: gh:microsoft/aici/pyctrl
[0]: FIXED 'What are the most popular types of vehicles?n'
[0]: FIXED '1.'
[0]: GEN ' Carsn'
[0]: FIXED '2.'
[0]: GEN ' Motorcyclesn'
[0]: FIXED '3.'
[0]: GEN ' Bicyclesn'
[0]: FIXED '4.'
[0]: GEN ' Trucksn'
[0]: FIXED '5.'
[0]: GEN ' Boatsn'
[0]: FIXED 'n'
[DONE]
[Response] What are the most popular types of vehicles?
1. Cars
2. Motorcycles
3. Bicycles
4. Trucks
5. Boats
response saved to tmp/response.json
Usage: {'sampled_tokens': 16, 'ff_tokens': 37, 'cost': 69}
Timing: {'http_response': 0.05193686485290527, 'data0': 0.05199289321899414, 'first_token': 0.0658726692199707, 'last_token': 0.1784682273864746}
Tokens/sec: {'prompt': 861.0913072488067, 'sampling': 89.65181217019571}
Storage: {'result': '1. Carsn2. Motorcyclesn3. Bicyclesn4. Trucksn5. Boatsnn'}
Repositori ini berisi sejumlah komponen, dan mana yang Anda butuhkan tergantung pada kasus penggunaan Anda.
Anda dapat menggunakan modul pengontrol yang ada . Kami menyediakan pyctrl dan jsctrl yang memungkinkan Anda pengontrol skrip menggunakan python dan javascript sisi server. Paket Pyaici berisi alat baris perintah aici yang memungkinkan Anda mengunggah dan menjalankan skrip dengan pengontrol apa pun (kami juga memberikan definisi API REST untuk penasaran).
? Spython Code Sampel untuk skrip Pyctrl dan JavaScript Hello World untuk JSCTRL
Kami mengantisipasi perpustakaan akan dibangun di atas pengontrol. Kami memberikan contoh di PromptLib - Perpustakaan Python sisi klien yang menghasilkan berinteraksi dengan DeclCtrl melalui paket Pyaici.
? Contoh notebook yang menggunakan promptlib untuk berinteraksi dengan declctrl.
Pengontrol dapat dijalankan di awan atau mesin inferensi LLM yang diaktifkan AICI lokal. Anda dapat menjalankan mesin referensi yang disediakan (RLLM) secara lokal dengan backend LIBTORCH+CUDA atau LLAMA.CPP.
Untuk mengembangkan pengontrol baru , gunakan proyek starter karat yang menunjukkan penggunaan perpustakaan AICI_ABI, yang menyederhanakan penerapan antarmuka AICI tingkat rendah.
? Kode contoh untuk pengontrol baru yang minim untuk Anda mulai
Untuk menambahkan dukungan AICI ke mesin inferensi LLM baru , Anda perlu menerapkan sisi LLM dari protokol yang berbicara dengan runtime AICI.
Akhirnya, Anda mungkin ingin memodifikasi salah satu komponen yang disediakan - PRS sangat disambut!
AICI Abstracts LLM Engine inferensi dari controller dan sebaliknya, seperti pada gambar di bawah ini. Node bulat aspiratif. Lapisan tambahan dapat dibangun di atas - kami menyediakan promptlib, tetapi kami sangat percaya bahwa panduan, LMQL, SGLANG, garis besar, JSONFORMER, LMFE, dll juga dapat berjalan di atas AICI (baik dengan pengontrol khusus atau menggunakan PyCTRL atau JSCTRL).
grafik td
Pyctrl-Aici-> Aicirt [Aici-Runtime]
JSCTRL -AICI -> AICIRT
Bimbingan ([Guidancectrl]) -AICI -> AICIRT
LMQL ([LMQL CTRL]) -AICI -> AICIRT
Aicirt -POSIX SHM -> RLLM
AICIRT -POSIX SHM -> llama [llama.cpp]
AICIRT -POSIX SHM -> PYAICI
Pyaci -Python -> Vllm (VLLM)
Pyaci -Python -> HF [HF Transformers]
Paket Pyaci memudahkan untuk mengintegrasikan AICI dengan mesin inferensi LLM berbasis Python. Lihatlah integrasi dengan Transformers Huggingface, meskipun perhatikan bahwa itu tidak mendukung Forking (generasi beberapa urutan secara paralel). Server VLLM REST saat ini ketinggalan zaman. Harap gunakan RLLM-Cuda atau RLLM-LLAMA.cpp untuk saat ini.
aicirt berjalan dalam proses yang terpisah, dan dapat berjalan di bawah pengguna yang berbeda dari mesin LLMaici_host_* , diimplementasikan di hostImpl.rsaicirt juga memperlihatkan antarmuka WAV sebagian; Namun hampir semua fungsi tidak ada op, kecuali untuk fd_write mana deskriptor file shims 1 dan 2 (stdout dan stderr) untuk mencetak pesan debugSecara khusus, modul WASS tidak dapat mengakses sistem file, jaringan, atau sumber daya lainnya. Mereka juga tidak dapat memutar utas atau mengakses timer apa pun (ini relevan untuk serangan Specter/Meltdown).
Sebagian besar perhitungan pada pengontrol AICI terjadi pada CPU, sejajar dengan generasi logit pada GPU. Generasi terjadi dalam langkah -langkah, di mana login dihasilkan secara paralel untuk token baru untuk setiap urutan dalam batch (biasanya antara 1 dan 50). Ini melibatkan membaca seluruh model dan cache KV untuk sekuens dalam batch dari memori GPU. Untuk throughput batch yang optimal, cache model dan KV harus memanfaatkan sebagian kecil dari memori GPU, dan membaca seluruh memori membutuhkan waktu sekitar 40ms pada A100 GPU (80GB).
Dengan demikian, setiap langkah generasi mengambil urutan 20-50 ms. Dengan rekayasa yang cermat, ini lebih dari cukup untuk menghitung set token yang diizinkan dalam karat yang dikompilasi untuk Wasm. Ini dapat digabungkan baik secara asli dalam karat, atau melalui Python atau penerjemah JavaScript yang kami berikan.
Misalnya, komputasi yang diizinkan ditetapkan dalam kosakata 32000-kuat dari model Llama mengambil:
Angka -angka di atas adalah untuk urutan tunggal, namun setiap urutan diproses dalam proses yang terpisah, dan dengan demikian jika ada lebih banyak core daripada sekuens (yang khas), mereka tidak berubah. Mereka juga memasukkan overhead panggilan ke Python Interpreter yang diimplementasikan dalam Wasm, dan kemudian kembali ke kode WASM yang dihasilkan karat untuk kendala itu sendiri. Mereka semua baik dalam anggaran 20-50ms, jadi jangan mempengaruhi waktu generasi sama sekali.
Ada juga beberapa overhead di jalur kritis pengambilan sampel. Itu turun ke sekitar 0,3 ms per generasi langkah ketika mengeksekusi 10 urutan paralel (ini terlepas dari kendala yang digunakan). Overhead naik menjadi sekitar 0,7ms untuk 40 urutan (meskipun belum sepenuhnya dioptimalkan).
WebAssembly dirancang untuk memiliki overhead minimal, dibandingkan dengan kode asli. Dalam pengalaman kami, kode karat yang sangat dioptimalkan kurang dari 2x lebih lambat saat dijalankan di Wasmtime daripada asli. Ini 10-100x lebih baik dari JavaScript atau Python.
Semua pengukuran yang dilakukan pada AMD EPYC 7V13 dengan NVIDIA A100 GPU dengan 80GB VRAM.
Antarmuka tingkat rendah yang disediakan AICI Runtime memungkinkan untuk:
Ini dapat digunakan dari bahasa apa pun yang dikompilasi ke Wasm.
Repositori ini menyediakan perpustakaan karat yang membuatnya mudah untuk mengimplementasikan pengontrol dalam karat, dan memberikan implementasi yang efisien dari kendala spesifik (ekspresi reguler, tata bahasa YACC, substring). Kami juga menyediakan penafsir Python dan JavaScript yang memungkinkan untuk merekatkan kendala ini bersama -sama. Semua ini dapat dengan mudah diperpanjang.
Jika Anda menemukan antarmuka pengontrol AI dan idenya untuk mendefinisikan lapisan baru di tumpukan inferensi LLM yang berguna, silakan kutip paket menggunakan referensi berikut:
Bibtex:
@misc { Moskal2024 ,
author = { Moskal, Michal and Musuvathi, Madan and {Ki ci man}, Emre } ,
title = { {AI Controller Interface} } ,
year = { 2024 } ,
publisher = { {GitHub} } ,
journal = { {GitHub} repository } ,
howpublished = { url{https://github.com/microsoft/aici/} }
}Proyek ini menyambut kontribusi dan saran. Sebagian besar kontribusi mengharuskan Anda untuk menyetujui perjanjian lisensi kontributor (CLA) yang menyatakan bahwa Anda memiliki hak untuk, dan benar -benar melakukannya, beri kami hak untuk menggunakan kontribusi Anda. Untuk detailnya, kunjungi https://cla.opensource.microsoft.com.
Saat Anda mengirimkan permintaan tarik, bot CLA akan secara otomatis menentukan apakah Anda perlu memberikan CLA dan menghiasi PR secara tepat (misalnya, pemeriksaan status, komentar). Cukup ikuti instruksi yang disediakan oleh bot. Anda hanya perlu melakukan ini sekali di semua repo menggunakan CLA kami.
Proyek ini telah mengadopsi kode perilaku open source Microsoft. Untuk informasi lebih lanjut, lihat FAQ Kode Perilaku atau hubungi [email protected] dengan pertanyaan atau komentar tambahan.
Proyek ini dapat berisi merek dagang atau logo untuk proyek, produk, atau layanan. Penggunaan resmi merek dagang atau logo Microsoft tunduk dan harus mengikuti pedoman merek dagang & merek Microsoft. Penggunaan merek dagang atau logo Microsoft dalam versi yang dimodifikasi dari proyek ini tidak boleh menyebabkan kebingungan atau menyiratkan sponsor Microsoft. Setiap penggunaan merek dagang atau logo pihak ketiga tunduk pada kebijakan pihak ketiga tersebut.