Изменения

Перейти к: навигация, поиск

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

6082 байта добавлено, 08:54, 9 июня 2021
м
Нет описания правки
Есть у меня такая традиция - традиция — раз примерно в несколько лет год с блендером и каким-нибудь радеоном трахаться.
В этот раз меня, в принципе, ждал успех. Получилось , во-первых, завести под линуксом Blender Cycles на радеоне с OpenCL и с Radeon ProRenderRX 5500M (Navi 14) под Linux-ом, а во-вторых, даже получить расчётные показатели производительности! Расчётные — это немного быстрее нивидии GTX 1660 Ti и примерно на уровне GTX 1080 (да, она быстрее 1660), именно так, как и заявляется про данный GPU.
За последние лет 10 пытался это сделать несколько раз, ни разу не получалось. OpenCL всегда был болью Бонусом завёлся и страданиемRadeon ProRender, и вообще возникает ощущение, что но на конкретном демо-файле толку от него все положили с прибором, включая самих AMD. Я, правда, всё надеюсь на улучшения, так как монополизм нивидии не люблю по причине того, что они ставят палки в колёса разработчикам открытых драйверовоказалось мало.
Сейчас наконец получилось. Получилось на карточке Radeon RX 5500M («Navi 14»). УвыИтак, не через Mesa — ей для работы на новых радеонах не хватает реализации libclc — не хватает файла /​usr/lib/clc/gfx1012-amdgcn-mesa-mesa3d.bc и подобных.что я сделал…
Но, по крайней мере, получилось без полного перехода на закрытый драйвер, то есть с использованием открытого модуля ядра.==== Сначала протестировал Mesa + libclc ====
В общих чертах — достаточно скачать драйвер AMDGPUЧтобы Blender вообще увидел Mesa-Proдевайс, извлечь пакеты и поставить всё, что относится к OpenCL, не ставя всё остальноенужно его запускать с <tt>CYCLES_OPENCL_TEST=1 blender</tt>.
Для AMDGPU-Pro 20Далее обнаруживается, что Mesa до сих пор показывает версию OpenCL 1.40 это:* amdgpu-core1, amdgpu-pro-core потому что (пустые метапакетылол)* opencl-amdgpu-pro-comgr* opencl-amdgpu-pro-icd* ocl-icd-libopencl1-amdgpu-proу них не реализована функция 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>.
Для AMDGPUИ, наконец, выясняется, что на новые радеоны нет libclc, что выражается отсутствием файла <tt>/​usr/lib/clc/gfx1012-Pro 20amdgcn-mesa-mesa3d.50 и более новых (сейчас актуальная 21bc</tt>.10) Я попробовал вместо него подложить другой, от tahiti, ничем хорошим это:* amdgpu-coreне увенчалось. Рендер запустился, amdgpu-pro-core (пустые метапакеты)* comgr-amdgpu-pro* hsa-runtime-rocr-amdgpu* hsakmt-roct-amdgpu* ocl-icd-libopencl1-amdgpu-pro* opencl-rocr-amdgpu-pro* libdrm-amdgpu-amdgpu1но рендерил белый шум вместо картинки. На встроенный Renoir, libdrm-amdgpu-commonкстати, libdrm2-amdgpu требуются по зависимостямтоже libclc нет, но по факту не нужны — можно поправить зависимости пакета hsakmtтам нужен файл <tt>gfx902-runtimeamdgcn-rocrmesa-amdgpu и эти пакеты не ставитьmesa3d. Можно поставить, вреда от них никакогоbc</tt>.
Также стоит проверить, есть ли в /etc/ldНа этом эксперименты с Mesa завершились.so.conf.d/ файл с содержимым<pre>/opt/amdgpu-pro/lib/x86_64-linux-gnu/opt/amdgpu-pro/lib/i386-linux-gnu</pre>
Но если установлены «пустые метапакеты», то должен быть (/etc/ld.so.conf.d/10-amdgpu-pro.conf). После чего выполнить sudo ldconfig.==== Потом решил попробовать закрытый драйвер ====
Ещё понадобилось сделать <tt>adduser свой_юзер render</tt>К счастью, чтобы был доступ к устройству /dev/kfd.выяснилось, что у AMD всё достаточно хорошо и ядерная часть закрытого и открытого драйверов совпадает, поэтому OpenCL-ные драйвера можно пробовать запускать, не ставя никаких дополнительных модулей ядра и не переходя на закрытый драйвер для графики
Далее ставим clinfoСкачал драйвер AMDGPU-Pro 20.40 и поставил пакеты opencl-amdgpu-pro-comgr, запускаем его в консоли opencl-amdgpu-pro-icd, ocl-icd-libopencl1-amdgpu-pro, ну и видим вродепочти пустые amdgpu-как рабочий OpenCLcore и amdgpu-pro-core, требующиеся по зависимостям.
Как monkey-патчить зависимости Всё брал для Ubuntu 20 — вообще я юзаю Debian-пакета:<code-bash>ar x hsakmt-roct-amdgpu_1Sid, но он достаточно похож на убунту, чтобы всё завелось.0.9-1234664_amd64.debtar -Jxf control.tar.xz# нагло правим файл control прямо в текстовом редакторе и выпиливаем из него ненужную зависимостьtar -cJf control.tar.xz control md5sums shlibs triggersar r hsakmt-roct-amdgpu_1.0.9-1234664_amd64.deb control.tar.xz</code-bash>
И, наконецПроверил, как заставить заработать ProRender!рекомендовали в интернете, файлик /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.
Я поставил сборку Blender На этом этапе у меня уже завёлся OpenCL 2.93 с официального сайта и Radeon ProRender 3.1.0 «для Ubuntu 20», скачав его (появились девайсы в clinfo) и установив через Blender Addons -> Install… попробовал включить его и их увидел какой. И даже тестовая сценка, которая валялась где-то мутный питоновый бэктрейспод рукой (не с сайта блендера), успешно отрендерилась.
Оказывается, проблема в том, что в ProRender есть файлик <tt>_cffi_backend.cpython-37m-x86_64-linux-gnu.so</tt> — он для Python 3.7, а официальная сборка идёт Далее я скачал с Python 3сайта блендера Barcelona Pavillion и решил проверить рендер на нём.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 завёлся==== Далее решил попробовать версию закрытого драйвера 20. И даже Cycles с драйвером 21.10 завёлся50, хотя с ибо 20.40 падал.40 — явно не последняя ====
Что по производительности Cycles: на 20.40 рендер на чистом GPU (Radeon RX 5500M) раза в 2 медленнее чистого CPU (Ryzen 4800 HS). На 20.50 гораздо лучше и скорость рендера на GPU и CPU примерно одинаковая…и обнаружил, то есть на GPU+CPU вместе получается что в 2 раза быстрее, чем просто на CPUнём изменился состав пакетов.
ИтогНо процедуре установки «только 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.
* Cycles "Supported"** Barcelona Pavillion, GPU only (192x192 tile) libdrm- 10:23** Barcelona Pavillionна самом деле не нужны, CPU+GPU (192x192 tile) их приходится ставить только из- 06:22* Cycles "Experimental"** Barcelona Pavillionза зависимостей. Но вреда они не несут, GPU only (192x192 tile) так что можно ставить смело. Хотя на первом заходе я ещё поизвращался и поправил зависимости в deb пакете hsakmt- 09:32** Barcelona Pavillionroct-amdgpu, CPU+GPU (128x128 tile) - 05:48убрав оттуда этот libdrm, перед установкой.
572 секунды. Иными словамиПосле установки clinfo показало отсутствие девайсов в системе, однако, немного побыстрее GTX 1660 и примерно на уровне GTX 1080. Вот [https:через strace стало понятно, что оно обращается к /dev/www.phoronix.com/scan.php?page=article&item=blender-281-optix&num=3 тут на похорониксе] GTX 1660 Super выдал 628 секундkfd, а GTX 1080 - 565 секунд/dev/kfd по дефолту доступно только группе render. Ну, на самом деле, это можно считать успехом, т.к. расчётные показатели достигнуты - Radeon RX 5500M и считается примерным аналогом GTX 1660 Поэтому пришлось сделать <tt>adduser me render</ 1660 Ti. Ну tt> и то, что оно добавить себя в принципе стабильно работает, само по себе уже успех. До RTX с OptiX, понятно, не дотягиваетгруппу, но тот RTX стоит как весь этот ноутпосле чего перелогиниться.
Отдельно стоит упомянуть Radeon ProRender:* Barcelona Pavillionclinfo снова показал девайсы, GPU only - 05:02* а Blender стал успешно рендерить Barcelona PavillionPavillion… но стал зависать на рендере тестовой сценки, CPU+GPU - 07:00которая на 20.40 успешно рендерилась. O_o
Здесь я уже замерил рендер Barcelona Pavillion-а — получилось 16:40 на GPU и примерно 8:50 на CPU+GPU. Не очень хороший результат, прямо скажем. ==== Решил попробовать снова обновиться ==== Поискал получше и обнаружил, что последняя версия драйвера на самом деле 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 стоит как весь этот ноутбук, так что по Сеньке шапка. ==== Отдельно расскажу про 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, и сделать <tt>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</tt>. Этого хватает, чтобы 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 }}

Навигация