1 puan yazan GN⁺ 3 시간 전 | 1 yorum | WhatsApp'ta paylaş
  • ESP32-S3 üzerinde sunucu bağlantısı olmadan 28,9 milyon parametreli bir dil modeli çalıştırılıyor ve küçük bir ekrana yaklaşık saniyede 9 token hızında metin yazdırılıyor
  • Toplam parametrelerin 25 milyonu yavaş flash üzerinde tutuluyor; her token için yalnızca gereken yaklaşık 6 satırı, yani 450 baytı okuyan Per-Layer Embeddings yapısı kullanılıyor
  • Model 4 bit ölçekte 14,9 MB; 512 KB SRAM’e her token’da kullanılan hesaplama çekirdeği, 8 MB PSRAM’e çıktı başlığı ve çalışma belleği, 16 MB flash’a ise büyük embedding tablosu yerleştiriliyor
  • TinyStories ile eğitildiği için kısa ve basit hikâyeleri genelde tutarlı biçimde üretebiliyor; ancak soru-cevap, komut yürütme, kod yazma veya olgusal bilgi için uygun değil
  • Daha önce benzer bir çipte çalıştırılan 260 bin parametreli modele göre yaklaşık 100 kat daha fazla parametre barındırıyor; asıl nokta üretim kalitesinden çok büyük bir modeli küçük bir çipe sığdıran bellek yapısı

Donanım ve çalışma performansı

  • Yaklaşık 8 dolar olan tek bir ESP32-S3 üzerinde tüm işlem yapılıyor; sunucuya veri gönderilmiyor
    • 512 KB SRAM, 8 MB PSRAM ve 16 MB flash kullanılıyor
    • Genel hız yaklaşık 9,5 tok/s, saf hesaplama hızı yaklaşık 9,7 tok/s
    • 4 bit model boyutu 14,9 MB
  • Toplam 28,9 milyon parametrenin 25 milyonu flash arama tablosunda saklanıyor

Modeli küçük belleğe sığdırma yöntemi

  • Normalde modelin tamamının hızlı bellekten erişilebilir olması gerekir; ancak ESP32-S3’ün SRAM’i yalnızca 512 KB olduğu için sadece çok küçük modeller sığabilir
  • Parametrelerin çoğunun hesaplama hedefi değil, embedding tablosunda olmasından yararlanılarak tablo flash üzerinde bırakılıyor
    • Her token için yalnızca gereken yaklaşık 6 satır, yaklaşık 450 bayt okunuyor
    • Asıl hesaplamayı yapan küçük bölüm hızlı bellekte tutuluyor
    • Modelin büyük kısmı çalışma sırasında yüklenmiyor; yalnızca flash’tan gereken kısımlar seçiliyor
  • Bellek rolleri şöyle ayrılıyor
    • SRAM: Her token’da kullanılan hesaplama çekirdeği
    • PSRAM: Çıktı başlığı ve çalışma belleği
    • Flash: 25 milyon parametreli tablo

Per-Layer Embeddings uygulaması

  • Google’ın Gemma 3n ve Gemma 4’te kullandığı Per-Layer Embeddings, telefon veya GPU yerine mikrodenetleyici bellek yapısına uygulanıyor
  • Proje geliştiricisinin doğruladığı kadarıyla, bu yöntemin bu kadar küçük bir çipe uygulandığı bir önceki örnek yok

Modelin yapabildikleri ve sınırları

  • TinyStories içindeki kısa sentetik hikâyelerle eğitildiği için basit hikâyeler üretebiliyor ve genelde tutarlılığı koruyor
  • Soru-cevap, komut yürütme, kod yazma veya olgusal bilgi sağlama yapamıyor
  • Bu sınır, çıkarımı yapan küçük çekirdekten kaynaklanıyor; bellek yerleşimi tekniği çıkarım yeteneğinin kendisini artırmıyor

Kod ve deney materyalleri

  • firmware/esp32_llm/README.md içinde firmware, kablolama ve flashing prosedürleri yer alıyor
  • src/ ve experiments/ içinde eğitim, ablation deneyleri ve kuantizasyon kodu bulunuyor
  • RESULTS.md içinde tüm yöntem, ablation deneyleri ve çip üstü ölçümler özetleniyor

Temel alınan projeler ve kayıtlar

  • TinyStories, küçük modellerin de tutarlı yazım öğrenebilmesi için oluşturulmuş kısa sentetik hikâye veri kümesi
  • Google Gemma’nın Per-Layer Embeddings yaklaşımı, büyük modelleri küçük çiplere sığdırmanın temelini oluşturuyor
  • Andrej Karpathy’nin llama2.c’si, küçük dil modellerini eğitip saf C ile çalıştırma yaklaşımına ilham verdi
  • Depoda, başlangıçtaki parametre sayısını şişiren hesaplama hatası ve düzeltme süreci de bırakılmış
    • Commit geçmişi ve RESULTS.md içinde sayıların nerede ve neden değiştiği görülebilir

1 yorum

 
GN⁺ 3 시간 전
Hacker News yorumları
  • Bugünlerde 5 dolarlık bir mikrodenetleyiciyle yapılabilenler şaşırtıcı. Milk-V kartları arasında Duo, 256 MB'a kadar bellek ve 1TOPS@INT8 TPU'ya sahip olup Linux bile çalıştırabildiği için 5 tane aldım

    • 128 bit vektör ISA ve 32 kayıt da unutulmamalı. En fazla 64 bit tamsayı ve kayan nokta desteği var; LMUL=8 olduğunda tek bir komutla 1.024 bit işleyebiliyor ve çoğu işlem 128 bit başına 3 çevrim sürüyor
      GCC ve Clang xTHeadVector'ı tamamen destekliyor; C yerleşik fonksiyonları kullanıldığında yalnızca komut satırı seçenekleriyle RVV 1.0 ile uyumlu oluyor. 8 bit öğelerle çalışan memcpy(), memset(), memcmp(), strlen(), strcpy(), strcmp() gibi kodların önemli bir kısmı ikili düzeyde uyumlu
      64 MB Duo'yu aldığımda 3 dolardı; sonrasında 64 MB, 256 MB ve 512 MB modeller sırasıyla 5, 7 ve 10 dolardı, ancak bu yıl fiyatlar epey arttı: https://arace.tech/products/milk-v-duo, https://arace.tech/products/milkv-duo-s
    • 0,5 doların altında mikrodenetleyici de satın alabilirsiniz, ama 5 dolarlık ürünlerde bile model çalıştırma açısından kısıtlar o kadar ağır ki pratikte işe yaramaz bir ortam gibi görünüyor. Model talebi yüzünden MCU kıtlığı yaşanmamasını umuyorum
    • Mikrodenetleyiciler 1980'lerin donanımında kalmış gibi assembly ya da C'nin tek seçenek olduğunu düşünmeye gerek yok. Bu düzeydeki bir cihaz Xerox PARC işletim sistemini de zorlanmadan çalıştırabilir
      4 KB PIC'in hâlâ en iyi seçenek olduğu kullanım alanları var, ancak çoğu durumda daha iyi bir seçenek yokmuş gibi davranmamak gerekir
    • Bu fiyat ve performans, ARM'nin tekel konumunun tüm sektöre ne kadar büyük bir maliyet yüklediğini hissettiriyor
  • Ses-metin dönüştürme modelleri de bu boyuta yaklaşıyor; bizimle konuşabilen küçük cihazların ne kadar yakın olduğunu merak ediyorum. Diş fırçasının ağız hijyeni tavsiyesi verdiği, hatta diş macunu reklamı yaptığı bir dünya gelebilir

    • Ağız hijyeni tavsiyesi zaten mümkün. Philips'in üst seviye diş fırçaları Bluetooth ile bağlanıp uygulamada geri bildirim sağlıyor
      Ama diş fırçası yapay zekası için reklam engelleyici aramak zorunda kalacağımız bir dünya istemiyorum
  • Katman bazlı embedding tekniğini çok akıllıca kullanmışlar. Yaklaşık 20-30 milyon parametreli pratik TTS modelleri de var; bu nedenle ağa bağlı olmayan bir ESP32 neredeyse gerçek zamanlı olarak metin okuyabilir

    • Her MCU'ya modelin bir katmanını atayan bir yapı denemek istiyorum. Birden çok RP2350'yi PIO'ya özel hatlarla bağlayıp interpolator ve çift çarpma komutlarını birleştirme yaklaşımı
      PSRAM, flash ve SD kartın ayrı ayrı bant genişliği yüksek değil, ama birçoğu aynı anda çalıştırılırsa kayda değer bir throughput'a ulaşılabilir. Büyük ölçekli özel donanım watt başına performansta önde olacaktır, ancak düşük başlangıç maliyeti ve kademeli ölçeklenebilirlik nedeniyle böyle bir yapı da cazip
  • Mikrodenetleyicilerden ziyade Raspberry Pi 4'te yerel LLM yanıtlarının 30'ar saniye sürmemesini sağlayacak gerçekçi seçenekleri merak ediyorum

  • Ufacık cihazlarda LLM çalıştırmak da harika, ama bundan ziyade bu ağırlıkları üreten eğitim yöntemi daha etkileyici

    • Küçük parametre alanlarında yalnızca benchmark'ı hedefleyen aşırı optimizasyon zor olduğu için liderlik tablolarının faydası bitmiş değil. Aksine, aynı benchmark performansını veren daha küçük modelleri bulurken modelleme aşamasında sıkıştırılabilirliği ve tekrarları fark edip ortadan kaldırmaya zorlayan bir rolü hâlâ var
  • İyi erişim örüntüleriyle flash'tan yararlanılırsa, CPU üzerinde çok daha büyük modelleri çalıştıracak şekilde ölçeklenemez mi diye merak ediyorum

    • Yakın zamanda benzer bir deneme olmuştu. Standart bir masaüstü CPU, NVMe SSD ve yaklaşık 25 GB RAM ile GLM-5.2 çalıştırıldı, ancak hız saniye başına token değil, token başına en fazla 20 saniye düzeyindeydi: https://github.com/JustVugg/colibri
    • ESP32'nin flash bant genişliği dahili SRAM'in yalnızca yaklaşık dörtte biri. Daha güçlü sistemlerde bu fark çok daha büyür ve artan hesaplama performansını verimli kullanmak için sağlanması gereken bellek bant genişliği de ciddi şekilde artar
  • ESP32-S3 oldukça güçlü; şu anda Raspberry Pi 4 geliştirme işlerinde kullanıyorum. İki USB portundan biri OTG desteklediği için, başka bir yöntemle 100 doların üzerinde tutacak işlevler uygulanabiliyor

    • Bazı kısıtları kabul ederseniz RP2350 ile yaklaşık 1 dolara benzer bir kurulum mümkün. En yüksek hız USB Full Speed olan 12 Mbps; bir port çipin yerleşik USB çevre birimini kullanır, diğeri ise PIO'nun desteklediği GPIO pinlerine bağlanır
      Şu anda tinyusb ve pico-pio-usb ile çalışıyor; daha yüksek performans umuduyla Rust portunu da deniyorum
  • Bu kuantize modelin doğruluğunun ne düzeyde olduğunu merak ediyorum

  • Bu ölçekte gösterdiği performans şaşırtıcı; başlıkta geçen biraz daha güçlü tek kart bilgisayarlarda nelerin mümkün olacağını görmek heyecan verici