1 puan yazan GN⁺ 3 시간 전 | 1 yorum | WhatsApp'ta paylaş
  • Yerel kodlama ajanı yapılandırması, internet kesintisi olduğunda bile macOS'te OpenAI uyumlu API ile modeli çalıştırıp Pi üzerinde metin ve görsel girdilerini işleyebilen bir kurulumdur
  • Apple M1 Max 64GB ve macOS 15.7.7 üzerinde llama.cpp Metal ile Gemma 4 26B-A4B GGUF modeli kullanıldı; temel üretim hızı 58.2 tok/s oldu
  • MTP draft modeli eklendikten ve --spec-draft-n-max 3 olarak ayarlandıktan sonra üretim hızı 72.2 tok/s'ye çıktı ve yaklaşık %24 iyileşti
  • mmproj-BF16.gguf dosyası --mmproj ile yüklenmeli ve Pi model girdisi ["text", "image"] olarak ayarlanmalı; ancak bu şekilde ekran görüntüsü gibi görsel girdiler iletilir
  • Nihai yapılandırmada llama.cpp sunucusu 127.0.0.1:8080/v1 üzerinde çalışıyor ve Pi bunu yerel sağlayıcı olarak kullanıyor; Qwen3.6 35B-A3B kodlama ajanı kıyaslamalarında daha iyi görünse de bu testte 55 tok/s ile daha yavaştı

Yerel kodlama ajanı yapılandırmasının hedefi

  • İnternet kesintileri birkaç kez yaşandığı için kodlama ajanı kullanılamadı; bu da yerelde çalışan bir kurulum denemek için tetikleyici oldu
  • İstenen yapılandırma, Mac'te gerçekten kullanılabilecek kadar hızlı olmalı ve OpenAI uyumlu API üzerinden başka araçlarda da kullanılabilmeliydi
  • Gerektiğinde ekran görüntülerini veya görselleri işleyip ajanın ürettiği sonuçları tekrar girdi olarak verebilen bir düzen hedeflendi
  • Nihai yapılandırma llama.cpp, Gemma 4 26B-A4B GGUF, Q8 MTP draft modeli, Gemma 4 multimodal projector ve Pi terminal kodlama ajanından oluşuyor
  • Test ortamı Apple M1 Max, 64GB birleşik bellek ve macOS 15.7.7 idi

Model

  • Ana model gemma-4-26B-A4B-it-UD-Q4_K_XL.gguf idi ve Hugging Face üzerindeki unsloth-gemma-4-26B-A4B-it-GGUF deposunda bulunuyor
  • Dosya boyutu yaklaşık 16GB; MTP draft head ve multimodal projector ile birlikte model klasörü yaklaşık 17GB oluyor
  • Benchmark prompt'u şu şekildeydi: Write a compact Python function that parses a unified diff and returns the changed file paths. Then explain two edge cases.
  • Her benchmark yaklaşık 128 token üretti

Temel çalıştırma: llama.cpp + Metal

  • Ana model doğrudan llama.cpp ve Metal hızlandırması ile çalıştırıldı
  • Çalıştırma komutu llama-cli içinde model yolu, -ngl 999, -fa on, -c 4096, -n 128 belirtilerek verildi
  • Temel yapılandırmada prompt işleme hızı 298.0 tok/s, üretim hızı ise 58.2 tok/s oldu
  • 58 tok/s çok hızlı değil ama kullanılabilir bir seviye; kodlama ajanı işlerinde çok sayıda araç çağrısı olduğu için mümkün olduğunca yüksek hız gerekiyor

MTP draft modelinin eklenmesi

  • Gemma 4 için MTP/gemma-4-26B-A4B-it-Q8_0-MTP.gguf biçiminde bir MTP draft modeli sunuluyor
  • llama.cpp içinde bu model speculative decoding için --model-draft, --spec-type draft-mtp, --spec-draft-n-max ile yükleniyor
  • MTP ile ilk çalıştırma, 4 draft token ayarında 69.2 tok/s gördü
  • Unsloth belgeleri başlangıç noktası olarak --spec-draft-n-max 2 öneriyor, ancak donanıma göre 1 ile 6 arasındaki değerlerin test edilip en hızlı olanın seçilmesini söylüyor
  • --spec-draft-n-max ayarı denendiğinde en yüksek hız 3 draft token ile 72.2 tok/s oldu
  • Yalnızca ana model 58.2 tok/s verirken, Q8 MTP draft modeli eklenmiş yapılandırma 72.2 tok/s verdi
  • Prompt işleme hızı neredeyse sabit kalırken üretim hızı yaklaşık %24 arttı

MTP ince ayar sonuçları

  • --spec-draft-n-max için 1'den 6'ya kadar değerler test edildi
  • 1 değerinde prompt 295.5 tok/s, üretim 68.4 tok/s oldu
  • 2 değerinde prompt 299.1 tok/s, üretim 72.0 tok/s oldu
  • 3 değerinde prompt 295.6 tok/s, üretim 72.2 tok/s ile en hızlı sonuç alındı
  • 4 değerinde üretim 70.7 tok/s, 5 değerinde 63.7 tok/s, 6 değerinde ise 61.2 tok/s'ye düştü
  • M1 Max ortamında 3 en hızlı değerdi; 2 de buna oldukça yakındı

MLX karşılaştırması

  • Mac'te modeli çalıştırmanın daha hızlı bir yolu olup olmadığını görmek için mlx-lm tabanlı MLX modelleri de test edildi
  • llama.cpp Metal + MTP, Unsloth GGUF Q4 ile Q8 MTP kombinasyonunda 72.2 tok/s verdi
  • Sadece llama.cpp Metal, Unsloth GGUF Q4 ile 58.2 tok/s verdi
  • MLX-LM, Unsloth UD MLX 4-bit ile 45.8 tok/s verdi
  • MLX-LM, mlx-community 4-bit ile 43.9 tok/s ve mlx-community OptiQ 4-bit ile 38.1 tok/s verdi
  • Bu özel yapılandırmada llama.cpp, MLX'ten daha hızlıydı ve MTP uygulanmış llama.cpp en iyi seçenek oldu
  • Gemma 4 MTP için gemma-4-swift-mlx de denendi; ancak test edilen 26B 4-bit MLX checkpoint'i, loader'ın beklediği weight key ile eşleşmediği için yeni modeli tekrar indirip uyarlama yapılmadan çalışma bırakıldı

Görsel desteği ekleme

  • Pi içinde ekran görüntüsü eklemek için model girdisi yalnızca metin olamaz
  • Başlangıçta yerel model girdisi "input": ["text"] olarak ayarlanmıştı; bu durumda Pi, görsel araç çıktısını modele düzgün şekilde iletemiyordu
  • llama.cpp sunucusu da multimodal yetenek için Gemma 4 multimodal projector olan mmproj-BF16.gguf dosyasına ihtiyaç duyuyor
  • Projector --mmproj ile yüklendiğinde llama.cpp multimodal desteği duyuruyor ve Pi görsel gönderebiliyor
  • Projector olmadan çalışan llama.cpp Metal + MTP testinde prompt 120.3 tok/s, üretim 71.4 tok/s oldu
  • mmproj-BF16.gguf yüklü nihai çalıştırmada prompt 297.4 tok/s, üretim 72.2 tok/s oldu
  • Projector yüklü nihai çalıştırmada metin üretim hızında bir düşüş görülmedi

llama.cpp kurulumu

  • Bağımlılıklar Homebrew ile cmake, git, tmux, python@3.11 kurularak yüklendi
  • ~/Developer/ML-Models/Gemma4/repos yolu oluşturuldu ve ggml-org/llama.cpp deposu repos/llama.cpp içine klonlandı
  • Derleme cmake -B build -DCMAKE_BUILD_TYPE=Release -DGGML_METAL=ON -DGGML_ACCELERATE=ON ile yapılandırıldı
  • Ardından cmake --build build --config Release -j ile release derlemesi yapıldı
  • Test edilen derleme GGML_METAL=ON, GGML_ACCELERATE=ON, GGML_BLAS=ON, GGML_BLAS_VENDOR=Apple ayarlarına sahipti

Model dosyalarını indirme

  • Python 3.11 sanal ortamı oluşturuldu ve huggingface_hub ile hf_xet kuruldu
  • huggingface-cli download ile Gemma 4 ana modeli, mmproj-BF16.gguf ve MTP draft modeli indirildi
  • İndirilen hedef dosyalar gemma-4-26B-A4B-it-UD-Q4_K_XL.gguf, mmproj-BF16.gguf, MTP/gemma-4-26B-A4B-it-Q8_0-MTP.gguf oldu
  • Nihai model klasörü models/unsloth-gemma-4-26B-A4B-it-GGUF/ altında bu üç dosyayı içeriyor

Yerel sunucuyu başlatma

  • Nihai sunucu llama-server ile çalıştırılıyor ve ana model, MTP draft modeli ile multimodal projector birlikte belirtiliyor
  • Başlıca seçenekler --spec-type draft-mtp, --spec-draft-n-max 3, -ngl 999, -fa on, -c 65536, --parallel 1
  • Sunucu --host 127.0.0.1 --port 8080 ile başlatılıyor
  • OpenAI uyumlu endpoint http://127.0.0.1:8080/v1
  • start_server.sh sarmalayıcısı sunucuyu bir tmux oturumunda çalıştırıyor ve logları logs/llama-server-mtp.log içine yazıyor
  • chmod +x start_server.sh sonrası sunucu ./start_server.sh ile başlatılıyor
  • Sunucunun çalıştığı curl http://127.0.0.1:8080/v1/models ile doğrulanıyor

Pi ayarları

  • Pi, model sağlayıcı ayarlarını ~/.pi/agent/models.json dosyasından okuyor
  • Yerel sağlayıcı gemma4-local için baseUrl değeri http://127.0.0.1:8080/v1
  • api değeri openai-completions; yerel sunucu kullanıldığı için authHeader false olarak bırakılıyor
  • Model ID'si gemma-4-26B-A4B-it-UD-Q4_K_XL.gguf, adı ise Gemma 4 26B-A4B Q4 + MTP olarak ayarlanıyor
  • input değeri ["text", "image"] olmalı; aksi halde Pi modeli yalnızca metin tabanlı kabul ediyor
  • Context window 65536, maksimum token 8192 olarak ayarlanıyor
  • Gerekirse ~/.pi/agent/settings.json içinde defaultProvider değeri gemma4-local, defaultModel değeri de ilgili GGUF dosya adı olarak ayarlanabiliyor
  • pi --offline --list-models gemma çalıştırıldığında görsel desteğinin yes olarak görünmesi bekleniyor
  • Yerel model çalıştırma komutu pi --provider gemma4-local --model gemma-4-26B-A4B-it-UD-Q4_K_XL.gguf
  • Etkileşimsiz çalıştırma pi -p --provider gemma4-local --model gemma-4-26B-A4B-it-UD-Q4_K_XL.gguf "Explain what this repository does" biçiminde yapılıyor
  • Ekran görüntüsü girdisi pi -p @"/path/to/screenshot.png" "Describe this image and point out anything relevant to the UI" biçiminde veriliyor

Nihai yapılandırma

  • Nihai inference runtime llama.cpp
  • macOS hızlandırması Metal + Accelerate kombinasyonu
  • Ana model gemma-4-26B-A4B-it-UD-Q4_K_XL.gguf
  • Draft model gemma-4-26B-A4B-it-Q8_0-MTP.gguf
  • MTP ayarı --spec-draft-n-max 3
  • Multimodal projector mmproj-BF16.gguf
  • Sunucu 127.0.0.1:8080 üzerindeki llama-server
  • API, OpenAI uyumlu /v1
  • Kodlama ajanı Pi ve Pi model girdisi ["text", "image"]
  • MTP draft modeli bu ortamda Gemma 4'ün üretim hızını 58.2 tok/s'den 72.2 tok/s'ye çıkardı ve yerel OpenAI uyumlu sunucu olarak çalıştırılabilecek kadar basit bir kurulum sundu

Qwen3.6 35B-A3B alternatifi

  • Bazıları Gemma 4 26B-A4B yerine Qwen3.6 35B-A3B kullanılmasını öneriyor
  • Doğrulanabilir benchmark'lara göre Qwen, Gemma 4'ten çok daha iyi bir kodlama ajanı olarak değerlendiriliyor
  • Ancak Qwen yapılandırması daha yavaştı; Qwen3.6-35B-A3B-UD-Q4_K_XL.gguf, unsloth-Qwen3.6-35B-A3B-MTP-GGUF, mmproj-BF16.gguf kombinasyonunda 55 tok/s görüldü
  • 72 tok/s yerine 55 tok/s, kullanıcının beklediği durumlarda hissedilir bir fark yaratıyor
  • Qwen model indirmesi unsloth/Qwen3.6-35B-A3B-MTP-GGUF üzerinden Qwen3.6-35B-A3B-UD-Q4_K_XL.gguf ve mmproj-BF16.gguf alınarak yapılıyor
  • Qwen sunucusu aynı llama-server ile ancak --port 8081 kullanılarak çalıştırılıyor
  • Pi ayarlarındaki Qwen sağlayıcısının adı qwen36-local, baseUrl değeri ise http://127.0.0.1:8081/v1
  • Qwen model yapılandırması reasoning: true, input: ["text", "image"], contextWindow: 65536, maxTokens: 8192 kullanıyor

1 yorum

 
GN⁺ 3 시간 전
Hacker News yorumları
  • Benchmark promptu “unified diff'i parse edip değişen dosya yollarını döndüren kısa bir Python fonksiyonu yaz ve iki edge case'i açıkla” idiyse ve her benchmark yaklaşık 128 token ürettiyse, iyi bir sonuç almak için 128 token fazla az görünüyor
    MTP hızlandırması, tahmin edilen tokenların ne kadar sık kabul edildiğine bağlı; deneyimime göre çıktının ilk kısmında kabul oranı daha yüksek oluyor, bu yüzden kısa testler yanlış pozitif hızlanma üretebilir
    llama.cpp içinde, sunucuyu yeniden başlatıp prompt göndermeye gerek kalmadan argümanları tarayan benchmark'a özel bir araç var: https://github.com/ggml-org/llama.cpp/blob/master/tools/llam...
    Model indirme bölümünde de llama.cpp'nin -hf argümanının modeli sizin yerinize indirebildiğinden bahsedilmeliydi. Yazarın deneyimini paylaşması güzel ama yeni başlayanlar için en iyi rehber olmayabilir

    • Bu yazı zaten düzgün bir geliştirici rehberi olarak yazılmamıştı. Ekran kaydı çok yıldız alınca ve nasıl kurulduğunu soran mesajlar gelmeye başlayınca, bu testi nasıl kurduğumu hızlıca yazdım
      Unclothe'un “2x hız” duyurusunu görüp “bu gerçekten kullanılabilecek kadar hızlandırıyor mu?” diye düşündüm ve kendim kurup denedim
      Geçen yıl da Devstral gibi şeylerle test etmiştim ama çok yavaş ve fazla aptalcaydı, bu yüzden kullanmayı sürdürmek istemedim; bu sefer ise sonunda hem hız hem de zeka açısından kullanılabilir seviyeye geldiğini hissettim
    • Gerçekçi olarak, rastgele kullanıcı promptlarına ek olarak yeterli bir sistem promptu ile de denemek gerekir. En az 1000 token, pratikte ise 3000 token civarı daha uygun görünüyor
      llama.cpp'de bunun için araçlar var ve doğru ölçüm yapmak için token üretiminden önce prefill eklemek gerekiyor. 32k ya da 64k gibi uzun bağlamlarda token üretim hızını ölçmek de giderek daha önemli hale geliyor
    • 128 token ile benchmark yapmak, operayı değil sadece uvertürü benchmark etmek gibi
    • Asıl probleme bakmadan “benim bilgisayarımda çalışıyor” demeye benziyor. 128 token gerçekten hiçbir şey; kısa bir selamlama yanıtından biraz daha uzun sadece
  • Daha önce ollama ve opencode kullanarak benzer bir yazı yazmıştım: https://blog.kulman.sk/running-local-llm-coding-server/

    • Ollama iyi bir seçim değil: https://sleepingrobots.com/dreams/stop-using-ollama/
      opencode sistem promptu bağlamın çok büyük bir kısmını yemiyor mu? Yerel modellerde bağlam kısıtı büyük mesele ve hatırladığım kadarıyla opencode bunun 10k kadarını ya da ona yakın bir miktarı kullanıyor
    • Gerçekte faydalı ve ollama GUI kullanırsanız muhtemelen daha da basitleştirilebilir
  • Sadece llama.cpp kullanıyorsanız bir şey indirmek için huggingface-cli zorunlu görünmüyor. -hf ... verirseniz modeli indiriyor
    İndirme konumunu değiştirmek için LLAMA_CACHE ayarlanabilir:
    LLAMA_CACHE="models" ./llama-server \
    -hf unsloth/gemma-4-31B-it-GGUF:UD-Q4_K_XL \
    ...

    • Draft model için -hfd kullanılabilir
  • Birleşik bellekli RAM büyük ama teraflops ve bant genişliği GB/s olarak orta-alt seviyedeyse, genelde en umut verici seçenek MoE oluyor. Benim ortamım olan M2 Max 96GB'ta (zeka, tok/s, bağlam derinliği) açısından şu an 1 numara DeepSeek-V4-Flash REAP25 <65gb gguf + ds4-server + pi agent
    Elbette bulut API'lerinden iyi değil ama gerekirse katlanıp kullanabileceğim kadar yeterli. İnternetsiz 4 saatlik bir uçuşta bile yerel LLM 60W çekmesine rağmen pil gayet dayandı
    REAP destekli ds4 branch'i burada: https://github.com/ljubomirj/ds4/tree/reap-compact-support
    DS4F'nin ancak 784K bağlamda 10 tok/s altına düşüp kullanılamaz hale gelmesi büyük fark yaratıyor

  • Bu tür yerel modellerin, belli bir programlama dilinde uzman olmayan kullanıcılar için gerçekten sorun çözebileceğini merak ediyorum
    Satır içi otomatik tamamlama veya birim uygulamanın ötesinde, gerçekten çalışan teknik spesifikasyonları tasarlayıp bir araya getirebildiklerinden emin değilim

  • llama.cpp/server kullanarak yerel bir LLM ayağa kaldırmak ve bunu Claude Code ya da Codex-CLI ile birlikte kullanmak nispeten kolay
    Gerekli llama server ayarları çoğu zaman farklı yerlere dağılmış oluyor; popüler birkaç açık LLM için yönergeleri burada tutuyorum: https://pchalasani.github.io/claude-code-tools/integrations/...

    • Bunu günlük kullanımda kullanıyor musun? Claude Code'un promptu çok büyük, bu yüzden yerel modellerde prompt işleme çok uzun sürüyor ve çok geçmeden bağlamı da tamamen tüketiyor
  • omlx.ai ile donanımıma uygun çeşitli MLX modellerini indirip, bu modellerle açık kaynak ve kapalı harness'leri (Claude Code, Codex) otomatik çalıştırmada epey başarılı oldum
    Hem web hem masaüstü arayüzünde mümkün olduğu için, bana göre omlx kullanıyorsanız blog yazısını takip etmenize gerek yok

    • 64GB M1 Max üzerinde oMLX ya da MLX'in llama.cpp'deki GGUF'a karşı belirgin bir üstünlüğünü görmedim
      Şimdiye kadar bulduğum Gemma 4 MLX build'leri aynı quantization düzeyinde daha yavaştı, MTP'de ise çok daha yavaştı
      Modeli seçtikten sonra llama.cpp'nin yerleşik web arayüzü oldukça iyi ve kurcalamak için LM Studio da gayet uygun
      Gemma-4 ve Qwen 3.6 için tipik opencode sistem promptunun büyük kısmı hiç gerekmiyor, hatta çıkarmak daha iyi
    • oMLX ve Pi'ye bağlamak için bir sandbox arıyorsanız bu var: https://github.com/Dotnaught/pi-sandbox
    • Bence Mac'te yerel çıkarım için son teknoloji. Regression olsa bile geliştiriciler inanılmaz hızlı tepki veriyor ve son dönemde gördüğüm en etkileyici açık kaynak projelerden biri
  • antirez'in ds4'ü üzerinde çalışan DeepSeek v4 Flash oldukça etkileyiciydi
    “Kayıtlı bilgi” açısından GPT-4 seviyesinde bir model gibi hissettiriyor ama uzun akışlı araç çağrılarında GPT-4 sınıfı modellerden daha iyi
    128GB MBP M4 Max'te üretim yaklaşık 24 t/s, prefill ise yaklaşık 200 t/s veriyor. Yavaş olmasını bekliyordum ve kod üretimi gibi işlerde gerçekten yavaş, ama basit görevler için bir makine orkestratörü olarak şaşırtıcı derecede kullanışlı
    Ajan tipi olmayan kullanımda sohbet etmek için de fazlasıyla yeterli bir model ve tamamen kendi kendine çalışan, özel kalabilen bir seçenek olma avantajına sahip
    [0]https://github.com/antirez/ds4

  • Çok tembel yapmak isterseniz terminalde Claude Code'u açın, bu yazıyı gösterin ve sadece “bunu yap” deyin

    • Artık neredeyse hiç Google araması yapmıyorum. 10 seferin 9'unda bilgi kalitesi berbat oluyor ve etraftaki spam'in içinden gereken şeyi ayıklamak zor
      Buna karşılık Claude ya tek seferde yapıyor ya da çok az düzeltmeyle hallediyor
      Bilgiye ve icraya giden kapı artık LLM ve Google Search bir dinozor gibi hissettiriyor
      Akıllı telefondan bile daha etkileyici; sanki bir yüzyıl geleceğe gitmişiz gibi geliyor bana