Изменения

Блог:Виталий Филиппов/2021-06-09 Blender, OpenCL и Radeon ProRender

12 143 байта добавлено, 21:53, 9 июня 2021
Нет описания правки
Hi, just a note for future users who face the same issue on how I solved it.I installed Blender 2.93 from the official site on Debian testing and Radeon ProRender 3.1.0 "for Ubuntu 20" using Blender Addons Есть у меня такая традиция — раз примерно в год с блендером и каким-> Installнибудь радеоном трахаться...It showed me this error message. Installing python3-cffi via apt-get didn't help.The problem was that Radeon ProRender contains _cffi_backend.cpython-37m-x86_64-linux-gnu.so which is for Python 3.7 and official Blender uses Python 3.9. So I linked /usr/lib/python3/dist-packages/_cffi_backend.cpython-39-x86_64-linux-gnu.so to ~/.config/blender/2.93/scripts/addons/rprblender/_cffi_backend.cpython-39-x86_64-linux-gnu.so and it started to work.By the way, I use a closed-source OpenCL driver from AMDGPU-Pro 20.40 with open-source 3D and kernel drivers.I.e. it's sufficient to install opencl-amdgpu-pro-comgr, opencl-amdgpu-pro-icd and ocl-icd-libopencl1-amdgpu-pro and put
/opt/amdgpuВ этот раз меня, в принципе, ждал успех. Получилось, во-pro/lib/x86_64первых, завести Cycles на OpenCL с Radeon RX 5500M (Navi 14) под Linux-linuxом, а во-gnu/opt/amdgpu-pro/lib/i386-linux-gnuвторых, даже получить расчётные показатели производительности! Расчётные — это немного быстрее нивидии GTX 1660 Ti и примерно на уровне GTX 1080 (да, она быстрее 1660), именно так, как и заявляется про данный GPU.
into Бонусом завёлся и Radeon ProRender, но на конкретном демо-файле толку от него оказалось мало. Итак, что я сделал… ==== Сначала протестировал Mesa + libclc ==== Чтобы Blender вообще увидел Mesa-девайс, нужно его запускать с <tt>CYCLES_OPENCL_TEST=1 blender</tt>. Далее обнаруживается, что Mesa до сих пор показывает версию OpenCL 1.1, потому что (лол) у них не реализована функция printf. Всё остальное реализовано (лол). Проблему можно обойти, запуская Blender с переменными окружения <tt>CLOVER_PLATFORM_VERSION_OVERRIDE=1.2 CLOVER_DEVICE_VERSION_OVERRIDE=1.2 CLOVER_DEVICE_CLC_VERSION_OVERRIDE=1.2 CYCLES_OPENCL_TEST=1 blender</tt>. И, наконец, выясняется, что на новые радеоны нет libclc, что выражается отсутствием файла <tt>/​usr/lib/clc/gfx1012-amdgcn-mesa-mesa3d.bc</tt>. Я попробовал вместо него подложить другой, от tahiti, ничем хорошим это не увенчалось. Рендер запустился, но рендерил белый шум вместо картинки. На встроенный Renoir, кстати, тоже libclc нет, там нужен файл <tt>gfx902-amdgcn-mesa-mesa3d.bc</tt>. На этом эксперименты с 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 to get на предмет наличия строк <tt>/opt/amdgpu-pro/lib/x86_64-linux-gnu</tt> и <tt>/opt/amdgpu-pro/lib/i386-linux-gnu</tt> и выполнил sudo ldconfig. На этом этапе у меня уже завёлся OpenCL working2.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. Поэтому пришлось сделать <tt>adduser me render</tt> и добавить себя в группу, после чего перелогиниться. 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 есть файлик <tt>_cffi_backend.cpython-37m-x86_64-linux-gnu.so</tt> — он для Python 3.7, а официальная сборка блендера идёт с Python 3.9. Соответственно, вся задача — найти <tt>_cffi_backend.cpython-39-x86_64-linux-gnu.so</tt>. Найти его легче всего в пакетах (<tt>apt-get install python3-cffi</tt>), там как раз тоже python 3.9, и сделать <code-bash>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</code-bash> Этого хватает, чтобы 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 только через отдельную настройку в панельке. Но работает вполне адекватно.{{wl-publish: 2021-06-09 11:54:42 +0300 | VitaliyFilippov }}