TensorFlow Lite telah menjadi alat yang ampuh untuk machine learning di perangkat sejak dirilis pada 2017, dan MediaPipe semakin memperkuat kemampuannya pada 2019 dengan mendukung pipeline ML komplet. Meskipun alat ini awalnya berfokus pada model di perangkat yang lebih kecil, hari ini menandai perubahan dramatis dengan hadirnya MediaPipe LLM Inference API eksperimental.
Rilis baru ini memungkinkan Model Bahasa Besar (LLM) berjalan sepenuhnya di perangkat pada berbagai platform. Kemampuan baru ini sangat transformatif mengingat kebutuhan memori dan komputasi LLM yang lebih dari seratus kali lipat lebih besar daripada model di perangkat tradisional. Pengoptimalan seluruh stack di perangkat memungkinkan hal ini, termasuk operasi baru, kuantisasi, caching, dan pembagian beban.
MediaPipe LLM Inference API lintas platform eksperimental, dirancang untuk menyederhanakan integrasi LLM di perangkat untuk developer web, mendukung Web, Android, dan iOS dengan dukungan awal untuk empat LLM yang tersedia secara terbuka: Gemma, Phi 2, Falcon, dan Stable LM. API ini memberikan fleksibilitas bagi peneliti dan developer untuk membuat prototipe dan menguji model LLM populer yang tersedia secara terbuka di perangkat.
Di Android, MediaPipe LLM Inference API hanya ditujukan untuk penggunaan eksperimental dan penelitian. Aplikasi produksi dengan LLM bisa menggunakan Gemini API atau Gemini Nano di perangkat melalui Android AICore. AICore adalah kemampuan level sistem baru yang diperkenalkan di Android 14 untuk memberikan solusi berteknologi Gemini untuk perangkat kelas atas, termasuk integrasi dengan akselerator ML terbaru, adapter LoRA yang dioptimalkan untuk berbagai kasus penggunaan, dan filter keamanan. Untuk mulai menggunakan Gemini Nano di perangkat dengan aplikasi Anda, daftar ke Pratinjau Akses Awal.
Mulai hari ini, Anda bisa menguji MediaPipe LLM Inference API melalui demo web kami atau dengan membangun aplikasi demo contoh kami. Anda dapat bereksperimen dan mengintegrasikannya ke dalam project melalui Web, Android, atau SDK iOS kami.
Penggunaan LLM Inference API memungkinkan Anda menghadirkan LLM di perangkat hanya dalam beberapa langkah. Langkah-langkah ini berlaku di web, iOS, dan Android, meskipun SDK dan API native akan berbeda untuk setiap platform. Contoh kode berikut menunjukkan SDK web.
2. Konversi beban model ke dalam TensorFlow Lite Flatbuffer menggunakan MediaPipe Python Package
from mediapipe.tasks.python.genai import converter
config = converter.ConversionConfig(...)
converter.convert_checkpoint(config)
3. Masukkan LLM Inference SDK ke dalam aplikasi Anda
import { FilesetResolver, LlmInference } from "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai”
4. Host TensorFlow Lite Flatbuffer bersama dengan aplikasi Anda.
5. Gunakan LLM Inference API untuk mengambil prompt teks dan mendapatkan respons teks dari model Anda
const fileset = await FilesetResolver.forGenAiTasks("https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai/wasm");
const llmInference = await LlmInference.createFromModelPath(fileset, “model.bin”);
const responseText = await llmInference.generateResponse("Hello, nice to meet you");
document.getElementById('output').textContent = responseText;
Silakan lihat dokumentasi dan contoh kode kami untuk mendapatkan panduan terperinci tentang setiap langkah ini.
Berikut adalah gif real time dari Gemma 2B yang berjalan melalui MediaPipe LLM Inference API.
Rilis awal kami mendukung empat arsitektur model. Semua beban model yang kompatibel dengan arsitektur ini akan bekerja dengan LLM Inference API. Gunakan beban model dasar, gunakan versi beban yang telah disesuaikan komunitas, atau sesuaikan beban menggunakan data Anda sendiri.
Melalui pengoptimalan yang signifikan, beberapa di antaranya dijelaskan di bawah ini, MediaPipe LLM Inference API mampu menghadirkan latensi tercanggih di perangkat, berfokus pada CPU dan GPU untuk mendukung berbagai platform. Untuk performa yang stabil dalam lingkungan produksi pada ponsel premium terbaik, Android AICore bisa memanfaatkan akselerator neural khusus hardware.
Ketika mengukur latensi untuk LLM, ada beberapa istilah dan pengukuran yang perlu diperhatikan. Waktu ke Token Pertama dan Kecepatan Dekode adalah hal terpenting karena keduanya mengukur seberapa cepat Anda memulai respons dan seberapa cepat respons dibuat setelah dimulai.
Kecepatan Prefill dan Kecepatan Dekode tergantung pada model, hardware, dan token maksimal. Mereka juga bisa berubah tergantung beban perangkat saat ini.
Kecepatan berikut ini diambil pada perangkat kelas atas yang menggunakan token maksimal 1280 token, prompt input 1024 token, dan kuantisasi beban int8. Pengecualiannya adalah Gemma 2B (int4), ditemukan di sini di Kaggle, yang menggunakan kuantisasi beban 4/8-bit campuran.
Untuk mencapai angka performa di atas, pengoptimalan yang tak terhitung jumlahnya dilakukan di MediaPipe, TensorFlow Lite, XNNPack (library operator neural network CPU), dan runtime yang diakselerasi GPU. Berikut adalah beberapa optimalisasi terbaik yang menghasilkan peningkatan performa yang signifikan.
Pembagian Beban: Proses inferensi LLM terdiri dari 2 fase: fase prefill dan fase dekode. Secara tradisional, pengaturan ini membutuhkan 2 konteks inferensi yang terpisah, masing-masing mengelola sumber daya secara independen untuk model ML yang sesuai. Mengingat kebutuhan memori LLM, kami telah menambahkan fitur yang memungkinkan pembagian beban dan cache KV di seluruh konteks inferensi. Meskipun berbagi beban mungkin terlihat mudah, ini memiliki implikasi performa yang signifikan ketika membagikan antara operasi yang terikat pada komputasi dan operasi yang terikat pada memori. Dalam skenario inferensi ML tertentu, ketika beban tidak dibagikan dengan operator lain, mereka dikonfigurasi dengan cermat untuk setiap operator yang terhubung penuh secara terpisah untuk memastikan performa yang optimal. Berbagi beban dengan operator lain menunjukkan berkurangnya pengoptimalan per-operator dan ini mengharuskan pembuatan implementasi kernel baru yang dapat berjalan secara efisien bahkan pada beban yang kurang optimal.
Operasi Terhubung Penuh yang Dioptimalkan: Operasi FULLY_CONNECTED XNNPack telah melakukan dua pengoptimalan yang signifikan untuk inferensi LLM. Pertama, kuantisasi rentang dinamis dengan mulus menggabungkan manfaat komputasi dan memori dari kuantisasi integer penuh dengan keunggulan presisi inferensi floating point. Pemanfaatan beban int8/int4 tidak hanya meningkatkan throughput memori tetapi juga menghasilkan performa yang luar biasa, terutama dengan in-register decoding yang efisien untuk beban 4-bit yang hanya membutuhkan satu instruksi tambahan. Kedua, kami secara aktif memanfaatkan instruksi I8MM dalam CPU ARM v9 yang memungkinkan perkalian matriks int8 2x8 dengan matriks int8 8x2 dalam satu instruksi, sehingga menghasilkan kecepatan dua kali lipat dari implementasi berbasis produk NEON dot.
Menyeimbangkan Komputasi dan Memori: Setelah membuat profil inferensi LLM, kami mengidentifikasi batasan yang berbeda untuk kedua fase: fase prefill menghadapi batasan yang disebabkan oleh kapasitas komputasi, sedangkan fase dekode terkendala oleh bandwidth memori. Akibatnya, setiap fase menggunakan strategi yang berbeda untuk dekuantisasi beban int8/int4 yang digunakan bersama. Pada fase prefill, setiap operator konvolusi terlebih dahulu melakukan dekuantisasi beban menjadi nilai floating point sebelum komputasi utama, memastikan performa optimal untuk konvolusi yang intensif secara komputasi. Sebaliknya, fase dekode meminimalkan bandwidth memori dengan menambahkan komputasi dekuantisasi ke operasi konvolusi matematis utama.
Operator Khusus: Untuk inferensi LLM yang diakselerasi GPU di perangkat, kami sangat mengandalkan operasi khusus untuk mengurangi ketidakefisienan yang disebabkan oleh banyak shader kecil. Operasi khusus ini memungkinkan penggabungan operator khusus dan berbagai parameter LLM seperti ID token, ukuran patch urutan, parameter pengambilan sampel, untuk dikemas ke dalam tensor kustom khusus yang sebagian besar digunakan dalam operasi khusus ini.
Dinamisme Semu: Dalam blok perhatian, kami menemukan operasi dinamis yang meningkat seiring berjalannya waktu saat konteksnya bertambah. Karena runtime GPU kami tidak mendukung operasi/tensor dinamis, kami memilih operasi tetap dengan ukuran cache maksimum yang telah ditetapkan sebelumnya. Untuk mengurangi kompleksitas komputasi, kami memperkenalkan parameter yang memungkinkan melewati perhitungan nilai tertentu atau pemrosesan data yang dikurangi.
Tata Letak Cache KV yang Dioptimalkan: Karena entri dalam cache KV pada akhirnya berfungsi sebagai beban untuk konvolusi, yang digunakan sebagai pengganti perkalian matriks, kami menyimpannya dalam tata letak khusus yang disesuaikan untuk beban konvolusi. Penyesuaian strategis ini menghilangkan keharusan untuk melakukan konversi ekstra atau ketergantungan pada tata letak yang tidak dioptimalkan, dan oleh karena itu berkontribusi pada proses yang lebih efisien dan efektif.
Kami sangat senang dengan pengoptimalan dan performa dalam rilis eksperimental MediaPipe LLM Inference API hari ini. Ini hanyalah permulaan. Pada 2024, kami akan memperluas ke lebih banyak platform dan model, menawarkan alat konversi yang lebih luas, komponen bebas biaya di perangkat, tugas tingkat tinggi, dan lainnya.
Anda bisa melihat contoh resmi di GitHub yang mendemonstrasikan semua hal yang baru saja Anda pelajari dan membaca dokumentasi resmi kami untuk mengetahui detail selengkapnya. Pantau terus saluran YouTube Google for Developers untuk mendapatkan informasi dan tutorial terbaru.
Kami ingin mengucapkan terima kasih kepada semua anggota tim yang telah berkontribusi dalam pekerjaan ini: T.J. Alumbaugh, Alek Andreev, Frank Ban, Jeanine Banks, Frank Barchard, Pulkit Bhuwalka, Buck Bourdon, Maxime Brénon, Chuo-Ling Chang, Lin Chen, Linkun Chen, Yu-hui Chen, Nikolai Chinaev, Clark Duvall, Rosário Fernandes, Mig Gerard, Matthias Grundmann, Ayush Gupta, Mohammadreza Heydary, Ekaterina Ignasheva, Ram Iyengar, Grant Jensen, Alex Kanaukou, Prianka Liz Kariat, Alan Kelly, Kathleen Kenealy, Ho Ko, Sachin Kotwani, Andrei Kulik, Yi-Chun Kuo, Khanh LeViet, Yang Lu, Lalit Singh Manral, Tyler Mullen, Karthik Raveendran, Raman Sarokin, Sebastian Schmidt, Kris Tonthat, Lu Wang, Zoe Wang, Tris Warkentin, Geng Yan, Tenghui Zhu, dan tim Gemma.