Утилиты для бенчмаркинга — torch.utils.benchmark
Создано: 2 нояб. 2020 г. | Последнее обновление: 7 мая 2026 г.
-
class torch.utils.benchmark.Timer(stmt='pass', setup='pass', global_setup='', timer=<function timer>, globals=None, label=None, sub_label=None, description=None, env=None, num_threads=1, language=Language.PYTHON)[исходный код] -
Вспомогательный класс для измерения времени выполнения инструкций PyTorch.
Полное руководство по использованию этого класса см. здесь: https://pytorch.org/tutorials/recipes/recipes/benchmark.html
Таймер PyTorch основан на
timeit.Timer(и фактически внутри используетtimeit.Timer), но имеет несколько важных отличий:-
- Учет особенностей среды выполнения:
-
Timer выполняет прогревочные запуски (это важно, поскольку некоторые компоненты PyTorch инициализируются лениво), задает размер пула потоков для корректного сравнения и при необходимости синхронизирует асинхронные функции ускорителей.
-
- Акцент на повторных измерениях:
-
При измерении кода, особенно сложных ядер и моделей, значительные колебания результатов от запуска к запуску могут исказить оценку. Предполагается, что все измерения должны включать повторные запуски для количественной оценки шума и вычисления медианы, которая надежнее среднего значения. Поэтому этот класс концептуально объединяет
timeit.Timer.repeatиtimeit.Timer.autorange, отступая от APItimeit. (Точные алгоритмы описаны в строках документации методов.) Методtimeitвоспроизводит исходный вариант для случаев, когда адаптивная стратегия не требуется.
-
- Дополнительные метаданные:
-
При создании Timer можно при желании указать
label,sub_label,descriptionиenv. (Они определены ниже.) Эти поля включаются в представление объекта результата и используются классомCompareдля группировки и отображения результатов сравнения.
-
- Количество инструкций
-
Помимо времени выполнения, Timer может запускать инструкцию под Callgrind и сообщать количество выполненных инструкций.
Аргументы конструктора, непосредственно соответствующие
timeit.Timer:stmt,setup,timer,globalsАргументы конструктора, специфичные для таймера PyTorch:
label,sub_label,description,env,num_threads- Параметры:
-
- stmt (str) – Фрагмент кода, который будет выполняться в цикле и измеряться.
-
setup (str) – Необязательный код настройки. Используется для определения переменных, задействованных в
stmt -
global_setup (str) – (Только для C++) Код, который размещается на верхнем уровне файла, например для инструкций
#include. -
timer (Callable[[], float]) – Вызываемый объект, возвращающий текущее время. Если PyTorch собран без поддержки ускорителей или ускоритель отсутствует, по умолчанию используется
timeit.default_timer; в противном случае перед измерением времени выполняется синхронизация ускорителей. -
globals (dict[str, Any] | None) – Словарь, определяющий глобальные переменные при выполнении
stmt. Это другой способ передать переменные, необходимые дляstmt. -
label (str | None) – Строка с кратким описанием
stmt. Например, еслиstmt— «torch.nn.functional.relu(torch.add(x, 1, out=out)», можно задать label равным «ReLU(x + 1)», чтобы улучшить читаемость. -
sub_label (str | None) –
Дополнительные сведения для различения измерений с одинаковыми stmt или label. Например, в приведенном выше примере sub_label может быть равен «float» или «int», чтобы результаты было легко различать: «ReLU(x + 1): (float)»
«ReLU(x + 1): (int)» при выводе объектов Measurement или при создании сводки с помощью
Compare. -
description (str | None) –
Строка для различения измерений с одинаковыми label и sub_label. Основное назначение
description— указатьCompareстолбцы данных. Например, его можно задать в зависимости от размера входных данных, чтобы получить таблицу следующего вида:| n=1 | n=4 | ... ------------- ... ReLU(x + 1): (float) | ... | ... | ... ReLU(x + 1): (int) | ... | ... | ...с помощью
Compare. Это значение также включается при выводе объекта Measurement. -
env (str | None) – Эта метка указывает, что в остальном идентичные задачи выполнялись в разных средах и поэтому не являются эквивалентными, например при A/B-тестировании изменения ядра.
Compareбудет считать объекты Measurement с разными значениямиenvотдельными при объединении повторных запусков. -
num_threads (int) – Размер пула потоков PyTorch при выполнении
stmt. Производительность в однопоточном режиме важна как для одной из ключевых задач логического вывода, так и в качестве хорошего показателя внутренней эффективности алгоритма, поэтому по умолчанию используется один поток. Это отличается от размера пула потоков PyTorch по умолчанию, который старается задействовать все ядра.
-
adaptive_autorange(threshold=0.1, *, min_run_time=0.01, max_run_time=10.0, callback=None)[исходный код] -
Подобно
blocked_autorange, но также проверяет вариативность измерений и повторяет их, пока отношение межквартильного размаха к медиане не станет меньшеthresholdили не будет достигнутоmax_run_time.В общих чертах adaptive_autorange выполняет следующий псевдокод:
`setup` times = [] while times.sum < max_run_time start = timer() for _ in range(block_size): `stmt` times.append(timer() - start) enough_data = len(times)>3 and times.sum > min_run_time small_iqr=times.iqr/times.mean<threshold if enough_data and small_iqr: break- Параметры:
- Возвращает:
-
Объект
Measurement, содержащий измеренное время выполнения и число повторений, который можно использовать для вычисления статистических показателей (среднего, медианы и т. д.). - Тип возвращаемого значения:
-
blocked_autorange(callback=None, min_run_time=0.2)[исходный код] -
Выполняет много повторных измерений, сводя к минимуму накладные расходы таймера.
В общих чертах blocked_autorange выполняет следующий псевдокод:
`setup` total_time = 0 while total_time < min_run_time start = timer() for _ in range(block_size): `stmt` total_time += (timer() - start)Обратите внимание на переменную
block_sizeво внутреннем цикле. Выбор размера блока важен для качества измерений и требует баланса между двумя конкурирующими целями:- Малый размер блока обеспечивает больше повторных измерений и, как правило, более точную статистику.
- Большой размер блока позволяет лучше распределить стоимость вызова
timerи дает менее смещенную оценку. Это важно, поскольку синхронизация ускорителя занимает заметное время (от единиц до нескольких десятков микросекунд) и в противном случае исказила бы измерение.
blocked_autorange задает block_size, выполняя прогревочный период и увеличивая размер блока, пока накладные расходы таймера не станут меньше 0,1% от общего времени вычислений. Затем это значение используется в основном цикле измерений.
- Возвращает:
-
Объект
Measurement, содержащий измеренное время выполнения и число повторений, который можно использовать для вычисления статистических показателей (среднего, медианы и т. д.). - Тип возвращаемого значения:
-
collect_callgrind(number: int, *, repeats: None, collect_baseline: bool, retain_out_file: bool) → CallgrindStats[исходный код] - collect_callgrind(number:int, *, repeats:int, collect_baseline:bool, retain_out_file:bool) tuple[CallgrindStats,...]
-
Собирает сведения о количестве инструкций с помощью Callgrind.
В отличие от времени выполнения, количество инструкций детерминировано (за исключением недетерминированности самой программы и небольшого разброса, вносимого интерпретатором Python). Благодаря этому оно идеально подходит для подробного анализа производительности. Этот метод запускает
stmtв отдельном процессе, чтобы Valgrind мог инструментировать программу. Инструментирование значительно снижает производительность, однако это компенсируется тем, что для получения качественных измерений обычно достаточно небольшого числа итераций.Для использования этого метода необходимо установить
valgrind,callgrind_controlиcallgrind_annotate.Поскольку вызывающий процесс и выполнение
stmtразделены границей процесса,globalsне может содержать произвольные структуры данных в памяти. (В отличие от методов измерения времени.) Глобальные переменные ограничены встроенными объектами, объектамиnn.Modulesи функциями или модулями TorchScript, чтобы уменьшить вероятность неожиданностей при сериализации и последующей десериализации. Подробнее об этом см. в классеGlobalsBridge. Будьте особенно внимательны с nn.Modules: они используют pickle, и для корректной передачи может понадобиться добавить импорт вsetup.По умолчанию собирается и кэшируется профиль пустой инструкции, чтобы определить количество инструкций, выполняемых циклом Python, который управляет
stmt.- Возвращает:
-
Объект
CallgrindStats, предоставляющий сведения о количестве инструкций и базовые средства для анализа и обработки результатов.
-
timeit(number=1000000)[исходный код] -
Повторяет семантику timeit.Timer.timeit().
Выполняет основную инструкцию (
stmt)numberраз. https://docs.python.org/3/library/timeit.html#timeit.Timer.timeit- Тип возвращаемого значения:
-
-
class torch.utils.benchmark.Measurement(number_per_run, raw_times, task_spec, metadata=None)[исходный код] -
Результат измерения с помощью Timer.
Этот класс хранит одно или несколько измерений заданной инструкции. Он поддерживает сериализацию и предоставляет несколько удобных методов (в том числе подробный __repr__) для дальнейшей обработки.
-
static merge(measurements)[исходный код] -
Вспомогательный метод для объединения повторных измерений.
Merge экстраполирует время до
number_per_run=1и не переносит метаданные (поскольку они могут различаться между повторными измерениями).- Тип возвращаемого значения:
-
property significant_figures: int -
Приблизительная оценка числа значащих цифр.
Это свойство предназначено для удобной оценки точности измерения. Для вычисления статистики используется только межквартильный размах, чтобы уменьшить влияние асимметрии хвостов распределения; применяется фиксированное значение z, равное 1,645, поскольку предполагается, что оно не будет использоваться для малых значений
n, и поэтому z может аппроксимироватьt.Оценка числа значащих цифр используется вместе с методом
trim_sigfigдля создания более понятной человеку сводки данных. Метод __repr__ его не использует — он просто отображает исходные значения. Оценка числа значащих цифр предназначена дляCompare.
-
-
class torch.utils.benchmark.CallgrindStats(task_spec, number_per_run, built_with_debug_symbols, baseline_inclusive_stats, baseline_exclusive_stats, stmt_inclusive_stats, stmt_exclusive_stats, stmt_callgrind_out)[исходный код] -
Контейнер верхнего уровня для результатов Callgrind, собранных Timer.
Для обработки обычно используется класс FunctionCounts, получаемый вызовом
CallgrindStats.stats(…). Также доступно несколько вспомогательных методов; наиболее важный из них —CallgrindStats.as_standardized().-
as_standardized()[исходный код] -
Удаляет из строк функций названия библиотек и некоторые префиксы.
При сравнении двух наборов данных о количестве инструкций одним из препятствий могут стать префиксы путей. Callgrind включает полный путь к файлу при выводе функции, и это правильно. Однако при сравнении профилей это может вызывать проблемы. Если такой важный компонент, как Python или PyTorch, был собран в разных каталогах для двух профилей, результат может выглядеть примерно так:
23234231 /tmp/first_build_dir/thing.c:foo(...) 9823794 /tmp/first_build_dir/thing.c:bar(...) ... 53453 .../aten/src/Aten/...:function_that_actually_changed(...) ... -9823794 /tmp/second_build_dir/thing.c:bar(...) -23234231 /tmp/second_build_dir/thing.c:foo(...)
Удаление префиксов позволяет смягчить эту проблему, нормализуя строки и улучшая сопоставление эквивалентных мест вызова при сравнении.
- Тип возвращаемого значения:
-
counts(*, denoise=False)[исходный код] -
Возвращает общее количество выполненных инструкций.
Пояснение аргумента
denoiseсм. вFunctionCounts.denoise().- Тип возвращаемого значения:
-
delta(other, inclusive=False)[исходный код] -
Сравнивает два набора счетчиков.
Одна из распространенных причин собирать сведения о количестве инструкций — определить, как конкретное изменение повлияет на число инструкций, необходимых для выполнения некоторой единицы работы. Если это число возрастает, следующий логичный вопрос — «почему». Обычно для ответа нужно выяснить, какая часть кода привела к увеличению количества инструкций. Эта функция автоматизирует процесс, позволяя легко сравнивать счетчики как с учетом вложенных вызовов, так и без них.
- Тип возвращаемого значения:
-
stats(inclusive=False)[исходный код] -
Возвращает подробные счетчики функций.
Возвращаемые FunctionCounts можно представить как кортеж кортежей вида (количество, путь_и_имя_функции).
inclusiveсоответствует семантике Callgrind. Если значение True, счетчики включают инструкции, выполненные дочерними функциями.inclusive=Trueполезен для выявления узких мест в коде;inclusive=Falseполезен для уменьшения шума при сравнении счетчиков двух разных запусков. (Подробнее см. CallgrindStats.delta(…).)- Тип возвращаемого значения:
-
-
class torch.utils.benchmark.FunctionCounts(_data, inclusive, truncate_rows=True, _linewidth=None)[исходный код] -
Контейнер для обработки результатов Callgrind.
- Поддерживаются:
-
- Сложение и вычитание для объединения результатов или их сравнения.
- Индексация, как у кортежей.
- Функция
denoise, удаляющая вызовы CPython, известные своей недетерминированностью и значительным уровнем шума. - Два метода высшего порядка (
filterиtransform) для пользовательской обработки.
-
denoise()[исходный код] -
Удаляет известные источники шума в счетчиках инструкций.
Некоторые инструкции интерпретатора CPython довольно сильно влияют на разброс результатов. Это инструкции, связанные с поиском в словаре по Unicode-строкам, которые Python использует для сопоставления имен переменных. Обычно FunctionCounts — это контейнер, не зависящий от содержимого, однако для получения надежных результатов это исключение достаточно важно.
- Тип возвращаемого значения:
-
filter(filter_fn)[исходный код] -
Оставляет только элементы, для которых
filter_fnвозвращает True при передаче имени функции.- Тип возвращаемого значения:
-
transform(map_fn)[исходный код] -
Применяет
map_fnко всем именам функций.Это можно использовать для нормализации имен функций (например, удаления несущественных частей пути к файлу), объединения записей путем сопоставления нескольких функций одному имени (в этом случае счетчики суммируются) и т. д.
- Тип возвращаемого значения:
-
class torch.utils.benchmark.Compare(results)[исходный код] -
Вспомогательный класс для отображения результатов множества измерений в виде форматированной таблицы.
Формат таблицы основан на информационных полях, указанных в
torch.utils.benchmark.Timer(description,label,sub_label,num_threadsи т. д.).Таблицу можно вывести напрямую с помощью
print()или преобразовать вstr.Полное руководство по использованию этого класса см. здесь: https://pytorch.org/tutorials/recipes/recipes/benchmark.html
- Параметры:
-
results (list[Measurement]) – Список объектов Measurement для отображения.
-
colorize(rowwise=False)[исходный код] -
Добавляет цветовое оформление к форматированной таблице.
По умолчанию раскрашивает столбцы.
-
extend_results(results)[исходный код] -
Добавляет результаты к уже сохраненным.
Все добавляемые результаты должны быть экземплярами
Measurement.
-
highlight_warnings()[исходный код] -
Включает выделение предупреждений при создании форматированной таблицы.
-
print()[исходный код] -
Выводит форматированную таблицу.
-
trim_significant_figures()[исходный код] -
Включает сокращение числа значащих цифр при создании форматированной таблицы.
-
torch.utils.benchmark.examples.op_benchmark.assert_dicts_equal(dict_0, dict_1)[исходный код] -
Встроенное сравнение словарей не сравнивает массивы NumPy.
Например:
x = {"a": np.ones((2, 1))} x == x # Raises ValueError
-
torch.utils.benchmark.utils.fuzzer.prod(values, base=1)[исходный код] -
np.prod может вызвать переполнение, поэтому для вычисления произведения размеров следует использовать Python.
Несмотря на то что тип результата np.prod повышается до int64, переполнение все равно возможно. В таком случае отрицательное значение пройдет проверку размера, а при попытке фактически выделить память для Tensor возникнет ошибка нехватки памяти.
-
torch.utils.benchmark.utils.common.select_unit(t)[исходный код] -
Определяет, как масштабировать значения времени порядка O(1).
Эта утилита форматирует числа для удобного восприятия.
-
torch.utils.benchmark.utils.common.trim_sigfig(x, n)[исходный код] -
Округляет
xдоnзначащих цифр (например, 3.14159, 2 -> 3.10000).- Тип возвращаемого значения:
-
torch.utils.benchmark.utils.compile.bench_all(model, sample_input, num_iters=5, optimizer=None, loss_fn=None)[исходный код] -
Это простая утилита для тестирования производительности torch.compile. В частности, она проверяет, настроен ли ваш GPU для использования тензорных ядер, если он их поддерживает. Она также тестирует все основные бэкенды и выводит таблицу результатов, чтобы вы могли легко сравнить их. Для многих бэкендов требуются дополнительные зависимости, поэтому установите их отдельно с помощью pip.
Вы получите одну таблицу для инференса и другую для обучения. Если вы хотите использовать эту утилиту для обучения, обязательно передайте ей torch.optim.Optimizer.
Важные предупреждения: ваш GPU поддерживает тензорные ядра; мы включим их автоматически, установив
torch.set_float32_matmul_precision(‘high’)Если компиляция завершится с ошибкой по какой-либо причине, в том числе из-за отсутствующей зависимости, мы выведем Failed to compile {backend} with mode {mode}
-
torch.utils.benchmark.utils.compile.benchmark_compile(model, sample_input, num_iters=5, backend=None, mode='default', optimizer=None, loss_fn=None)[исходный код] -
Используйте эту утилиту для тестирования производительности torch.compile.
torch.utils.benchmark.examples
torch.utils.benchmark.examples.spectral_ops_fuzz_test
Микротесты производительности для модуля torch.fft
© 2026, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://docs.pytorch.org/docs/2.14/benchmark_utils.html