- C++/CUDA tabanlı bir LLM çıkarım motoru olarak, GPU bellek akışı ve NVMe doğrudan G/Ç sayesinde Llama 70B modelini RTX 3090 (24GB VRAM) üzerinde çalıştırabiliyor
- 3 aşamalı uyarlanabilir önbellekleme yapısı kullanarak VRAM, sabitlenmiş RAM ve NVMe/mmap alanlarını otomatik olarak bölüyor; mmap'e kıyasla 83 kata kadar hız artışı sağlıyor
- gpu-nvme-direct arka ucu, CPU'yu tamamen atlayarak veriyi NVMe'den doğrudan GPU'ya aktarıyor ve PCIe bant genişliğini azami ölçüde kullanıyor
- Layer skip ve self-speculative decoding özellikleriyle gereksiz hesaplamayı azaltıp kalite kaybı olmadan işlem hızını artırıyor
- Tüketici donanımında son derece büyük modellerin verimli çalıştırılmasını mümkün kılarak yüksek performanslı LLM çıkarımının erişilebilirliğini genişletme potansiyeli gösteriyor
NTransformer'a genel bakış
- RTX 3090 (24GB VRAM) üzerinde Llama 70B modelini çalıştıran yüksek verimli bir C++/CUDA LLM çıkarım motoru
- Model katmanlarını GPU belleği üzerinden akış halinde taşır; isteğe bağlı olarak NVMe doğrudan G/Ç kullanarak CPU'yu tamamen devre dışı bırakır
- CUDA Toolkit dışında harici bağımlılık yok, PyTorch veya cuBLAS gerektirmez
- GGUF model formatını destekler; Q4_0, Q8_0, Q4_K_M, Q5_K, Q6_K, F16, F32 niceleme biçimleri kullanılabilir
Performans ve önbellekleme yapısı
- 3 aşamalı uyarlanabilir önbellekleme (3-Tier Adaptive Caching)
- VRAM'de yerleşik katmanlar (0 G/Ç)
- Sabitlenmiş RAM (yalnızca H2D aktarımı için)
- NVMe/mmap geri dönüş yolu
- RTX 3090 + 48GB RAM ortamında mmap'e kıyasla 83 kat hız artışı
- PCIe Gen3 x8 bant genişliği (yaklaşık 6.5 GB/s) darboğaz olarak çalışıyor
- Q4_K_M nicelemesi, VRAM'e 10 katman daha fazla yükleyerek (36'ya karşı 26) aktarım miktarını azaltıyor
- Layer skip (kosinüs benzerliği tabanlı) ile 80 katmandan 20'si atlanıyor, kalite kaybı en aza indiriliyor
Başlıca özellikler
- SLEP akışı: NVMe okuma, PCIe DMA ve GPU hesaplamasını çift tamponla örtüştürerek işler
- gpu-nvme-direct arka ucu: NVMe verisini GPU'nun erişebildiği sabitlenmiş belleğe doğrudan okur
- Self-speculative decoding: VRAM'de yerleşik katmanları taslak model olarak kullanır, ek model gerektirmez
- Otomatik veri yolu seçimi: VRAM'de yerleşik > sabitlenmiş RAM H2D > mmap sabitlenmiş > CPU memcpy
- Llama mimarisi desteği: RoPE, GQA, SwiGLU, RMSNorm, KV önbelleği dahil
Sistem gereksinimleri
- Linux (Ubuntu, kernel 6.17+), CUDA Toolkit 13.1, gcc/g++ 14, CMake 3.24+
- Compute Capability 8.0+ GPU (RTX 3090 üzerinde test edildi)
- NVMe doğrudan G/Ç kullanımı için ayrı bir PCIe yuvasındaki NVMe SSD ve gpu-nvme-direct kütüphanesi gerekir
NVMe doğrudan akışı
- Model VRAM'e sığmadığında, NVMe → GPU doğrudan yolu ile CPU tamamen devre dışı bırakılır
- Veri akışı: NVMe SSD → DMA → sabitlenmiş staging belleği → PCIe H2D → GPU arabelleği → hesaplama
- Kullanıcı alanından doğrudan erişim için NVMe, VFIO'ya bağlanır
- Her katman (70B Q6_K için yaklaşık 670MB) yaklaşık 202ms içinde 670 NVMe komutuyla okunur
- NVMe okuma, H2D DMA ve GPU hesaplaması çift tamponlu işlem hattı ile paralel yürütülür
Sistem kurulumu ve risk uyarısı
- Otomatik kurulum betiği (
setup_system.sh), GRUB, NVIDIA DKMS, CUDA başlıkları, VFIO, NVMe bağlama adımlarını sırasıyla yapılandırır
- IOMMU devre dışı bırakma, çekirdek modülü yaması, NVMe VFIO bağlama gibi yüksek riskli işlemler içerir
- Hatalı yapılandırma durumunda önyükleme başarısızlığı, NVMe veri kaybı, sistem kararsızlığı yaşanabilir
- Önyükleme sürücüsü kesinlikle kullanılmamalıdır; ayrı, yalnızca NVMe için ayrılmış bir aygıt gerekir
- Tüm değişiklikler için yedekleme ve geri yükleme betikleri sağlanır
Mimari ve kod yapısı
src/ dizinindeki başlıca bileşenler
core/: tensörler, bellek ayırma, GPU aygıt yönetimi
cuda/: GEMV, RMSNorm, RoPE, SwiGLU, softmax çekirdekleri
memory/: NVMe ve mmap tabanlı SLEP akış motoru
model/: Transformer bileşenleri, GGUF yükleyici, attention, FFN, normalization
inference/: tokenizer, sampler, motor
scripts/: sistem kurulumu, NVMe bağlama ve geri yükleme betiklerini içerir
Geliştirme aşaması yol haritası
- Aşama 1: Llama 8B Q8_0, özel CUDA çekirdekleri, 48.9 tok/s (tamamlandı)
- Aşama 2: SLEP akışı, tek GPU'da 70B çalıştırma, 33 kat hız artışı (tamamlandı)
- Aşama 3: Q4_K_M/Q5_K desteği, Layer skip, self-speculative decoding, F16 KV önbelleği (tamamlandı)
- Aşama 4: NVMe Direct arka ucu, GPU güdümlü NVMe okuma 3.35 GB/s (tamamlandı)
- Aşama 5: çıkarım optimizasyonu ve herkese açık C API (planlanıyor)
Lisans
- BSD-2-Clause lisansı uygulanır
1 yorum
Hacker News yorumları
CPU'yu atlayıp NVMe'den GPU'ya doğrudan aktarım yapma yaklaşımının gerçekten zekice olduğunu düşünüyorum
Yerelde büyük modeller çalıştırırken darboğaz her zaman bellek hiyerarşisiydi; bu, NVMe'yi adeta genişletilmiş VRAM gibi doğrudan DMA ile ele almak anlamına geliyor
Apple M serisinin birleşik bellek (unified memory) yaklaşımıyla karşılaştırıldığında nasıl olur merak ediyorum. M4 Max 70B modeli tamamen belleğe alabiliyor ama throughput'u 3090'dan daha düşük
NVMe yaklaşımını kullanan 3090 ile M4 Max'in yerel performansını batch inference temelinde karşılaştıran benchmark'lar görmek ilginç olurdu
GPUdirect kullanılırsa depolama aygıtına doğrudan DMA aktarımı mümkün oluyor
Eğer m.2 depolama aslında DRAM olsaydı nasıl olurdu diye düşünüyorum. GPU'dan modeli spill ederken kalıcılık gerekmiyor, böylece sistem RAM'i CPU için bırakılabilir
Saniyede 0.2 token hızı sohbet için yavaş, ama batch/asenkron işler için yeterli
Ben otomatik içerik üretim pipeline'ları çalıştırıyorum ve birden fazla LLM çağrısını aynı anda yürütüyorum. Görsel üretimi darboğaz olduğu için tüm iş zaten yaklaşık 20 dakika sürüyor
70B modeli yerelde çalıştırabilmek, API token maliyetinden tasarruf sağlayacağı için büyük bir maliyet avantajı olurdu
0.2 tok/s deneysel kullanım için fena değil ama etkileşimli kullanım için yetersiz
Çoğu durumda iyi quantize edilmiş 8B veya 13B modeller daha iyi bir gecikme-kalite dengesi sunuyor
Gerçekten ilginç bir deney. Keşke ben de bunu önce deneseydim
PCIe'nin teorik bant genişliğine kıyasla gerçek throughput değerleri nasıl merak ediyorum. Bunun latency mi yoksa bant genişliği sorunu mu olduğunu bilmek isterdim
Harika bir hack, ama 70B modelde 0.5 tok/s aynı kartta 7B modelin 30+ tok/s vermesiyle karşılaştırıldığında yavaş kalıyor
NVIDIA araştırmasına göre 10B altı modeller bile ajan görevlerinin %40~70'ini halledebiliyor ve kalite farkı da hızla kapanıyor
Bu alan gelecekte deney yapmaya fazlasıyla değer
Uzun vadede asıl kritik nokta model optimizasyonu olacak gibi görünüyor; yani modelin bazı kısımlarını atlayıp performansı etkilemeyen bölümleri bulmaya yönelik araştırmalar. Sonuçta model de bir tür kayıplı sıkıştırma (lossy compression) yapısı
Bu tür bir yönelim yapay zekanın demokratikleşmesine de katkı sağlar
Gerçekten çok havalı bir proje. Böyle bir fikri akla getirmek için nasıl bir sistem/donanım bilgisi altyapısı gerektiğini merak ediyorum
Ben donanımın büyük ölçüde soyutlandığı ortamlarda çalışıyorum, bu yüzden böyle bir yaklaşımı düşünmek zor. Sadece yaratıcılık değil, sistem seviyesinde anlayış da gerekiyor gibi görünüyor
PS2'de LLM çalıştırmaya uğraşırken 32MB RAM ve 4MB VRAM sınırına takılıp katman akışlama (layer streaming) yöntemini geliştirmiştim. PS2'de VRAM 32 bit adresleri doğrudan işleyebildiği için çok hızlıydı; ben de bunu PC'de yeniden üretmeye çalıştım
Ben de benzer bir şey deniyorum. VRAM'in yarısından daha azıyla 1T model çalıştırma deneyi yapıyorum
SGLang'in yönlendirme katmanını değiştirerek Gen5 NVMe'den GPU belleğine JIT tahmin tabanlı expert swap uygulayabileceğimi düşünüyorum. NVIDIA Dynamo ve NIXL primitive'lerini kullanıyorum
Bunu daha önce deneyen biri var mı merak ediyorum
Harika proje. Tüketici sınıfı GPU'larda DKMS patch süreci hakkında biraz daha fazla ayrıntı duymak isterim. Ben de denemek istiyorum
İlgili bağlantılar: RTX4090 P2P Unlock, vGPU Unlock