libreyolo profile
Группа команд, которая измеряет, куда уходит время в шаге обучения или в вызове инференса, пишет самодостаточный профиль и читает его обратно через несколько срезов.
- Команда
libreyolo profile- Вывод
profile.json и profile_trace.json в runs/profile
Синопсис
libreyolo profile <subcommand> [<positional>] [--flag value ...]Эта группа не принимает аргументы вида key=value. Её подкоманды используют
позиционные аргументы и POSIX-флаги, поэтому пишется --weights LibreYOLO9t.pt,
а не weights=LibreYOLO9t.pt. Запуск libreyolo profile без подкоманды выводит
их список.
Две подкоманды измеряют и пишут профиль; остальные его читают. run и infer
выдают один и тот же самодостаточный profile.json, поэтому любая читающая
подкоманда работает с обоими.
profile run
Запускает короткое обучение под профилировщиком и пишет профиль.
libreyolo profile run <data> [--flag value ...]| Аргумент | По умолчанию | Значение |
|---|---|---|
data | Позиционный. YAML датасета или его имя, например coco128. Обязателен | |
--weights | LibreYOLO9t.pt | Файл весов модели или имя |
--size | t | Вариант размера модели |
--batch | 16 | Микробатч. -1 подбирает размер примерно под 70% VRAM |
--imgsz | 640 | Размер изображения при обучении |
--workers | 8 | Воркеры загрузчика данных |
--amp | true | Использовать AMP-путь семейства. --no-amp отключает его |
--steps | 20 | Профилируемые, то есть измеряемые, шаги |
--warmup | 5 | Шаги прогрева перед измерением |
--repeat | 1 | Повторить N раз ради среднего и стандартного отклонения |
--device | 0 | Устройство |
--project | runs/profile | Корневой каталог вывода |
--json | false | JSON-вывод в stdout |
Измеряемое окно — это --warmup плюс --steps итераций. Датасет, которого
слишком мало, чтобы его заполнить, профиля не даёт: команда завершается с кодом
3 и называет три выхода — датасет побольше, меньше шагов или меньший батч.
--repeat больше 1 пишет сводный runs/profile/profile_repeat.json: скалярные
метрики в нём усреднены по попыткам, а списки ядер взяты из последней попытки.
Это же условие нужно, чтобы compare вынес вердикт о значимости: одного запуска
для него не хватает.
profile infer
Профилирует путь инференса и пишет профиль.
libreyolo profile infer [<source>] [--flag value ...]| Аргумент | По умолчанию | Значение |
|---|---|---|
source | Позиционный. Изображение или каталог. Если опущен, берётся встроенный пример изображения | |
--weights | LibreYOLO9t.pt | Файл весов модели или имя |
--size | t | Вариант размера модели |
--batch | 1 | Изображений за один прямой проход |
--imgsz | 640 | Размер входного изображения |
--half | false | Autocast на прямом проходе, только CUDA. --no-half отключает его |
--amp-dtype | float16 | Тип данных для autocast на CUDA: float16 или bfloat16 |
--warmup | 20 | Итерации прогрева перед измерением |
--runs | 100 | Измеряемые итерации |
--repeat | 1 | Повторить N раз ради среднего и стандартного отклонения |
--conf | 0.25 | Порог уверенности, который меняет объём работы NMS |
--iou | 0.45 | Порог IoU для NMS |
--max-det | 300 | Максимум детекций на изображение, который меняет объём работы NMS |
--device | 0 | Устройство |
--trace | true | Писать Chrome trace для разбора по ядрам и операциям. --no-trace пропускает это |
--project | runs/profile | Корневой каталог вывода |
--json | false | JSON-вывод в stdout |
Сообщает задержку на p50, p90 и p99, пропускную способность в изображениях в секунду и разбиение по стадиям: предобработка, прямой проход и постобработка. Три пороговых аргумента здесь потому, что они двигают число постобработки.
profile summary
libreyolo profile summary <trace> [--json]| Аргумент | По умолчанию | Значение |
|---|---|---|
trace | Позиционный. Путь к profile.json или profile_trace.json. Обязателен | |
--json | false | JSON-вывод в stdout |
Взгляд сверху: время шага, пропускная способность, загрузка GPU, доля Tensor Core, пиковый VRAM, накладные расходы на хосте, запуски ядер на шаг, вердикт об узком месте с его обоснованием, состав ядер по категориям и топ ядер на шаг. Для профиля инференса печатаются ещё перцентили задержки и разбиение по стадиям.
Профиль, снятый при пробуксовке VRAM, помечается: загрузке и пропускной способности, измеренным там, доверять нельзя.
profile get
libreyolo profile get <trace> [<field>] [--json]| Аргумент | По умолчанию | Значение |
|---|---|---|
trace | Позиционный. Путь к профилю. Обязателен | |
field | Позиционный. Имя метрики. Опустите, чтобы вывести список доступных метрик | |
--json | false | JSON-вывод в stdout |
Печатает одну метрику и больше ничего — для циклов в скриптах. Неизвестное поле
завершает команду с кодом 2 и отсылает к форме со списком.
profile phases
libreyolo profile phases <trace> [--json]| Аргумент | По умолчанию | Значение |
|---|---|---|
trace | Позиционный. Путь к профилю. Обязателен | |
--json | false | JSON-вывод в stdout |
Миллисекунды GPU, миллисекунды по часам, число ядер и число операций по каждой фазе: forward, backward, dataload, to_device, optimizer.
profile kernels
libreyolo profile kernels <trace> [--flag value ...]| Аргумент | По умолчанию | Значение |
|---|---|---|
trace | Позиционный. Путь к профилю. Обязателен | |
--top | 20 | Показать топ N по времени GPU |
--category | Фильтр по подстроке категории: gemm, layout, norm, elementwise | |
--grep | Фильтр по регулярному выражению для имени ядра | |
--tensorcore | false | Только ядра Tensor Core |
--sort | time | time, count или name |
--phase | Ограничиться одной фазой: forward, backward, dataload, to_device, optimizer | |
--json | false | JSON-вывод в stdout |
Самый нижний уровень анализа: отдельные ядра GPU с их долей времени GPU,
миллисекундами на шаг, числом вызовов на шаг и категорией. Неизвестная --phase
завершает команду с кодом 2 и выводит список фаз, которые есть в профиле.
profile ops
libreyolo profile ops <trace> [--flag value ...]| Аргумент | По умолчанию | Значение |
|---|---|---|
trace | Позиционный. Путь к профилю. Обязателен | |
--top | 20 | Показать топ N по времени CPU |
--phase | Ограничиться одной фазой | |
--json | false | JSON-вывод в stdout |
Взгляд со стороны фреймворка, а не со стороны устройства: операции aten и
autograd, отсортированные по времени CPU, — именно там видна стоимость запуска
с хоста.
profile compare
libreyolo profile compare <before> <after> [--json]| Аргумент | По умолчанию | Значение |
|---|---|---|
before | Позиционный. Базовый профиль. Обязателен | |
after | Позиционный. Новый профиль. Обязателен | |
--json | false | JSON-вывод в stdout |
Сравнивает пропускную способность, миллисекунды на изображение, загрузку GPU, накладные расходы на хосте, запуски ядер на шаг и вердикт об узком месте.
Чтобы судить о значимости, обе стороны должны быть измерены с --repeat не
меньше 2. Тогда разница считается значимой, если превышает удвоенную суммарную
стандартную ошибку, и в выводе печатается само сделанное сравнение. Без этого в
строке написано, что одного запуска для такого вывода не хватает.
profile what-if
libreyolo profile what-if <trace> [--flag value ...]| Аргумент | По умолчанию | Значение |
|---|---|---|
trace | Позиционный. Путь к профилю. Обязателен | |
--remove-category | Оценить, что даст удаление категории ядер: gemm, layout, norm, elementwise | |
--remove-launches | Оценить, что даст удаление N запусков ядер на шаг, например выигрыш от слияния операций | |
--json | false | JSON-вывод в stdout |
Оценивает выигрыш от изменения до того, как это изменение написано. Один из двух
параметров обязателен; без обоих команда завершается с кодом 2.
Прогноз следует вердикту самого профиля. При загрузке GPU ниже 80% экономия моделируется как число убранных запусков, умноженное на измеренную стоимость одного запуска на хосте; выше — как меньший объём работы GPU. У результата есть поле с оговоркой, потому что стоимость одного запуска — это приближение, и единственное доказательство — второе измерение.
Примеры
# Без аргумента source берётся встроенный пример изображения.libreyolo profile infer --device cpu --warmup 5 --runs 20libreyolo profile summary runs/profile/infer/profile.jsonlibreyolo 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 — файла нет или аргумент не разрешается,
3 — run не выдал профиль, 1 — трейс не удаётся проанализировать.
Смотрите также: libreyolo train — профиль обучения обычно
снимают как раз для того, чтобы настроить его аргументы.