libreyolo profile

Un gruppo di comandi che misura dove va il tempo in uno step di addestramento o in una chiamata di inferenza, scrive un profilo autonomo e rilegge quel profilo attraverso diverse lenti.

Comando
libreyolo profile
Output
profile.json and profile_trace.json under runs/profile

Sinossi

bash
libreyolo profile <subcommand> [<positional>] [--flag value ...]

Questo gruppo non accetta argomenti key=value. I suoi sottocomandi usano argomenti posizionali e flag POSIX, quindi si scrive --weights LibreYOLO9t.pt, non weights=LibreYOLO9t.pt. Eseguire libreyolo profile senza sottocomando stampa l'elenco.

Due sottocomandi misurano e scrivono un profilo; gli altri lo leggono. run e infer producono entrambi lo stesso profile.json autonomo, quindi ogni sottocomando di lettura funziona con l'uno o con l'altro.

profile run

Esegue un breve addestramento profilato e scrive un profilo.

bash
libreyolo profile run <data> [--flag value ...]
ArgomentoDefaultSignificato
dataPosizionale. YAML o nome del dataset, ad esempio coco128. Obbligatorio
--weightsLibreYOLO9t.ptFile o nome dei pesi del modello
--sizetVariante di dimensione del modello
--batch16Micro-batch. -1 si adatta automaticamente a circa il 70% della VRAM
--imgsz640Dimensione delle immagini di addestramento
--workers8Worker del dataloader
--amptrueUsa il percorso AMP della famiglia. --no-amp lo disattiva
--steps20Step profilati, cioè misurati
--warmup5Step di warmup prima della misurazione
--repeat1Ripete N volte per ottenere media e deviazione standard
--device0Dispositivo
--projectruns/profileRadice della directory di output
--jsonfalseOutput JSON su stdout

La finestra misurata è --warmup più --steps iterazioni. Un dataset troppo piccolo per riempirla non produce alcun profilo e il comando esce con codice 3, indicando le tre vie d'uscita: un dataset più grande, meno step o un batch più piccolo.

--repeat maggiore di 1 scrive un runs/profile/profile_repeat.json aggregato, le cui metriche scalari sono mediate tra le prove, mentre gli elenchi dei kernel vengono dall'ultima prova. È anche il prerequisito per un verdetto di significatività in compare: una singola esecuzione non può fornirlo.

profile infer

Profila il percorso di inferenza e scrive un profilo.

bash
libreyolo profile infer [<source>] [--flag value ...]
ArgomentoDefaultSignificato
sourcePosizionale. Immagine o directory. Se omesso, l'immagine di esempio inclusa
--weightsLibreYOLO9t.ptFile o nome dei pesi del modello
--sizetVariante di dimensione del modello
--batch1Immagini per passaggio forward
--imgsz640Dimensione delle immagini in input
--halffalseForward in autocast, solo CUDA. --no-half lo disattiva
--amp-dtypefloat16dtype dell'autocast CUDA: float16 o bfloat16
--warmup20Iterazioni di warmup prima della misurazione
--runs100Iterazioni misurate
--repeat1Ripete N volte per ottenere media e deviazione standard
--conf0.25Soglia di confidenza, che cambia quanto lavoro fa NMS
--iou0.45Soglia IoU di NMS
--max-det300Numero massimo di rilevamenti per immagine, che cambia quanto lavoro fa NMS
--device0Dispositivo
--tracetrueProduce un trace Chrome per analizzare in dettaglio kernel e op. --no-trace lo salta
--projectruns/profileRadice della directory di output
--jsonfalseOutput JSON su stdout

Riporta la latenza a p50, p90 e p99, il throughput in immagini al secondo e la ripartizione per fase tra preprocess, forward e postprocess. I tre argomenti di soglia sono qui perché spostano il numero del postprocess.

profile summary

bash
libreyolo profile summary <trace> [--json]
ArgomentoDefaultSignificato
tracePosizionale. Percorso di un profile.json o profile_trace.json. Obbligatorio
--jsonfalseOutput JSON su stdout

La lettura ad alto livello: tempo per step, throughput, utilizzo della GPU, quota di Tensor Core, VRAM di picco, overhead dell'host, lanci di kernel per step, il verdetto sul collo di bottiglia con la sua motivazione, il mix di kernel per categoria e i kernel principali per step. Su un profilo di inferenza stampa anche i percentili di latenza e la ripartizione per fase.

Un profilo preso in condizioni di thrashing della VRAM viene segnalato, perché l'utilizzo e il throughput misurati lì non sono affidabili.

profile get

bash
libreyolo profile get <trace> [<field>] [--json]
ArgomentoDefaultSignificato
tracePosizionale. Percorso di un profilo. Obbligatorio
fieldPosizionale. Nome della metrica. Ometti per elencare le metriche disponibili
--jsonfalseOutput JSON su stdout

Stampa una sola metrica e nient'altro, per i cicli negli script. Un campo sconosciuto esce con codice 2 e rimanda alla forma che elenca le metriche.

profile phases

bash
libreyolo profile phases <trace> [--json]
ArgomentoDefaultSignificato
tracePosizionale. Percorso di un profilo. Obbligatorio
--jsonfalseOutput JSON su stdout

Millisecondi GPU, millisecondi reali, numero di kernel e numero di op per fase: forward, backward, dataload, to_device, optimizer.

profile kernels

bash
libreyolo profile kernels <trace> [--flag value ...]
ArgomentoDefaultSignificato
tracePosizionale. Percorso di un profilo. Obbligatorio
--top20Mostra i primi N per tempo GPU
--categoryFiltra per sottostringa di categoria: gemm, layout, norm, elementwise
--grepFiltra per espressione regolare sul nome del kernel
--tensorcorefalseSolo kernel Tensor Core
--sorttimetime, count o name
--phaseLimita a una sola fase: forward, backward, dataload, to_device, optimizer
--jsonfalseOutput JSON su stdout

Il fondo dell'analisi: i singoli kernel GPU con la loro quota di tempo GPU, i millisecondi per step, le invocazioni per step e la categoria. Un --phase sconosciuto esce con codice 2 ed elenca le fasi presenti nel profilo.

profile ops

bash
libreyolo profile ops <trace> [--flag value ...]
ArgomentoDefaultSignificato
tracePosizionale. Percorso di un profilo. Obbligatorio
--top20Mostra i primi N per tempo CPU
--phaseLimita a una sola fase
--jsonfalseOutput JSON su stdout

La vista del framework anziché quella del dispositivo: op aten e di autograd ordinate per tempo CPU, che è dove si manifesta il costo dei lanci dall'host.

profile compare

bash
libreyolo profile compare <before> <after> [--json]
ArgomentoDefaultSignificato
beforePosizionale. Profilo di riferimento. Obbligatorio
afterPosizionale. Nuovo profilo. Obbligatorio
--jsonfalseOutput JSON su stdout

Confronta throughput, millisecondi per immagine, utilizzo della GPU, overhead dell'host, lanci di kernel per step e verdetto sul collo di bottiglia.

Il giudizio di significatività richiede che entrambi i lati siano misurati con --repeat di almeno 2. A quel punto una differenza conta come significativa quando supera il doppio dell'errore standard combinato, e l'output stampa il confronto che ha fatto. Senza, la riga dice che una singola esecuzione non può sostenere il giudizio.

profile what-if

bash
libreyolo profile what-if <trace> [--flag value ...]
ArgomentoDefaultSignificato
tracePosizionale. Percorso di un profilo. Obbligatorio
--remove-categoryProietta la rimozione di una categoria di kernel: gemm, layout, norm, elementwise
--remove-launchesProietta la rimozione di N lanci di kernel per step, per esempio un guadagno da fusione di op
--jsonfalseOutput JSON su stdout

Stima cosa porterebbe una modifica prima che la modifica venga scritta. Una delle due opzioni è obbligatoria; nessuna delle due esce con codice 2.

La proiezione segue il verdetto del profilo stesso. Sotto l'80% di utilizzo della GPU modella il risparmio come meno lanci moltiplicati per il costo host per lancio misurato; sopra, come meno lavoro GPU. Il risultato porta con sé un campo di avvertenza, perché il costo per lancio è un'approssimazione e l'unica prova è una seconda misurazione.

Esempi

Misurare l'inferenza
# Senza argomento source viene usata l'immagine di esempio inclusa.libreyolo profile infer --device cpu --warmup 5 --runs 20
Leggere il verdetto
libreyolo profile summary runs/profile/infer/profile.json
Confrontare due misurazioni
libreyolo profile infer --device cpu --warmup 5 --runs 20 --project runs/profile/alibreyolo profile infer --device cpu --warmup 5 --runs 20 --batch 4 --project runs/profile/b libreyolo profile compare runs/profile/a/infer/profile.json \  runs/profile/b/infer/profile.json

Note

Il profiler misura e riporta. Non cambia nulla: leggere il verdetto, modificare la configurazione o il codice, rieseguire e confrontare è il ciclo per cui è costruito.

--device vale 0 per impostazione predefinita, cioè il dispositivo CUDA 0. Passare --device cpu misura sulla CPU e produce un profilo che i sottocomandi di lettura accettano comunque, senza il dettaglio dei kernel GPU.

Ogni sottocomando supporta --json, e quelli di lettura stampano solo su stdout, ed è questo che rende il gruppo utilizzabile da uno script.

I codici di uscita qui sono propri del gruppo: 2 per un file che non esiste o un argomento che non si risolve, 3 quando run non ha prodotto alcun profilo e 1 quando un trace non può essere analizzato.

Correlato: libreyolo train, i cui argomenti sono ciò che di solito un profilo di addestramento serve a regolare.

Verificato con LibreYOLO v1.5.0.