deniz.in

Piyasalar

Hava durumu

Hava durumu yükleniyor

· kaynak Hacker News – Front Page (native)

Sıfırdan C++ ve CUDA ile yazılmış LLM çıkarım motoru, video kursu ve el yazısı notlarla birlikte yayınlandı

samir-vllm adlı GitHub projesi, LLM çıkarımını C++17 ve CUDA ile temel ilkelerden yeniden inşa ediyor; özel kernel'lar, sayfalı KV cache ve sürekli batching ile Llama 3.2 1B'yi çalıştırıyor ve yanında bir video kursu ile el yazısı notlar sunuyor.

Sıfırdan C++ ve CUDA ile yazılmış LLM çıkarım motoru, video kursu ve el yazısı notlarla birlikte yayınlandı

Bir ürün değil, öğretim motoru

Hacker News'in ana sayfasına çıkan samir-vllm projesi, C++17 ve CUDA ile temel ilkelerden yazılmış küçük bir LLM çıkarım motoru. Beyan edilen amacı eğitim: depo, bir prompt'un gelmesinden bir token üretilmesine kadar her adımı, ağırlık dosyalarının ayrıştırılmasından her transformer bileşeninin GPU'da çalıştırılmasına kadar izliyor. Projenin README'sine göre kod, altı saatten uzun bir YouTube yapım serisiyle eşleştirilmiş; seri çıkarıma giriş, ağırlık yükleme, embedding gather, RMSNorm, RoPE, cuBLAS ile Q/K/V projeksiyonları, self-attention, feed-forward ağ, decode ve KV cache, statik ve sürekli batching ile sayfalı KV cache konularını kapsıyor ve paged attention ile sona eriyor. 80 sayfadan fazla el yazısı not ve diyagram içeren bir eşlik eden PDF, depoda markdown kaynaklarıyla birlikte geliyor ve yazar, notların yapay zekâ yardımı olmadan yazıldığını belirtiyor.

Motorun uyguladığı şeyler

Motor, 16 katmanı boyunca sabit bir tensör düzeniyle tek bir modeli, Llama 3.2 1B Instruct'u hedefliyor. model.safetensors dosyasını doğrudan yüklüyor, metadata'yı ayrıştırıyor, tensör offset'lerini doğruluyor ve ham BF16 ağırlıklarını GPU belleğine kopyalıyor; ayrıca ekstra bir CPU taraflı kopyalamayı atlamak için bellek eşlemeli bir yükleyici sunuyor. Tokenizasyon, ICU kütüphanesi üzerinden Unicode desteği, özel token'lar ve Instruct sohbet prompt formatını destekleyen bir BPE tokenizer ile yerel olarak yürütülüyor ve özel bir test çalıştırılabilir dosyasıyla birlikte geliyor.

Hesaplama tarafında, yoğun nedensel prefill yolu 16 katmanın tamamını çalıştırıyor: Q/K/V projeksiyonu, RoPE, grouped-query attention, çıktı projeksiyonu, attention artığı, attention sonrası RMSNorm, SwiGLU MLP ve MLP artığı. Özel CUDA kernel'ları embedding gather ve RMSNorm'u kapsıyor; ikincisi, BF16 öğrenilmiş ağırlıkları uygularken 2.048 genişliğindeki gizli durum üzerinde FP32'de indirgeme yapıyor. Son bir RMSNorm ve bağlantılı embedding/LM-head projeksiyonu FP32 logit'ler üretiyor ve bir GPU argmax her yeni token'ı seçiyor. Üretim greedy'dir; sıra sonu ve metin sonu durdurmaları 2.048 token'lık bir bağlam içinde gerçekleşir.

KV sayfalama ve zamanlama

Bellek tasarımı, üretim sunum yığınlarının yaptığını yansıtıyor. Paylaşılan bir BF16 KV sayfa havuzu, her dizi ve her katman için bir blok tablosunu destekliyor; her fiziksel sayfa 16 token'lık K ve V tutuyor. Prefill bir isteğin prompt sayfalarını dolduruyor, decode ise her seferinde mutlak RoPE pozisyonunda bir yeni token ekliyor. Havuz varsayılan olarak 128 MiB ve komut satırı bayrağıyla yeniden boyutlandırılabiliyor.

İki zamanlama modu uygulanmış: statik batching yeni istekleri kabul etmeden önce mevcut grubun bitmesini bekliyor, sürekli zamanlayıcı ise sayfa bütçeleri izin verdiğinde kuyruktaki prompt'ları kabul ediyor ve tamamlanınca sayfalarını serbest bırakıyor. Kabul işlemi, bir isteğin en kötü durum işlenmiş önekine yer açıyor: prompt token'ları artı izin verilen yeni token'lar eksi bir, 16 katmanın her birinde 16 token'lık sayfalara yuvarlanıyor. Sığmayan istekler FIFO sırasıyla bekliyor ve bütçesi tüm havuzu aşan istek bir hatayla reddediliyor. README, bu muhafazakâr politikanın preempt ve yeniden hesaplamayı önlediğini, buna karşılık büyük çıktı bütçeleri bildirildiğinde bazı eşzamanlılıktan feragat edildiğini not ediyor. Decode attention, her sorgu başının önbelleğe alınmış sayfalarını FP32 bir online softmax ile akıtıyor ve sonuçları, cache'i bitişik bir tampona kopyalamadan veya tam attention skor matrisleri saklamadan biriktiriyor.

Uyarılar ve gereksinimler

README sınırlamalar hakkında açık sözlü. Model boyutları ve 2.048 token'lık bağlam sabit, prefill hâlâ decode yinelemeleri arasında aynı anda yalnızca bir prompt işliyor ve BF16 aritmetiği farklı batch boyutlarında farklı yuvarlayabildiği için greedy çıktılar tekil ve batch'li çalıştırmalar arasında ayrışabilir; bitwise eşitlik garanti edilmiyor. Derleme için CUDA Toolkit'li bir NVIDIA GPU, CMake 3.24 veya daha yenisi, bir C++17 derleyicisi, ICU geliştirme kütüphaneleri, nlohmann/json başlık dosyası ve kullanıcının sağladığı Llama 3.2 1B Instruct ağırlıkları ile tokenizer gerekiyor. Motor kaynağı MIT lisanslı; notlar ayrı koşullar taşıyor.

Neden önemli

Sunum motorları çıkarımı tek bir API çağrısı gibi gösteriyor, ama altında ağırlık yükleme, özel kernel'lar, KV cache sayfalama, online-softmax attention ve sürekli batching var; vLLM gibi üretim yığınlarının kullandığı aynı teknikler. Bu proje tüm bu parçaları 1B parametrelik bir model üzerinde minyatür ölçekte yeniden inşa ediyor. Gecikme, maliyet veya GPU kullanımını ayarlayan mühendisler için eksiksiz, çalışabilir bir uygulama üzerinde çalışmak, parçaların nasıl etkileşime girdiğini görmenin az yolundan biri; kod, video ve el yazısı notların eşleşmesi de onu yalnızca bir referans kod tabanı değil, kendi başına yeterli bir müfredat olarak kullanılabilir kılıyor. Açıkça bir üretim motoru değil bir öğrenme motoru, ama kavramlar gerçek iş yüklerini çalıştıran sistemlere doğrudan aktarılıyor.

  • #llm
  • #cuda
  • #cpp
  • #inference
  • #open-source

İlgili yazılar