Model Bahasa Besar di Perangkat dengan MediaPipe dan TensorFlow Lite

MAR 07, 2024
Mark Sherwood Senior Product Manager
Juhyun Lee Staff Software Engineer

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.

LLM Inference API

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.

  1. Pilih beban model yang kompatibel dengan salah satu arsitektur model yang didukung

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.

Moving image of Gemma 2B running on-device in browser via the MediaPipe LLM Inference API
Gemma 2B berjalan di perangkat pada browser melalui MediaPipe LLM Inference API
Moving image of Gemma 2B running on-device on iOS (left) and Android (right) via the MediaPipe LLM Inference API
Gemma 2B berjalan di perangkat iOS (kiri) dan Android (kanan) melalui MediaPipe LLM Inference API

Model

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.

Table showing model and parameter size across the four model architectures - Falcon 1B, Gemma 2B, Phi 2 and Stable LM 3B

Performa Model

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.

Table showing latency measurements for model performance

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.


Tolok ukur

Graph of prefill performance in tokens per second
Graph of decode performance in tokens per second
Pada GPU, Falcon 1B dan Phi 2 menggunakan aktivasi fp32, sedangkan Gemma dan StableLM 3B menggunakan aktivasi fp16 karena model yang terakhir ini menunjukkan ketahanan yang lebih besar terhadap kehilangan presisi menurut studi evaluasi kualitas kami. Tipe data aktivasi bit terendah yang mempertahankan kualitas model dipilih untuk setiap model. Perhatikan bahwa Gemma 2B (int4) adalah satu-satunya model yang bisa kami jalankan di iOS karena keterbatasan memorinya, dan kami juga sedang berupaya untuk mengaktifkan model-model lainnya di iOS.

Pengoptimalan Performa

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.

Flowchart showing compute-intensive prefill phase and memory-intensive decode phase, highlighting difference in performance bottlenecks

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.



Apa yang Berikutnya

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.



Ucapan Terima kasih

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.