Ultralytics'te YOLO modellerini sevdiğin yongada nasıl hızlandırıyoruz?
Ultralytics'in YOLO modellerini CPU'lar, GPU'lar ve uç cihazlarda hız için nasıl optimize ettiğini keşfet. Yongaları, belleği ve niceleme, füzyon ve budama gibi akıllı teknikleri açıklayacağız.

Ultralytics'te bilgisayarlı görü modelleri geliştiriyoruz; temel olarak bilgisayarlara görmeyi öğretiyoruz! Bu modelleri devasa matematiksel tarifler gibi düşün. İşlemlerden (bunlara katman diyoruz) ve ağırlık adını verdiğimiz büyük bir sayı yığınından oluşuyorlar.
Ultralytics YOLO modellerimiz görüntüleri gerçekte oldukları şey olarak işler: sayı dizileri! Her piksel, görüntüyü oluşturan her bir nokta için yalnızca renk değerleridir; yani Kırmızı, Yeşil ve Mavi miktarı (dolayısıyla RGB). Bu sayı dizilerine "tensör" diyoruz; çünkü kulağa "çok boyutlu matrisler" ifadesinden çok daha havalı geliyor, o da "sayıların üst üste dizildiği sayıların üst üste dizildiği sayılar" ifadesinden çok daha havalı geliyor.
Bir görüntüyü modelimize verdiğinde ağ üzerinden destansı bir yolculuğa çıkar. Tensörünün katman katman ilerleyip dönüşmesini, evrilmesini ve mümkün olan en güzel şekilde matematiksel olarak şekilden şekle girmesini hayal et. Bunu, sayıların birbirine karışıp kaynaştığı; bir kediyi kedi, bir arabayı araba yapan özü çıkardığı bir dans partisi gibi düşün. Bu sürece özellik çıkarımı diyoruz.
Diğer uçtan ne çıkar? Daha fazla sayı! Anlamlı sayılar. Tespit görevlerinde bunlar görüntündeki şeylerin tam olarak nerede olduğunu ve muhtemelen ne olduklarını söyler. "Hey, (x, y) koordinatlarında bunun bir köpek olma ihtimali %95!" Bu sihirli sürece çıkarım diyoruz.
Modellerimiz sihirlerini gerçekleştirebilmeden önce okula gitmeleri, yani eğitilmeleri gerekir. Eğitim kısmı, işlerin yoğunlaştığı yerdir.
Eğitim sırasında ağa her görüntü sunduğumuzda yalnızca bir yanıt almıyoruz. Ekstra yoğun iki iş yapıyoruz. İlk olarak ağın ne kadar yanıldığını hesaplıyoruz (buna kayıp diyoruz; temelde hedefin merkezinden uzaklık). İkinci olarak ve önemli kısım da bu, ağdaki her bir sayıyı (veya ağırlığı) bu kayba göre güncelliyoruz. Bunu, her ayarın ağı daha isabetli hâle getirmek üzere hesaplandığı binlerce küçük düğmeyi aynı anda ayarlamak gibi düşün.
Aslında ağı düzeltme yoluyla eğitiyoruz: Her hata ona ne YAPMAMASI gerektiğini öğretiyor ve tüm bu ağırlıkları, benzer bir görüntüyü tekrar gördüğünde doğru yanıta yaklaşacak şekilde ayarlıyoruz. Başka bir deyişle ağ, tahminleri tutturmaya başlayana kadar hatadan hataya doğru yöne küçük adımlarla ilerleyerek öğreniyor.
Kaç sayıdan söz ediyoruz? Sevimli küçük YOLO11n modelimizde birkaç milyon parametre var. Peki ya YOLO11x? Bu canavar 50 milyondan fazla parametre taşıyor! Daha fazla parametre, tıpkı pastel boyalarla çizim yapmakla tam bir sanatçı paletine sahip olmak arasındaki fark gibi, daha fazla ayrıntıyı kodlayabileceğin anlamına gelir.
Çıkarım sırasında bu parametre sayısı kritik hâle gelir. 3 milyon parametreli bir ağı çalıştırmak, mahallenin çevresinde hafif tempolu koşuya çıkmak gibidir. 50 milyon parametreli bir ağı çalıştırmaksa yanan meşaleleri çevirirken maraton koşmaya benzer.
Peki hesaplama TAM olarak nedir? Tüm bu sayı işlemleri gerçekte nasıl gerçekleşir? Bunu nasıl hızlandırırız? Peki "hesaplamayı optimize etmek" ne anlama gelir?
Çipler matematiği gerçekte nasıl yapar#
Hesaplama çiplerle gerçekleşir. Bu küçük silikon kareleri, temelde evrenin en düzenli kumdan kaleleridir. Bilgisayarının yaptığı her işlem; her toplama, her karşılaştırma, her "eğer bu, o zaman şu" işlemi fiziksel olarak silikona işlenmiştir. Çipin belirli bölgelerinde sayıları toplamak için gerçek fiziksel devreler, mantık işlemleri için de başka devreler bulunur. Farklı mahallelerin farklı matematik türlerinde uzmanlaştığı küçük bir şehir gibi düşün.
Bilgisayar bilimcisi olsan bile bu kulağa tuhaf gelebilir. Çünkü son 40 yılı, artık alt tabakayı göremeyeceğimiz kadar yükselmiş teknolojik bir lazanya gibi, katman katman soyutlama inşa ederek geçirdik. İşleri o kadar basitleştirdik ki günümüzde çoğu programcı hesaplamanın silikonda gerçekte nasıl gerçekleştiği hakkında hiçbir fikre sahip değil. Bu onların hatası değil, tasarımın sonucu!
Bu katmanları soyalım. Şu son derece basit Python kodunu ele alalım:
x = 1
if x == 1:
y = x + 1x adında bir değişken oluşturuyor, ona 1 değerini atıyor ve x, 1'e eşitse (spoiler: eşit), x'in 1 fazlası değerine sahip y'yi oluşturuyoruz. Üç satır. Kolay.
Ama işte burada ilginçleşiyor. Bu üç masum satır ile silikonda hareket eden gerçek elektronlar arasında EN AZ dört büyük çeviri katmanı gerçekleşiyor (aslında daha fazla var, fakat Dijital İçerik Yöneticimiz kelime sayımın ona şimdiden kaygı verdiğini söylüyor). Bu akıl almaz yolculuğu sana anlatayım:
Katman 1: Python → Bayt kodu İlk olarak Python kodunu okur ve bayt kodu adı verilen, bilgisayarların sindirmesinin daha kolay olduğu ancak okumaya çalışsan gözlerini kanatacak bir ara dile derler.
Katman 2: Bayt kodu → Makine kodu Python yorumlayıcısı (CPython gibi) bu bayt kodunu alır ve işlemcinin anladığı gerçek talimatlar olan makine koduna çevirir. Zarif "if x == 1" ifadenin "REGISTER'I YÜKLE, REGISTER'I KARŞILAŞTIR, SIFIR BAYRAĞI AYARLIYSA ATLAMALI" gibi bir şeye dönüştüğü yer burasıdır.
Katman 3: Makine kodu → Mikro kod Ters köşe! Modern işlemciler makine kodunu bile doğrudan yürütmez. Kodu, çipin iç bileşenlerinin işleyebileceği daha küçük işlemler olan mikro koda ayırırlar. Tek bir "ADD" talimatın birden fazla mikro işleme dönüşebilir.
Katman 4: Mikro kod → Fiziksel elektronik Sonunda silikona ulaşırız. Bu mikro işlemler, transistörlerin içinden akan gerçek elektrik sinyallerini tetikler. Milyarlarca küçük anahtar açılıp kapanır, elektronlar özenle tasarlanmış yollarda dans eder ve bir şekilde, sihirliymişçesine, 1 + 1 eşittir 2 olur.
Her katman, kendisinden alttaki katmanın akıl almaz karmaşıklığını gizlemek için vardır. Her bebeğin tamamen farklı bir dil konuştuğu ve en küçük bebeğin kelimenin tam anlamıyla kuma hapsedilmiş şimşekten yapıldığı Rus matruşkaları gibi.
İroni şu: Python'daki bu üç satır muhtemelen MİLYONLARCA transistör anahtarını tetikliyor. Ancak bu soyutlamalar sayesinde bunların hiçbirini düşünmene gerek yok. Yalnızca "y = x + 1" yazar ve derinlerde bir yerde, silikonda sihrin gerçekleştiğine güvenirsin.
Mimari#
Her işlem silikonda fiziksel olarak uygulanır ve bunun çipte NEREDE gerçekleştiği tamamen çipin topolojisine bağlıdır. Elektronlar için şehir planlaması gibi düşün. Toplayıcı burada, çarpan orada yaşar ve hepsinin birbiriyle verimli şekilde iletişim kurması gerekir.
Piyasada her biri farklı amaçlar için tasarlanmış yüzlerce farklı çip var. Aralarındaki fark ne? Topoloji; işlemlerin fiziksel alanda nasıl konumlandırıldığı ve uygulandığı. Buna mimari diyoruz ve gerçekten çok sayıda mimarimiz var:
- x86 (Intel ve AMD) - Masaüstü bilgisayar kullanımının büyük atası; karmaşık ama güçlü
- ARM - Telefonuna ve giderek daha fazla dizüstü bilgisayara güç verir; verimlilik için tasarlanmıştır
- RISC-V - Her yerde ilgi gören açık kaynaklı asi
- PowerPC - IBM'in canavarı; hâlâ oyun konsollarında ve sunucularda çalışıyor
- MIPS - Akademik dünyanın favorisi; basit ve zarif
- SPARC - Sun Microsystems'ın (şimdi Oracle'ın) yüksek performanslı hesaplamaya katkısı
- GPU mimarileri (NVIDIA'nın CUDA çekirdekleri, AMD'nin RDNA'sı) - Paralel işleme canavarları
Her mimari yalnızca transistörlerini farklı şekilde düzenlemekle kalmaz, aynı zamanda farklı bir dil konuşur. Bu makinelere talimat göndermek için kullandığımız soyutlamalar tamamen farklıdır. Birine yol tarifi yazman gerektiğini düşün; ancak kullandığı arabaya bağlı olarak Fransızca, Mandarin dilinde yazman veya ifadeli dans yapman gerekebilir.
Silikonun kalp atışı#
Çiplerimizin yakıtı elektronlardır; çipe akan ve hesaplama için gereken enerjiyi sağlayan elektrik. Ancak tek başına enerji yeterli değildir. Bir çipin gerçekten çalışması, verileri karmaşık topolojisi boyunca hareket ettirmesi için her şey tek bir kritik bileşene bağlıdır: saat. Elektronların belirli zamanlarda belirli yollardan akmasını sağlayan şey budur. Bu olmadan, hiçbir şey yapmayan enerjili bir silikona sahip olursun.
Milyarlarca bileşenin kusursuz uyum içinde hareket etmesi gereken devasa bir gösteriyi koordine etmeye çalıştığını hayal et. Bir ritim olmadan kaos çıkardı. Saatin işlemcin için yaptığı tam olarak budur. Saat, inanılmaz derecede istikrarlı bir hızda titreşen ve saniyede milyarlarca kez elektrik darbeleri gönderen bir kristaldir.
"3.5 GHz işlemci" dendiğinde GHz (gigahertz), saat hızını, yani saniyede 3,5 milyar vuruşu ifade eder. Her vuruşa saat çevrimi denir ve bu, bilgisayardaki temel zaman birimidir.
Saat çevrimleri arasında HİÇBİR ŞEY gerçekleşmez. Tüm bilgisayar donar ve bir sonraki vuruşu bekler. Bu, evrenin en uç kırmızı ışık-yeşil ışık oyunu gibidir. Her "yeşil ışıkta" (saat darbesinde):
- Bileşenler arasında veri hareket eder
- Hesaplamalar yürütülür
- Mantıksal kararlar alınır
- Bellek okunur veya belleğe yazılır
Bazı işlemler bir çevrim sürer (basit bir toplama), bazılarıysa birçok çevrim sürer (bölme veya RAM'den veri alma). Bu süreç kusursuz bir koreografiyle gerçekleşir; milyarlarca bileşen, durmak bilmeyen bu ritme senkronize olarak kendi işlemlerini gerçekleştirir.
Kristali daha hızlı titreştirerek işlemcine hız aşırtma uygulayabilirsin; her şey daha hızlı gerçekleşir, ancak daha fazla ısı üretir ve daha kararsız hâle gelir. Fazla zorlarsan bilgisayarın çöker; çünkü elektronlar kelimenin tam anlamıyla ritme yetişemez.
Eskiden bu işlemler oda büyüklüğündeki makinelerle uygulanırdı. Ancak tüm bu hesaplamayı yapan bileşenler şaşırtıcı derecede basittir: Bunlar yalnızca anahtarlardır. Açık veya kapalı anahtarlar.
Bu anahtarlardan yeterince fazlasını doğru düzende birbirine bağladığında hesaplamayı elde edersin. Tüm dijital devrim, gelişmiş bir anahtar düzenine indirgenebilir.
Bu basitlik, anahtarların varsa — herhangi türde anahtarların — bir bilgisayar inşa edebileceğin anlamına gelir. İnsanlar su boruları ve valflerden, dominolardan, LEGO bloklarından, misketlerden ve hatta Minecraft'taki redstone'dan çalışan bilgisayarlar yaptı.
İlkeler 1940'lardan beri değişmedi. Yalnızca anahtarları son derece küçültme konusunda inanılmaz derecede ustalaştık. Telefonunun hesaplama gücü, insanları Ay'a gönderen tüm bilgisayarlardan daha fazla ve cebine sığıyor; çünkü anahtarları atomik ölçekte yapmayı öğrendik.
Milyonlarca parametreli sinir ağlarını çalıştırırken bu küçük anahtarları saniyede milyarlarca kez çeviriyor ve hepsini o kristal kalp atışına kusursuz şekilde senkronize ediyoruz. Her ağırlık güncellemesi, her matris çarpımı, her aktivasyon fonksiyonu saatin ritmine ayak uyduruyor.
Model eğitiminin bilgisayarını kalkışa geçmeye çalışıyormuş gibi seslendirmesine şaşmamak gerek!
Sinir ağlarını BRRRRRR yaptırmak#
Pekâlâ, kristalin ritmiyle dans eden milyarlarca anahtara sahip bu çiplerimiz var ve üzerlerinde milyonlarca parametreli sinir ağlarını çalıştırmak istiyoruz. Kolay olmalı, değil mi? Sayıları çipe atıp çalıştır gitsin!
Sinir ağlarını hızlı çalıştırmak; buzdolabının üç sokak ötede, yalnızca bir tavanın olduğu ve her malzemenin 225 kilogram geldiği bir mutfakta beş aşamalı yemek pişirmeye çalışmak gibidir. Matematiğin kendisi en büyük sorun değil; diğer her şeydir.
Mimari uyumsuzluğu#
Çoğu çip sinir ağlarını değil, Microsoft Word'ü çalıştırmak için tasarlandı. CPU'n, ömrünü if ifadeleri ve döngüleri çalıştırarak, arada bir de vergilerini hesaplayarak geçireceği düşüncesiyle üretildi (süper bilgisayarların bile duygusal olarak yorucu bulduğu tek hesaplama). Sıralı işlemler için optimize edilmiştir: bunu yap, sonra şunu, ardından ötekini.
Ancak sinir ağları tamamen farklıdır. HER ŞEYİ AYNI ANDA yapmak isterler. Eğitim sırasında tahminlerinin ne kadar hatalı olduğuna göre milyonlarca ağırlığı güncellersin. Çıkarımda (eğitilmiş modeli gerçekten kullanırken) verileri milyonlarca hesaplamadan aynı anda geçirirsin. Bir milyon sayıyı başka bir milyon sayıyla çarpman gerektiğini düşün. CPU'n, sağ olsun, bunları çok hızlı ama son derece metodik bir muhasebeci gibi teker teker yapmak ister.
GPU'ların yapay zekâ hesaplamasının omurgası hâline gelmesinin nedeni budur. GPU'lar, milyonlarca pikselin rengini aynı anda hesaplaman gereken video oyunları için tasarlandı. Meğer piksel renklerini hesaplamakla sinir ağı matematiği yapmak şaşırtıcı derecede benzer şeylermiş: İkisi de devasa miktarda veri üzerinde aynı işlemi paralel olarak gerçekleştirmeyi içeriyor.
Ancak GPU'lar bile sinir ağları için kusursuz değildir. Bu nedenle şirketler artık uzmanlaşmış yapay zekâ çipleri (TPU'lar, NPU'lar ve PU ile biten diğer tüm kısaltmalar) geliştiriyor. Bu çipler, tek bir amaçla, sinir ağlarını hızlı çalıştırmak üzere sıfırdan tasarlanır. Yalnızca tek bir yemek pişirmeyi bilen, ama onu insanüstü hızda hazırlayan bir şef tutmak gibidir. CPU'n matris işlemlerini sıralı biçimde gerçekleştirirken zorlanır, GPU'n bunları paralel olarak oldukça iyi işler; bu uzmanlaşmış çipler ise matrisleri kahvaltıda, öğle ve akşam yemeğinde tüketir.
Bellek duvarı (Veya: Bitleri taşımak matematikten neden daha zor)#
Modern sinir ağı hesaplamalarında verileri gerçekten HESAPLAMAKTAN çok, onları HAREKET ETTİRMEYE zaman ve enerji harcıyoruz.
Bilgisayar çipini ışık hızında çalışan parlak bir matematikçi gibi düşün; ancak tüm referans kitapları şehrin farklı yerlerindeki binalarda saklanıyor. Her denklemi anında çözebilir ama önce sayıları alması gerekir ve bu yolculuk sonsuza kadar sürer.
Çipin iki sayıyı tek bir saat çevriminde (hatırlarsan bu, saniyedeki milyarlarca vuruştan biridir) çarpabilir. Yıldırım hızında! Peki bu sayıları bellekten çipe almak? YÜZLERCE çevrim sürebilir. Matematikçinin bir problemi bir saniyede çözebildiğini, ancak kütüphaneye gidip dönmesinin beş dakika sürdüğünü düşün.
Bunun nedeni mesafedir (ve alandır). Elektrik hızlı hareket eder ama sonsuz hızda değil. Verilerin çip üzerinde katetmesi gereken mesafe arttıkça gereken süre de artar. Bilgisayar tasarımcıları bunu farklı uzaklıklarda birden fazla depolama konumuna sahip olmak gibi bir bellek hiyerarşisi oluşturarak çözdü:
- Register'lar (doğrudan hesaplama birimlerinin içine yerleştirilir): Matematikçinin masası. Anında erişim! Ancak çok küçüktür; burada yalnızca yaklaşık 32 sayı tutabilirsin. Önündeki yapışkan notlar gibi.
- L1 Önbelleği (mikrometre uzaklıkta): Ofisteki kitaplık. Bir şeyi almak 3-4 çevrim sürer. Buraya birkaç bin sayı sığdırabilirsin.
- L2 Önbelleği (milimetre uzaklıkta): Koridorun aşağısındaki dosya dolabı. 10-15 çevrim sürer ve birkaç milyon sayı alabilir.
- L3 Önbelleği (çipin karşı tarafında): Aşağı kattaki depo odası. 30-50 çevrim sürer ve on milyonlarca sayı tutar.
- RAM (tamamen farklı bir çipte): Şehrin öbür ucundaki depo. 100-300 çevrim sürer. Milyarlarca sayın burada yaşar.
- SSD/Sabit disk (kablolarla bağlı): Tamamen başka bir şehir. Milyonlarca çevrim sürer. Muazzam depolama, buzul hızı.
Kesin yapılar değişir; telefonunun çipi L3 önbelleğini atlayabilirken sunucu CPU'sunda bundan çok büyük miktarlarda bulunabilir. Ancak ilke aynıdır: Daha yakındaki bellek daha hızlı ama daha küçüktür.
Şimdi sinir ağları için işin can yakıcı kısmı burada başlıyor. Ultralytics YOLO modelinin 50 milyon parametreye sahip olduğunu düşün (bu arada ChatGPT'nin milyarlarca parametresi var). Bellek ile hesaplama birimleri arasında gidip gelmesi gereken 50 milyon sayı demek. Her sayı yalnızca 4 bayt olsa bile sisteminde taşınması gereken 200 megabayt veri var.
Çip her sayıyı tek bir çevrimde işleyebilir; ancak bu sayıyı RAM'den almak 100 çevrim sürüyorsa zamanının %99'unu teslimatı bekleyerek geçiriyorsun. Bu, trafik sıkışıklığında duran bir Formula 1 yarış arabası gibi. Tüm bu hesaplama gücü orada oturuyor ve verilerin gelmesini bekliyor.
İşte kritik nokta: modern hesaplamadaki DARBOĞAZ budur. Buna von Neumann darboğazı denir. Çipleri matematikte hızlandırmak görece kolaydır. Belleği hızlandırmaksa fiziksel sınırlara dayanıyor. Yapay zekâdaki performans optimizasyonlarının neredeyse TAMAMININ bellek düzeyinde gerçekleşmesinin nedeni budur. Mühendisler sinir ağlarını hızlandırırken nadiren matematiği hızlandırırlar; veriyi daha az taşımanın, önbelleğe daha iyi almanın veya ona daha akıllıca erişmenin yollarını bulurlar.
Modern yapay zekâ çipleri yalnızca hesaplama hızına odaklanmaz; bellek bant genişliğine ve veri taşıma stratejilerine takıntılıdır. Verileri önceden getirir, önbellekte bulunan değerleri yeniden kullanır ve bellek yolculuklarını en aza indirecek şekilde hesaplamaları düzenlerler. Yapay zekâ donanımı yarışını kazananlar en hızlı hesap makinelerine sahip olanlar değil; bu hesap makinelerini verilerle beslemeyi çözenlerdir. Tüm oyun, bellek erişim düzenlerini optimize etmekten ibarettir.
Her veri biti taşıdığında enerji harcarsın. Çok değil, pikojul düzeyinden söz ediyoruz; ancak saniyede terabaytlar taşıdığında bu miktar HIZLA birikir. Hatta bir biti çip üzerinde 1 mm taşımak, gerçek hesaplamayı yapmaktan daha fazla enerji kullanır!
Sinir ağlarını eğitirken dizüstü bilgisayarının jet motoru gibi ses çıkarmasının nedeni budur. Isıyı üreten matematik değil, veri hareketidir. Her parametre güncellemesi, her gradyan hesaplaması, her ileri geçiş odanı kelimenin tam anlamıyla ısıtıyor.
Modern yapay zekâ hızlandırıcıları temelde termodinamik egzersizleridir. Çip erimeden önce ne kadar hesaplamayı sığdırabiliriz? Isıyı ne kadar hızlı uzaklaştırabiliriz? Bu, hız aşırtma yapmaya benzer; ancak saat her zaman 11'de ve biz yalnızca yangın çıkarmamaya çalışıyoruz.
Çözüm? Mimari farkındalıklı tasarım#
En hızlı sinir ağları mutlaka en akıllı olanlar değildir; çipler düşünülerek tasarlananlardır. Bunlar:
- Verileri mümkün olduğunca yerel tutar
- Hesaplamaları takıntılı bir şekilde yeniden kullanır
- Donanım yetenekleriyle kusursuz şekilde hizalanır
- Bellek hareketini ne pahasına olursa olsun en aza indirir
Bu, "malzemeleri yerel marketinden kullan" diyen bir tarifle baharatları Tibet'ten, peyniri Fransa'dan ve suyu Antarktika'dan ithal etmeni gerektiren bir tarif arasındaki fark gibidir. İkisinin de tadı güzel olabilir ama biri kesinlikle daha pratiktir.
Sinir ağlarını hızlı çalıştırmanın bir sanat biçimi olmasının nedeni de budur. İyi matematiğe sahip olmak yetmez; donanımı anlaman, bellek hiyerarşisine saygı duyman ve mimariyle kusursuz bir uyum içinde hareket etmen gerekir.
Bilgisayar biliminin fizik, mühendislik ve saf sihirbazlıkla buluştuğu dünyaya hoş geldin. Bir sayıyı taşımanın onunla hesaplama yapmaktan daha pahalı olduğu dünyaya. Paralelliğin hızlı, senkronizasyonun ise ölüm olduğu dünyaya. En büyük düşmanının karmaşıklık değil, mesafe olduğu dünyaya.
YOLO'yu nasıl hızlandırıyoruz#
Bir YOLO modeli eğittiğinde eğitim kurulumunda harika çalışan bir sinir ağı elde edersin. Ancak işin aslı şu: Oyun GPU'n, iPhone'un ve güvenlik kamerasındaki küçük çip tamamen farklı diller konuşur. Farklı güçlü ve zayıf yönleri, verileri işleme konusunda da birbirinden çok farklı yaklaşımları vardır.
Şöyle düşün: Bir GPU'nun aynı anda çalışabilen binlerce çekirdeği vardır; paralel işleme için geliştirilmiştir. Buna karşılık mobil çipte özellikle yapay zekâ işlemleri için tasarlanmış özel devreler bulunabilir, ancak yalnızca belirli matematik türlerini işleyebilir. Kapı zilindeki kamera gibi uç cihazın mı? LED ampulden daha küçük bir güç bütçesiyle yapay zekâ çalıştırmaya uğraşıyor.
Ultralytics'te, her biri farklı donanımlar için optimize edildiğinden bir düzineden fazla farklı dışa aktarma biçimini destekliyoruz. Mesele çok fazla seçeneğe sahip olmak değil. SENİN özel ihtiyaçların için doğru seçeneğe sahip olmak.
İşlemleri birleştirme: Daha az kaynakla daha fazlasını yapmak#
Özgün YOLO modelinde birçok işlem ardışık olarak gerçekleşir. Örneğin önce evrişim yapabilir, ardından sonuçları normalleştirip aktivasyon fonksiyonu uygulayabiliriz. Bunlar, her biri kendi bellek okuma ve yazmalarını gerektiren üç ayrı adımdır.
Ama akıllıca olan kısım şu: Bu işlemleri tek bir adımda birleştirebiliriz. YOLO'yu dağıtım için dışa aktardığımızda bu işlemleri birbirine kaynaştırırız. Şunun yerine:
- Evrişimi hesapla → Belleğe kaydet
- Bellekten yükle → Normalleştir → Belleğe kaydet
- Bellekten yükle → Aktivasyonu uygula → Belleğe kaydet
Şunu yaparız:
- Evrişim + normalleştirme + aktivasyonu hesapla → Belleğe kaydet
640×640 görüntü işleyen tipik bir YOLO modeli için bu basit yöntem, gereksiz bellek aktarımlarından gigabaytlarcasını ortadan kaldırır. Cep telefonunda bu, akıcı gerçek zamanlı tespit ile can sıkıcı gecikme arasındaki farktır.
Daha küçük sayılar kullanmak: Nicemleme sihri#
YOLO, nesneleri doğru şekilde algılamak için aslında son derece hassas sayılara ihtiyaç duymaz. Eğitim sırasında her ağırlığı temsil etmek için 32 bit kullanıyoruz; bu, bir sandviç için malzemeleri ölçmek üzere bilimsel hesap makinesi kullanmaya benziyor. Gerçek dağıtımda ise 8 bit fazlasıyla yeterli.
Buna niceleme denir ve en güçlü optimizasyon tekniklerimizden biridir. Daha küçük sayılar kullanarak:
- Model %75 küçülür (Ultralytics YOLO11x için 200 MB'tan 50 MB'a)
- Çoğu cihazda 2-4 kat daha hızlı çalışır
- Çok daha az güç kullanır (telefonunun pili sana teşekkür eder)
YOLO'daki tüm katmanlar bu azaltmaya aynı derecede duyarlı değildir. Temel kenarları ve şekilleri algılayan ilk katmanlar mı? Oldukça dayanıklıdır; 8 bitlik sayıları sorunsuzca kullanabiliriz. "Bu bir kedi mi yoksa köpek mi?" kararını veren son algılama katmanları ise biraz daha fazla hassasiyet gerektirir. Bu nedenle hassasiyeti katman katman ayarlıyor, doğruluğu korumak ve hızı en üst düzeye çıkarmak için yalnızca gerektiği kadar bit kullanıyoruz.
Dikkatli bir nicelemeyle Ultralytics YOLO'nun özgün doğruluğunun %99,5'ini korurken telefonlarda 3 kat daha hızlı çalıştığını gördük. Araştırma modeli ile gerçek dünyada gerçekten kullanabileceğin bir şey arasındaki fark budur.
En iyi algoritmayı seçme#
Aynı matematiksel işlemi gerçekleştirmenin onlarca farklı yolu vardır. Basit bir evrişim (YOLO'nun temel işlemi) tamamen farklı algoritmalar kullanılarak hesaplanabilir ve en iyi seçim, kullandığın donanıma ve girdi boyutuna bağlıdır.
YOLO'yu dışa aktarırken optimizasyon çerçevemiz aslında farklı algoritmaları test eder ve senin özel durumun için en hızlı olanı seçer. Bu, aynı hedefe giden birden fazla rota arasından mevcut trafik koşullarına göre seçim yapmak gibidir. GPU'da birçok pikseli aynı anda işleyen bir algoritma kullanabiliriz. CPU'da ise sıralı işleme için optimize edilmiş bir algoritmayı tercih edebiliriz. Matematik aynıdır, ancak yürütme stratejisi tamamen farklıdır.
Bellek: Gizli darboğaz#
Modern bilişimde asıl darboğazın belleğin olduğundan nasıl bahsettiğimizi hatırlıyor musun? Bu, özellikle YOLO için geçerlidir. Modelde 50 milyon parametre olabilir ve çıkarım sırasında gigabaytlarca ara sonuç oluşturur. Tüm bu verileri taşımak çoğu zaman gerçek hesaplamadan daha yavaştır.
Bellek hareketini en aza indirmek için çeşitli yöntemler kullanıyoruz:
Akıllı Zamanlama: Veriler hâlâ hızlı önbellek belleğindeyken hemen kullanılacak şekilde işlemleri düzenliyoruz. YOLO'nun özellik piramidi ağı için bu, bellek trafiğini %40 azaltır.
Tiling: Görüntünün tamamını tek seferde işlemek yerine, onu önbelleğe sığan daha küçük parçalara bölüyoruz. Böylece işlemci, yavaş ana bellekten sürekli veri çekmek yerine hızlı ve yerel bellekle çalışabiliyor.
Arabellek Yeniden Kullanımı: Ara sonuçlar için sürekli yeni bellek oluşturmak yerine aynı bellek arabelleklerini yeniden kullanıyoruz. Bu inanılmaz derecede verimli; YOLO'nun tamamı, yalnızca yeniden kullanılabilir bir dizi arabellekle çalışabilir.
Budama: Az çoktur#
İşte şaşırtıcı bir gerçek: YOLO modelleri çoğu zaman gereğinden karmaşıktır. Birçok katmandaki kanalların %30'unu doğruluk üzerinde neredeyse hiç etkisi olmadan kaldırabiliriz. Bu yalnızca modeli küçültmek değildir; gerçekleştirilecek hesaplama sayısı gerçekten azaldığı için modeli hızlandırır.
Süreç oldukça zariftir: ağın nihai algılama sonuçlarına en az katkıda bulunan bölümlerini analiz eder, bunları kaldırır ve ardından telafi etmesi için modeli ince ayardan geçiririz. Budanmış bir YOLO11m modeli, özgün doğruluğunun %99'unu korurken %30 daha hızlı olabilir. Pille çalışan cihazlarda bu verimlilik artışı, saatlerce ek çalışma süresi sağlayabilir.
Donanım hızlandırma: Her çipin güçlü yönlerinden yararlanma#
Farklı işlemciler farklı işlerde iyidir ve performans farkları çarpıcıdır. Aynı YOLO11n modeli şu süreleri alır:
- Modern bir Intel CPU'da kare başına 45 milisaniye
- Bir NVIDIA RTX GPU'da 4 milisaniye
- Üst düzey bir telefon işlemcisinde 22 milisaniye
- Bir Google Coral edge TPU'da 15 milisaniye
Bunlar yalnızca saat hızlarından kaynaklanan hız farkları değildir; temel mimari farklılıkları yansıtır. GPU'larda paralel çalışan binlerce çekirdek bulunur; bu, YOLO'nun evrişimleri için mükemmeldir. Mobil NPU'larda özellikle sinir ağları için tasarlanmış özel devreler vardır. CPU'lar her işe koşan, esnek ancak özelleşmemiş işlemcilerdir.
Optimizasyonun anahtarı, YOLO'nun işlemlerini her çipin en iyi yaptığı işlerle eşleştirmektir. GPU, aynı işlemi çok sayıda veri üzerinde eş zamanlı olarak gerçekleştirmeyi sever. Mobil bir NPU yalnızca belirli işlemleri destekleyebilir, ancak bunları inanılmaz verimli şekilde yürütür. Bir edge TPU yalnızca 8 bitlik tam sayılarla çalışır, ancak bu kısıt içinde olağanüstü bir hıza ulaşır.
Derlemenin sihri#
Bir YOLO modelini dışa aktardığında perde arkasında dikkate değer bir şey gerçekleşir. Dosya biçimini yalnızca dönüştürmeyiz; modeli hedef donanımın için özel olarak derleriz. Bu, Google Translate ile ana dili o olan bir konuşmacı arasındaki farka benzer. Derleme süreci:
- Modelini analiz eder ve yapısını ve gereksinimlerini anlamaya çalışır
- Donanımının özelliklerini dikkate alır – neleri iyi yaptığına ve hangi konularda zorlandığına bakar
- Donanımının yerel dilini konuşan optimize edilmiş kod oluşturur
Derleyici, işlemcinin önbelleğini daha iyi kullanmak için işlemleri yeniden düzenleyebilir, çipinin desteklediği özel talimatları seçebilir veya en iyi optimizasyon stratejisini bulmak için makine öğrenmesinden yararlanabilir. Evet, yapay zekâyı yapay zekâyı optimize etmek için kullanıyoruz; gelecek burada!
Bu derleme adımı performansta 10 kat fark yaratabilir. Aynı YOLO modeli genel kodla ağır ağır çalışabilirken, düzgün şekilde optimize edilmiş talimatlarla uçabilir.
Gerçek dünyada edge dağıtımı#
YOLO gerçek dünyayla, özellikle de edge cihazların zorlu dünyasıyla buluştuğunda neler olduğundan bahsedelim. Nesne algılama için YOLO'yu 7/24 çalıştırması gereken bir güvenlik kamerası düşün. Bu kamera zorlu kısıtlamalarla karşı karşıyadır:
- Bellek: Toplamda belki yalnızca 512 MB ila 2 GB RAM
- Güç: Çoğu zaman yalnızca 2-5 watt (telefon şarj cihazından daha az)
- Soğutma: Fan yok, yalnızca pasif ısı dağıtımı
- Güvenilirlik: Çökmeden sürekli çalışması gerekir
Optimizasyonun pratikte sağladığı sonuç şu. YOLO11s çalıştıran bir güvenlik kamerası:
- Özgün model: 15 watt, 85°C'de aşırı ısınarak çalışıyor, 20 FPS elde ediyor
- Niceleme ve budama ile optimize edilmiş: 3 watt, rahatça 45°C'de çalışıyor, 25 FPS elde ediyor
Performansı gerçekten artırırken güç tüketimini %80 azalttık! Aşırı ısınan ve pilleri tüketen bir cihazla yıllarca güvenilir şekilde çalışan bir cihaz arasındaki fark budur.
Önemli olan doğru ödünleşimleri seçmektir. Edge cihazlarda genellikle:
- INT8 nicelemesi kullanırız (daha az hassasiyet, çok daha az güç)
- Etkinlik düşük olduğunda daha az kare işleriz
- Isıyı yönetmek için işi farklı işlemciler arasında dağıtırız
- Modelleri tamamen hızlı belleğe sığacak kadar küçük tutarız
Optimizasyon süreci#
Ultralytics olarak optimizasyona sistematik bir yaklaşımla ilerliyoruz. Önce zamanın gerçekten nerede harcandığını anlamak için modelin profilini çıkarıyoruz. Çoğu zaman darboğazlar beklediğin yerde değildir. Belki zamanın %80'i yalnızca birkaç katmanda harcanıyordur veya bellek aktarımları hesaplama süresine hâkimdir.
Ardından optimizasyonları yinelemeli olarak uygularız:
- En büyük darboğazlarla başlarız
- Her seferinde tek bir optimizasyon uygularız
- Hem hız artışını hem de doğruluk üzerindeki etkiyi ölçeriz
- İyi ödünleşimler sağlayan optimizasyonları koruruz
- Hedeflerimize ulaşana kadar tekrarlarız
Örneğin, YOLO11m'nin telefonda dağıtımı için:
- Temel durum: kare başına 200 ms, 200 MB model
- Nicelemeden sonra: kare başına 80 ms, 50 MB model
- Budamadan sonra: kare başına 60 ms, 35 MB model
- İşlem birleştirmeden sonra: kare başına 45 ms, 35 MB model
Her adım, özgün doğruluğun %99'undan fazlasını korurken performansı artırır. Sonuç mu? Cebine sığan bir cihazda gerçek zamanlı nesne algılama.
Gelecek: Heterojen bilişim#
Modern cihazlar birden fazla işlemciyi birlikte kullanma konusunda giderek akıllanıyor. Telefonunda yalnızca bir işlemci yok; her biri farklı görevlerde uzmanlaşmış birkaç işlemci var:
- Kamera sensöründe ön işleme için bir ISP (Görüntü Sinyali İşlemcisi) bulunur
- NPU (Sinirsel İşleme Birimi), YOLO çıkarımını çalıştırır
- CPU, karmaşık mantığı ve koordinasyonu yönetir
- GPU, sonuçları ekranda görüntüler
YOLO optimizasyonunun geleceği, modelin bu işlemciler arasında akıllıca bölüştürülmesiyle ilgilidir. Belki NPU ana evrişimleri yürütür, CPU son algılama mantığını işler ve GPU sonuçları görselleştirir. Her işlemci en iyi yaptığı işi gerçekleştirir ve böylece tek bir işlemcinin sağlayabileceğinden daha verimli bir işlem hattı oluşturulur.
YOLO'yu kullanılabilir işlemciler arasında bölmenin en iyi yolunu otomatik olarak belirleyen, yalnızca işlemcilerin yeteneklerini değil, aralarında veri taşımanın maliyetini de dikkate alan akıllı bölümleme algoritmaları geliştiriyoruz.
Özetle#
YOLO modellerini optimize etmek yalnızca dosya biçimlerini dönüştürmekle ilgili değildir; son teknoloji yapay zekâyı gerçek dünyada gerçekten çalışan bir şeye dönüştürmekle ilgilidir. Niceleme (daha küçük sayılar kullanma), budama (gereksiz bölümleri kaldırma), işlem birleştirme (adımları birleştirme) ve akıllı bellek yönetimi gibi tekniklerle doğruluğu korurken performansta 10-100 kat iyileşme elde ediyoruz.
Dikkat çekici olan ne mi? Evrensel bir "en iyi" optimizasyon yoktur. Sınırsız güce sahip bir bulut sunucusu, pille çalışan bir drone'dan farklı optimizasyonlara ihtiyaç duyar. Özel bir yapay zekâ çipine sahip bir telefon, Raspberry Pi'dan farklı bir yaklaşım gerektirir. Ultralytics'in bu kadar çok dışa aktarma seçeneği sunmasının nedeni budur; her biri farklı senaryolar için optimize edilmiştir.
Ele aldığımız her optimizasyonun tek bir amacı vardır: bilgisayarlı görüye her yerde erişilebilmesini sağlamak. İster akıllı bir kapı zili, ister bir drone uygulaması, ister büyük bir bulut hizmeti geliştiriyor ol, YOLO'nun kısıtların içinde çalışmasını sağlayacak araçları sunuyoruz.
Ultralytics ile bir YOLO modelini dışa aktardığında yalnızca bir dosya kaydetmiş olmazsın. Sinir ağlarını pratik hâle getirme konusundaki yıllarca süren araştırmadan yararlanırsın. Son teknoloji bir yapay zekâ modelini gerçek donanımda, gerçek kısıtlarla çalışabilen ve gerçek sorunları çözebilen bir şeye dönüştürürsün.
Ultralytics olarak yaptığımız şey budur. Yapay zekâ araştırmaları ile pratik dağıtım arasındaki boşluğu kapatıyoruz. Bilgisayarlı görünün her yerde çalışmasını sağlıyoruz; çünkü yapay zekânın geleceği yalnızca en iyi modellere sahip olmakla değil, bu modelleri gerçek dünyada kullanışlı hâle getirmekle ilgilidir.









