Kısa video üreten bir boru hattı kurdum: Reddit’ten hikaye çekiyor, arka plana Minecraft oynanışı indiriyor, seslendirme yapıyor, altyazıyı kelime kelime yakıyor ve hepsini dikey videoda birleştiriyor. Bu zincirde bir yerde metnin düzeltilmesi gerekiyor. Reddit hikayesi olduğu gibi seslendirilemez: içinde AITA, throwaway because..., Edit: gibi okununca tuhaf duran kalıplar var, cümleler yazı diliyle kurulmuş.
Bu iş için dışarıdan bir API kullanabilirdim. Kullanmadım. Sebebi maliyet değil, akışın kendisi: boru hattı bir kez tetiklendiğinde baştan sona tek başına çalışsın istiyorum ve tek yaptığı şey elimdeki metni başka bir metne çevirmek. İnternete çıkmasına gerek olmayan bir dönüşüm için dış servise bağlanmak, zincire kırılabilecek bir halka eklemek olurdu. Ev sunucusunda bunun adı Ollama.
Tek servis, tek model, 1.9 GB
Ollama’yı kurdum, arkasından modeli çektim:
ollama pull llama3.2:3b
Model seçimi tamamen donanımdan geliyor. Sunucu, adı aksaraymaraklisi olan eski bir laptop: i7-9750H, 15 GB RAM, NVIDIA GTX 1650 ve 4 GB VRAM. Sürücü 580.178.04, Ollama 0.32.6. 3B parametreli bir modeli Q4_K_M kuantizasyonuyla indirdiğinizde diskte ~1.9 GB yer kaplıyor, bellekte ise 2.6 GB VRAM tutuyor. Bu kartta sığabilecek şey bu; 8B’lik bir modeli aynı karta zorlamak, katmanları CPU’ya taşırıp saniyede 2-3 token’a düşmek demek.
Bir ara disk şiştiğinde temizliği de buradan yaptım: sunucuda biriken 9 Ollama modelini silip sadece llama3.2:3b bıraktım, kök disk 97 GB’dan 40 GB’a indi. Model indirmek ucuz görünüyor ama her yeni denemenin karşılığı gigabaytlar; boru hattının gerçekten kullandığı model dışındakiler gereksiz ağırlık.
Ölçtüğüm şeyler
Modelin ne yaptığını anlatmak yerine bugün ölçtüğüm sayıları yazıyorum. Servis ilk kez açıldıktan sonraki ilk istek 33.6 saniyede cevap verdi — bu sürede yapılan şey üretim değil, ağırlıkların diskten VRAM’e taşınması. İkinci istek aynı istemle 0.74 saniye sürdü ve model saniyede ~49 token üretti. Yani soğuk başlangıç ile sıcak çalışma arasındaki fark, 45 kat.
Üretim anındaki kart: 2512 MiB VRAM dolu, GPU %65, sıcaklık 56 °C, güç çekişi 50.4 W. Kartın güç limiti 50 W. Yani model yazarken ekran kartı tavanında çalışıyor. Üretim bitip model bellekte beklerken bu değerler 45 °C / 4.8 W’a düşüyor, servisi durdurunca 44 °C / 4 MiB.
Buradan çıkan ilk ders şu: ısıyı üreten şey modelin bellekte durması değil, üretim anı. İkinci ders ise modelin kendi veri sayfasıyla ilgili. llama3.2’nin bağlam penceresi 128 bin token; bu kartta ollama ps çıktısı bağlamı 4096’da tuttuğunu söylüyor. Bağlam, modelin özelliği değil, sizin VRAM’inizin sınırı.
Boru hattındaki yeri
Hat, her hikaye için modeli bir kez çağırıyor. İstem şablonu dosyada duruyor ve on maddelik bir kural listesi var: hikayenin örgüsünü değiştirme, uzun cümleleri böl, AITA yerine “Am I wrong” yaz, Edit: bloklarını at, madde işaretlerini düz yazıya çevir, kendi yorumunu ekleme. Üretim ayarları da sabit: temperature 0.7, top_p 0.9 ve num_predict hikayenin kelime sayısının iki katı — modelin kendini tekrar edip uzamasını beklemek yerine üst sınırı baştan koyuyorum.
İlk gerçek denemede hikaye r/confession’dan geldi; 16.753 puan almış, 2.800 yorumu olan bir metin. Model onu sesli okunabilir hale getirdi, TTS onu seslendirdi, Whisper kelime zamanlarını çıkardı, MoviePy videoyu birleştirdi. 12 Mayıs’ta dosya saatlerine bakınca zincirin ritmi görünüyor: metin işleme saniyeler, seslendirme 15:57, video 15:59. Aynı hikayenin Türkçe sürümü için ikinci kez render aldım; 16:11’de metin, 16:12’de ses, 16:14’te video hazırdı. Üç video, 50-78 MB arası dosyalar.
Yani 4 GB’lık kartta dil modeli darboğaz değil. Hattın yavaş kısmı Whisper ve video kodlama; modelin işi toplam sürenin yanında yuvarlanacak kadar kısa.
Model olmadığında ne oluyor
Kodun bir yerinde şöyle bir davranış var: model iki denemede de cevap veremezse hata fırlatıp akışı durdurmuyor, hikayenin ham halini kullanıyor ve durumu yine SIMPLIFIED olarak işaretliyor. Hata mesajı nesnenin içinde duruyor ama boru hattı devam ediyor.
Bu tasarımın iyi tarafı, gece çalışan bir zincirin tek bir adım yüzünden tümden düşmemesi. Kötü tarafı, kalite kaybının sessiz olması: video üretilir, altyazı çıkar, kimse hata görmez — sadece metin ham haliyle seslendirilmiş olur. Otomasyonun en zor kısmı bu. Kırılan iş gürültü yapar, kırılmayan ama bozulan iş yapmaz.
Isınma, soğutma ve 5 dakikalık kural
Ollama bir isteğe cevap verdikten sonra modeli varsayılan olarak 5 dakika bellekte tutuyor. Sonraki istek hızlı gelsin diye konmuş bir varsayılan. Ama aynı 4 GB’lık kartta ComfyUI ile SDXL de çalıştırıyorum ve o model 2.6 GB VRAM tutan bir komşuyu sevmiyor. İki araç aynı kartı paylaşınca ortada bir kural gerekiyor; benim kuralım “iş bitince durdur”:
ollama stop llama3.2:3b # modeli bellekten at
sudo systemctl stop ollama # servisi kapat
Servisi boot’ta açılacak şekilde de bırakmadım. Gece 03:00’te kimsenin çağırmadığı bir model için laptopu ısıtmanın ve kartı meşgul tutmanın anlamı yok. Ölçüm de bunu doğruluyor: maliyet üretimde, beklemede değil.
Buradaki ayrıntı, soğuk başlangıcın 33 saniye olması. İnternette keep_alive ayarını uzatan yazıların çoğu, isteklerin aralıksız geldiği servislerden çıkma. Benim işim toplu: bir hikaye için model bir kez yükleniyor, işini saniyeler içinde yapıyor, sonra iki dakika video kodlamaya geçiyoruz. Bu ritimde 33 saniye yılda birkaç kez ödenen bir bedel; buna karşılık kartı saatlerce meşgul tutmak çok daha pahalı olurdu. (Ollama’nın dokümantasyonunda not düşülen bir ayrıntı da var: keep_alive istek gövdesinde verildiğinde bunu native /api uçları dinliyor, OpenAI uyumlu /v1 ucu yok sayıyor. Yani “ayarı verdim” demek, “ayar geçerli” demek değil.)
Neyi farklı yapardım
Birincisi, model seçimini indirip deneyerek yapmazdım. Dokuz model indirip dokuzunu da silmek, hem disk hem zaman kaybı; 4 GB VRAM için doğru soru “hangi model akıllı” değil, “hangisi bu karta sığar” olmalı. Bu sorunun cevabı da modelin parametre sayısı ve kuantizasyonuyla diskte duruyor: bakmadan indirmek gerekmiyor.
İkincisi, keep_alive ayarını boru hattının kendisine koyardım. Son istekten sonra modeli bırak komutunu (keep_alive: 0) çalıştırmak, “kullanınca durdurmayı hatırla” demekten daha güvenilir. Unutulan bir kural, olmayan kuraldır.
Üçüncüsü, yedek yolun sessizliğini baştan kapatırdım. Model cevap veremezse ham metne düşmesi doğru karar, ama bunun SIMPLIFIED diye işaretlenmesi yanlış. Hata mesajı log satırında kalmak yerine boru hattının sonunda “bu videonun metni sadeleştirilmedi” diye görünmeli.
Genel ders: 3B’lik bir modeli küçümsememek gerekiyor — “jargonu temizle, cümleyi böl” işini saniyelerde yapıyor ve bunun için hiçbir yere bağlanması gerekmiyor. Ama boyut sınırını da unutmamak lazım: bu model sadeleştirir, yeniden yazmaz. İkisini karıştırdığınızda fark, gece üretilen videoların altyazısında kendini gösteriyor.