Путь диагностики из четырёх решений
Цель — найти первый слой, который даёт сбой, а не перепробовать несколько установок подряд. Сохраняйте запущенную команду, первое сообщение об ошибке и результат каждой проверки. Если вы измените одновременно Python, пакет PyTorch и размер батча, вы уже не поймёте, какое изменение решило проблему.
Скачиваемый скрипт выполняет эту последовательность и формирует ограниченный технический отчёт. Он не запускает вашу модель и не изменяет вашу установку. Используйте его в том же окружении, что и ваш проект, иначе вы проверите другой интерпретатор, а не тот, в котором произошёл сбой.
Прокрутите таблицу, чтобы увидеть все столбцы.| Проверка | Если проверка даёт сбой | Что позволяет сделать её успешное прохождение |
|---|---|---|
| 1. Интерпретатор и импорт | Исправить используемый Python или его установку PyTorch. | Узнать версию и backend фактически импортированного пакета. |
| 2. Backend и устройство | Проверить пакет, драйвер, доступность GPU и права. | Запросить выделение ресурсов на нужном GPU. |
| 3. Небольшое вычисление на GPU | Сохранить ошибку выделения, вычисления или синхронизации. | Перейти к уменьшенному входу приложения. |
| 4. Репрезентативное приложение | Изолировать неверные веса, расширение, формат, память или вывод. | Постепенно увеличивать реальную нагрузку. |
1. Определите Python, который действительно выполняется
Терминал, ноутбук и служба могут использовать разные интерпретаторы. Выведите sys.executable в том контексте, который запускает проект, затем проверьте версию. Путь позволяет обнаружить забытое виртуальное окружение или ноутбук, оставшийся на другом ядре. Проверьте его на своей машине; публиковать вашу личную структуру каталогов в отчёте не нужно.
Затем с помощью этого же интерпретатора опросите пакеты. Команда python -m pip show torch выдаёт информацию о PyTorch, связанном с этим Python. Если import torch даёт сбой, следующий шаг — исправить эту установку: уменьшение батча или смена весов модели не решит проблему отсутствующего модуля.
python -c "import sys; print(sys.executable); print(sys.version)"
python -m pip show torch2. Различайте CUDA, ROCm и пакет без ускорения на GPU
Снимите отдельно torch.__version__, torch.version.cuda и torch.version.hip. Не делайте вывод «пакет для CPU» только по значению None у torch.version.cuda: PyTorch для ROCm использует HIP, повторно задействует torch.cuda и также ожидает устройство с именем cuda. Замена этого имени на rocm или hip — не то исправление, которое нужно применять.
Затем проверьте torch.cuda.is_available() и torch.cuda.device_count(). Эти результаты описывают, что данный Python-интерпретатор может использовать в текущий момент. Они не заменяют минимальный расчёт. Системный инструмент может видеть карту, тогда как пакет, доступный процессу драйвер или его окружение мешают PyTorch её использовать.
python -c "import torch; print(torch.__version__); print(torch.version.cuda); print(torch.version.hip); print(torch.cuda.is_available()); print(torch.cuda.device_count())"3. Формирование отчёта с помощью скрипта Kernodeck
После загрузки файла поместите его в рабочий каталог и запустите с помощью Python проекта. По умолчанию требуется GPU. Режим CPU нужно запрашивать явно: его успех проверяет ветку диагностики для CPU и никогда не превращает недоступный GPU в подтверждённый GPU. Отчёт выводится в терминал, а при использовании --output — в новый файл JSON. Существующий файл никогда не перезаписывается: выберите другое имя для следующей попытки.
Скрипт выделяет две матрицы 2 × 2 в float32, проверяет их произведение, затем градиент и синхронизирует устройство GPU. Ожидаемое значение потерь для этого фиксированного расчёта равно 196. Эта очень короткая проверка не загружает никаких весов модели и не измеряет никакой пропускной способности. Она требует небольшого реального вычисления от бэкенда, выходя за рамки простого обнаружения устройства.
Необязательная системная проверка использует nvidia-smi, когда он присутствует. Она сообщает только версию драйвера NVIDIA и общий объём памяти, видимый этому инструменту; она не является эквивалентной системной проверкой для ROCm. Тайм-аут вычисления по умолчанию составляет 30 секунд и может задаваться от 5 до 120 секунд. У системной проверки собственный максимальный тайм-аут 3 секунды.
python kernodeck-diagnostic-v1.py --device-index 0 --timeout 30 --output diagnostic-gpu.jsonpython kernodeck-diagnostic-v1.py --device cpu --output diagnostic-cpu.jsonpython kernodeck-diagnostic-v1.py --host-check --output diagnostic-gpu-systeme.json4. Чтение отчёта и выбор следующего действия
Начните с status, code, exit_code и stage. Блок runtime определяет версию Python и семейство системы. Блок pytorch различает импортированный пакет, его версии сборки CUDA/HIP, объявленный бэкенд и видимые устройства. Блок execution указывает, где фактически выполнялся расчёт и были ли проверены произведение и градиент.
В режиме CPU gpu_available и visible_device_count остаются равными null: скрипт не запрашивает состояние драйвера GPU. Это не ноль и не сбой. Также прочитайте execution.device: пакет, собранный для CUDA, вполне может выполнить эту проверку на CPU, когда это явно запрошено.
Отчёт содержит подборку технических данных. Он не включает переменные окружения, пути на машине, идентификаторы сессии, полный список пакетов или необработанную трассировку исключения. Скрипт не отправляет никаких отчётов в Kernodeck. Для подробной ошибки вашего приложения сохраните её трассировку в своём рабочем пространстве и удалите секреты перед тем, как ею поделиться.
Прокрутите таблицу, чтобы увидеть все столбцы.| Результат | Значение | Следующее действие |
|---|---|---|
| GPU_CHECK_PASSED · 0 | Произведение и градиент проверены на выбранном GPU. | Перейти к небольшому входу вашего приложения. |
| CPU_CHECK_PASSED · 0 | Произведение и градиент проверены только на CPU. | Не делать выводов о CUDA или ROCm. |
| TORCH_MISSING · 3 / TORCH_IMPORT_FAILED · 4 | PyTorch отсутствует в этом Python или импорт завершился неудачей. | Проверить интерпретатор, пакет и его зависимости. |
| GPU_BACKEND_ABSENT · 5 | Пакет не объявляет ни CUDA, ни HIP. | Установить пакет, подходящий для вашего окружения. |
| GPU_UNAVAILABLE · 6 / DEVICE_INDEX_INVALID · 7 | GPU непригоден для использования в этом процессе, или индекс вне видимых устройств. | Проверить доступность карт, драйвер и запрошенный индекс. |
| CHECK_FAILED · 8 / OUT_OF_MEMORY или RUNTIME_ERROR · 9 | Сбой фиксированного расчёта, выделения памяти или операции бэкенда. | Прочитать указанный этап перед запуском полной модели. |
| TIMEOUT · 10 / WORKER_FAILED · 11 | Проверка остановлена по тайм-ауту или без пригодного для использования отчёта. | Расценивать проверку как сбой; изучить окружение. |
| OUTPUT_WRITE_FAILED · 12 | Отчёт не был сохранён в указанное место назначения. | Использовать новое доступное имя файла. |
5. Переход от небольшого вычисления к вашему приложению
Перед запуском подготовьте воспроизводимую команду, идентифицированную модель, небольшой набор данных и доступный каталог вывода. Выберите входные данные, которые сохраняют важные характеристики конечной работы: длину текста, размеры изображения, формат аудио или обязательные поля. Искусственно короткие входные данные могут скрыть проблему, которую вы хотите наблюдать.
Задайте конкретный критерий успеха. Для вычисления эмбеддингов каждый идентификатор входа должен получать вектор ожидаемой размерности с конечными значениями. Для обучения один шаг должен давать приемлемую функцию потерь, обновлять предусмотренные параметры и позволять сохранять состояние. Код завершения процесса дополняет эти проверки, а не заменяет их.
Добавьте маркеры до и после чтения параметров, импорта библиотек, загрузки весов, подготовки данных, их передачи, вычисления и записи. Присвойте каждой попытке идентификатор и сохраняйте связанные с ней параметры. Сообщение «модель загружена» должно соответствовать завершённому событию, а не просто намерению загрузить.
Логируйте формы, типы и устройства нужных тензоров, не копируя весь набор данных. Сводка вида «вход: 8 последовательностей, максимальная длина 512, устройство cuda:0» помогает сравнивать две попытки. Эти числа здесь описывают пример журнала, а не универсальную конфигурацию. Не помещайте токены доступа или конфиденциальное содержимое входных данных в эти сообщения.
6. Исправление ошибки на нужном уровне
Если небольшое вычисление проходит, но веса не находятся, проверьте их путь, формат и права доступа. Если расширение не импортируется, проверьте его совместимость с пакетом PyTorch и бэкендом проекта. Успешная диагностика не подтверждает работоспособность всех расширений приложения. Возвращайтесь к первому шагу, на котором возникает сбой, вместо того чтобы менять несколько зависимостей сразу.
Ошибка устройства может быть вызвана входными данными, оставшимися на CPU, тогда как модель находится на GPU. Ошибка типа может быть вызвана частичным преобразованием или оператором, несовместимым с выбранной точностью. Сохраните первое полное сообщение и его трассировку. Меняйте по одной гипотезе за раз, затем снова запускайте минимальный вход, прежде чем возвращать конечный объём.
7. Если модель запускается, а затем превышает объём памяти
Определите, возникает ли превышение при загрузке весов, при первом вычислении или после нескольких итераций. Эти моменты указывают на разные причины: слишком большой объём модели, крупные активации или кэш генерации, накопление сохраняемых тензоров. Снимайте torch.cuda.memory_allocated() и torch.cuda.memory_reserved() на одних и тех же этапах. Первый отслеживает выделения под тензоры; второй охватывает память, управляемую аллокатором.
torch.cuda.empty_cache() может вернуть неиспользуемый кэш, но не удаляет тензоры, на которые ещё есть ссылки. Поэтому проверяйте списки выходов, истории функции потерь и объекты, удерживающие граф вычислений. Затем уменьшите размер батча или длину входа, чтобы изолировать определяющий фактор. Смена карты становится обоснованным решением, когда вы знаете этап, на котором происходит превышение, и реально необходимый запас.
8. Измерение вычисления с учётом асинхронности
Операции на GPU могут выполняться асинхронно по отношению к программе на Python. Поэтому таймер, размещённый вокруг вызова, может измерять главным образом отправку работы. Для диагностического измерения синхронизируйте GPU на границах наблюдаемого участка или используйте подходящие события. Такая синхронизация меняет ход выполнения: держите эту инструментацию отдельно от обычной работы вашего приложения.
Постройте простой пример с тремя сегментами: подготовка входа, вычисление, запись выхода. Для сегмента GPU вызовите torch.cuda.synchronize(), замерьте time.perf_counter(), выполните вычисление, снова синхронизируйте, затем вычислите разницу. Храните отдельно первый проход и последующие. Загрузка или инициализация не должна растворяться в среднем, выдаваемом за полное время отклика.
9. Проверяйте выходы и сохраняйте диагностику для повторного использования
Для классического инференса model.eval() задаёт поведение соответствующих модулей, тогда как torch.inference_mode() отключает отслеживание, необходимое для градиентов. Эти две настройки выполняют разные функции. Используйте вторую, когда созданные тензоры не должны впоследствии участвовать в вычислении с градиентами. Оценка модели во время обучения требует явного возврата в нужный режим перед его возобновлением.
Теперь сравните выходы с подготовленным контрактом: число результатов, соответствие идентификаторов, размерности, конечные значения и подходящая бизнес-метрика. Если вы увеличиваете batch, снова проверьте это соответствие. Если вы добавляете GPU, проверьте распределение входов и сбор выходов. Лоты аренды обозначают заказанные карты; batch обозначает примеры, обрабатываемые вашей программой вместе.
Результат этого метода — небольшая папка: команда, версии, параметры, минимальный вход, последний успешный шаг, первая ошибка, наблюдения по памяти и полученный выход. Если запуск работает, сохраните эту папку как точку сравнения перед увеличением нагрузки. Если запуск не удаётся, она позволяет воспроизвести проблему, не начиная всё расследование заново.
Перед длительной обработкой также выполните корректную остановку и возобновление на этом небольшом наборе входов. Убедитесь, что уже записанные выходы не потеряны и не посчитаны дважды. После прохождения этих проверок постепенно увеличивайте только одну ось — batch, длину, параллелизм или число процессов — и фиксируйте наблюдаемый предел. Вы получаете измеренный диапазон работы для вашего приложения, а не предположение, связанное с названием GPU.
Предоставленное доказательство и его ограничения
Загружаемые примеры получены из реальных проверок, выполненных 24 сентября 2026 года. Оба запуска с PyTorch используют Windows, Python 3.14.6 и PyTorch 2.11.0+cu128. Проверка GPU использует CUDA на NVIDIA GeForce RTX 5070; проверка CPU явно запрашивает CPU. Это контрольное оборудование не представлено как предложение Kernodeck. Для этого доказательства не выполнялось ни одного вычисления на ROCm.
Успешное небольшое вычисление показывает, что путь выделения памяти и вычислений работает на выбранном устройстве. Оно не измеряет ни скорость вашей модели, ни память, необходимую для её наибольших входов, ни её совместимость с конкретным расширением. Отчёт также не подтверждает многослотовую топологию. Переходите к репрезентативному тесту, прежде чем решать увеличивать нагрузку или аренду.
Для приложения CUDA сравните карточку NVIDIA со своими потребностями в памяти и библиотеках; для цепочки ROCm изучите условия MI300X. Связанные карточки — это варианты, которые нужно квалифицировать для вашего проекта, а не список оборудования, использованного в доказательстве. Учитывайте время первоначальной проверки и экспорта в ваш период 3, 7 или 30 дней.
Прокрутите таблицу, чтобы увидеть все столбцы.| Реальная проверка | Наблюдаемый результат | Область применения |
|---|---|---|
| Явный CPU · Python 3.14.6 / PyTorch 2.11.0+cu128 | CPU_CHECK_PASSED; произведение и градиент точны; потеря 196. | Фиксированное вычисление работает на CPU. |
| CUDA · RTX 5070 / пакет CUDA 12.8 | GPU_CHECK_PASSED; произведение и градиент точны; потеря 196. | Фиксированное вычисление работает на этой карте в этой среде. |
| PyTorch отсутствует · Python 3.12.14 | TORCH_MISSING; код выхода 3. | Отсутствие модуля приводит к явному сбою. |
| GPU сделан невидимым для процесса проверки | GPU_UNAVAILABLE; код выхода 6. | Скрипт не подменяет GPU на CPU молча. |