2021-06-09 Blender, OpenCL и Radeon ProRender
Есть у меня такая традиция — раз примерно в год с блендером и каким-нибудь радеоном трахаться.
В этот раз меня, в принципе, ждал успех. Получилось, во-первых, завести Cycles на OpenCL с Radeon RX 5500M (Navi 14) под Linux-ом, а во-вторых, даже получить расчётные показатели производительности! Расчётные — это немного быстрее нивидии GTX 1660 Ti и примерно на уровне GTX 1080 (да, она быстрее 1660), именно так, как и заявляется про данный GPU.
Бонусом завёлся и Radeon ProRender, но на конкретном демо-файле толку от него оказалось мало.
Итак, что я сделал…
Содержание
Сначала протестировал Mesa + libclc
Чтобы Blender вообще увидел Mesa-девайс, нужно его запускать с CYCLES_OPENCL_TEST=1 blender.
Далее обнаруживается, что Mesa до сих пор показывает версию OpenCL 1.1, потому что (лол) у них не реализована функция printf. Всё остальное реализовано (лол). Проблему можно обойти, запуская Blender с переменными окружения CLOVER_PLATFORM_VERSION_OVERRIDE=1.2 CLOVER_DEVICE_VERSION_OVERRIDE=1.2 CLOVER_DEVICE_CLC_VERSION_OVERRIDE=1.2 CYCLES_OPENCL_TEST=1 blender.
И, наконец, выясняется, что на новые радеоны нет libclc, что выражается отсутствием файла /usr/lib/clc/gfx1012-amdgcn-mesa-mesa3d.bc. Я попробовал вместо него подложить другой, от tahiti, ничем хорошим это не увенчалось. Рендер запустился, но рендерил белый шум вместо картинки. На встроенный Renoir, кстати, тоже libclc нет, там нужен файл gfx902-amdgcn-mesa-mesa3d.bc.
На этом эксперименты с Mesa завершились.
Потом решил попробовать закрытый драйвер
К счастью, выяснилось, что у AMD всё достаточно хорошо и ядерная часть закрытого и открытого драйверов совпадает, поэтому OpenCL-ные драйвера можно пробовать запускать, не ставя никаких дополнительных модулей ядра и не переходя на закрытый драйвер для графики
Скачал драйвер AMDGPU-Pro 20.40 и поставил пакеты opencl-amdgpu-pro-comgr, opencl-amdgpu-pro-icd, ocl-icd-libopencl1-amdgpu-pro, ну и почти пустые amdgpu-core и amdgpu-pro-core, требующиеся по зависимостям.
Всё брал для Ubuntu 20 — вообще я юзаю Debian Sid, но он достаточно похож на убунту, чтобы всё завелось.
Проверил, как рекомендовали в интернете, файлик /etc/ld.so.conf.d/10-amdgpu-pro.conf на предмет наличия строк /opt/amdgpu-pro/lib/x86_64-linux-gnu и /opt/amdgpu-pro/lib/i386-linux-gnu и выполнил sudo ldconfig.
На этом этапе у меня уже завёлся OpenCL 2.0 (появились девайсы в clinfo) и Blender их увидел. И даже тестовая сценка, которая валялась где-то под рукой (не с сайта блендера), успешно отрендерилась.
Далее я скачал с сайта блендера Barcelona Pavillion и решил проверить рендер на нём. Увы, нет — на нём рендер стал падать.
Далее решил попробовать версию закрытого драйвера 20.50, ибо 20.40 — явно не последняя
…и обнаружил, что в нём изменился состав пакетов.
Но процедуре установки «только OpenCL» это не помешало, только устанавливаемых пакетов стало больше: comgr-amdgpu-pro, hsa-runtime-rocr-amdgpu, hsakmt-roct-amdgpu, ocl-icd-libopencl1-amdgpu-pro, opencl-rocr-amdgpu-pro плюс требующиеся по зависимостям libdrm-amdgpu-amdgpu1, libdrm-amdgpu-common, libdrm2-amdgpu и те же amdgpu-core с amdgpu-pro-core.
libdrm-* на самом деле не нужны, их приходится ставить только из-за зависимостей. Но вреда они не несут, так что можно ставить смело. Хотя на первом заходе я ещё поизвращался и поправил зависимости в deb пакете hsakmt-roct-amdgpu, убрав оттуда этот libdrm, перед установкой.
После установки clinfo показало отсутствие девайсов в системе, однако, через strace стало понятно, что оно обращается к /dev/kfd, а /dev/kfd по дефолту доступно только группе render. Поэтому пришлось сделать adduser me render и добавить себя в группу, после чего перелогиниться.
clinfo снова показал девайсы, а Blender стал успешно рендерить Barcelona Pavillion… но стал зависать на рендере тестовой сценки, которая на 20.40 успешно рендерилась.
Здесь я уже замерил рендер Barcelona Pavillion-а — получилось 16:40 на GPU и примерно 8:50 на CPU+GPU (CPU Ryzen 4800 HS). Не очень хороший результат, прямо скажем.
Решил попробовать снова обновиться
Поискал получше и обнаружил, что последняя версия драйвера на самом деле 21.10, а не 20.50.
А кроме того, всё это происходило на ядре 5.8, а в дебиане уже было в наличии как минимум 5.10.
ОК. Скачал 21.10, провёл ту же процедуру установки пакетов. К счастью, в 21.10 пакеты от 20.50 уже не отличаются. Установил 5.10-е ядро.
Перезагрузился и… у меня вообще перестала нормально работать графическая среда. X-ы стали виснуть, в dmesg появились сообщения о GPU reset и всё такое прочее. Причём OpenCL-драйвер тут был никак не виноват, это были просто регрессии драйвера amdgpu в более новом ядре.
Что ж, пришлось пробовать ставить модуль ядра из комплекта поставки AMDGPU-Pro… Модуль, как я уже сказал, там тот же самый открытый, что и в обычном ядре — просто версия, видимо, поставляется сразу более новая.
Ну ок. Ставим заголовки ядра (linux-headers-5.10.0-7-amd64), сам dkms и пакеты amdgpu-dkms-firmware и amdgpu-dkms… и обламываемся, потому что модуль из AMDGPU-Pro отказывается собираться с ядром 5.10.
К счастью, мы всё-таки не лыком шиты и тривиальные ошибки вида «добавился/удалился параметр функции» в модуле ядра поправить можем. Ошибок оказывается немного — всего 3 — и после вот таких вот исправлений: Media:Amdgpu-dkms-5.10.diff — модуль успешно собирается и устанавливается.
Вуаля! После перезагрузки графика снова работает, а Blender наконец-то работает стабильно. Не виснет и не падает.
Наступило время прогнать тест(ы)
Снова рендерим Barcelona Pavillion:
- Cycles «Supported»
- GPU only (192x192 tile) — 10:23
- CPU+GPU (192x192 tile) — 06:22
- Cycles «Experimental»
- GPU only (192x192 tile) — 09:32
- CPU+GPU (128x128 tile) — 05:48
И это уже таки можно считать успехом, ибо вот тут на похорониксе: https://www.phoronix.com/scan.php?page=article&item=blender-281-optix&num=3 - есть данные по рендеру на различных Nvidia-х. GTX 1660 Super выдал 628 секунд, GTX 1080 успел за 565, а у нас 572. Вполне неплохо, Radeon RX 5500M и считается примерным аналогом GTX 1660 / 1660 Ti, даже по числу транзисторов. Ну и то, что оно в принципе стабильно работает, само по себе уже успех. До RTX с OptiX, понятно, не дотягивает, но тот RTX стоит как весь этот ноутбук, так что по Сеньке шапка.
Вдогонку:
- Classroom (GPU only) — 5:04, для сравнения GTX 1660 Super — 5:26
- BMW27 (GPU only) — тут похуже, 2:21, для сравнения GTX 1660 Super — 1:24, GTX 1650 — 2:24
Отдельно расскажу про Radeon ProRender
Я пробовал его завести на винде с Radeon R9 270, но ни разу не получалось — при попытке включения плагина Blender всегда падал. Как это решить я не понял, вопросы такие в интернете есть, а ответов — нет.
А что на линуксе? А на линуксе — берём сборку Blender 2.93 с официального сайта и Radeon ProRender 3.1.0 опять же «для Ubuntu 20», скачиваем его и устанавливаем через Blender Addons -> Install… пробуем включить и получаем какой-то питоновый стектрейс со странной, не особо о чём-то говорящей, ошибкой.
Гуглением выясняется, что проблема в том, что в ProRender есть файлик _cffi_backend.cpython-37m-x86_64-linux-gnu.so — он для Python 3.7, а официальная сборка блендера идёт с Python 3.9.
Соответственно, вся задача — найти _cffi_backend.cpython-39-x86_64-linux-gnu.so. Найти его легче всего в пакетах (apt-get install python3-cffi), там как раз тоже python 3.9, и сделатьln -s /usr/lib/python3/dist-packages/_cffi_backend.cpython-39-x86_64-linux-gnu.so ~/.config/blender/2.93/scripts/addons/rprblender/_cffi_backend.cpython-39-x86_64-linux-gnu.soЭтого хватает, чтобы ProRender таки завёлся.
А что же умеет этот ProRender? Ну, ситуация следующая: первую тестовую сценку он рендерит с вполне неплохим качеством всего лишь за 20 секунд (Cycles тратит на неё примерно 1:20). Но если взять Barcelona Pavillion, то на нём, во-первых, результат рендера слегка отличается от Cycles (ну ладно, понятно, что движки разные), а во-вторых, и производительность не выдающаяся:
- GPU only — 05:02
- CPU+GPU — 07:00
То есть CPU+GPU медленнее, чем просто GPU O_o. Не знаю, почему.
Ещё могу отметить, что Environment-Based Lighting в ProRender делается чуть по-другому, чем в Cycles — в Cycles он делается через Nodes, а в ProRender только через отдельную настройку в панельке. Но работает вполне адекватно.
[ Хронологический вид ]Комментарии
Войдите, чтобы комментировать.