Ultralytics'te YOLO modellerini tercih ettiğin çipte nasıl hızlandırıyoruz?
Yongaların, belleğin ve saat hızlarının YOLO hızını nasıl etkilediğini; niceleme, operatör birleştirme ve budamanın modelleri CPU'larda, GPU'larda ve uç cihazlarda nasıl hızlandırdığını öğren.
Francesco Mattioli20 dakikalık okuma
Ultralytics olarak bilgisayarlı görü modelleri geliştiriyoruz; temelde bilgisayarlara görmeyi öğretiyoruz! Bu modelleri devasa matematiksel tarifler gibi düşünebilirsin. İşlemlerden (bunlara katman diyoruz) ve ağırlık adını verdiğimiz kocaman bir sayı yığınından oluşuyorlar.
Ultralytics YOLO modellerimiz görüntüleri oldukları gibi, yani sayı dizileri olarak işler! Her piksel aslında yalnızca renk değerlerinden, görüntüyü oluşturan her bir noktanın Kırmızı, Yeşil ve Mavi (RGB) miktarından ibarettir. Bu sayı dizilerine “tensör” diyoruz; çünkü kulağa, “çok boyutlu matrisler” ifadesinden çok daha havalı gelen “üst üste yığılmış sayıların üst üste yığılmış sayıları” ifadesinden bile daha havalı geliyor.
Bir görüntüyü modelimize verdiğinde, görüntü ağ boyunca destansı bir yolculuğa çıkar. Tensörünün katman katman ilerlediğini; dönüşerek, evrişimden geçerek ve mümkün olan en güzel şekilde matematiksel olarak şekillenerek yol aldığını hayal et. Bunu, sayıların bir araya gelip kaynaştığı ve bir kediyi kedi, arabayı araba yapan özelliği çı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 bu sayılar, görüntünde bir şeyin tam olarak nerede olduğunu ve muhtemelen ne olduğunu söyler. “Hey, (x, y) koordinatlarında bir köpek olma ihtimali %95!” Bu sihirli sürece çıkarım diyoruz.
Modellerimiz sihirlerini gösterebilmeden önce okula gitmeleri, yani eğitilmeleri gerekir. İşlerin kızıştığı yer eğitim aşamasıdır.
Eğitim sırasında ağa her görüntü gösterdiğimizde yalnızca bir yanıt almıyoruz. Çok yoğun iki işlem yapıyoruz. İlk olarak, ağın ne kadar yanıldığını hesaplıyoruz (buna kayıp diyoruz; temelde hedefin ne kadar uzağında olduğumuzu gösteriyor). İkinci ve önemli olan kısımda ise bu kayba bağlı olarak ağdaki her bir sayıyı (veya ağırlığı) güncelliyoruz. Bunu, her ayarı ağı daha isabetli kılacak şekilde hesaplanan binlerce küçük düğmeyi aynı anda ayarlamak gibi düşünebilirsin.
Özünde ağı düzeltmeler yoluyla eğitiyoruz: her hata, ne YAPMAMASI gerektiğini öğretiyor ve benzer bir görüntüyle tekrar karşılaştığında doğru yanıta yaklaşması için tüm ağırlıkları ayarlıyoruz. Kısacası ağ, tahminleri isabetli hâle gelene kadar her hatasında doğru yöne doğru küçük adımlar atarak öğreniyor.
Kaç sayıdan mı bahsediyoruz? Sevimli küçük YOLO11n modelimizde birkaç milyon parametre var. Peki ya YOLO11x? O canavarda 50 milyondan fazla parametre var! Daha fazla parametre, tıpkı pastel boyalarla çizim yapmak yerine tam bir sanatçı paletine sahip olmak gibi, daha fazla ayrıntıyı kodlayabilmen anlamına gelir.
Çıkarım sırasında parametre sayısı kritik hâle gelir. 3 milyon parametreli bir ağı çalıştırmak, mahallenin çevresinde hafif tempoda koşmak gibidir. 50 milyon parametreli bir ağı çalıştırmak mı? Alevli meşaleleri çevirerek maraton koşmaya daha çok benzer.
Peki hesaplama TAM olarak nedir? Bütün bu sayı işlemleri gerçekte nasıl gerçekleşiyor? Bunları nasıl hızlandırıyoruz? “Hesaplamayı optimize etmek” ne anlama geliyor?
Yongalar matematik işlemlerini gerçekte nasıl yapar?#
Hesaplama yongalarla yapılır. Silikondan yapılmış bu küçük kareler, evrenin en düzenli kumdan kaleleri gibidir. Bilgisayarının yaptığı her işlem; her toplama, her karşılaştırma, her “bu olursa şunu yap” komutu fiziksel olarak silikonun içine işlenmiştir. Yongaların belirli bölgelerinde sayıları toplamak için tasarlanmış gerçek fiziksel devreler, mantıksal işlemler için tasarlanmış başka devreler bulunur. Farklı mahallelerin farklı matematik türlerinde uzmanlaştığı küçük bir şehir gibidir.
Bilgisayar bilimcisi olsan bile bu muhtemelen kulağa tuhaf geliyor. Bunun nedeni, son 40 yılı teknolojik bir lazanya gibi katman katman soyutlama oluşturarak geçirmemiz; öyle ki artık en alttaki tabağı bile göremiyoruz. İşleri o kadar basitleştirdik ki günümüzde programcıların çoğu, hesaplamanın silikonda gerçekte nasıl gerçekleştiği hakkında hiçbir fikre sahip değil. Bu onların suçu değil, tasarımın sonucu!
Şimdi bu katmanları soyalım. Son derece basit şu Python koduna bakalım:
x = 1
if x == 1:
y = x + 1Bir x değişkeni oluşturup değerini 1 olarak ayarlıyoruz ve x 1'e eşitse (sürpriz: eşit), x artı 1 değerine sahip bir y oluşturuyoruz. Üç satır. Kolay.
Ama işin ilginçleştiği yer burası. Bu masum üç satırla silikon üzerinden gerçekten elektronların hareket etmesi arasında, gerçekleşen EN AZ dört büyük çeviri katmanı var (aslında daha fazlası da var, ama konuyu anlatmak için dört katman yeterli). Şimdi seni akıl almaz bu yolculukta adım adım gezdireyim:
Katman 1: Python → Bayt kodu Önce Python kodunu okur ve bilgisayarların daha kolay anlayabileceği ara dil olan bayt koduna derler; ama bu kodu okumaya çalışsan gözlerin kanardı.
Katman 2: Bayt kodu → Makine kodu Python yorumlayıcısı (CPython gibi), bayt kodunu alıp işlemcinin anladığı gerçek talimatlara, yani makine koduna çevirir. Bu aşamada zarif "if x == 1" ifaden "kaydı yükle, kaydı karşılaştır, sıfır bayrağı ayarlıysa atla" gibi bir şeye dönüşür.
Katman 3: Makine kodu → Mikro kod Ters köşe! Modern işlemciler makine kodunu doğrudan çalıştırmaz bile. Kodu daha küçük işlemlere, yonganın iç bileşenlerinin işleyebileceği daha da küçük mikro koda ayırırlar. Tek bir "ADD" talimatın birden çok mikro işleme dönüşebilir.
Katman 4: Mikro kod → Fiziksel elektronik Sonunda silikona ulaşıyoruz. Bu mikro işlemler, transistörlerden geçen gerçek elektrik sinyallerini tetikler. Milyarlarca küçük anahtar açılıp kapanır, elektronlar özenle tasarlanmış yollarda dans eder ve bir şekilde, sihirli biçimde 1 + 1, 2 olur.
Her katman, altındaki katmanın akıl almaz karmaşıklığını gizlemek için vardır. Rus matruşkaları gibidir; ancak her bebek tamamen farklı bir dil konuşur ve en küçük bebek, kelimenin tam anlamıyla kuma hapsedilmiş şimşekten yapılmıştır.
İşin ironik yanı mı? Python'daki bu üç satır muhtemelen MİLYONLARCA transistör anahtarını tetikliyor. Ama bu soyutlamalar sayesinde bunların hiçbirini düşünmene gerek yok. Sen yalnızca "y = x + 1" yazarsın ve silikondaki derinlerde bir yerde sihrin gerçekleşeceğine güvenirsin.
Mimari#
Her işlem fiziksel olarak silikonun içinde uygulanır ve yonganın HANGİ noktasında gerçekleştiği tamamen yonganın topolojisine bağlıdır. Elektronlar için şehir planlaması gibidir. Toplayıcı burada, çarpıcı orada yaşar ve hepsinin birbiriyle verimli şekilde iletişim kurması gerekir.
Piyasada her biri farklı amaçlar için tasarlanmış yüzlerce farklı yonga 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 mimari var:
- x86 (Intel ve AMD) - Masaüstü bilgisayarların büyükbabası; karmaşık ama güçlü
- ARM - Telefonuna, giderek daha fazla da dizüstü bilgisayarlara güç verir; verimlilik için tasarlanmıştır
- RISC-V - Açık kaynaklı asi; her yerde giderek daha fazla ilgi görüyor
- PowerPC - IBM'in bir zamanlar oyun konsollarında kullanılan, bugün de gömülü sistemlerde yaygın olan güçlü işlemcisi
- MIPS - Akademisyenlerin gözdesi; basit ve zarif
- SPARC - Sun Microsystems'ın (şimdi Oracle'ın) yüksek performanslı bilgi işleme katkısı
- GPU mimarileri (NVIDIA'nın CUDA çekirdekleri, AMD'nin RDNA'sı) - Paralel işlem canavarları
Her mimari, transistörlerini farklı biçimde düzenlemekle kalmaz, farklı bir dil de konuşur. Bu makinelere talimat göndermek için kullandığımız soyutlamalar birbirinden tamamen farklıdır. Birine yol tarifi yazman gerektiğini düşün; ancak kullandığı araca bağlı olarak Fransızca, Mandarin Çincesi ya da yorumlayıcı dans diliyle yazman gerekebilir.
Silikonun kalp atışı#
Yongalarımızın yakıtı, hesaplama için gereken enerjiyi sağlayarak yonganın içine akan elektrik, yani elektronlardır. Ancak tek başına enerji yetmez. Bir yonganın gerçekten çalışması ve verileri karmaşık topolojisi boyunca taşıması için her şey tek bir kritik bileşene bağlıdır: saat. Elektronların belirli zamanlarda belirli yollardan akmasını sağlayan budur. Saat olmadan, enerji verilmiş ama hiçbir şey yapmayan bir silikon yığınından ibaret olursun.
Milyarlarca bileşenin kusursuz uyum içinde hareket etmesi gereken devasa bir gösteriyi koordine etmeye çalıştığını düşün. Bir ritim olmadan her şey kaosa dönüşürdü. İşte saat, işlemcin için tam olarak bunu yapar. İnanılmaz derecede sabit bir hızda titreşen ve saniyede milyarlarca elektrik darbesi gönderen bir kristaldir.
“3.5 GHz işlemci” ifadesini duyduğunda, GHz (gigahertz) saat hızını, yani saniyede 3,5 milyar vuruşu belirtir. Her vuruşa saat döngüsü denir ve bu, bilişimde temel zaman birimidir.
Saat döngüleri arasında HİÇBİR ŞEY gerçekleşmez. Bir sonraki vuruşu beklerken bilgisayarın tamamı donar. Evrenin en uç kırmızı ışık, yeşil ışık oyunu gibidir. Her “yeşil ışıkta” (saat darbesinde):
- Bileşenler arasında veri taşınır
- Hesaplamalar yürütülür
- Mantıksal kararlar alınır
- Bellekten okuma veya belleğe yazma işlemi yapılır
Bazı işlemler tek bir döngü sürer (basit bir toplama gibi), bazılarıysa birçok döngü sürer (bölme veya RAM'den veri getirme gibi). Milyarlarca bileşenin kendi işlemlerini, hiç durmayan bu ritimle eşzamanlı ve kusursuz bir koreografi içinde gerçekleştirmesi gerekir.
İşlemcinin saat hızını artırarak hız aşırtma yapabilirsin; her şey daha hızlı çalışır, ancak daha fazla ısı üretir ve daha kararsız hâle gelir. Aşırıya kaçarsan bilgisayarın çöker; çünkü elektronlar gerçekten de ritme ayak uyduramaz.
Eskiden bu işlemler oda büyüklüğündeki makinelerle gerçekleştirilirdi. Ancak bütün bu hesaplamaları yapan bileşenler şaşırtıcı derecede basittir: yalnızca anahtardırlar. Açık veya kapalı anahtarlar.
Bu anahtarlardan yeterince fazla sayıda olanı doğru örüntüyle birbirine bağlarsan hesaplama elde edersin. Dijital devrimin tamamı, karmaşık bir anahtar düzenine dayanır.
Bu basitlik, anahtarların varsa herhangi türden anahtarlarla bilgisayar kurabileceğin anlamına gelir. İnsanlar su boruları ve vanalar, domino taşları, LEGO blokları, bilyeler ve hatta Minecraft'taki redstone ile çalışan bilgisayarlar yaptı.
İlkeler 1940'lardan beri değişmedi. Yalnızca anahtarları inanılmaz küçültme konusunda çok başarılı olduk. Telefonun, insanları Ay'a gönderen tüm bilgisayarlardan daha fazla işlem gücüne sahip ve cebine sığabiliyor; çünkü atom ölçeğinde anahtarlar yapmayı başardık.
Milyonlarca parametreli sinir ağları çalıştırdığımızda, bu küçücük anahtarları kristalin kalp atışıyla kusursuz biçimde eşzamanlı olarak saniyede milyarlarca kez açıp kapatıyoruz. Her ağırlık güncellemesi, her matris çarpımı, her aktivasyon fonksiyonu saat ritmine ayak uyduruyor.
Modelleri eğitmenin neden bilgisayarını havalanmaya çalışıyormuş gibi ses çıkardığına şaşmamalı!
Sinir ağlarını vızır vızır çalıştırmak#
Pekâlâ, elimizde kristalin ritmiyle dans eden milyarlarca anahtarlı yongalar var ve bu yongalarda milyonlarca parametreli sinir ağları çalıştırmak istiyoruz. Kolay olmalı, değil mi? Sayıları yongaya verip çalıştır gitsin!
Sinir ağlarını hızla çalıştırmak; buzdolabının üç sokak ötede olduğu, yalnızca bir tavanın bulunduğu ve her malzemenin 250 kilo geldiği bir mutfakta beş aşamalı bir yemek pişirmeye benzer. En büyük sorun matematiğin kendisi değil, geri kalan her şeydir.
Mimari uyumsuzluğu#
Çoğu yonga sinir ağlarını değil, Microsoft Word'ü çalıştırmak için tasarlandı. CPU'n, ömrünü if ifadelerini ve döngüleri çalıştırarak ve arada bir vergilerini hesaplayarak geçireceği düşünülerek üretildi (süper bilgisayarların bile duygusal olarak tüketici bulduğu tek hesaplama). Şunu yap, sonra bunu yap, ardından ötekini yap şeklindeki sıralı işlemler için optimize edildi.
Ancak sinir ağları bambaşkadır. Her şeyi AYNI ANDA yapmak isterler. Eğitim sırasında, tahminlerinin ne kadar hatalı olduğuna bağlı olarak milyonlarca ağırlığı güncellersin. Çıkarım sırasında (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, ne kadar hızlı olsa da, hepsini metodik bir muhasebeci gibi teker teker işlemeyi tercih eder.
GPU'ların yapay zekâ hesaplamalarının bel kemiği hâline gelmesinin nedeni budur. GPU'lar, milyonlarca pikselin rengini aynı anda hesaplaman gereken video oyunları için tasarlandı. Piksel renklerini hesaplamanın sinir ağı matematiğine şaşırtıcı derecede benzediği ortaya çıktı: ikisi de büyük miktarda veriye aynı işlemi paralel olarak uygulamayı içeriyor.
Ancak GPU'lar bile sinir ağları için kusursuz değil. Bu nedenle şirketler artık özel yapay zekâ yongaları üretiyor (TPU'lar, NPU'lar ve PU ile biten diğer tüm kısaltmalar). Bu yongalar tek bir iş için sıfırdan tasarlanıyor: sinir ağlarını hızlandırmak. Yalnızca tek bir yemek pişirmeyi bilen ama bunu insanüstü bir hızla yapan bir şef tutmak gibi. CPU'n matris işlemlerini sırayla yapmakta zorlanırken GPU'n bunları paralel olarak oldukça iyi işliyor; bu özel yongalar ise matrisleri kahvaltıda, öğle ve akşam yemeğinde yiyor.
Bellek duvarı (ya da: Bitleri taşımak neden matematik yapmaktan daha zor?)#
Modern sinir ağı hesaplamalarında verileri HESAPLAMAKTAN çok TAŞIMAK için zaman ve enerji harcıyoruz.
Bilgisayar yonganı, ışık hızında çalışan parlak bir matematikçi gibi düşün; ancak bütün başvuru kitapları şehrin farklı yerlerindeki binalarda saklanıyor. Her denklemi anında çözebilir, ama önce sayılara ulaşması gerekir ve bu yolculuk sonsuza dek sürer.
Yongan iki sayıyı tek bir saat döngüsünde çarpabilir (hatırla, bu saniyede milyarlarca vuruştan biridir). İnanılmaz hızlı! Peki bu sayıları bellekten yongaya getirmek mi? YÜZLERCE döngü sürebilir. Matematikçinin bir problemi bir saniyede çözebilmesi ama kütüphaneye gidip dönmesinin beş dakika sürmesi gibidir.
Nedeni mesafedir (ve alandır). Elektrik hızlı hareket eder ama sonsuz hızda değil. Verilerin yonga üzerinde katetmesi gereken mesafe arttıkça gereken süre de artar. Bilgisayar tasarımcıları bunu, farklı uzaklıklarda birden fazla depolama alanı bulunan bir bellek hiyerarşisi oluşturarak çözdü:
- Yazmaçlar (doğrudan işlem birimlerinin içine yerleştirilmiştir): Matematikçinin masası. Anında erişim! Ama çok küçüktür; burada yalnızca yaklaşık 32 sayı tutabilirsin. Önündeki yapışkan notlar gibi düşünebilirsin.
- L1 önbellek (mikrometreler uzakta): Ofisteki kitaplık. Bir şeyi almak 3-4 döngü sürer. Buraya birkaç bin sayı sığdırabilirsin.
- L2 önbellek (milimetreler uzakta): Koridorun sonundaki dosya dolabı. Erişim 10-15 döngü sürer ve birkaç milyon sayı alabilir.
- L3 önbellek (yonganın diğer ucunda): Alt kattaki depo. Erişim 30-50 döngü sürer ve on milyonlarca sayı tutar.
- RAM (tamamen farklı bir yongada): Şehrin diğer ucundaki depo. Erişim 100-300 döngü sürer. Milyarlarca sayının burada saklanır.
- SSD/Sabit sürücü (kablolarla bağlı): Bambaşka bir şehir. Erişim milyonlarca döngü sürer. Devasa depolama alanı, buzul hızında erişim.
Tam yapılar değişiklik gösterir: telefonunun yongasında L3 önbellek olmayabilirken sunucu CPU'sunda çok büyük bir L3 önbellek bulunabilir. Ancak ilke değişmez: belleğin erişim mesafesi kısaldıkça hız artar, kapasite azalır.
Şimdi sinir ağları açısından işler burada can sıkıcı hâle geliyor. Ultralytics YOLO modelinde 50 milyon parametre olduğunu düşün (bu arada ChatGPT'de milyarlarca parametre var). Bellekten işlem birimlerine gidip geri gelmesi gereken 50 milyon sayı demek bu. Her sayı yalnızca 4 bayt olsa bile sisteminde taşınması gereken 200 megabayt veri eder.
Yonga her sayıyı tek bir döngüde işleyebilir, ancak o sayıyı RAM'den getirmek 100 döngü sürerse zamanının %99'unu teslimatı bekleyerek geçirirsin. Trafik sıkışıklığında kalmış bir Formula 1 aracı gibi. Onca işlem gücü, verilerin gelmesini bekleyerek öylece duruyor.
İşte kritik bilgi: bu, modern bilişimdeki DARBOĞAZDIR. Buna von Neumann darboğazı denir. Yongaların matematik işlemlerindeki hızını artırmak görece kolaydır. Belleği hızlandırmaksa fiziksel sınırlara takılır. Yapay zekâdaki performans optimizasyonlarının neredeyse TAMAMEN bellek düzeyinde gerçekleşmesinin nedeni budur. Mühendisler sinir ağlarını hızlandırırken matematiği nadiren hızlandırır; genellikle veriyi daha az taşımanın, daha iyi önbelleğe almanın veya verilere daha akıllıca erişmenin yollarını bulurlar.
Modern yapay zekâ yongaları yalnızca işlem hızına odaklanmaz; bellek bant genişliğine ve veri taşıma stratejilerine de büyük önem verir. Verileri önceden getirir, önbellekteki değerleri yeniden kullanır ve bellek erişimini en aza indirecek şekilde hesaplamaları düzenlerler. Yapay zekâ donanımı yarışını en hızlı hesap makinelerine sahip olanlar değil, bu hesap makinelerini verilerle beslemenin yolunu bulanlar kazanır. Her şey bellek erişim örüntülerini optimize etmeye dayanır.
Her veri parçasını taşıdığında enerji harcarsın. Çok değil, pikojoule düzeyinde; ama saniyede terabaytlarca veri taşıdığında bu miktar birikiyor ve HIZLA artıyor. Hatta bir çip üzerinde veriyi 1 mm taşımak, gerçek hesaplamayı yapmaktan daha fazla enerji harcıyor!
Sinir ağlarını eğitirken dizüstü bilgisayarının jet motoru gibi ses çıkarmasının nedeni bu. Isı üreten şey matematik değil, veri hareketi. Her parametre güncellemesi, her gradyan hesabı, her ileri geçiş kelimenin tam anlamıyla odanı ısıtıyor.
Modern AI 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? Hız aşırtma gibi, ama saat hızı hep 11'de ve biz sadece yangın çıkarmamaya çalışıyoruz.
Çözüm mü? Mimariyi dikkate alan tasarım#
En hızlı sinir ağları her zaman en zekileri değildir; çipler göz önünde bulundurularak tasarlananlardır. Bu ağlar:
- Verileri mümkün olduğunca yerel tutar
- Hesaplamaları takıntılı biçimde yeniden kullanır
- Donanımın yetenekleriyle kusursuz biçimde örtüşür
- Bellek hareketini ne pahasına olursa olsun en aza indirir
Bu, "malzemeleri yerel marketinden kullan" diyen bir tarifle Tibet'ten baharat, Fransa'dan peynir ve Antarktika'dan su getirmeni gerektiren bir tarif arasındaki farka benzer. İkisi de lezzetli olabilir ama biri kesinlikle daha pratiktir.
Sinir ağlarını hızlandırmanın bir sanat olmasının nedeni de bu. İyi matematiğe sahip olmak yetmez; donanımı anlaman, bellek hiyerarşisine saygı göstermen ve mimariyle kusursuz bir uyum içinde çalışman gerekir.
Bilgisayar biliminin fizik, mühendislik ve saf sihirle buluştuğu dünyaya hoş geldin. Bir sayıyı taşımanın, o sayıyla hesaplama yapmaktan daha maliyetli olduğu dünyaya. Paralelliğin hızlı, eşzamanlamanınsa ölümcül olduğu dünyaya. En büyük düşmanın karmaşıklık değil, mesafedir.
YOLO'yu nasıl hızlandırıyoruz#
Bir YOLO modelini eğittiğinde, eğitim düzeninde harika çalışan bir sinir ağı elde edersin. Ama işin aslı şu: oyun GPU'n, iPhone'un ve güvenlik kamerasındaki küçücük çip birbirinden tamamen farklı diller konuşur. Farklı güçlü ve zayıf yönleri, verileri nasıl işleyeceklerine dair de birbirinden çok farklı fikirleri vardır.
Şöyle düşün: GPU'nun aynı anda çalışabilen binlerce çekirdeği vardır; paralel işlem için tasarlanmıştır. Buna karşılık bir mobil çipte, özellikle AI işlemleri için tasarlanmış devreler olabilir ama bu devreler yalnızca belirli matematik işlemlerini gerçekleştirebilir. Kapı zili kamerandaki uç cihaz ise bir LED ampulünkinden daha düşük güç bütçesiyle AI çalıştırmaya uğraşır.
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. Mesele, SENİN özel ihtiyaçlarına uygun seçeneğe sahip olmak.
İşlemleri birleştirme: Daha azıyla daha fazlasını yapma#
Orijinal YOLO modelinde birçok işlem art arda gerçekleşir. Örneğin bir evrişim uygulayıp ardından sonuçları normalleştirebilir, sonra da bir aktivasyon fonksiyonu uygulayabiliriz. Bunlar, her biri kendi bellek okuma ve yazma işlemlerini gerektiren üç ayrı adımdır.
Ama işin zekice yanı şu: Bu işlemleri tek bir adımda birleştirebiliriz. YOLO'yu dağıtım için dışa aktarırken bu işlemleri birleştiririz. Şunları yapmak 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şimi + normalleştirmeyi + 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 gigabaytlarca veriyi ortadan kaldırır. Cep telefonunda bu, akıcı gerçek zamanlı algılama ile can sıkıcı gecikme arasındaki farktır.
Daha küçük sayılar kullanma: Kuantizasyon sihri#
YOLO'nun nesneleri doğru algılamak için aslında çok yüksek hassasiyetli sayılara ihtiyacı yoktur. Eğitim sırasında her ağırlığı temsil etmek için 32 bit kullanırız; bu, sandviç malzemelerini ölçmek için bilimsel hesap makinesi kullanmaya benzer. Gerçek dağıtımda ise 8 bit gayet yeterlidir.
Buna niceleme denir ve en güçlü optimizasyon tekniklerimizden biridir. Daha küçük sayılar kullanarak:
- Modelin boyutu %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üç tüketir (telefonunun pili sana teşekkür eder)
YOLO'daki tüm katmanlar bu küçültmeye aynı ölçüde duyarlı değildir. Temel kenarları ve şekilleri algılayan ilk katmanlar dayanıklıdır; 8 bitlik sayıları sorunsuzca kullanabiliriz. "Bu kedi mi, köpek mi?" kararını veren son algılama katmanlarının biraz daha fazla hassasiyete ihtiyacı vardır. Bu nedenle hassasiyeti katman katman ayarlarız; doğruluğu korurken hızı en üst düzeye çıkarmaya yetecek kadar bit kullanırız.
En iyi algoritmayı seçme#
Aynı matematiksel işlemi gerçekleştirmenin onlarca farklı yolu vardır. YOLO'nun temel işlemi olan basit bir evrişim, birbirinden tamamen farklı algoritmalarla hesaplanabilir; en iyi seçeneği ise kullandığın donanım ve girdi boyutu belirler.
YOLO'yu dışa aktarırken optimizasyon çerçevemiz farklı algoritmaları gerçekten test eder ve senin özel durumun için en hızlı olanı seçer. Bu, aynı yere giden birden fazla rota arasından o anki trafik durumuna göre seçim yapmaya benzer. GPU'da birçok pikseli eş zamanlı işleyen bir algoritma kullanabiliriz. CPU'da ise sıralı işlem için optimize edilmiş bir algoritmayı tercih edebiliriz. Matematik aynıdır ama yürütme stratejisi tamamen farklıdır.
Bellek: Gizli darboğaz#
Modern bilişimde asıl darboğazın bellek olduğundan söz ettiğ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şturabilir. 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: İşlemleri, veriler hâlâ hızlı önbellekteyken hemen kullanılacak şekilde düzenleriz. Bu, YOLO'nun özellik piramidi ağı için bellek trafiğini %40 azaltır.
Döşeme: Görüntünün tamamını tek seferde işlemek yerine, önbelleğe sığan daha küçük parçalara böleriz. Böylece işlemci, yavaş ana bellekten sürekli veri almak yerine hızlı yerel bellekle çalışabilir.
Arabelleklerin Yeniden Kullanımı: Ara sonuçlar için sürekli yeni bellek ayırmak yerine aynı bellek arabelleklerini yeniden kullanırız. Bu son derece verimlidir; YOLO'nun tüm omurgası yeniden kullanılabilir birkaç arabellekle çalışabilir.
Budama: Az, çoktur#
Şaşırtıcı bir gerçek: YOLO modelleri çoğu zaman gereğinden fazla tasarlanmıştır. Doğruluk üzerinde neredeyse hiç etkisi olmadan birçok katmandaki kanalları sıklıkla kaldırabiliriz. Bu, yalnızca modeli küçültmek değildir; daha hızlı hâle de getirir, çünkü gerçekten daha az hesaplama yapılması gerekir.
Süreç oldukça zariftir: Ağın hangi bölümlerinin nihai algılama sonuçlarına en az katkıda bulunduğunu analiz eder, bu bölümleri kaldırır ve ardından aradaki farkı telafi etmesi için modeli ince ayardan geçiririz. Pil ile çalışan cihazlarda bu verimlilik kazanımı, saatlerce daha fazla ç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 aralarındaki performans farkları yalnızca saat hızından kaynaklanan hız farkları değildir; temel mimari farklılıkları yansıtır. GPU'larda binlerce çekirdek paralel çalışır ve bu, YOLO'nun evrişim işlemleri için idealdir. Mobil NPU'larda özellikle sinir ağları için tasarlanmış özel devreler bulunur. CPU'lar ise esnek ama özelleşmemiş, her işi yapabilen 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ı yapmayı sever. Mobil NPU yalnızca belirli işlemleri destekleyebilir ama bu işlemleri inanılmaz verimli biçimde yürütür. Edge TPU yalnızca 8 bitlik tam sayılarla çalışır ama bu kısıt altında olağanüstü hıza ulaşır.
Derleme 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 konuşan biri arasındaki farka benzer. Derleme süreci:
- Modelini analiz ederek yapısını ve gereksinimlerini anlar
- Donanımının yeteneklerini göz önünde bulundurarak nelerde başarılı, nelerde zorlandığını değerlendirir
- Donanımının yerel dilinde konuşan optimize edilmiş kod üretir
Derleyici, işlemcinin önbelleğinden daha iyi yararlanmak için işlemleri yeniden düzenleyebilir, çipinin desteklediği özel talimatları seçebilir, hatta en iyi optimizasyon stratejisini bulmak için makine öğrenmesi kullanabilir. Evet, AI'yi AI'yi optimize etmek için kullanıyoruz; gelecek geldi!
Bu derleme adımı performansta 10 kata varan fark yaratabilir. Aynı YOLO modeli genel kodla ağır ilerlerken uygun biçimde optimize edilmiş talimatlarla uçabilir.
Gerçek dünyada uç dağıtımı#
YOLO'nun gerçek dünyayla, özellikle de zorlu uç cihazlar dünyasıyla karşılaştığında neler olduğuna bakalım. Nesne algılama için YOLO'yu 7/24 çalıştırması gereken bir güvenlik kamerası düşün. Kamera son derece ağır kısıtlamalarla karşı karşıya:
- Bellek: Toplamda belki yalnızca 512 MB ila 2 GB RAM
- Güç: Genellikle 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ışmalı
Önemli olan doğru ödünleşimleri seçmektir. Uç cihazlarda genellikle:
- INT8 kuantizasyonu kullanırız (daha düşük hassasiyet, çok daha az güç tüketimi)
- Etkinliğin düşük olduğu zamanlarda daha az kare işleriz
- Isıyı yönetmek için işi farklı işlemcilere dağıtırız
- Modelleri hızlı belleğe tamamen sığacak kadar küçük tutarız
Optimizasyon süreci#
Ultralytics'te optimizasyona sistematik bir yaklaşımla ilerliyoruz. Önce, zamanın gerçekte nerede harcandığını anlamak için modelin profilini çıkarıyoruz. Darboğazlar çoğu zaman beklediğin yerde olmaz. Zamanın %80'i yalnızca birkaç katmanda geçiyor olabilir ya da bellek aktarımları hesaplama süresine baskın gelebilir.
Ardından optimizasyonları yinelemeli olarak uygularız:
- En büyük darboğazlarla başla
- Her seferinde tek bir optimizasyon uygula
- Hem hız artışını hem de doğruluğa etkisini ölç
- İyi ödünleşimler sağlayan optimizasyonları koru
- Hedeflerimize ulaşana kadar yinele
Gelecek: Heterojen hesaplama#
Modern cihazlar birden fazla işlemciyi birlikte kullanma konusunda giderek akıllanıyor. Telefonunda tek bir işlemci yok; farklı görevlerde uzmanlaşmış birkaç işlemci var:
- Kamera sensöründe ön işleme için bir ISP (Görüntü Sinyal İşlemcisi) bulunur
- NPU (Sinirsel İşlem Birimi), YOLO çıkarımını çalıştırır
- CPU, karmaşık mantığı ve koordinasyonu yürütür
- GPU, sonuçları ekranda görüntüler
YOLO optimizasyonunun geleceği, modeli bu işlemciler arasında akıllıca bölüştürmekle ilgilidir. NPU ana evrişimleri yürütürken CPU son algılama mantığını işleyebilir, GPU da sonuçları görselleştirebilir. Her işlemci en iyi yaptığı işi üstlenerek tek bir işlemcinin sağlayabileceğinden daha verimli bir işlem hattı oluşturur.
YOLO'yu mevcut işlemciler arasında en iyi şekilde nasıl böleceğini otomatik olarak belirleyen akıllı bölümleme algoritmaları geliştiriyoruz. Bu algoritmalar yalnızca işlemcilerin yeteneklerini değil, aralarında veri taşımanın maliyetini de hesaba katıyor.
Özetle#
YOLO modellerini optimize etmek yalnızca dosya biçimlerini dönüştürmek değildir; en yeni yapay zekâyı gerçek dünyada gerçekten çalışan bir şeye dönüştürmektir. 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 büyük performans iyileştirmeleri elde ederiz.
Dikkat çekici olan ne mi? Evrensel olarak "en iyi" bir optimizasyon yoktur. Sınırsız güce sahip bir bulut sunucusunun, pille çalışan bir drone'dan farklı optimizasyonlara ihtiyacı vardır. Özel AI çipi olan bir telefonla Raspberry Pi'ye farklı yaklaşmak gerekir. Ultralytics'in bu nedenle bu kadar çok dışa aktarma seçeneği sunuyor; her biri farklı senaryolar için optimize edilmiştir.
Ele aldığımız her optimizasyon tek bir amaca hizmet ediyor: bilgisayarlı görüye her yerde erişilebilmesini sağlamak. İster akıllı bir kapı zili, ister drone uygulaması, ister devasa bir bulut hizmeti geliştiriyor ol, YOLO'yu kısıtların dahilinde çalıştırman için gereken araçları sunuyoruz.
Ultralytics ile bir YOLO modelini dışa aktardığında yalnızca bir dosya kaydetmiş olmazsın. Sinir ağlarını kullanışlı hâle getirmek için yıllar içinde yapılan araştırmalardan yararlanırsın. Son teknoloji bir yapay zeka modelini gerçek donanımlarda, gerçek kısıtlar altında çalışabilen ve gerçek sorunları çözen bir yapıya dönüştürürsün.
Ultralytics olarak yaptığımız iş bu. Yapay zeka 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 zekanın geleceği yalnızca en iyi modellere sahip olmakla değil, bu modelleri gerçek dünyada kullanışlı kılmakla ilgili.
Yazan
Yorumlar
Soru sor, sonuçlarını paylaş veya başka birine yardım et.










