Birkaç ayda bir, kendi donanımımda yerel bir dil modeli çalıştırmayı denerdim. Motivasyon her seferinde aynıydı: prompt'larımın kontrol edemediğim bir sağlayıcıya gitmesini istemiyorum, hâlâ üzerinde çalıştığım şeyler için token başına ödeme yapmak istemiyorum, ve açık modellerin elimde zaten olan makinelerde neler yapabileceğini gerçekten merak ediyorum. Niyet her zaman gerçekti. Takip etmek değildi.
Her deneme benzer bir şekilde gidiyordu. Bir runtime seç (llama.cpp, Ollama, text-generation-webui, vLLM, ne istersen). Bir model dosyası seç, sonra bir nicemleme seç (Q4_K_M, Q5_K_S, IQ3_XXS, ve zaten bilmen gereken bir farkı ima eden bir düzine başka isim). Anonim olarak indirilen bir GGUF bul. Donanımına hangi flag'lerin önemli olduğunu anlamak için üç blog yazısını gözden geçir. Birkaç hafta önce derlediğin binary'nin zaten iki sürüm geride olduğunu fark et. Baştan başla. Bu döngüyü birkaç kez koşturup esasen aynı yapışma scriptini her seferinde yazdıktan sonra durdum ve düzgün yazdım.
Sonuç hydra-llm. Küçük bir CLI ve isteğe bağlı bir KDE Plasma 6 widget'ı. Altında sadece Docker'da çalışan llama.cpp, ve Hugging Face hesabı olmadan indirilen bir küratörlü topluluk-nicemlenmiş GGUF dosyaları kataloğu (Bartowski, lmstudio-community, mradermacher) var. CLI, prompt'ta gerçekten yaptığım dört şeyi yapar: list-online, download, chat ve api. Plasma widget'ı, panel'i her zaman görünür tutan benim gibi insanlar için bakışta durum bilgisi ekler.
Bunun için bir wrapper'a gerçekten ihtiyaç olup olmadığından emin değildim. Ollama var. llama.cpp var. text-generation-webui var. Cevap, hiçbirinin beni durduran tam sürtünmeleri kapsamamasıdır. Ollama çok şey gizler ve ilgilendiğim belirli bir GGUF kullanmayı zahmetli yapar. llama.cpp çıplaktır, böylece her kurulum bir flag araştırma alıştırmasıdır. text-generation-webui diğer yöne gider – grafiksel, ağır, bir script için istediğim şey değildir. İnce bir katman istedim, terminalden yaptığım tam şeyi yapan ve gerisini yoldan çekilen.
En büyük sürtünme donanımımın ne kaldırdığını önceden bilmememdi. 16GB VRAM'de 14B model için hangi nicemlemeyi seçmeliyim? her seferinde cevabını parçalamam gereken türden bir soru. hydra-llm'in bir donanım-katmanı kavramı vardır – Low, Medium, High, Beast – her biri için makul varsayılanlarla. Q4_K_M ile IQ3_XXS arasında karar vermek zorunda değilsiniz; araca hangi katmanda olduğunuzu söylersiniz, ve VRAM'inize uyan ve berbat görünmeyen bir nicemleme seçer. Bu zekice değil ama beni durduran sürtünme bu.
Katmanlar açıkça muhafazakardır. Bir katman seçimi, teorik olarak çalıştırabileceğiniz en hızlı modeli vermeyebilir, ama makinenizde kıracak bir model seçmez. Akıllı olmak isterseniz, varsayılanlar üzerine yazılabilir. Akıllı olmak istemezseniz, sadece çalışır.
Konfigürasyon üç düz katmandadır. Binary'de bir varsayılan, /etc'de sistem genelinde bir dosya ve ~/.config'da kullanıcı başına bir dosya vardır. Kullanıcı başına, sistem genelinin üzerine yazar, sistem geneli varsayılanın üzerine yazar. Include'lar, kalıtım veya şema yoktur. Bu kasıtlıydı: yerel LLM'ler için bir CLI'da istediğim son şey, anlamak için bir gün gerektiren bir konfigürasyon DSL'i.
Üç katman, gerçekte kullanıcıların konfigürasyonu üzerine yazdıklarını gördüğüm tüm yolları kapsayan tam sayıdır: makineye özgü bir şey test ediyorum, sistem yöneticisinin kendi kısıtlamaları var, ya da dağıtım makul varsayılanlar gönderiyor. Daha fazla katman, mimari uğruna mimari olurdu.
Plasma widget'ı bir model çalışıyor mu, hangi model çalışıyor ve ne kadar VRAM/RAM kullanıyor gösterir. Tıklamak bir sohbet açar. Sağ tıklamak modeli değiştirir. Ayar paneli yoktur; widget, CLI ile aynı kullanıcı başına konfigürasyonu okur. Widget istemiyorsanız, kurmayın. CLI kendinden tamamlanmıştır.
hydra-llm hiçbir sunucuya hiçbir şey göndermez, model indirme ve flag ile devre dışı bırakılabilir bir isteğe bağlı sürüm kontrolü dışında. Telemetri yoktur. Uçakta veya bir air-gap arkasındaysanız, zaten indirilmiş her şey çalışmaya devam eder. Yerel çalıştırmamın asıl nedeni budur.
Bu projenin dürüst dersi, yerel LLM'lerle başarısız olduğum "sürtünme" sorunlarının çoğunun model kalitesiyle ilgisi olmadığıdır. Varsayılanlarla, donanım farkındalığıyla, sürekli güncellenen build adımlarıyla ve kalktıktan sonra unuttuğum bir konfigürasyon formatıyla ilgisi vardı. Bu sürtünmeleri toplayıp tek bir yerde çözerseniz, deneyim "ilginç ama her gün çalıştırmayacağım"dan "aylardır kullanıyorum ve bakmıyorum"a geçer.
