Ultralytics YOLO27: Bekleme listesine katıl.
Get Started
Üretimde Ultralytics YOLO·Optimize et·Ders 3/9
Dersorta düzey

TensorRT ile optimize et

Bir FP16 TensorRT motoru oluştur, INT8'in doğruluk maliyetine değip değmeyeceğine karar ver ve motoru kullanıma almadan önce kabul koşullarını uygula.

NVIDIA GPU'da TensorRT FP16 motoru genellikle elde edebileceğin en düşük maliyetli hız artışıdır: Ultralytics A100 kıyaslamasında mAP değişmeden yaklaşık 1,5× daha hızlıdır. INT8 daha da hızlandırır, ancak eğitim sonrası INT8, COCO'da YOLO26s ile YOLO26m arasında 4 ila 6 mAP puanına mal oldu. Bu derste hangi adımı attığını bilmeyi ve kullanıcıların fark etmesinden önce ölçüm yapmayı öğreneceksin.

Sonuç

Bir FP16 TensorRT motoru oluştur, INT8'in değip değmeyeceğine yazılı bir kabul koşuluyla karar ver ve her motoru mAP ile p95 gecikmesine göre kabul et ya da reddet.

Hızlı Başlangıç
Nasıl ilerleyeceğini zaten biliyorsan, işte kısa sürüm.
  1. Önce FP16: yolo export model=best.pt format=engine quantize=16, motorun çalışacağı GPU'da.

  2. Yalnızca FP16 bütçeyi karşılamıyorsa INT8'e geç: quantize=8 data=your.yaml seçeneğini 500'den fazla üretim benzeri görüntüyle ekle.

  3. Her motor için kabul koşullarını uygula: mAP50-95 farkı 0,5 puanı aşmamalı (FP16) ya da belirlediğin INT8 bütçesinde kalmalı; p95 gecikmesi de bütçenin altında olmalı.

  4. INT8 çok fazla doğruluk kaybettiriyor mu? Kuantizasyona duyarlı eğitim (train quantize=8) kaybın çoğunu geri kazandırır.

Uygulamalı

NVIDIA GPU gerektirir

Bu dersteki kod, TensorRT yüklü bir NVIDIA GPU gerektirir. Gösterilen her bağımsız değişken, Dışa aktarma modu belgelerinde format=engine için listelenmiştir.

FP16 Güvenli İlk Adımdır#

Volta ve sonraki NVIDIA GPU'larda FP16 tensor çekirdekleri bulunur; algılama modellerinin çıkarım sırasında FP32'ye nadiren ihtiyacı olur. Buradan başla:

from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # veya runs/detect/pills_v1/weights/best.pt
model.export(format="engine", quantize=16, workspace=4)  # FP16 motoru, en fazla 4 GiB derleyici çalışma alanı

workspace, oluşturma sırasında TensorRT'nin kullanabileceği GPU belleğini sınırlar; TensorRT'nin karar vermesini istiyorsan bu ayarı yapma. TensorRT entegrasyonu sayfasında şu A100 sonucu yayımlanmıştır (YOLOv8n, 640 piksel):

KesinlikTahmin, toplu iş boyutu 8 (ms)COCO doğrulama mAP50-95
FP320.520.37
FP160.340.37
INT80.280.33

Model YOLO26'dan daha eski, ancak ödünleşimin genel görünümü geçerli: FP16 hiçbir ek maliyet olmadan yaklaşık 1,5× hız kazandırdı; INT8 ise 1,2× daha hızlandırdı ve 4 puana mal oldu. FP16 bütçeni karşılıyorsa onu kullanıma al.

Yerel NVIDIA GPU'n yok mu? Ultralytics Platform'un Export sekmesi, seçeceğin bulut GPU'sunda aynı görüntü boyutu, hassasiyet, toplu iş, dinamik, NMS ve çalışma alanı seçenekleriyle motoru oluşturur:

TorchScript, ONNX, OpenVINO, TensorRT ve CoreML seçeneklerini gösteren Ultralytics Platform modelinin Export sekmesi; RTX 5090'da imgsz 640 ve FP16 ile dışa aktarılmış bir TensorRT motoru listeleniyor

Dağıtımda kullanacağın GPU ailesini seç: ekran görüntüsündeki motor RTX 5090'da oluşturulmuştur ve yalnızca bu ailede çalışır.

INT8 İçin Kalibrasyon Verisi Gerekir#

INT8 kuantizasyonu, her katmanın aktivasyonlarını 256 seviyeye eşler. Bu aralıkları belirlemek için dışa aktarıcı, kalibrasyon görüntülerini modelden geçirip gördüğü aktivasyonları kaydeder; bu yüzden görüntülerin üretim verilerine benzemesi gerekir:

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
model.export(
    format="engine",
    quantize=8,
    data="coco128.yaml",  # # kalibrasyon görüntüleri bu veri kümesinin val bölümünden alınır; my_dataset/data.yaml kullan
    fraction=1.0,  # # kullanılacak bu görüntülerin oranı (veya sayısı)
    batch=8,  # # daha büyük kalibrasyon toplu iş boyutları daha kararlı aralıklar sağlar
    dynamic=True,  # # batch=8 ile motor 1 ila 8 arasındaki toplu iş boyutlarını kabul eder
    workspace=4,
)

INT8'in ne kadar doğruluk kaybettireceği modele bağlıdır. Dışa aktarma modu belgelerinde COCO doğrulama verisi üzerinde YOLO26 TensorRT motorları için ölçülen mAP50-95 değerleri şöyledir:

ModelFP32 motoruKalibre edilmiş INT8 (PTQ)Kuantizasyona duyarlı eğitim (QAT) sonrasında INT8
YOLO26n0.40320.39340.3935
YOLO26s0.47940.44120.4711
YOLO26m0.52690.46960.5137

Yalnızca kalibrasyon YOLO26n'de 1 puana, daha büyük modellerde ise 4–6 puana mal olur. QAT, INT8'e dayanıklı ağırlıklar elde etmek için modeli train içinde quantize=8 ile ince ayardan geçirir; kontrol noktası kendi aralıklarını içerir, INT8 dışa aktarımı kalibrasyon verisi gerektirmez ve FP32'nin 1–2 puan yakınına ulaşır. Kararını şöyle ver:

Kullanıma Almadan Önce Motoru Kabul Koşullarına Göre Değerlendir#

Her motor, dağıtım GPU'sunda aynı kontrollerden geçmelidir:

KontrolKabul koşulu
Doğrulama kümenizde mAP50-95FP16 için FP32'den en fazla 0,5 puan düşük olmalı; INT8 için yazılı bütçeni karşılamalı
Sınıf başına APHiçbir sınıfta yaklaşık 1 puandan fazla düşüş olmamalı (küçük sınıflarda değişim en fazladır)
p95 gecikmesiÜretim toplu iş boyutunda bütçenin altında olmalı
Çalışma eşiğiMotorun kendi F1 eğrisinden yeniden seçilen conf
DeterministiklikAynı görüntü iki kez verildiğinde kutular tam olarak aynı olmalı
yolo val model=yolo26n.engine data=coco8.yaml  # or my_dataset/data.yaml
yolo benchmark model=yolo26n.pt data=coco8.yaml imgsz=640 format=engine quantize=16

Hız Artışı Nereden Geliyor?#

TensorRT katman birleştirme: optimize edilmemiş ağdaki ayrı evrişim, bias ve ReLU katmanları, TensorRT ile optimize edilmiş ağda tek CBR katmanlarında birleştirilir

TensorRT, her evrişim, bias ve ReLU'yu tek bir çekirdekte birleştirir (sağdaki "CBR" blokları) ve concat adımlarını kaldırır; böylece GPU çok daha az çekirdek başlatır ve daha az veri taşır. YOLO26'da bu, ağın her yerindeki conv-BN-aktivasyon zincirlerinde, omurgadaki dikkat (PSA) bloğunda ve algılama başlığındaki çok sayıdaki küçük işlemde hız kazandırır. Motor hâlâ yavaşsa trtexec veya NVIDIA Nsight ile profilini çıkar: çoğu zaman tek bir katman toplam sürenin %30'unu ya da daha fazlasını alır.

Yaygın Hatalar#

Yanlış verilerle kalibrasyon

Belirti: INT8, COCO'da 1 puan ve kameralarında 6 puan kaybediyor. Çözüm: Kendi doğrulama kümenin ayrılmış bir bölümünü kullanarak kalibrasyon yap; NVIDIA en az 500 temsili görüntü öneriyor. Kalibrasyon cihazlar arasında da farklılık gösterir, bu nedenle dağıtım yapacağın GPU'da kalibrasyon yap.

FP32 güven eşiğini koruma

Belirti: Aynı conf değerinde INT8'e geçince duyarlılık düşüyor. Çözüm: INT8 güven değerlerini değiştirebilir; conf değerini INT8 motorunun kendi F1 eğrisinden yeniden seç.

Yanlış GPU'da oluşturulmuş motor

Belirti: Motor, dağıtım cihazında serileştirmeden çözülemiyor veya beklenenden yavaş çalışıyor. Çözüm: Eşleşen TensorRT ve CUDA çalışma ortamıyla dağıtım GPU ailesinde oluştur ve cihazların yeniden derleyebilmesi için .onnx dosyasını gönder. Derleme sırasında kalibrasyon çökerse workspace değerini yükselt veya imgsz ya da batch değerini düşür.

Jetson'da DeepStream elde edilen motorları donanım hızlandırmalı bir video işlem hattında çalıştırır; veri merkezinde ise Triton Inference Server bu motorları sunar.

Dene

Bir NVIDIA GPU'da (yerel GPU veya Platform'un Export sekmesi) modelin için FP16 motoru oluştur. Veri kümesi YAML dosyanla yolo val komutunu hem motorda hem de .pt üzerinde çalıştır, motoru dağıtım GPU'sunda kıyasla ve tek sayfalık bir kabul raporu yaz: her ikisi için mAP50-95, aradaki fark, bütçene göre p95 gecikmesi ve kararın (FP16'yı kullanıma al, INT8'i dene veya model boyutunu değiştir).

Tamamlanma ölçütü
Aşağıdakilerin tümü doğru olduğunda dersi tamamlamış olursun.
  • FP16 motoru oluşturulmuş ve çalışacağı GPU ailesinde derlenmiş olmalı.

  • Kabul raporunda motor ile PyTorch'un mAP50-95 değerleri ve p95 gecikmeleri yan yana gösterilmeli.

  • Kararın kabul tablosuna dayanmalı ve başarısız olursa sonraki adımda ne deneyeceğini belirtmeli.

Çözümü göster
from ultralytics import YOLO

if __name__ == "__main__":  # validation starts worker processes on Windows
    data = "coco8.yaml"  # or my_dataset/data.yaml
    model = YOLO("yolo26n.pt")
    engine = model.export(format="engine", quantize=16, workspace=4)

    base = model.val(data=data, plots=False).box.map
    fp16 = YOLO(engine).val(data=data, plots=False).box.map
    print(f"PyTorch {base:.4f}  FP16 engine {fp16:.4f}  gap {abs(base - fp16) * 100:.2f} points")

    # Only if FP16 misses the latency budget:
    # model.export(format="engine", quantize=8, data=data, batch=8, dynamic=True, workspace=4)

Başarılı bir rapor şöyle görünür: fark 0,5 puanın altında, p95 bütçenin altında, karar FP16'yı kullanıma al. p95 hedefi karşılamazsa kendi kalibrasyon YAML dosyanla INT8'i dışa aktar, aynı iki satırı yeniden çalıştır ve INT8'i yalnızca farka, başlamadan önce belirlediğin bütçe içinde kalıyorsa kullanıma al; aksi hâlde QAT'yi veya daha küçük bir modeli dene.

Sırada ne var

NVIDIA kullanmıyor musun? Sırada Intel'in CPU'lar için sunduğu karşılık olan OpenVINO var; hedef cihazda neden yine de ölçüm yapman gerektiğini de öğren.

İlerlemeni kaydetmek için giriş yap