Ver como markdown

libreyolo profile

Um grupo de comandos que mede para onde vai o tempo em um passo de treinamento ou em uma chamada de inferência, escreve um perfil autocontido e lê esse perfil de volta por vários ângulos.

Comando
libreyolo profile
Saída
profile.json e profile_trace.json em runs/profile

Sinopse

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

Este grupo não aceita argumentos key=value. Seus subcomandos usam argumentos posicionais e flags POSIX, ou seja, é --weights LibreYOLO9t.pt, não weights=LibreYOLO9t.pt. Rodar libreyolo profile sem subcomando imprime a lista.

Dois subcomandos medem e escrevem um perfil; os demais leem um. run e infer emitem o mesmo profile.json autocontido, então todo subcomando de leitura funciona com qualquer um dos dois.

profile run

Roda um treinamento curto com profiling e escreve um perfil.

bash
libreyolo profile run <data> [--flag value ...]
ArgumentoPadrãoSignificado
dataPosicional. YAML ou nome do dataset, por exemplo coco128. Obrigatório
--weightsLibreYOLO9t.ptArquivo de pesos ou nome do modelo
--sizetVariante de tamanho do modelo
--batch16Micro-batch. -1 ajusta automaticamente para cerca de 70% da VRAM
--imgsz640Tamanho da imagem de treinamento
--workers8Workers do dataloader
--amptrueUsa o caminho AMP da família. --no-amp desativa
--steps20Passos com profiling, isto é, medidos
--warmup5Passos de warmup antes de medir
--repeat1Repete N vezes para obter média e desvio padrão
--device0Dispositivo
--projectruns/profileRaiz do diretório de saída
--jsonfalseSaída JSON no stdout

A janela medida é --warmup mais --steps iterações. Um dataset pequeno demais para preenchê-la não produz perfil algum e o comando termina com o código 3, apontando as três saídas possíveis: um dataset maior, menos passos ou um batch menor.

--repeat acima de 1 escreve um runs/profile/profile_repeat.json agregado, cujas métricas escalares são a média das tentativas, enquanto as listas de kernels vêm da última tentativa. Ele também é pré-requisito para um veredito de significância no compare: uma única execução não consegue fornecer um.

profile infer

Faz profiling do caminho de inferência e escreve um perfil.

bash
libreyolo profile infer [<source>] [--flag value ...]
ArgumentoPadrãoSignificado
sourcePosicional. Imagem ou diretório. A imagem de exemplo incluída quando omitido
--weightsLibreYOLO9t.ptArquivo de pesos ou nome do modelo
--sizetVariante de tamanho do modelo
--batch1Imagens por passada forward
--imgsz640Tamanho da imagem de entrada
--halffalseForward com autocast, apenas CUDA. --no-half desativa
--amp-dtypefloat16Dtype do autocast CUDA: float16 ou bfloat16
--warmup20Iterações de warmup antes de medir
--runs100Iterações medidas
--repeat1Repete N vezes para obter média e desvio padrão
--conf0.25Limiar de confiança, que muda quanto trabalho o NMS faz
--iou0.45Limiar de IoU do NMS
--max-det300Máximo de detecções por imagem, que muda quanto trabalho o NMS faz
--device0Dispositivo
--tracetrueEmite um trace do Chrome para detalhar kernels e ops. --no-trace pula isso
--projectruns/profileRaiz do diretório de saída
--jsonfalseSaída JSON no stdout

Informa a latência em p50, p90 e p99, o throughput em imagens por segundo e a divisão por etapas entre pré-processamento, forward e pós-processamento. Os três argumentos de limiar estão aqui porque mexem no número do pós-processamento.

profile summary

bash
libreyolo profile summary <trace> [--json]
ArgumentoPadrãoSignificado
tracePosicional. Caminho para um profile.json ou profile_trace.json. Obrigatório
--jsonfalseSaída JSON no stdout

A leitura de alto nível: tempo por passo, throughput, utilização da GPU, participação dos Tensor Cores, pico de VRAM, overhead do host, lançamentos de kernel por passo, o veredito sobre o gargalo com seu motivo, a mistura de kernels por categoria e os principais kernels por passo. Em um perfil de inferência, imprime também os percentis de latência e a divisão por etapas.

Um perfil tomado sob thrashing de VRAM é marcado, porque a utilização e o throughput medidos ali não são confiáveis.

profile get

bash
libreyolo profile get <trace> [<field>] [--json]
ArgumentoPadrãoSignificado
tracePosicional. Caminho para um perfil. Obrigatório
fieldPosicional. Nome da métrica. Omita para listar as métricas disponíveis
--jsonfalseSaída JSON no stdout

Imprime uma métrica e nada mais, para loops em scripts. Um campo desconhecido termina com o código 2 e aponta para a forma de listagem.

profile phases

bash
libreyolo profile phases <trace> [--json]
ArgumentoPadrãoSignificado
tracePosicional. Caminho para um perfil. Obrigatório
--jsonfalseSaída JSON no stdout

Milissegundos de GPU, milissegundos de relógio, contagem de kernels e contagem de ops por fase: forward, backward, dataload, to_device, optimizer.

profile kernels

bash
libreyolo profile kernels <trace> [--flag value ...]
ArgumentoPadrãoSignificado
tracePosicional. Caminho para um perfil. Obrigatório
--top20Mostra os N principais por tempo de GPU
--categoryFiltra por substring de categoria: gemm, layout, norm, elementwise
--grepFiltra por expressão regular sobre o nome do kernel
--tensorcorefalseApenas kernels de Tensor Core
--sorttimetime, count ou name
--phaseRestringe a uma fase: forward, backward, dataload, to_device, optimizer
--jsonfalseSaída JSON no stdout

O fundo da análise: kernels de GPU individuais com sua fatia do tempo de GPU, milissegundos por passo, invocações por passo e categoria. Um --phase desconhecido termina com o código 2 e lista as fases que o perfil tem.

profile ops

bash
libreyolo profile ops <trace> [--flag value ...]
ArgumentoPadrãoSignificado
tracePosicional. Caminho para um perfil. Obrigatório
--top20Mostra os N principais por tempo de CPU
--phaseRestringe a uma fase
--jsonfalseSaída JSON no stdout

A visão do framework em vez da visão do dispositivo: ops de aten e do autograd ordenadas por tempo de CPU, que é onde aparece o custo de lançamento do host.

profile compare

bash
libreyolo profile compare <before> <after> [--json]
ArgumentoPadrãoSignificado
beforePosicional. Perfil de referência. Obrigatório
afterPosicional. Perfil novo. Obrigatório
--jsonfalseSaída JSON no stdout

Compara throughput, milissegundos por imagem, utilização da GPU, overhead do host, lançamentos de kernel por passo e o veredito sobre o gargalo.

O julgamento de significância precisa que os dois lados tenham sido medidos com --repeat de pelo menos 2. Com isso, uma diferença conta como significativa quando supera o dobro do erro padrão combinado, e a saída imprime a comparação que fez. Sem isso, a linha diz que uma única execução não sustenta o julgamento.

profile what-if

bash
libreyolo profile what-if <trace> [--flag value ...]
ArgumentoPadrãoSignificado
tracePosicional. Caminho para um perfil. Obrigatório
--remove-categoryProjeta a remoção de uma categoria de kernels: gemm, layout, norm, elementwise
--remove-launchesProjeta a remoção de N lançamentos de kernel por passo, por exemplo um ganho de fusão de ops
--jsonfalseSaída JSON no stdout

Estima o que uma mudança traria antes de a mudança ser escrita. Uma das duas opções é obrigatória; nenhuma delas termina com o código 2.

A projeção segue o veredito do próprio perfil. Abaixo de 80% de utilização da GPU, modela a economia como menos lançamentos vezes o custo de host por lançamento medido; acima disso, como menos trabalho de GPU. O resultado carrega um campo de ressalva, porque o custo por lançamento é uma aproximação e a única prova é uma segunda medição.

Exemplos

Medir a inferência
# Sem argumento source, usa a imagem de exemplo incluída.libreyolo profile infer --device cpu --warmup 5 --runs 20
Ler o veredito
libreyolo profile summary runs/profile/infer/profile.json
Comparar duas medições
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

O profiler mede e informa. Ele não muda nada: ler o veredito, editar a configuração ou o código, rodar de novo e comparar é o ciclo para o qual ele foi construído.

--device vale 0 por padrão, que é o dispositivo CUDA 0. Passar --device cpu mede na CPU e produz um perfil que os subcomandos de leitura continuam aceitando, sem o detalhe de kernels de GPU.

Todo subcomando aceita --json, e os de leitura imprimem apenas no stdout, que é o que torna o grupo utilizável a partir de um script.

Os códigos de saída aqui são os do próprio grupo: 2 para um arquivo que não existe ou um argumento que não resolve, 3 quando run não produziu nenhum perfil, e 1 quando um trace não pode ser analisado.

Relacionado: libreyolo train, cujos argumentos são o que um perfil de treinamento costuma ser tomado para ajustar.

Verificado com o LibreYOLO v1.5.0.