Изменения

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

6628 байтов добавлено, 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 и более новых (сейчас актуальная 21.10) это:* 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 Далее я скачал с драйвером 21сайта блендера Barcelona Pavillion и решил проверить рендер на нём.10 завёлся, хотя с 20.40 падал (напримерУвы, нет — на демо-файле Barcelona Pabellon)нём рендер стал падать.
Что по производительности Cycles: на 20.40 рендер на чистом GPU (Radeon RX 5500M) раза в 2 медленнее чистого CPU (Ryzen 4800 HS). На ==== Далее решил попробовать версию закрытого драйвера 20.50 гораздо лучше и скорость рендера на GPU и CPU примерно одинаковая, то есть на GPU+CPU вместе получается в 2 раза быстрее, чем просто на CPUибо 20.40 — явно не последняя ====
Итог:…и обнаружил, что в нём изменился состав пакетов.
* Cycles "Supported"** Barcelona PavillionНо процедуре установки «только OpenCL» это не помешало, GPU only - 10только устанавливаемых пакетов стало больше:23** Barcelona Pavillioncomgr-amdgpu-pro, CPU+GPU (192x192 tile) hsa- 06:22* Cycles "Experimental"** Barcelona Pavillionruntime-rocr-amdgpu, GPU only (192x192 tile) hsakmt- 09:32** Barcelona Pavillionroct-amdgpu, CPU+GPU (128x128 tile) ocl- * Radeon ProRender** Barcelona Pavillionicd-libopencl1-amdgpu-pro, GPU only opencl- ** Barcelona Pavillionrocr-amdgpu-pro плюс требующиеся по зависимостям libdrm-amdgpu-amdgpu1, CPU+GPU libdrm-amdgpu-common, libdrm2-amdgpu и те же amdgpu-core с amdgpu-pro- core.
То есть, та самая Barcelona Pabellon libdrm-* на голом GPU рендерится примерно 16 минутсамом деле не нужны, на CPU+GPU — примерно 8 минутих приходится ставить только из-за зависимостей. Но вреда они не несут, так что даже не так уж и плохо по сравнению с нивидиями: [https://wwwможно ставить смело.phoronix.com/scan.php?page=article&item=blender-281-optix&num=3 вот бенчи Хотя на похорониксе]. Как первом заходе я понимаю, там ещё поизвращался и поправил зависимости в CUDAdeb пакете hsakmt-бенчах CPU тоже участвовал, CPU был аж Core i9roct-9900KS, и, например, результат десктопной GTX 1660 составил только 628 секунд против наших ~500. Хотя RTX с OptiXamdgpu, конечноубрав оттуда этот 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 }}