Руководство по отладке AOTInductor
Дата создания: 14 авг. 2025 г. | Дата последнего обновления: 3 дек. 2025 г.
Если при использовании AOT Inductor возникают ошибки недопустимого доступа к памяти CUDA (IMA), это руководство предлагает систематический подход к их отладке. AOT Inductor входит в стек PT2, как и torch.compile, но создает артефакт компиляции, который можно использовать в среде C++. Ошибки недопустимого доступа к памяти CUDA могут возникать недетерминированно и временами даже казаться кратковременными.
В целом отладка ошибок IMA CUDA состоит из трех основных шагов:
- Проверки работоспособности: используйте базовые флаги отладки, чтобы выявить распространенные проблемы до более глубокого анализа.
- Определение места возникновения IMA CUDA: добейтесь детерминированного возникновения ошибки и выявите проблемное ядро.
- Выявление проблемных ядер: используйте отладку промежуточных значений, чтобы проверить входные и выходные данные ядра.
Шаг 1. Проверки работоспособности
Прежде чем углубляться в надежное воспроизведение ошибки, попробуйте использовать имеющиеся флаги отладки:
AOTI_RUNTIME_CHECK_INPUTS=1 TORCHINDUCTOR_NAN_ASSERTS=1
Эти флаги действуют во время компиляции (точнее, во время генерации кода):
-
AOTI_RUNTIME_CHECK_INPUTS=1проверяет, удовлетворяют ли входные данные тому же набору ограничений, который использовался при компиляции. Подробнее см. в разделе Устранение неполадок torch.compile. -
TORCHINDUCTOR_NAN_ASSERTS=1добавляет генерацию кода до и после каждого ядра Inductor, чтобы проверять наличие NaN.
Шаг 2. Определение места возникновения IMA CUDA
Одна из сложностей заключается в том, что ошибки IMA CUDA могут возникать недетерминированно. Они могут проявляться в разных местах, а иногда и вовсе не возникать (хотя это лишь означает, что результаты вычислений незаметно оказываются неверными). С помощью следующих двух флагов можно добиться детерминированного возникновения ошибки:
PYTORCH_NO_CUDA_MEMORY_CACHING=1 CUDA_LAUNCH_BLOCKING=1
Эти флаги действуют во время выполнения:
-
PYTORCH_NO_CUDA_MEMORY_CACHING=1отключает кэшируемый аллокатор PyTorch, который сразу выделяет буфер большего размера, чем требуется, чтобы сократить число выделений буферов. Обычно именно это становится причиной недетерминированных ошибок недопустимого доступа к памяти CUDA.Рисунок: как кэшируемый аллокатор PyTorch может маскировать ошибки недопустимого доступа к памяти CUDA
-
CUDA_LAUNCH_BLOCKING=1заставляет запускать ядра по одному. Без этого появилось бы известное предупреждение «Ошибки ядра CUDA могут асинхронно сообщаться при вызове другого API», поскольку ядра запускаются асинхронно.
Шаг 3. Выявление проблемных ядер с помощью отладчика промежуточных значений
Отладчик промежуточных значений AOTI поможет определить проблемное ядро и получить сведения о его входных и выходных данных.
Для начала используйте:
AOT_INDUCTOR_DEBUG_INTERMEDIATE_VALUE_PRINTER=3
Этот флаг действует во время компиляции и выводит ядра по одному во время выполнения. В сочетании с предыдущими флагами это позволит узнать, какое ядро было запущено непосредственно перед возникновением ошибки.
Однако важно учитывать, что возникновение ошибки в этом ядре не обязательно означает, что именно оно является проблемным. Например, проблема может быть в более раннем ядре, которое выдает неверные результаты. Поэтому логичным следующим шагом будет проверка входных данных проблемного ядра:
AOT_INDUCTOR_FILTERED_KERNELS_TO_PRINT="triton_poi_fused_add_ge_logical_and_logical_or_lt_231,_add_position_embeddings_kernel_5" AOT_INDUCTOR_DEBUG_INTERMEDIATE_VALUE_PRINTER=2
Переменная среды filtered kernels to print содержит имена ядер, которые нужно проверить. Если входные данные ядра не соответствуют ожиданиям, проверьте ядро, которое создает неверные входные данные.
Дополнительные инструменты отладки
Ведение журналов и трассировка
- tlparse / TORCH_TRACE: предоставляет полный вывод кода для проверки и записывает набор использованных ограничений. Подробнее см. в разделе tlparse / TORCH_TRACE.
-
TORCH_LOGS: используйте
TORCH_LOGS="+inductor,output_code", чтобы просмотреть больше внутренних журналов PT2. Подробнее см. в разделе TORCH_LOGS. -
TORCH_SHOW_CPP_STACKTRACES: задайте
TORCH_SHOW_CPP_STACKTRACES=1, чтобы получить дополнительные трассировки стека.
Распространенные источники проблем
- Динамические формы: исторически это частый источник ошибок IMA. При отладке сценариев с динамическими формами уделяйте этому особое внимание.
- Пользовательские операции: особенно если они реализованы на C++ и используются с динамическими формами. Необходимо адаптировать meta-функцию для работы с SymInt.
© 2026, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://docs.pytorch.org/docs/2.14/user_guide/torch_compiler/torch.compiler_aot_inductor_debugging_guide.html