Ver como Markdown

libreyolo profile

Un grupo de comandos que mide adónde se va el tiempo en un paso de entrenamiento o en una llamada de inferencia, escribe un perfil autocontenido y vuelve a leer ese perfil desde varios ángulos.

Comando
libreyolo profile
Salida
profile.json y profile_trace.json en runs/profile

Sinopsis

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

Este grupo no acepta argumentos key=value. Sus subcomandos usan argumentos posicionales y flags POSIX, así que es --weights LibreYOLO9t.pt, no weights=LibreYOLO9t.pt. Ejecutar libreyolo profile sin subcomando imprime la lista.

Dos subcomandos miden y escriben un perfil; el resto lo leen. Tanto run como infer emiten el mismo profile.json autocontenido, así que todos los subcomandos de lectura funcionan con cualquiera de los dos.

profile run

Ejecuta un entrenamiento corto perfilado y escribe un perfil.

bash
libreyolo profile run <data> [--flag value ...]
ArgumentoPor defectoSignificado
dataPosicional. YAML o nombre del dataset, p. ej. coco128. Requerido
--weightsLibreYOLO9t.ptArchivo o nombre de los pesos del modelo
--sizetVariante de tamaño del modelo
--batch16Micro-batch. -1 ajusta automáticamente cerca del 70% de la VRAM
--imgsz640Tamaño de la imagen de entrenamiento
--workers8Workers del dataloader
--amptrueUsa la ruta AMP de la familia. --no-amp lo desactiva
--steps20Pasos perfilados, es decir, medidos
--warmup5Pasos de calentamiento antes de medir
--repeat1Repite N veces para obtener una media y una desviación estándar
--device0Dispositivo
--projectruns/profileRaíz del directorio de salida
--jsonfalseSalida JSON por stdout

La ventana medida son las iteraciones de --warmup más las de --steps. Un dataset demasiado pequeño para llenarla no produce ningún perfil y el comando termina con el código 3, nombrando las tres salidas: un dataset más grande, menos pasos o un batch más pequeño.

Un --repeat por encima de 1 escribe un runs/profile/profile_repeat.json agregado cuyas métricas escalares se promedian entre pruebas, mientras que las listas de kernels vienen de la última prueba. Es además el requisito previo para un veredicto de significancia en compare: una sola ejecución no puede darlo.

profile infer

Perfila la ruta de inferencia y escribe un perfil.

bash
libreyolo profile infer [<source>] [--flag value ...]
ArgumentoPor defectoSignificado
sourcePosicional. Imagen o directorio. La imagen de ejemplo incluida si se omite
--weightsLibreYOLO9t.ptArchivo o nombre de los pesos del modelo
--sizetVariante de tamaño del modelo
--batch1Imágenes por pasada forward
--imgsz640Tamaño de la imagen de entrada
--halffalseForward con autocast, solo CUDA. --no-half lo desactiva
--amp-dtypefloat16dtype del autocast de CUDA: float16 o bfloat16
--warmup20Iteraciones de calentamiento antes de medir
--runs100Iteraciones medidas
--repeat1Repite N veces para obtener una media y una desviación estándar
--conf0.25Umbral de confianza, que cambia cuánto trabajo hace NMS
--iou0.45Umbral de IoU para NMS
--max-det300Máximo de detecciones por imagen, que cambia cuánto trabajo hace NMS
--device0Dispositivo
--tracetrueEmite una traza de Chrome para profundizar en kernels y ops. --no-trace la omite
--projectruns/profileRaíz del directorio de salida
--jsonfalseSalida JSON por stdout

Informa de la latencia en p50, p90 y p99, del throughput en imágenes por segundo y del reparto por etapas entre preprocesado, forward y postprocesado. Los tres argumentos de umbral están aquí porque mueven la cifra del postprocesado.

profile summary

bash
libreyolo profile summary <trace> [--json]
ArgumentoPor defectoSignificado
tracePosicional. Ruta a un profile.json o profile_trace.json. Requerido
--jsonfalseSalida JSON por stdout

La lectura de alto nivel: tiempo por paso, throughput, utilización de la GPU, proporción de Tensor Cores, pico de VRAM, overhead del host, lanzamientos de kernel por paso, el veredicto sobre el cuello de botella con su motivo, la mezcla de kernels por categoría y los principales kernels por paso. En un perfil de inferencia imprime además los percentiles de latencia y el reparto por etapas.

Un perfil tomado con thrashing de VRAM queda marcado, porque la utilización y el throughput medidos ahí no son fiables.

profile get

bash
libreyolo profile get <trace> [<field>] [--json]
ArgumentoPor defectoSignificado
tracePosicional. Ruta a un perfil. Requerido
fieldPosicional. Nombre de la métrica. Omítelo para listar las métricas disponibles
--jsonfalseSalida JSON por stdout

Imprime una métrica y nada más, para bucles en scripts. Un campo desconocido termina con el código 2 y remite a la forma de listado.

profile phases

bash
libreyolo profile phases <trace> [--json]
ArgumentoPor defectoSignificado
tracePosicional. Ruta a un perfil. Requerido
--jsonfalseSalida JSON por stdout

Milisegundos de GPU, milisegundos de reloj, número de kernels y número de ops por fase: forward, backward, dataload, to_device, optimizer.

profile kernels

bash
libreyolo profile kernels <trace> [--flag value ...]
ArgumentoPor defectoSignificado
tracePosicional. Ruta a un perfil. Requerido
--top20Muestra los N principales por tiempo de GPU
--categoryFiltra por subcadena de categoría: gemm, layout, norm, elementwise
--grepFiltra por expresión regular sobre el nombre del kernel
--tensorcorefalseSolo kernels de Tensor Core
--sorttimetime, count o name
--phaseLimita a una sola fase: forward, backward, dataload, to_device, optimizer
--jsonfalseSalida JSON por stdout

El fondo del análisis: kernels de GPU individuales con su porcentaje del tiempo de GPU, milisegundos por paso, invocaciones por paso y categoría. Un --phase desconocido termina con el código 2 y lista las fases que tiene el perfil.

profile ops

bash
libreyolo profile ops <trace> [--flag value ...]
ArgumentoPor defectoSignificado
tracePosicional. Ruta a un perfil. Requerido
--top20Muestra los N principales por tiempo de CPU
--phaseLimita a una sola fase
--jsonfalseSalida JSON por stdout

La vista del framework en lugar de la del dispositivo: ops de aten y de autograd ordenadas por tiempo de CPU, que es donde aparece el coste del lanzamiento desde el host.

profile compare

bash
libreyolo profile compare <before> <after> [--json]
ArgumentoPor defectoSignificado
beforePosicional. Perfil de referencia. Requerido
afterPosicional. Perfil nuevo. Requerido
--jsonfalseSalida JSON por stdout

Compara throughput, milisegundos por imagen, utilización de la GPU, overhead del host, lanzamientos de kernel por paso y el veredicto sobre el cuello de botella.

El juicio de significancia necesita que ambos lados se hayan medido con un --repeat de al menos 2. Con eso, una diferencia cuenta como significativa cuando supera el doble del error estándar combinado, y la salida imprime la comparación que hizo. Sin ello, la línea dice que una sola ejecución no puede sostener el juicio.

profile what-if

bash
libreyolo profile what-if <trace> [--flag value ...]
ArgumentoPor defectoSignificado
tracePosicional. Ruta a un perfil. Requerido
--remove-categoryProyecta la eliminación de una categoría de kernels: gemm, layout, norm, elementwise
--remove-launchesProyecta la eliminación de N lanzamientos de kernel por paso, por ejemplo una ganancia por fusión de ops
--jsonfalseSalida JSON por stdout

Estima lo que aportaría un cambio antes de escribir ese cambio. Se requiere una de las dos opciones; no indicar ninguna termina con el código 2.

La proyección sigue el veredicto del propio perfil. Por debajo del 80% de utilización de la GPU modela el ahorro como menos lanzamientos multiplicados por el coste de host por lanzamiento medido; por encima, como menos trabajo de GPU. El resultado lleva un campo de advertencia, porque el coste por lanzamiento es una aproximación y la única prueba es una segunda medición.

Ejemplos

Medir la inferencia
# Sin argumento source se usa la imagen de ejemplo incluida.libreyolo profile infer --device cpu --warmup 5 --runs 20
Leer el veredicto
libreyolo profile summary runs/profile/infer/profile.json
Comparar dos mediciones
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

Notas

El profiler mide e informa. No cambia nada: leer el veredicto, editar la configuración o el código, volver a ejecutar y comparar es el bucle para el que está construido.

--device vale 0 por defecto, que es el dispositivo CUDA 0. Pasar --device cpu mide en la CPU y produce un perfil que los subcomandos de lectura siguen aceptando, sin el detalle de kernels de GPU.

Todos los subcomandos admiten --json, y los de lectura imprimen solo por stdout, que es lo que hace que el grupo se pueda usar desde un script.

Los códigos de salida aquí son los propios del grupo: 2 para un archivo que no existe o un argumento que no resuelve, 3 cuando run no produjo ningún perfil, y 1 cuando una traza no se puede analizar.

Relacionado: libreyolo train, cuyos argumentos son lo que normalmente se busca ajustar cuando se toma un perfil de entrenamiento.

Verificado con LibreYOLO v1.5.0.