Собираем ROCm 7.1 + PyTorch в Windows под свои GPU
В этой статье я поделюсь опытом сборки еще не вышедшей на момент написания ROCm 7 под свои GPU, даже если их нет в списке официально поддерживаемых архитектур. Затем покажу, как с собранным ROCm 7 собрать PyTorch и запустить ComfyUI. Для примера я буду собирать ROCm под RX 6800 + Radeon 780m.
Я предполагаю, что читатель уже знает, что такое ROCm и зачем он нужен.
Мотивация
У меня мини-ПК на Ryzen 8745HS со встроенной Radeon 780M (без NPU) и внешней видеокартой RX 6800. Мне давно наскучил полноценный ATX-корпус в интерьере, да и нужен он был только для того, чтобы было куда воткнуть GPU. А так как я GPU в основном использую для ML-задач, то все 16 линий PCIe мне не нужны — 4x от eGPU вполне достаточно.
До этого у меня была RTX 3060, но 12 ГБ VRAM банально не хватало — буквально 1–2 ГБ — для запуска некоторых моделей. На 24 ГБ RTX 3090 или 16 ГБ более свежих RTX 5060 Ti денег было жалко, поэтому я взял RX 6800: цена на б/у рынке почти такая же, как у 3060.
Но вот незадача: вместо CUDA у нас ROCm. Он вроде хочет быть как "красная CUDA", и сейчас, возможно, с выходом ROCm 7 что-то изменится в лучшую сторону, но пока это сплошные костыли. Однако будем работать с тем, что имеем, и попробуем выжать из этого максимум.
Свой путь я начал с Arch Linux и ROCm 7, но столкнулся с подводными камнями:
Драйверы периодически отваливались при использовании ROCm на встройке. Помогала только перезагрузка.
В Linux нет поддержки горячего отключения eGPU. Скрипты, которые мне удалось найти, не помогают для ROCm: Vulkan-ускорение работает нормально, а ROCm-драйвер падает до перезагрузки.
Под Windows другая история: тут горячее отключение работает нормально, но официальной версии ROCm для моей встройки нет, HSA_OVERRIDE_GFX_VERSION в Windows не работает, а для RX 6800 последняя доступная ROCm — 6.4.2, при том что на Linux все давно во всю крутят ROCm 7.
Я решил исправить ситуацию и собрать свой ROCm 7 + PyTorch с поддержкой обеих GPU под Windows. Ниже я расскажу, как у меня это получилось, а также запущу FLUX в ComfyUI на обеих карточках по очереди.
Проверка на совместимость
Перед тем как выполнять манипуляции, описанные в статье, нужно определить, какие у вас GPU и требуется ли их специальная сборка, или можно обойтись готовыми сборками из репозиториев.
Определяем архитектуру (Navi 21, Phoenix ...). Идем в GPU-Z или подобный инструмент и смотрим архитектуру.
Идем в исходники открытого драйвера и по своей архитектуре находим кодовое название, например для Phoenix это gfx1103, для Navi 21 это gfx1030.
Готовые сборки
После того как мы определились с кодовым названием наших GPU, идем по ссылкам ниже. Есть несколько источников готовых сборок ROCm:
Я брал отсюда: https://rocm.nightlies.amd.com/v2-staging/
Если вы нашли готовые сборки rocm_sdk
и pytorch
под свою архитектуру и версию ОС, то вам повезло: можете скачивать whl-пакеты
и переходить к пункту "Установка ComfyUI с поддержкой ROCm".
Для тех, кому нужен уже собранный дистрибутив ROCm (например, для сборки llama.cpp), а не Python-пакет, его можно найти по этой ссылке, дописав к ней имя нужного архива.
Если у вас 2 GPU (например, у меня одна gfx1103, а вторая gfx1030) и они из разных поколений, то готовых сборок с поддержкой обоих поколений вы на данный момент не найдете и остается только собирать все самим из исходников.
Подготовка к сборке
Есть ряд требований к системе, в которой осуществляется сборка:
Необходимо установить следующие компоненты:
chocolatey - популярный менеджер пакетов. После него установите следующие пакеты.
choco install visualstudio2022buildtools -y --params "--add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 --add Microsoft.VisualStudio.Component.VC.CMake.Project --add Microsoft.VisualStudio.Component.VC.ATL --add" choco install git.install -y --params "'/GitAndUnixToolsOnPath'" choco install cmake --version=3.31.0 -y 6. choco install ninja -y choco install ccache -y choco install strawberryperl -y choco install python --version=3.12.
Возможно, подойдет и другая версия Python, но я не проверял. Если у вас в системе уже установлен Python 3.12, удалите его и установите через choco, иначе python установится в качестве зависимости к dvc и будет каша в PATH.
choco install dvc -y
У меня в добавок установлена Visual Studio 2022 Community со следующим набором компонентов:
Workload: Desktop development with C++
Components: C++ CMake Tools for Windows, Git for Windows, C++ Clang Compiler for Windows, MSBuild Support for LLVM Toolset (clang)
Но я не уверен что это необходимо.
Для скачивания источников и сборки необходима поддержка symlink. По умолчанию создавать ссылки в Windows может только администратор. Можно включить эту возможность для непривилегированных пользователей в
secpol.msc
. Однако я собирал всё из-под админа.Для Git нужно выполнить следующие настройки:
git config --global core.symlinks true git config --global core.longpaths true git config --global user.email "mail@mail.m" #ваш email, любой git config --global user.name "superduperuser" #имя пользователя для комита # user.email и user.name — понадобится для сборки PyTorch
Проверьте интернет-соединение:
Если один из этих сайтов у вас не открывается, CMake завершится с ошибкой.
Пример ошибки:
[rocSPARSE configure] -- Downloading and extracting test matrix SNAP/amazon0312.tar.gz
[rocSPARSE configure] -- Timeout has been reached, trying mirror ...
[rocSPARSE configure] CMake Error at cmake/ClientMatrices.cmake:162 (message):
[rocSPARSE configure] "Timeout was reached"
Можно собирать без прокси и пр., ровно до момента сборки rocSPARSE, hipSPARSE и rocThrust, затем включить его и запустить сборку заново — она продолжится с того места, где остановилась.
Как я понял изначально сборка затачивалась под linux и только потом адаптировалась под Windows поэтому некоторые вещи остались, например CMake будет пытаться найти python3. Для того чтобы избежать ошибок "Python was not found", создаем ссылку
python3.exe
:# замените на ваш путь, если отличается cd C:\Python312\ New-Item -ItemType SymbolicLink -Name "python3.exe" -Target "C:\Python312\python.exe"
Клонирование репозитория и подпроектов
После того как требования к системе выполнены, нужно склонировать основной проект и запустить скрипт который скачает все необходимые зависимости:
git clone https://github.com/ROCm/TheRock.git
cd TheRock
# у меня заработал этот комит, все что после с моей gfx1030 работало плохо
git checkout -q --detach e060adb724b23da94b6913296f828fb56c28e196
python -m venv .venv
.\.venv\Scripts\activate
pip install -r requirements.txt
# скачивает подмодули и применяем патчи
python ./build_tools/fetch_sources.py
Обратите внимание, мы берем определенный коммит, именно на нем я проверял работоспособность и именно в нем исправили ошибку с определением моей GPU. Так как проект в разработке, то в нем что-то отваливается с определенной периодичностью — это нормально.
Про выбор комитов
На данный момент ведется активная разработка, поэтому постоянно что-то отваливается и появляется новое. Например, в данной статье я использую коммит от 2024-11-06 (коммиты с 2024-11-06 вообще не определяли одну из моих карточек). В 2024-11-16 это пофиксили и добавили поддержку rocWMMA, который нужен для AOTriton и новой sageattention. Однако после сборки я обнаружил, что в ComfyUI на выходе я стал получать изображение шума. Так что тут только методом проб и ошибок.
Патчим файлы для ускорения сборки
Я сначала думал сделать форк, чтобы упростить вам жизнь, но потом понял, что могу что-то сломать. Быстрее так объяснить, что изменить и зачем, — так как патчить файлы мы будем уже после скачивания всех подпроектов и т.д.
Ускоряем сборку rocSPARSE, hipSPARSE
Необходимо найти файлы:
TheRock\rocm-libraries\projects\rocsparse\cmake\ClientMatrices.cmake
TheRock\rocm-libraries\projects\hipsparse\cmake\ClientMatrices.cmake
И закомментировать в них все строки. Тогда не будут скачиваться файлы тестов с сайта http://sparse-files.engr.tamu.edu
.
Сборка ROCm
Важно: Если сборка завершается ошибками, о которых я тут не упоминал, лучше выполнить сборку на проверенной конфигурации (gfx110X-dgpu) с минимальным набором компонентов и под учетной записью с правами администратора.
Во время сборки CPU будет загружен на максимум, длиться это будет часа 4, так что если у вас мини-ПК или ноутбук, советую отключить TurboBoost, чтобы избежать перегрева и троттлинга. При данной нагрузке TurboBoost только замедлит сборку.
Немного про конфигурацию сборки
В официальном репозитории довольно хорошо задокументирована сборка и различные тонкости. Основные статьи которые нам понадобятся:
Главный параметр конфигурации это -DTHEROCK_AMDGPU_FAMILIES
с помощью него мы указываем для каких семейств GPU мы будем выполнять сборку. Есть так же параметр -DTHEROCK_AMDGPU_TARGETS
c помощью которого можно указать не семейство а конкретную архитектуру, однако с этим параметром у меня не получилось собрать PyTorch поэтому используем первый.
Запускаем конфигурацию и сборку
Для дальнейшей сборки PyTorch необходимо собрать все компоненты ROCm:
cmake -B build_103X_110X -GNinja . -DTHEROCK_AMDGPU_FAMILIES="gfx103X-dgpu;gfx110X-igpu" -DTHEROCK_AMDGPU_DIST_BUNDLE_NAME=custom
cmake --build build_103X_110X --target therock-dist
В данном примере я собираю сборку которая будет работать на gfx103X-dgpu иgfx110X-igpu что в переводе значит на RX 6800, RX6600XT и Radeon 780m.
Если ROCm нужен вам только для сборки llama.cpp, то можно ускорить сборку, отключив неиспользуемые компоненты:
cmake -B build_103X_110X -GNinja . -DTHEROCK_AMDGPU_FAMILIES="gfx103X-dgpu;gfx110X-igpu" -DTHEROCK_ENABLE_ALL=OFF -DTHEROCK_ENABLE_MIOPEN=ON -DTHEROCK_ENABLE_BLAS=ON -DTHEROCK_AMDGPU_DIST_BUNDLE_NAME=custom
cmake --build build_103X_110X --target therock-dist
После того как сборка завершилась, вы должны увидеть что-то вроде:
[rocThrust] [287/288] Linking CXX executable test\unique.hip.exe
[rocThrust SUCCEEDED in 1653 seconds]
[3/4] Populate artifact prim
И если запустить сборку повторно, то вы увидите:
[0/2] Re-checking globbed directories...
ninja: no work to do.
Поздравляю основной дистрибудив ROCm собран, теперь с ним можно компилировать другие приложения, например llama.cpp. Расположен дистрибутив в директории сборки -> папка dist.
После сборки дистрибутива необходимо упаковать его в WHL пакеты для дальнейшей сборки и использования с PyTorch.
Собираем архивы и Python-пакеты ROCm:
cmake --build build_103X_110X --target therock-archives
python ./build_tools/build_python_packages.py --artifact-dir=build_103X_110X/artifacts --dest-dir=build_103X_110X/packages --version "7.1.0" --version-suffix "gfx103X_1103"
После выполнения скрипта в директории packages должно появиться 4 пакета:
rocm-7.1.0.tar.gz
rocm_sdk_core-7.1.0-py3-none-win_amd64.whl
rocm_sdk_devel-7.1.0-py3-none-win_amd64.whl
rocm_sdk_libraries_custom-7.1.0-py3-none-win_amd64.whl
Сборка PyTorch
Деактивируем venv, переходим в external_build/pytorch
и создаем новый venv
deactivate
cd external_build/pytorch
python -m venv .venv
.\.venv\Scripts\Activate
Устанавливаем собранные пакеты ROCm:
# укажите свой путь к packages\dist
pip install --find-links C:\b\TheRock\build_103X_110X\packages\dist rocm[libraries,devel]
pip install packaging
Вывод успешной установки:
Successfully installed rocm-7.1.0 rocm-sdk-core-7.1.0 rocm-sdk-devel-7.1.0 rocm-sdk-libraries-custom-7.1.0
Клонируем и собираем PyTorch, torchaudio и torchvision:
Клонирование нужной версии PyTorch
В данной статье я рассмотрю возможность сборки Pytorch 2.9, хотя с 2.10 у мня тоже получилось.
Скачиваем исходники PyTorch 2.9
python pytorch_torch_repo.py checkout --repo-hashtag release/2.9 --gitrepo-origin https://github.com/ROCm/pytorch.git --checkout-dir D:/b/2.9/pytorch
python pytorch_audio_repo.py checkout --require-related-commit --checkout-dir D:/b/2.9/audio --torch-dir D:/b/2.9/pytorch
python pytorch_vision_repo.py checkout --require-related-commit --checkout-dir D:/b/2.9/vision --torch-dir D:/b/2.9/pytorch
Сборка
python build_prod_wheels.py build --pytorch-dir D:/b/2.9/pytorch --pytorch-audio-dir D:/b/2.9/audio --pytorch-vision-dir D:/b/2.9/vision --output-dir C:/dev/PytorchRocm7/out --clean
Если все собралось правильно, вы должны увидеть сообщение похожее на это:
++ Copy D:\b\vision\dist\torchvision-0.25.0a0+rocmsdk20251118-cp312-cp312-win_amd64.whl -> C:\dev\PytorchRocm7\out
--- Builds all completed
Поздравляю сборка PyTorch завершена. Необходимые пакеты вы найдете в директории --output-dir. Теперь давайте заставим все это работать.
Установка ComfyUI с поддержкой ROCm
Клонируем репозиторий с ComfyUI и создаем окружение:
git clone https://github.com/comfyanonymous/ComfyUI
cd ComfyUI
python -m venv gfx103X_1103_venv
.\gfx103X_1103_venv\Scripts\activate
Устанавливаем собранные пакеты PyTorch:
# Rocm
pip install --find-links D:\b\TheRock\build_gfx103X_1103\packages\dist rocm[libraries,devel]
# Затем PyTorch
pip install "C:\Dev\PytorchRocm7\gfx1103_103X_torch2.10\torch-2.10.0a0+rocmsdk20251118-cp312-cp312-win_amd64.whl" "C:\Dev\PytorchRocm7\gfx1103_103X_torch2.10\torchaudio-2.10.0a0+rocmsdk20251118-cp312-cp312-win_amd64.whl" "C:\Dev\PytorchRocm7\gfx1103_103X_torch2.10\torchvision-0.25.0a0+rocmsdk20251118-cp312-cp312-win_amd64.whl"
Обратите внимание, PyTorch нужно устанавливать напрямую, указывая путь к whl-файлам.
Устанавливаем зависимости:
pip install -r .\requirements.txt
Запускаем ComfyUI, для начала пробуем ничего не улучшать, только указываем, на какой GPU будем работать:
#Для ускорения первой генерации
$env:MIOPEN_FIND_MODE=5
# eGPU
$env:HIP_VISIBLE_DEVICES = "1"
python .\main.py --normalvram
# iGPU
$env:HIP_VISIBLE_DEVICES = "0"
python .\main.py --normalvram
В SD 1.5 512x512 У меня получилось 7-9 it/s на eGPU и 1.65 it/s на iGPU.
В FLUX-GGUF У меня получилось 4.8 s/it на eGPU и it/s на 22 s/it iGPU.
WAN 2.1 GGUF тоже работает, по скорости ~ 15 минут уходит на генерацию видео: 33 кадра 640х480, с использованием teacache.
Заключение
Работа над ROCm 7 все еще продолжается, и пока совершенно не ясно, какие архитектуры и в какой комбинации будут поддерживаться в релизной версии. Также не совсем ясно, когда этот релиз случится, поэтому надеюсь, что тем, кому нетерпится поработать с ROCm 7 в Windows, эта статья будет полезна.
Ниже я приведу ряд фич, реализовать которые у меня получилось частично, а так же опишу проблемы которые мне показались не очевидными.
Позже я выложу свои сборки на GitHub. Если кого интересуют какие либо экзотические сборки, например для нескольких поколений архитектур, пишите об этом в комментарии.
В следующей статье я расскажу, как собрать llama.cpp с поддержкой ROCm 7 и Vulkan в Windows.
Всем спасибо за прочтение!
Решение проблем
Сборка зависает
Если процесс сборки зависает на сообщении вроде [hipBLAS SUCCEEDED in 185 seconds]
или [10/22] Populate artifact miopen
это может быть связано с тем, что во время сборки могут возникать ошибки при скачивании файлов для тестов. Если это произошло:
Дождитесь завершения всех процессов
clang
.Нажмите
CTRL+C
.Завершите все висящие процессы
cmake
иpython
.Проверьте интернет-соединение с
sparse-files.engr.tamu.edu
иsqlite.org
.Запустите сборку снова. Она должна продолжиться с места остановки.
Ошибка Python was not found
Переходим в директорию с TheRock и находим строки:
if (NOT python)
set(python "python3") # default for linux
endif()
Заменяем их на:
if (NOT python)
set(python "python")
endif()
Если в Windows будут такие ошибки:
[hipBLAS] Python was not found; run without arguments to install from [hipBLAS] Python was not found; run without arguments to install from the Microsoft Store...
the Microsoft Store...
Экспериментальные фичи
RocWMMA на gfx1103
Официально поддержки RocWMMA для gfx1103 пока нет, но есть открытый PR, где она инициализирована.
Скачайте архив с этим PR и замените файлы в директории
TheRock\rocm-libraries\projects\rocwmma\library\include\rocwmma
на новые.В файле
cmake\therock_amdgpu_targets.cmake
найдите секцию для gfx1103 и закомментируйтеrocWMMA
:therock_add_amdgpu_target(gfx1103 "AMD Radeon 780M Laptop iGPU" FAMILY igpu-all gfx110X-all gfx110X-igpu EXCLUDE_TARGET_PROJECTS hipSPARSELt # https://github.com/ROCm/TheRock/issues/2042 rccl # https://github.com/ROCm/TheRock/issues/150 # rocWMMA # https://github.com/ROCm/TheRock/issues/1944 )
Подробнее о PR: https://github.com/ROCm/rocm-libraries/pull/2301
Сборка с поддержкой AOTriton
Собрать под windows у меня так и не получилось, но вы можете попытать счасте выполнив следующие шаги:
Для сборки с поддержкой AOTriton берем этот commit TheRock
git checkout -q --detach eb8f187ff47eb6af9cd5aaa0b8d9a04b06b12796
Выполняем все выше описаное в статье, и добавляем аргумент --enable-pytorch-flash-attention-windows
к сборке PyTorch
python build_prod_wheels.py build --pytorch-dir D:/b/2.9/pytorch --pytorch-audio-dir D:/b/2.9/audio --pytorch-vision-dir D:/b/2.9/vision --enable-pytorch-flash-attention-windows --output-dir C:/dev/PytorchRocm7/out --clean
Список архитектур с поддержкой AOTriton:
gfx90a_mod0,gfx942_mod0,gfx950_mod0,gfx1100_mod0,gfx1101_mod0,gfx1102_mod0,gfx1151_mod0,gfx1150_mod0,gfx1201_mod0,gfx1200_mod0,gfx1250_mod0
Если ни один из таргетов, для которых собран ROCm, не в списке, то при сборке будет ошибка.
Скачиваем PyTorch 2.10
python pytorch_torch_repo.py checkout --repo-hashtag main --patchset main --checkout-dir D:/b/pytorch
python pytorch_audio_repo.py checkout --repo-hashtag main --patchset main --checkout-dir D:/b/audio
python pytorch_vision_repo.py checkout --repo-hashtag main --patchset main --checkout-dir D:/b/vision