Изменения

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

7195 байтов добавлено, 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, извлечь пакеты и поставить всё, что относится к OpenCL, не ставя всё остальное.==== Сначала протестировал Mesa + libclc ====
Для AMDGPUЧтобы Blender вообще увидел Mesa-Pro 20девайс, нужно его запускать с <tt>CYCLES_OPENCL_TEST=1 blender</tt>.40 это:* amdgpu-core, amdgpu-pro-core (пустые метапакеты)* opencl-amdgpu-pro-comgr* opencl-amdgpu-pro-icd* ocl-icd-libopencl1-amdgpu-pro
Для AMDGPU-Pro 20Далее обнаруживается, что Mesa до сих пор показывает версию OpenCL 1.50 это:* amdgpu-core1, 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, libdrm-amdgpu-common, libdrm2-amdgpu требуются по зависимостям, но по факту у них не нужны — можно поправить зависимости пакета hsakmt-runtime-rocr-amdgpu и эти пакеты не ставитьреализована функция 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>.
Также стоит проверитьИ, есть ли в /etc/ld.so.conf.d/ файл с содержимымнаконец, выясняется, что на новые радеоны нет libclc, что выражается отсутствием файла <prett>/opt/amdgpu-pro​usr/lib/x86_64clc/gfx1012-linuxamdgcn-gnu/opt/amdgpumesa-promesa3d.bc</lib/i386tt>. Я попробовал вместо него подложить другой, от tahiti, ничем хорошим это не увенчалось. Рендер запустился, но рендерил белый шум вместо картинки. На встроенный Renoir, кстати, тоже libclc нет, там нужен файл <tt>gfx902-linuxamdgcn-gnumesa-mesa3d.bc</prett>.
Но если установлены «пустые метапакеты», то должен быть (/etc/ld.so.conf.d/10-amdgpu-pro.conf). После чего выполнить sudo ldconfigНа этом эксперименты с Mesa завершились.
Ещё понадобилось сделать <tt>adduser свой_юзер render</tt>, чтобы был доступ к устройству /dev/kfd.==== Потом решил попробовать закрытый драйвер ====
Далее ставим clinfoК счастью, запускаем его в консоли выяснилось, что у AMD всё достаточно хорошо и видим вроде-как рабочий ядерная часть закрытого и открытого драйверов совпадает, поэтому OpenCL.-ные драйвера можно пробовать запускать, не ставя никаких дополнительных модулей ядра и не переходя на закрытый драйвер для графики
Как monkeyСкачал драйвер AMDGPU-патчить зависимости DebianPro 20.40 и поставил пакеты opencl-пакета:<codeamdgpu-bash>ar x hsakmtpro-roctcomgr, opencl-amdgpu_1.0.9amdgpu-1234664_amd64.debtar pro-icd, ocl-Jxf control.tar.xz# нагло правим файл control прямо в текстовом редакторе icd-libopencl1-amdgpu-pro, ну и выпиливаем из него ненужную зависимостьtar почти пустые amdgpu-cJf control.tar.xz control md5sums shlibs triggersar r hsakmtcore и amdgpu-roctpro-amdgpu_1core, требующиеся по зависимостям.0.9-1234664_amd64.deb control.tar.xz</code-bash>
ИВсё брал для Ubuntu 20 — вообще я юзаю Debian Sid, наконецно он достаточно похож на убунту, как заставить заработать ProRender!чтобы всё завелось.
Я поставил сборку Blender 2Проверил, как рекомендовали в интернете, файлик /etc/ld.93 с официального сайта и Radeon ProRender 3so.1conf.0 «для Ubuntu 20», скачав его и установив через Blender Addons d/10-amdgpu-pro.conf на предмет наличия строк <tt>/opt/amdgpu-pro/lib/x86_64-linux-gnu</tt> Install… попробовал включить его и увидел какой<tt>/opt/amdgpu-то мутный питоновый бэктрейсpro/lib/i386-linux-gnu</tt> и выполнил sudo ldconfig.
Оказывается, проблема На этом этапе у меня уже завёлся OpenCL 2.0 (появились девайсы в том, что в ProRender есть файлик <tt>_cffi_backendclinfo) и Blender их увидел.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 завёлся. И даже Cycles Далее я скачал с драйвером 20сайта блендера Barcelona Pavillion и решил проверить рендер на нём.50 завёлся, хотя с 20.40 падал (напримерУвы, нет — на демо-файле Barcelona Pabellon)нём рендер стал падать.
Что по производительности Radeon RX 5500M: на 20.40 рендер на чистом GPU раза в 2 медленнее чистого CPU (Ryzen 4800 HS). На ==== Далее решил попробовать версию закрытого драйвера 20.50 гораздо лучше и скорость рендера на GPU и CPU примерно одинаковая, т.е. на GPU+CPU вместе получается в 2 раза быстрее, чем просто на CPUибо 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 Pabellon Pavillion… но стал зависать на рендере тестовой сценки, которая на 20.40 успешно рендерилась. Здесь я уже замерил рендер Barcelona Pavillion-а — получилось 16:40 на голом GPU рендерится и примерно 16 минут, 8:50 на CPU+GPU - примерно 8 минут(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 всегда падал. Как это решить я понимаюне понял, там вопросы такие в CUDAинтернете есть, а ответов — нет. А что на линуксе? А на линуксе — берём сборку Blender 2.93 с официального сайта и Radeon ProRender 3.1.0 опять же «для Ubuntu 20», скачиваем его и устанавливаем через Blender Addons -бенчах CPU тоже участвовал> Install… пробуем включить и получаем какой-то питоновый стектрейс со странной, CPU был аж Core i9не особо о чём-9900KSто говорящей, ошибкой. Гуглением выясняется, что проблема в том, что в 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, и результат десктопной GTX 1660 составил только 628 секунд против наших сделать <code-bash>ln -s /usr/lib/python3/dist-packages/_cffi_backend.cpython-39-x86_64-linux-gnu.so ~500/. Хотя до RTX config/blender/2.93/scripts/addons/rprblender/_cffi_backend.cpython-39-x86_64-linux-gnu.so</code-bash> Этого хватает, чтобы ProRender таки завёлся. А что же умеет этот ProRender? Ну, ситуация следующая: первую тестовую сценку он рендерит с OptiX результаты уже вполне неплохим качеством всего лишь за 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 }}