Изменения

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

9954 байта добавлено, 21:53, 9 июня 2021
Нет описания правки
Получилось завести под линуксом Blender на радеоне Есть у меня такая традиция — раз примерно в год с OpenCL блендером и Radeon ProRenderкаким-нибудь радеоном трахаться.
За последние лет 10 пытался это сделать несколько В этот разменя, ни разу не получалосьв принципе, ждал успех. OpenCL всегда был болью и страданиемПолучилось, и вообще возникает ощущениево-первых, что завести Cycles на него все положили OpenCL с приборомRadeon RX 5500M (Navi 14) под Linux-ом, включая самих AMD. Яа во-вторых, правдадаже получить расчётные показатели производительности! Расчётные — это немного быстрее нивидии GTX 1660 Ti и примерно на уровне GTX 1080 (да, всё надеюсьона быстрее 1660), т.к. монополизм нивидии не люблю по причине тогоименно так, что они ставят палки в колёса разработчикам открытых драйверовкак и заявляется про данный GPU.
Сейчас наконец получилось. Получилось на карточке Бонусом завёлся и Radeon RX 5500M ("Navi 14"). УвыProRender, не через Mesa - ей для работы но на новых радеонах не хватает реализации libclc конкретном демо- не хватает файла /​usr/lib/clc/gfx1012-amdgcn-mesa-mesa3d.bc и подобныхфайле толку от него оказалось мало.
НоИтак, по крайней мере, получилось без полного перехода на закрытый драйвер, т.е. с использованием открытого модуля ядра.что я сделал…
Делается это так:* Берём AMDGPU-Pro 20.40. Именно 20.40. В 20.50, по-видимому, реализация OpenCL уже другая.* ==== Сначала протестировал Mesa + libclc ====
В общем, плохая новость: на Чтобы Blender вообще увидел Mesa OpenCL для новых карточек (Navi и подобных) не работает-девайс, нужно его запускать с <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>.
Интересный вопрос - как завести на Linux, во-первых, Radeon-овский OpenCL, а во-вторых, Radeon ProRender для блендераНа этом эксперименты с Mesa завершились.
==== Потом решил попробовать закрытый драйвер ====
К счастью, выяснилось, что у AMD всё достаточно хорошо и ядерная часть закрытого и открытого драйверов совпадает, поэтому OpenCL-ные драйвера можно пробовать запускать, не ставя никаких дополнительных модулей ядра и не переходя на закрытый драйвер для графики
Очень меня расстраивает тот фактСкачал драйвер AMDGPU-Pro 20.40 и поставил пакеты opencl-amdgpu-pro-comgr, что Blenderopencl-amdgpu-pro-icd, ocl-icd-libopencl1-amdgpu-pro, ну и почти пустые amdgpu-core и amdgpu-овский Cycles на Radeonpro-ах работаетcore, как говнотребующиеся по зависимостям.
Давным-давно хотел добиться работы Blender-а Всё брал для Ubuntu 20 — вообще я юзаю Debian Sid, но он достаточно похож на линуксе с Radeon-ом. Наконец-таки умудрился. Конкретно - на Radeon RX 5500M ("Navi 14")убунту, чтобы всё завелось.
ПравдаПроверил, увыкак рекомендовали в интернете, файлик /etc/ld.so.conf.d/10-amdgpu-pro.conf на предмет наличия строк <tt>/opt/amdgpu-pro/lib/x86_64-linux-gnu</tt> и <tt>/opt/amdgpu-pro/lib/i386-linux-gnu</tt> и выполнил sudo ldconfig.
На этом этапе у меня уже завёлся OpenCL 2.0 (появились девайсы в clinfo) и Blender их увидел. И даже тестовая сценка, которая валялась где-то под рукой (не с сайта блендера), успешно отрендерилась.
Далее я скачал с сайта блендера Barcelona Pavillion и решил проверить рендер на нём. Увы, нет — на нём рендер стал падать.
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 way50, 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 put40 — явно не последняя ====
/opt/amdgpu-pro/lib/x86_64-linux-gnu/opt/amdgpu-pro/lib/i386-linux-gnu…и обнаружил, что в нём изменился состав пакетов.
into Но процедуре установки «только 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 стало понятно, что оно обращается к /etcdev/ldkfd, а /dev/kfd по дефолту доступно только группе render.soПоэтому пришлось сделать <tt>adduser me render</tt> и добавить себя в группу, после чего перелогиниться.conf clinfo снова показал девайсы, а Blender стал успешно рендерить Barcelona Pavillion… но стал зависать на рендере тестовой сценки, которая на 20.40 успешно рендерилась. Здесь я уже замерил рендер Barcelona Pavillion-а — получилось 16:40 на GPU и примерно 8:50 на CPU+GPU (CPU Ryzen 4800 HS). Не очень хороший результат, прямо скажем. ==== Решил попробовать снова обновиться ==== Поискал получше и обнаружил, что последняя версия драйвера на самом деле 21.d/10, а не 20.50. А кроме того, всё это происходило на ядре 5.8, а в дебиане уже было в наличии как минимум 5.10. ОК. Скачал 21.10, провёл ту же процедуру установки пакетов. К счастью, в 21.10 пакеты от 20.50 уже не отличаются. Установил 5.10-е ядро. Перезагрузился и… у меня вообще перестала нормально работать графическая среда. X-ы стали виснуть, в dmesg появились сообщения о GPU reset и всё такое прочее. Причём OpenCL-драйвер тут был никак не виноват, это были просто регрессии драйвера amdgpuв более новом ядре. Что ж, пришлось пробовать ставить модуль ядра из комплекта поставки AMDGPU-proPro… Модуль, как я уже сказал, там тот же самый открытый, что и в обычном ядре — просто версия, видимо, поставляется сразу более новая.conf to  Ну ок. Ставим заголовки ядра (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 OpenCL workinginstall 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 }}