AI

Gerçek Zamanlı Nesne Algılama Hatları Mimarisi: Düşük Gecikmeli Kenar Dağıtımı İçin YOLOv8'in Optimize Edilmesi

Bilgisayarlı görü modellerinin kenar cihazlarda dağıtımı benzersiz zorluklar sunar. YOLOv8 (You Only Look Once version 8), nesne algulamada doğruluk ve hızta yeni bir standart belirlerken, NVIDIA Jetson, Raspberry Pi veya mobil cihazlar gibi kaynak kısıtlı donanımlarda tam hassasiyetli bir modeli çalıştırmak genellikle kabul edilemez gecikmelere yol açar. Otonom robotiklerden gerçek zamanlı video analizine kadar uzanan uygulamalar için her milisaniye önemlidir. Bu yazı, standart bir YOLOv8 modelini yüksek performanslı bir kenar dağıtımına dönüştürmek için gereken mimari stratejileri ve pratik optimizasyon tekniklerini incelemektedir.

Kenar Dağıtımı Zorluğu

Kenar cihazları genellikle güç tüketimi, termal sınırlar ve hesaplama kaynakları (FLOPs) konusunda sıkı kısıtlamalar altında çalışır. Eğitim ve GPU üzerinde çıkarım için mükemmel olan standart bir PyTorch YOLOv8 modeli, doğrudan kenar dağıtımı için genellikle çok ağır gelir. Başlıca darboğazlar şunlardır:

  • Bellek Bant Genişliği: Büyük tensörlerin RAM ile GPU/CPU arasında taşınması maliyetlidir.
  • Hesaplama Sınırlamaları: Kenar TPUs ve NPUs'leri genellikle tam hassasiyetli kayan nokta işlemleri için gereken veri işleme hızına sahip değildir.
  • Gecikme Hassasiyeti: Gerçek zamanlı hatlar, yüksek ortalama FPS değerlerinden daha tutarlı kare işleme süreleri gerektirir.

Bu sorunları ele almak için, basit model dışa aktarmasının ötesine geçmeli; format dönüştürme, nicelleme ve donanım özgü hızlandırmayı içeren kapsamlı bir optimizasyon hattına girmeliyiz.

Adım 1: Donanım Bağımsızlığı İçin ONNX'e Dışa Aktarma

Optimizasyonun ilk adımı, modeli yerel çerçevesinden (PyTorch) ONNX (Açık Sinir Ağı Değişimi) gibi ara bir temsile dönüştürmektir. ONNX, model mimarisini yeniden yazmadan çeşitli çıkarım motorları ve optimizasyon araçlarından yararlanmamızı sağlayan evrensel bir formattır.

Ultralytics CLI kullanılarak ONNX'e dışa aktarma oldukça basittir:

yolo export model=yolov8n.pt format=onnx opset=11 simplify=true

simplify=true bayrağı, ONNX Simplifier'ı etkinleştirir; bu da sabit katlama ve operatör füzyonu gibi grafik optimizasyonları gerçekleştirerek daha fazla işlemden önce hesaplama grafiği boyutunu küçültür.

Adım 2: Azaltılmış Hassasiyet İçin Nicelleme

Nicelleme, kenar optimizasyonu için en etkili tekniktir. Modelin parametrelerinin ve aktivasyonlarının sayısal hassasiyetini azaltır. YOLOv8 FP32 (32-bit kayan nokta) ile eğitilse de, kenar donanımı INT8 (8-bit tamsayı) çıkarımında mükemmel performans gösterir. Bu, model boyutunu %75'e kadar azaltabilir ve çıkarım hızını önemli ölçüde artırabilir.

İki ana yaklaşım vardır:

  1. Eğitim Sonrası Nicelleme (PTQ): Model ağırlıklarını yeniden eğitim yapmadan INT8'e dönüştürür. Bu hızlıdır ancak doğrulukta hafif bir düşüşe neden olabilir.
  2. Nicelleme Bilinçli Eğitim (QAT): Ağırlıkların uyum sağlamasına izin vermek için eğitim sırasında nicellemeyi simüle eder ve PTQ'den daha iyi doğruluk korur.

Çoğu kenar kullanım durumu için PTQ yeterlidir. TensorRT kullanırken bu, motor oluşturma aşamasında otomatik olarak yapılır; ancak INT8 değerlerinin dinamik aralığının veri dağılımınıza uyum sağlaması için bir kalibrasyon veri kümesi sağlamanız gerekir.

Adım 3: TensorRT ile Donanım Özgü Hızlandırma

Kenar cihazınız bir NVIDIA GPU kullanıyorsa, TensorRT çıkarım hızlandırma için altın standarttır. Katman füzyonu, çekirdek otomatik ayarı ve hassasiyet kalibrasyonu gerçekleştirerek optimize edilmiş bir çıkarım motoru oluşturur.

ONNX modelinizden bir TensorRT motoru nasıl oluşturabileceğinize dair bir örnek:

# trtexec komut satırı aracını kullanarak
trtexec --onnx=yolov8n.onnx \
        --saveEngine=yolov8n.engine \
        --fp16 \
        --int8 \
        --calib=input_tensor_batch.bin \
        --workspace=1024

Bu komut, ONNX modelini FP16 (yarı hassasiyet) dönüştürür ve ardından INT8 için kalibre eder. Elde edilen .engine dosyası, GPU mimarinize özel olarak optimize edilmiştir ve mümkün olan en düşük gecikmeyi sağlar.

Pratik Uygulama: Çıkarım Döngüsü

Modeli optimize etmek savaşın sadece yarısıdır; çıkarım hattı kendisi de verimli olmalıdır. Aşırı yüklemeyi en aza indirmek için asenkron toplu işleme ve bellek havuzu kullanın.

import tensorrt as trt
import pycuda.driver as cuda
import numpy as np

# TensorRT motorunu başlat
engine = trt.Runtime(logger).deserialize_engine(open("yolov8n.engine", "rb").read())
context = engine.create_execution_context()

# Ana ve cihaz belleğini önceden tahsis et
input_buffer = cuda.mem_alloc(1 * 3 * 640 * 640 * 4)  # FP32 örneği
output_buffer = cuda.mem_alloc(1 * 300 * 6 * 4)

def infer(frame):
    # Kareyi ön işleme (boyutlandırma, normalize etme, transpoze etme)
    data = preprocess(frame)
    
    # Asenkron bellek kopyalama
    cuda.memcpy_htod_async(input_buffer, data, stream)
    
    # Çıkarımı yürüt
    context.execute_async_v3 bindings=[int(input_buffer), int(output_buffer)], stream_handle=stream.handle
    
    # Sonuçları al
    results = np.empty(300 * 6, dtype=np.float32)
    cuda.memcpy_dtoh_async(results, output_buffer, stream)
    stream.synchronize()
    
    return postprocess(results)

Sonuç

YOLOv8'i kenar dağıtımı için optimize etmek tek aşamalı bir süreç değil; dışa aktarma, nicelleme ve donanım özgü ayarlamayı içeren çok aşamalı bir süreçtir. ONNX'i interoperabilite (çapraz çalışma) için, nicellemeyi verimlilik için ve TensorRT'yi hızlandırma için kullanarak geliştiriciler, kısıtlı donanımlarda bile gerçek zamanlı performans elde edebilir. Kenar yapay zekası gelişmeye devam ettikçe, bu optimizasyon tekniklerine hakim olmak, duyarlı, ölçeklenebilir ve verimli bilgisayarlı görü uygulamaları oluşturmak için hayati önem taşıyacaktır. Hızlı kazanımlar için PTQ ile başlayın ve performans gereksinimleriniz doğrultusunda QAT ve özel çekirdeklere geçiş yapın.

Share: