Что означает «RuntimeError: ошибка CUDA: инициировано утверждение на стороне устройства» в PyTorch? - PullRequest
1 голос
/ 21 апреля 2019

Я видел много конкретных постов, посвященных конкретным конкретным случаям, но никаких фундаментальных мотивирующих объяснений.Что означает эта ошибка:

RuntimeError: CUDA error: device-side assert triggered

?В частности, что такое инициируемое утверждение, почему это утверждение и как мы работаем в обратном направлении для устранения проблемы?

Как есть, это сообщение об ошибке практически бесполезно при диагностике любой проблемы из-запроблема заключается в том, что общепринятый код «где-то касается графического процессора».Документация Cuda также не кажется полезной в этом отношении, хотя я могу ошибаться.https://docs.nvidia.com/cuda/cuda-gdb/index.html

1 Ответ

1 голос
/ 21 апреля 2019

При обнаружении ошибки на стороне устройства во время выполнения кода устройства CUDA об этой ошибке сообщается с помощью обычного механизма сообщения об ошибках API среды выполнения CUDA . Обычная обнаруженная ошибка в коде устройства будет выглядеть как недопустимый адрес (например, попытка разыменования неверного указателя), но другой тип - это утверждение на стороне устройства. Этот тип ошибки генерируется всякий раз, когда C / C ++ assert() встречается в коде устройства, и условие утверждения ложно.

Такая ошибка возникает в результате конкретного ядра. Проверка ошибок во время выполнения в CUDA обязательно является асинхронной, но, вероятно, есть как минимум 3 возможных метода для начала отладки.

  1. Изменение исходного кода для эффективного преобразования асинхронных запусков ядра в синхронные запуски ядра и тщательной проверки ошибок после каждого запуска ядра. Это определит конкретное ядро, которое вызвало ошибку. В этот момент может быть достаточно просто взглянуть на различные утверждения в этом коде ядра, но вы также можете использовать шаг 2 или 3 ниже.

  2. Запустите свой код с помощью cuda-memcheck. Это инструмент, похожий на «valgrind для кода устройства». Когда вы запускаете свой код с cuda-memcheck, он будет работать намного медленнее, но будет улучшена отчетность об ошибках во время выполнения. Также обычно предпочтительно компилировать ваш код с помощью -lineinfo. В этом сценарии, когда инициируется утверждение на стороне устройства, cuda-memcheck сообщит номер строки исходного кода, где находится утверждение, а также само утверждение и условие, которое было ложным. Вы можете увидеть здесь для пошагового руководства по его использованию (хотя и с ошибкой неверного адреса вместо assert(), но процесс с assert() будет аналогичным.

  3. Также должна быть возможность использовать отладчик. Если вы используете отладчик, такой как cuda-gdb (например, в linux), тогда у отладчика будут отчеты о трассировке, которые будут указывать, какой строкой было утверждение, когда оно было выполнено.

И cuda-memcheck, и отладчик можно использовать, если код CUDA запускается из скрипта Python.

В этот момент вы обнаружили, что такое assert и где он находится в исходном коде. Почему это не может быть дано общего ответа. Это будет зависеть от намерения разработчиков, и если это не будет прокомментировано или иным образом очевидно, вам понадобится какой-то метод для интуитивного понимания этого. Вопрос «как работать в обратном направлении» также является общим вопросом отладки, не специфичным для CUDA. Вы можете использовать printf в коде ядра CUDA, а также отладчик, такой как cuda-gdb, чтобы помочь с этим (например, установить точку останова до assert и проверять состояние машины - например, переменные - когда assert собирается быть удар).

...