Model dan platform AI

Kerangka Inference Microsoft Membawa Model Bahasa Besar 1-Bit ke Perangkat Lokal

mm
Tambahkan Unite.AI ke sumber pilihan Anda di Google

Pada tanggal 17 Oktober 2024, Microsoft mengumumkan BitNet.cpp (MSFT ), sebuah kerangka inference yang dirancang untuk menjalankan Model Bahasa Besar (LLM) 1-bit kuantisasi. BitNet.cpp merupakan kemajuan signifikan dalam Gen AI, memungkinkan penerapan LLM 1-bit secara efisien pada CPU standar, tanpa memerlukan GPU mahal. Pengembangan ini mendemokratisasikan akses ke LLM, membuatnya tersedia pada berbagai perangkat dan memberikan kemungkinan baru dalam aplikasi AI pada perangkat.

Mengenal Model Bahasa Besar 1-Bit

Model Bahasa Besar (LLM) secara tradisional memerlukan sumber daya komputasi yang signifikan karena penggunaan angka floating-point presisi tinggi (biasanya FP16 atau BF16) untuk bobot model. Kebutuhan ini membuat penerapan LLM menjadi mahal dan intensif energi.

Pada intinya, LLM 1-bit menggunakan teknik kuantisasi ekstrem untuk merepresentasikan bobot model menggunakan hanya tiga nilai yang mungkin: -1, 0, dan 1, sehingga disebut “1,58-bit” (karena memerlukan sedikit lebih dari satu bit untuk mengkodekan tiga status).

Sistem Bobot Ternari

Konsep

Kuantisasi 1-bit dalam BitNet.cpp adalah sistem bobot ternari. BitNet bekerja dengan hanya tiga nilai yang mungkin untuk setiap parameter:

  • -1 (negatif)
  • 0 (netral)
  • 1 (positif)

Hal ini menghasilkan kebutuhan penyimpanan sekitar 1,58 bit per parameter, sehingga namanya BitNet b1.58. Pengurangan dramatis dalam lebar bit parameter ini mengarah pada pengurangan yang mengesankan dalam penggunaan memori dan kompleksitas komputasi, karena sebagian besar perkalian floating-point digantikan dengan penambahan dan pengurangan sederhana.

Dasar Matematika

Kuantisasi 1-bit melibatkan transformasi bobot dan aktivasi menjadi representasi ternari melalui langkah-langkah berikut:

1. Binarisasi Bobot

Membinarisasi bobot melibatkan memusatkan mereka di sekitar mean (α), menghasilkan representasi ternari. Transformasi ini secara matematis dinyatakan sebagai:

Wf​=Sign(W−α)

Di mana:

  • W adalah matriks bobot asli.
  • α adalah mean dari bobot.
  • Sign(x) mengembalikan +1 jika x > 0 dan -1 lainnya.

2. Kuantisasi Aktivasi

Mengkuantisasi aktivasi memastikan bahwa input dibatasi pada bit width tertentu:

x^e​=Quant(x)=Clip(γx×Qb​​,−Qb​+ϵ,Qb​−ϵ)

Di mana:

  • Qb = 2(b−1)2^{(b-1)} adalah tingkat kuantisasi maksimum untuk b-bit width.
  • γ adalah nilai absolut maksimum dari x (dinotasikan sebagai ∣∣x∣∣∞).
  • ε adalah sebuah angka kecil untuk mencegah overflow selama perhitungan.

3. Operasi BitLinear

Lapisan BitLinear menggantikan perkalian matriks tradisional dengan operasi yang disederhanakan:

y=Wf​×x^e​×(Qb​βγ​)

Di mana:

  • β adalah faktor skala yang digunakan untuk meminimalkan kesalahan aproksimasi.
  • γ menskala aktivasi.
  • Q_b adalah faktor kuantisasi.

Transformasi ini memungkinkan perhitungan yang efisien sambil mempertahankan kinerja model.

Implikasi Kinerja

Efisiensi Memori

Sistem bobot ternari secara signifikan mengurangi kebutuhan memori:

  • LLM Tradisional: 16 bit per bobot
  • BitNet.cpp: 1,58 bit per bobot

Pengurangan ini menghasilkan penghematan memori sekitar 90% dibandingkan dengan model 16-bit tradisional, memungkinkan model yang lebih besar untuk muat dalam keterbatasan perangkat keras yang sama.

Efisiensi Energi

Kecepatan Inferensi, Efisiensi Energi (Apple [securities_stock_price_tag symbol="AAPL" exchange="NASDAQ"] M2)

 

Kecepatan Inferensi: Lebih Cepat pada Kedua CPU

Kecepatan Inferensi, Efisiensi Energi (i7-13700H)

1. Kecepatan Inferensi: Lebih Cepat pada Kedua CPU

Kecepatan inferensi direpresentasikan sebagai jumlah token yang diproses per detik. Berikut adalah breakdown dari pengamatan:

  • Pada Apple M2 Ultra: BitNet.cpp mencapai hingga 5,07x percepatan untuk model yang lebih besar (30B) dibandingkan dengan Llama.cpp, dengan kecepatan puncak 593,43 token per detik untuk model 125M, yang merupakan 1,37x percepatan. Untuk model yang lebih besar seperti 3,8B dan 7B, BitNet.cpp mempertahankan kecepatan di atas 84,77 token per detik, menunjukkan efisiensinya di berbagai skala.
  • Pada Intel (INTC ) i7-13700H: BitNet.cpp mencapai percepatan yang lebih dramatis. Pada ukuran model 7B, BitNet.cpp memberikan percepatan 5,68x dibandingkan dengan Llama.cpp. Untuk model yang lebih kecil seperti 125M, itu memproses 389,08 token per detik, yang merupakan 2,37x lebih cepat dari Llama.cpp.

2. Efisiensi Energi: Pengubah Permainan untuk Perangkat Edge

Grafik yang disediakan juga mencakup perbandingan biaya energi, yang menunjukkan pengurangan yang signifikan dalam konsumsi energi per token yang diproses:

  • Pada Apple M2 Ultra: Penghematan energi BitNet.cpp sangat substansial. Untuk model 700M, itu mengonsumsi 55,4% lebih sedikit energi per token dibandingkan dengan Llama.cpp, turun dari 0,314 menjadi 0,140. Tren ini berlanjut untuk model yang lebih besar, dengan model 70B menunjukkan pengurangan 70,0% dalam konsumsi energi.
  • Pada Intel i7-13700H: BitNet.cpp memberikan penghematan energi 71,9% untuk model 700M, dengan konsumsi turun dari 1,367 menjadi 0,384. Meskipun data energi untuk model 70B di Llama.cpp tidak tersedia, BitNet.cpp tetap efisien, dengan konsumsi energi 17,33 untuk model 70B.

3. Melampaui Batas Kecepatan Membaca Manusia

Salah satu wawasan paling menarik dari grafik ini adalah referensi ke kecepatan membaca manusia, yang ditandai pada 5-7 token per detik. Garis merah ini menunjukkan bahwa kedua implementasi, terutama BitNet.cpp, dapat dengan mudah melampaui kecepatan membaca manusia bahkan untuk model terbesar:

  • Pada Apple M2 Ultra, BitNet.cpp melampaui kecepatan membaca manusia untuk semua ukuran model, dengan kecepatan terendah 8,67 token per detik untuk model 70B.
  • Pada Intel i7-13700H, model 100B masih mencapai 1,70 token per detik, hampir menyentuh rentang bawah kecepatan membaca manusia, sementara semua model yang lebih kecil melampaui batas ini.

Pertimbangan Pelatihan

Estimator Langsung (STE)

Karena kuantisasi 1-bit memperkenalkan fungsi non-diferensial, pelatihan melibatkan teknik khusus yang dikenal sebagai Estimator Langsung (STE). Dalam pendekatan ini, gradien mengalir tanpa perubahan melalui titik non-diferensial. Berikut adalah implementasi sederhana dalam Python:

class StraightThroughEstimator(Function):
@staticmethod
def forward(ctx, input):
return input.sign()

@staticmethod
def backward(ctx, grad_output):
return grad_output

Pelatihan Presisi Campuran

Untuk mempertahankan stabilitas selama pelatihan, presisi campuran digunakan:

  • Bobot dan Aktivasi: Dikuantisasi ke presisi 1-bit.
  • Gradien dan Status Optimizer: Disimpan dalam presisi yang lebih tinggi.
  • Bobot Laten: Dipertahankan dalam presisi tinggi untuk memfasilitasi pembaruan akurat selama pelatihan.

Strategi Laju Pembelajaran Besar

Tantangan unik dengan model 1-bit adalah bahwa pembaruan kecil mungkin tidak mempengaruhi bobot yang dibinarisasi. Untuk mengatasi ini, laju pembelajaran ditingkatkan, memastikan konvergensi yang lebih cepat dan optimasi yang lebih baik dibandingkan dengan pendekatan tradisional.

Kuantisasi dan Normalisasi Grup

BitNet.cpp memperkenalkan Kuantisasi dan Normalisasi Grup untuk meningkatkan paralelisme model. Sebagai gantinya menghitung parameter untuk seluruh matriks bobot, BitNet membagi bobot dan aktivasi menjadi beberapa grup (G).
Ini memungkinkan pemrosesan paralel yang efisien tanpa komunikasi antar-grup tambahan, memungkinkan pelatihan dan inferensi model skala besar.

Catatan Implementasi dan Optimasi

Optimasi CPU

BitNet.cpp menggunakan beberapa optimasi tingkat rendah untuk mencapai kinerja CPU puncak:

  • Operasi Vektor: Menggunakan instruksi SIMD untuk melakukan manipulasi bit secara efisien.
  • Akses Memori yang Ramah Cache: Mengatur data untuk meminimalkan kehilangan cache.
  • Pemrosesan Paralel: Mendistribusikan beban kerja secara efektif di seluruh inti CPU.

Berikut adalah contoh fungsi kunci yang mengimplementasikan kuantisasi dan inferensi dalam BitNet:

def bitlinear_forward(input, weight, scale):
# Kuantisasi input menggunakan absmax kuantisasi
input_q = quantize(input)

# Lakukan perkalian matriks biner
output = binary_matmul(input_q, weight)

# Skala output untuk mencocokkan presisi asli
return output * scale

def quantize(x):
# Lakukan absmax kuantisasi
scale = torch.max(torch.abs(x))
return torch.clamp(x / scale, -1, 1) * scale
[/code]

Model yang Didukung

Rilis saat ini dari BitNet.cpp mendukung model 1-bit LLM berikut yang tersedia di Hugging Face:

  • bitnet_b1_58-large (0,7B parameter)
  • bitnet_b1_58-3B (3,3B parameter)
  • Llama3-8B-1.58-100B-tokens (8,0B parameter)

Model-model ini tersedia secara publik untuk mendemonstrasikan kemampuan inferensi kerangka kerja. Meskipun tidak secara resmi dilatih atau dirilis oleh Microsoft, mereka menggambarkan fleksibilitas kerangka kerja.

Panduan Instalasi

Untuk memulai dengan BitNet.cpp, ikuti langkah-langkah berikut:

Prasyarat

  1. Python >= 3.9
  2. CMake >= 3.22
  3. Clang >= 18
  4. Conda (sangat disarankan)

Untuk pengguna Windows, Visual Studio harus diinstal dengan komponen berikut diaktifkan:

  • Pengembangan Desktop dengan C++
  • Alat C++-CMake untuk Windows
  • Git untuk Windows
  • Kompilator C++-Clang untuk Windows
  • Dukungan MS-Build untuk LLVM Toolset (Clang)

Untuk pengguna Debian/Ubuntu, skrip instalasi otomatis tersedia:

bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"

Instalasi Langkah demi Langkah

  1. Klon Repositori:
    git clone --recursive https://github.com/microsoft/BitNet.git

    cd BitNet
  2. Instal Dependensi:
    # Buat lingkungan Conda baru (disarankan)
    conda create -n bitnet-cpp python=3.9
    conda activate bitnet-cpp


    pip install -r requirements.txt
  3. Bangun dan Siapkan Proyek: Anda dapat mengunduh model langsung dari Hugging Face dan mengonversinya ke format kuantisasi:
    python setup_env.py --hf-repo HF1BitLLM/Llama3-8B-1.58-100B-tokens -q i2_s

    Alternatif, unduh dan konversi model secara manual:

    huggingface-cli download HF1BitLLM/Llama3-8B-1.58-100B-tokens --local-dir models/Llama3-8B-1.58-100B-tokens

    python setup_env.py -md models/Llama3-8B-1.58-100B-tokens -q i2_s

Menggunakan Inferensi dengan BitNet.cpp

Untuk menjalankan inferensi menggunakan kerangka kerja, gunakan perintah berikut:

python run_inference.py -m models/Llama3-8B-1.58-100B-tokens/ggml-model-i2_s.gguf -p "Sandra melakukan perjalanan ke dapur. Di mana Sandra?" -n 6 -temp 0.7

Penjelasan:

  • -m menentukan jalur file model.
  • -p menentukan teks prompt.
  • -n menetapkan jumlah token untuk diprediksi.
  • -temp menyesuaikan keacakan sampling (suhu) selama inferensi.

Contoh Keluaran

Sandra melakukan perjalanan ke dapur. Di mana Sandra?

Jawaban: Sandra berada di dapur.

Detail Teknis BitNet.cpp

Lapisan BitLinear

BitNet.cpp mengimplementasikan arsitektur Transformer yang dimodifikasi, menggantikan perkalian matriks standar dengan operasi BitLinear. Pendekatan ini memusatkan bobot ke nol sebelum kuantisasi dan menskalakan mereka untuk mengurangi kesalahan aproksimasi. Fungsi transformasi kunci terlihat seperti ini:

# Fungsi binarisasi untuk bobot 1-bit
def binarize_weights(W):
alpha = W.mean()
W_binarized = np.sign(W - alpha)
return W_binarized

Kombinasi bobot yang dipusatkan dan penskalaan memastikan bahwa kesalahan kuantisasi tetap minimal, sehingga mempertahankan kinerja.

Dampak Industri

BitNet.cpp dapat memiliki implikasi yang luas untuk penerapan LLM:

  • Aksesibilitas: Memungkinkan LLM untuk berjalan pada perangkat standar, mendemokratisasikan akses ke AI yang kuat.
  • Efisiensi Biaya: Mengurangi kebutuhan akan GPU mahal, menurunkan hambatan untuk adopsi.
  • Efisiensi Energi: Menghemat energi dengan menggunakan inferensi berbasis CPU.
  • Inovasi: Membuka kemungkinan baru untuk aplikasi AI pada perangkat, seperti terjemahan bahasa waktu nyata, asisten suara, dan aplikasi yang fokus pada privasi tanpa ketergantungan cloud.

Tantangan dan Arah Masa Depan

Meskipun LLM 1-bit menjanjikan, beberapa tantangan tetap ada. Ini termasuk pengembangan model 1-bit yang kuat untuk tugas yang beragam, optimasi perangkat keras untuk komputasi 1-bit, dan mendorong pengembang untuk mengadopsi paradigma baru ini. Selain itu, menjelajahi kuantisasi 1-bit untuk tugas penglihatan komputer atau audio mewakili arah masa depan yang menarik.

Kesimpulan

Peluncuran BitNet.cpp oleh Microsoft merupakan kemajuan yang signifikan. Dengan memungkinkan inferensi 1-bit yang efisien pada CPU standar, BitNet.cpp menciptakan aksesibilitas dan keberlanjutan AI. Kerangka kerja ini membuka jalan bagi LLM yang lebih portabel dan efisien biaya, mendorong apa yang mungkin dengan AI pada perangkat.

Saya telah menghabiskan lima tahun terakhir dengan membenamkan diri dalam dunia Machine Learning dan Deep Learning yang menarik. Minat dan keahlian saya telah memimpin saya untuk berkontribusi pada lebih dari 50 proyek rekayasa perangkat lunak yang beragam, dengan fokus khusus pada AI/ML. Rasa ingin tahu saya yang terus-menerus juga telah menarik saya ke arah Natural Language Processing, sebuah bidang yang saya ingin jelajahi lebih lanjut.