Edocti
Training tehnic avansat pentru inginerul software de mâine

Deep learning at the edge - partea a 2-a: Semantic Segmentation pe Drive PX2 & Jetson TX2

Articol scris de Paul Ianas | Embedded AI & Automotive Expert la Edocti

În partea 1 a acestei serii, am pus bazele matematice ale aritmeticii Fixed-Point (FXP), explorând formatul Qn.q, intervalul dinamic (dynamic range) și motivele pentru care reducerea numărului de biți este esențială pentru deployment-ul AI în medii embedded.

Acum a venit momentul să facem trecerea de la teorie la producția automotive. În acest articol, vom aborda operația MAC (Multiply-Accumulate) — inima Rețelelor Neuronale Convoluționale (CNNs) — și vom demonstra cum am aplicat Fixed-Point (mai exact INT8 și FP16) pe un AlexNet modificat pentru segmentare semantică.

Vom analiza procesul de deployment și câștigurile reale de performanță obținute pe NVIDIA Drive PX2 și pe Jetson TX2.

Operația MAC: De ce precizia costă viteză

În orice CNN, marea majoritate a timpului de calcul este petrecut executând milioane de operații MAC (Multiply-Accumulate) în timpul fazelor de convoluție. O operație MAC calculează în esență produsul scalar (dot product) dintre ponderi (weights) și activările de intrare:

Accumulator = Accumulator + (Weight * Activation)

Când rulează în standardul FP32 (32-bit Floating Point), hardware-ul necesită o logică complexă pentru a gestiona alinierea mantisei, adunarea exponenților și normalizarea. Așa cum am demonstrat în partea 1, convertind aceste numere într-un format de tip Fixed-Point pe 8-biți sau 16-biți (INT8 / FP16), procesorul se va baza exclusiv pe aritmetică simplă de numere întregi (integer arithmetic).

Arhitectura NVIDIA Pascal (prezentă atât pe TX2, cât și pe Drive PX2) accelerează masiv aceste operații. GPU-urile dedicate de pe Drive PX2 folosesc instrucțiuni specializate dp4a, permițând executarea a patru operații MAC de tip integer pe 8-biți într-un singur ciclu de ceas, acumulând rezultatul într-un integer pe 32-biți. Acest lucru îmbunătățește drastic numărul de Operations Per Second (OPS), reducând totodată masiv lățimea de bandă necesară pentru aducerea ponderilor din memorie.

Provocarea: Semantic Segmentation cu FCN-AlexNet

Pentru condusul autonom (autonomous driving), detectarea obiectelor (bounding boxes) nu este adesea suficientă. Avem nevoie de Semantic Segmentation — clasificarea fiecărui pixel din fluxul video al camerei în categorii precum drum, pieton, vehicul sau trotuar.

Am folosit o rețea de tip Fully Convolutional Network bazată pe AlexNet (FCN-AlexNet). În timp ce AlexNet-ul standard se termină cu straturi dense fully-connected pentru clasificare, un FCN le înlocuiește cu convoluții 1x1 și straturi de upsampling (deconvolution) pentru a genera o hartă densă de clasificare la nivel de pixel.

Rularea acestei rețele greoaie (pixel-heavy) la 30+ FPS în FP32 pe dispozitive embedded reprezintă o provocare termică și de calcul masivă. Aici intră în joc Post-Training Quantization (PTQ) folosind NVIDIA TensorRT.

De la FP32 la INT8: Procesul de calibrare

Pentru a răspunde la întrebarea pe care am lăsat-o la finalul părții 1: "Ar trebui să antrenezi rețeaua în FXP de la început sau să o antrenezi în FP32 și să o transformi la deployment?"

Deși Quantization-Aware Training (QAT) câștigă popularitate, cea mai robustă și standardizată abordare pentru aceste arhitecturi este Post-Training Quantization. Antrenăm rețeaua normal în FP32 (folosind framework-uri ca TensorFlow sau PyTorch), înghețăm ponderile (freeze weights) și folosim TensorRT pentru a converti modelul în INT8 exact înainte de deployment.

Totuși, nu poți pur și simplu să trunchiezi din FP32 în INT8. Trebuie să mapezi Dynamic Range-ul formatului Floating-Point la intervalul limitat de 8 biți [-128, 127]. Dacă mapezi orbește valoarea maximă absolută la 127, outlier-ele (valorile extreme) vor comprima toate datele importante în doar câțiva biți, distrugând complet acuratețea.

TensorRT Entropy Calibration

TensorRT rezolvă această problemă folosind un Entropy Calibrator (bazat pe divergența Kullback-Leibler). Oferi calibratorului un batch reprezentativ din dataset-ul tău (ex. 500 de imagini cu scenarii de condus). TensorRT observă distribuția activărilor în fiecare strat și calculează factorul optim de scalare care minimizează pierderea de informație.

Iată un snippet conceptual în C++ care arată cum se configurează builder-ul TensorRT pentru calibrarea INT8 pe un Drive PX2:

// 1. Create the builder and network
IBuilder* builder = createInferBuilder(gLogger);
INetworkDefinition* network = builder->createNetwork();

// 2. Enable INT8 mode
builder->setInt8Mode(true);

// 3. Provide the custom Entropy Calibrator (Inherited from IInt8EntropyCalibrator)
Int8EntropyCalibrator* calibrator = new Int8EntropyCalibrator(calibrationBatchStream, "calibration_table.cache");
builder->setInt8Calibrator(calibrator);

// 4. Build the highly-optimized execution engine
ICudaEngine* engine = builder->buildCudaEngine(*network);

Câștiguri de performanță: Drive PX2 și Jetson TX2

Odată ce tabela de calibrare INT8 a fost generată, am făcut deployment pentru motorul (engine) optimizat FCN-AlexNet. Platforma Jetson TX2 (Parker SoC) strălucește în FP16 (half-precision), oferind nativ un throughput dublu comparativ cu FP32. Drive PX2 AutoCruise (cu GPU-urile sale discrete Pascal) valorifică la maximum optimizarea INT8.

Iată metricile normalizate de performanță observate în timpul testelor noastre de condus autonom (procesând cadre de cameră de 1280x720):

Platformă Precizie Amprentă de memorie (Ponderi) Latență inferență (ms) FPS (Aprox) Scădere Acuratețe (mIoU)
Jetson TX2 FP32 ~240 MB ~85 ms 11 FPS Baseline
Jetson TX2 FP16 ~120 MB ~45 ms 22 FPS < 0.1%
Drive PX2 (dGPU) FP32 ~240 MB ~40 ms 25 FPS Baseline
Drive PX2 (dGPU) INT8 ~60 MB ~12 ms 80+ FPS ~0.8% - 1.2%

Observații și limitări

  • Latență și memorie: Trecerea la INT8 a redus dimensiunea modelului cu exact 4x (de la 32 de biți la 8 biți pe pondere), reducând drastic blocajele de pe bus-ul de memorie. Latența a fost îmbunătățită de peste 3x pe Drive PX2.
  • Acuratețe: Scăderea indicatorului Mean Intersection over Union (mIoU) a fost neglijabilă (în jur de 1%). Totuși, în timpul inspecțiilor vizuale de tip edge-case, am observat o ușoară degradare pe obiecte foarte îndepărtate și mici (ex. pietoni aflați mult în depărtare). Acest lucru se întâmplă deoarece INT8 nu are dynamic range-ul necesar pentru a rezolva variații minuscule de activare în profunzimea rețelei.
  • Setul de calibrare: Calitatea modelului INT8 depinde enorm de dataset-ul de calibrare. Dacă setul tău de calibrare nu include condus pe timp de noapte, dynamic range-ul rețelei va fi aliniat greșit la condusul pe întuneric, ducând la o segmentare eratică.

Concluzie

Aritmetica fixed-point nu este doar un concept teoretic; este standardul absolut pentru deployment-ul inteligenței artificiale de producție în industria automotive. Folosind TensorRT și hardware precum Drive PX2 sau Jetson TX2, putem transforma modele FP32 greoaie și lente în motoare INT8 extrem de rapide, fără a compromite siguranța și acuratețea necesare pentru autonomous driving.

În newsletterele viitoare, vom explora zona de systems engineering—în mod specific, sincronizarea ceasurilor cu înaltă precizie folosind (g)PTP peste Ethernet, o componentă critică pentru fuziunea senzorilor (sensor fusion).

Ești gata să stăpânești Deep Learning at the Edge?

Dacă ai considerat utile aceste tehnici de optimizare, fă următorul pas în carieră. Învață cum să arhitectezi, să antrenezi și să faci deployment la modele de computer vision de înaltă performanță direct pe hardware embedded.

Explorează cursul de Deep Learning & Computer Vision

Despre Edocti R&D

Acest newsletter face parte dintr-o serie tehnică dezvoltată de Edocti . Împărtășim informații practice adunate direct din tranșeele inginerești. Focusul nostru principal este Industrial Autonomous Driving, Robotics și Industrial IoT. Suntem specializați în RTOS (QNX, Integrity, OSEK), Linux internals, Deep Learning și arhitecturi de Computer Vision pentru furnizori Tier-1.