Teknoloji 2026-10-03 5 dk okuma

Bir CPU'nun sınırlarını ne kadar zorlayabiliriz?

Şişkin framework'lerle ve GPU bağımlılığıyla yetinmeyin. pdefa'yı keşfedin — derin öğrenme modellerini doğrudan CPU üzerinde çalıştıran, sıfırdan geliştirilmiş bir çıkarım motoru.

Hasan Arda Acar
Hasan Arda Acar Founder of pdfduty.com
Bir CPU'nun sınırlarını ne kadar zorlayabiliriz?

Bir CPU'nun sınırlarını ne kadar zorlayabiliriz?

Yıllardır "derin öğrenme çalıştır" sorusunun cevabı aynı oldu: bir GPU al. Ancak bu cevap temel bir soruyu görmezden geliyor — o donanımın ne kadarını gerçekten kullanıyoruz ve ne kadarını çerçeve ek yüküne harcıyoruz?

Harici kütüphanelerin şişkin yazılımlarından kurtulmak ve donanımın tüm gücünü maksimum verimlilikle kullanmak için mühendislik yolculuğumu ve açık kaynak projemi paylaşıyorum: pdefa (hasnard/pdefa).

pdefa nedir?

pdefa, modelleri doğrudan CPU üzerinde çalıştırmak için C++20 ve AVX2 SIMD mimarisini kullanarak sıfırdan geliştirdiğim bir derin öğrenme çıkarım motorudur — GPU gerekmez, ağır çalışma zamanı yok, tek bir çıkarım çalıştırmadan önce çözülmesi gereken bağımlılık ağacı yok.

Temel motivasyonum basitti: sistem kaynaklarının mutlak verimlilikle nasıl yönetilebileceğini deneyimlemek ve bu ultra hafif mimariyi AGPL-3.0 lisansı altında ekosisteme kazandırmak, gerçek açık kaynak felsefesine ödün vermeden sadık kalmak.

Neden CPU çıkarımıyla uğraşalım ki?

Çünkü gerçek dünyadaki dağıtımların çoğu özel bir GPU lüksüne sahip değildir. Uç cihazlar, gömülü sistemler, CI ardışık düzenleri, küçük VPS örnekleri, fabrika katı makineleri ve akademik kümelerin tümü CPU üzerinde çalışır. Bu ortamlarda, her megabayt çerçeve ek yükü ve her gereksiz bağımlılık bir maliyettir — bellekte, başlatma süresinde, dağıtım karmaşıklığında.

Bir düzine paylaşılan kütüphaneyi içine çeken 300 MB'lık bir çerçeve "bedava" değildir. Bu, her dağıtımda ödediğiniz bir vergidir.

Öne Çıkan Teknik Özellikler:

- Ultra Hafif Boyut
Derlenmiş yerel ikili dosya yalnızca 320 KB'dır. Megabaytlarca şişkinlik yok, önce kurmanız gereken bir çalışma zamanı yok — yalnızca çıkarım çalıştırmak için gerekenler.

- Sıfır Harici Bağımlılık
Python arayüzü yalnızca yerleşik ctypes modülüne dayanır. pip install yok, sürüm çakışması yok, sanal ortam cambazlığı yok.

- Donanım Optimizasyonu
AVX2 komut setlerini kullanarak vektörel işleme kapasitesini en üst düzeye çıkarır ve iş parçacığı sayısı üzerinde doğrudan kontrol sağlar — böylece onu tam olarak çalıştığınız CPU'ya göre ayarlayabilirsiniz.

- Geniş Mimari Desteği
YOLO (v8'den v12'ye kadar), ResNet, MobileNet, EfficientNet ve DeepLabV3 mimarilerini kutudan çıktığı gibi çalıştırabilir.

- Yerleşik Görüntü İşleme
Kendi PNG/JPEG yükleyicisine ve yerleşik bir YOLO sonrası işleme algoritmasına sahiptir; OpenCV gibi ağır kütüphanelere olan ihtiyacı tamamen ortadan kaldırır.

- Esnek Dönüştürme İş Akışı
Mevcut PyTorch modellerinizi standart ONNX formatına aktarın, ardından motorun yerleşik dönüştürücüsünü kullanarak bunları pdefa'nın özel, düşük gecikmeli .engine formatına sorunsuzca çevirin.

Ekran görüntüsü 2026-10-03 094610

output_bus

Geliştirme Yol Haritası:

Yakında, PyTorch kullanıcılarının ONNX ara adımını tamamen atlamasına ve modelleri doğrudan motorun yerel formatına dönüştürmesine olanak tanıyacak pytorchtoengine aracını yayımlayacağım. Bir adım daha az, hata ayıklanacak bir şey daha az.

Kimler için:

Umarım bu, kaynak kısıtlı sunucular, uç cihazlar veya hafif sistemlerle çalışan geliştiriciler için güçlü bir alternatif olur — "Sadece bu modeli çalıştırmam gerekiyor, bunun için koca bir ekosisteme ihtiyacım yok" diye düşünen herkes için.

Buradan nereye:

Depo açık. Kod mimarisi hakkında geri bildirim gerçekten memnuniyetle karşılanır — özellikle benzer sistemler kurmuş veya aynı duvarlara çarpmış kişilerden. Ve eğer bu size hitap ediyorsa, bir yıldız projeyi desteklemeye çok katkı sağlar.

Github

$code = @'
 import pdefa
 import cv2

 model = pdefa.load('D:/PROJE/yolov8s.engine')
 img_path = 'D:/PROJE/bus.jpg'
 boxes = model(img_path, conf_thres=0.75)
 img = cv2.imread(img_path)

 class_names = {0: 'person', 1: 'bicycle', 2: 'car', 3: 'motorcycle', 5: 'bus', 7: 'truck'}

 for b in boxes:
    cls = int(b['cls'])
    conf = b['conf']
    x1, y1 = int(b['x1']), int(b['y1'])
    x2, y2 = int(b['x2']), int(b['y2'])

    names_attr = getattr(model, 'names', {})
    cls_name = class_names.get(cls, names_attr.get(cls, f'cls_{cls}'))

    label = f'{cls_name} {conf:.2f}'

   cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
   cv2.putText(img, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2, cv2.LINE_AA)

print(f'{cls_name} | conf={conf:.3f} | box=[{x1}, {y1}, {x2}, {y2}]')

cv2.imwrite('D:/PROJE/output_bus.png', img)
'@

PDFDUTY AI

Groq Cloud • Llama 3

Menü

Ana Sayfa

Tüm araçlar

Düzenleyici

Metin ve şekilleri düzenle

Blog

İpuçları ve rehberler

Araştırma

Akademik makaleler ve çalışmalar

Yeni

Tema

Dil

Son İşlemler

Lokal Geçmiş