Посмотреть как Markdown

libreyolo profile

Группа команд, которая измеряет, куда уходит время в шаге обучения или в вызове инференса, пишет самодостаточный профиль и читает его обратно через несколько срезов.

Команда
libreyolo profile
Вывод
profile.json и profile_trace.json в runs/profile

Синопсис

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

Эта группа не принимает аргументы вида key=value. Её подкоманды используют позиционные аргументы и POSIX-флаги, поэтому пишется --weights LibreYOLO9t.pt, а не weights=LibreYOLO9t.pt. Запуск libreyolo profile без подкоманды выводит их список.

Две подкоманды измеряют и пишут профиль; остальные его читают. run и infer выдают один и тот же самодостаточный profile.json, поэтому любая читающая подкоманда работает с обоими.

profile run

Запускает короткое обучение под профилировщиком и пишет профиль.

bash
libreyolo profile run <data> [--flag value ...]
АргументПо умолчаниюЗначение
dataПозиционный. YAML датасета или его имя, например coco128. Обязателен
--weightsLibreYOLO9t.ptФайл весов модели или имя
--sizetВариант размера модели
--batch16Микробатч. -1 подбирает размер примерно под 70% VRAM
--imgsz640Размер изображения при обучении
--workers8Воркеры загрузчика данных
--amptrueИспользовать AMP-путь семейства. --no-amp отключает его
--steps20Профилируемые, то есть измеряемые, шаги
--warmup5Шаги прогрева перед измерением
--repeat1Повторить N раз ради среднего и стандартного отклонения
--device0Устройство
--projectruns/profileКорневой каталог вывода
--jsonfalseJSON-вывод в stdout

Измеряемое окно — это --warmup плюс --steps итераций. Датасет, которого слишком мало, чтобы его заполнить, профиля не даёт: команда завершается с кодом 3 и называет три выхода — датасет побольше, меньше шагов или меньший батч.

--repeat больше 1 пишет сводный runs/profile/profile_repeat.json: скалярные метрики в нём усреднены по попыткам, а списки ядер взяты из последней попытки. Это же условие нужно, чтобы compare вынес вердикт о значимости: одного запуска для него не хватает.

profile infer

Профилирует путь инференса и пишет профиль.

bash
libreyolo profile infer [<source>] [--flag value ...]
АргументПо умолчаниюЗначение
sourceПозиционный. Изображение или каталог. Если опущен, берётся встроенный пример изображения
--weightsLibreYOLO9t.ptФайл весов модели или имя
--sizetВариант размера модели
--batch1Изображений за один прямой проход
--imgsz640Размер входного изображения
--halffalseAutocast на прямом проходе, только CUDA. --no-half отключает его
--amp-dtypefloat16Тип данных для autocast на CUDA: float16 или bfloat16
--warmup20Итерации прогрева перед измерением
--runs100Измеряемые итерации
--repeat1Повторить N раз ради среднего и стандартного отклонения
--conf0.25Порог уверенности, который меняет объём работы NMS
--iou0.45Порог IoU для NMS
--max-det300Максимум детекций на изображение, который меняет объём работы NMS
--device0Устройство
--tracetrueПисать Chrome trace для разбора по ядрам и операциям. --no-trace пропускает это
--projectruns/profileКорневой каталог вывода
--jsonfalseJSON-вывод в stdout

Сообщает задержку на p50, p90 и p99, пропускную способность в изображениях в секунду и разбиение по стадиям: предобработка, прямой проход и постобработка. Три пороговых аргумента здесь потому, что они двигают число постобработки.

profile summary

bash
libreyolo profile summary <trace> [--json]
АргументПо умолчаниюЗначение
traceПозиционный. Путь к profile.json или profile_trace.json. Обязателен
--jsonfalseJSON-вывод в stdout

Взгляд сверху: время шага, пропускная способность, загрузка GPU, доля Tensor Core, пиковый VRAM, накладные расходы на хосте, запуски ядер на шаг, вердикт об узком месте с его обоснованием, состав ядер по категориям и топ ядер на шаг. Для профиля инференса печатаются ещё перцентили задержки и разбиение по стадиям.

Профиль, снятый при пробуксовке VRAM, помечается: загрузке и пропускной способности, измеренным там, доверять нельзя.

profile get

bash
libreyolo profile get <trace> [<field>] [--json]
АргументПо умолчаниюЗначение
traceПозиционный. Путь к профилю. Обязателен
fieldПозиционный. Имя метрики. Опустите, чтобы вывести список доступных метрик
--jsonfalseJSON-вывод в stdout

Печатает одну метрику и больше ничего — для циклов в скриптах. Неизвестное поле завершает команду с кодом 2 и отсылает к форме со списком.

profile phases

bash
libreyolo profile phases <trace> [--json]
АргументПо умолчаниюЗначение
traceПозиционный. Путь к профилю. Обязателен
--jsonfalseJSON-вывод в stdout

Миллисекунды GPU, миллисекунды по часам, число ядер и число операций по каждой фазе: forward, backward, dataload, to_device, optimizer.

profile kernels

bash
libreyolo profile kernels <trace> [--flag value ...]
АргументПо умолчаниюЗначение
traceПозиционный. Путь к профилю. Обязателен
--top20Показать топ N по времени GPU
--categoryФильтр по подстроке категории: gemm, layout, norm, elementwise
--grepФильтр по регулярному выражению для имени ядра
--tensorcorefalseТолько ядра Tensor Core
--sorttimetime, count или name
--phaseОграничиться одной фазой: forward, backward, dataload, to_device, optimizer
--jsonfalseJSON-вывод в stdout

Самый нижний уровень анализа: отдельные ядра GPU с их долей времени GPU, миллисекундами на шаг, числом вызовов на шаг и категорией. Неизвестная --phase завершает команду с кодом 2 и выводит список фаз, которые есть в профиле.

profile ops

bash
libreyolo profile ops <trace> [--flag value ...]
АргументПо умолчаниюЗначение
traceПозиционный. Путь к профилю. Обязателен
--top20Показать топ N по времени CPU
--phaseОграничиться одной фазой
--jsonfalseJSON-вывод в stdout

Взгляд со стороны фреймворка, а не со стороны устройства: операции aten и autograd, отсортированные по времени CPU, — именно там видна стоимость запуска с хоста.

profile compare

bash
libreyolo profile compare <before> <after> [--json]
АргументПо умолчаниюЗначение
beforeПозиционный. Базовый профиль. Обязателен
afterПозиционный. Новый профиль. Обязателен
--jsonfalseJSON-вывод в stdout

Сравнивает пропускную способность, миллисекунды на изображение, загрузку GPU, накладные расходы на хосте, запуски ядер на шаг и вердикт об узком месте.

Чтобы судить о значимости, обе стороны должны быть измерены с --repeat не меньше 2. Тогда разница считается значимой, если превышает удвоенную суммарную стандартную ошибку, и в выводе печатается само сделанное сравнение. Без этого в строке написано, что одного запуска для такого вывода не хватает.

profile what-if

bash
libreyolo profile what-if <trace> [--flag value ...]
АргументПо умолчаниюЗначение
traceПозиционный. Путь к профилю. Обязателен
--remove-categoryОценить, что даст удаление категории ядер: gemm, layout, norm, elementwise
--remove-launchesОценить, что даст удаление N запусков ядер на шаг, например выигрыш от слияния операций
--jsonfalseJSON-вывод в stdout

Оценивает выигрыш от изменения до того, как это изменение написано. Один из двух параметров обязателен; без обоих команда завершается с кодом 2.

Прогноз следует вердикту самого профиля. При загрузке GPU ниже 80% экономия моделируется как число убранных запусков, умноженное на измеренную стоимость одного запуска на хосте; выше — как меньший объём работы GPU. У результата есть поле с оговоркой, потому что стоимость одного запуска — это приближение, и единственное доказательство — второе измерение.

Примеры

Измерение инференса
# Без аргумента source берётся встроенный пример изображения.libreyolo profile infer --device cpu --warmup 5 --runs 20
Чтение вердикта
libreyolo profile summary runs/profile/infer/profile.json
Сравнение двух измерений
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

Примечания

Профилировщик измеряет и сообщает. Он ничего не меняет: цикл, ради которого он сделан, — прочитать вердикт, поправить конфигурацию или код, перезапустить и сравнить.

По умолчанию --device равен 0, то есть CUDA-устройство 0. С --device cpu измерение идёт на CPU и получается профиль, который читающие подкоманды по-прежнему принимают, но без детализации по ядрам GPU.

--json поддерживают все подкоманды, а читающие пишут только в stdout — именно поэтому группу удобно вызывать из скрипта.

Коды возврата здесь свои у группы: 2 — файла нет или аргумент не разрешается, 3run не выдал профиль, 1 — трейс не удаётся проанализировать.

Смотрите также: libreyolo train — профиль обучения обычно снимают как раз для того, чтобы настроить его аргументы.

Проверено с LibreYOLO v1.5.0.