Есть ли жизнь без Nvidia? Запускаем TensorFlow на Radeon RX 580

Предыстория

На новом рабочем месте меня посадили за ПК, оборудованный процессором Ryzen 2600 и видеокартой Radeon RX 580. Попробовав обучать нейронные сети на процессоре, я понял, что это не дело: уж слишком медленным был процесс. После недолгих поисков я узнал, что существует как минимум 2 способа запуска современных библиотек машинного обучения на видеокартах Radeon: PlaidML и ROCm. Я попробовал оба и хочу поделиться результатами.

PlaidML: кроссплатформенность во главе угла

TensorFlow служит бэкэндом для Keras, интерпретируя его синтаксис и преобразуя его в инструкции, которые могут выполняться на процессоре или GPU. К сожалению, он поддерживает только видеокарты с технологией Nvidia CUDA.

PlaidML - альтернативный бэкэнд для Keras с поддержкой OpenCL. Его можно использовать для обучения моделей Keras на встроенной графике процессора, дискретном или даже внешнем графическом процессоре AMD. Он работает на Windows, Linux и Mac.

UPD: В своём комментарии пользователь MikeLP указал, что:

Keras задумывался как высокоуровневый интерфейс. Соответственно остальные бекенды, как PlaidML могли обеспечить работу с другими видеоускорителями без закрытой технологии CUDA. И так было до тех пор, пока авторы не заявили, что Keras будет развиваться только в рамках Tensorflow. Все — «накрылась медным тазом ваша качалка». И получается что PlaidML может работать только с Keras, a не с tf.Keras — API разбежалось. Cоответственно смысл юзать PlaidML, когда он не совместим с последней версией Keras API в Tensorflow. Пацаны из PlaidML (они часть Intel) были вынуждены поменять roadmap и идти в другом направлении.

По моему мнению, PlaidML ещё актуален, т.к. включение Keras в Tensorflow произошло недавно и API не успел существено поменяться. Однако дальшейшие перспективы Keras+PlaidML выглядят туманно.

Установка PlaidML очень проста. Нужно поставить Python-пакет и выбрать устройство в пошаговом конфигураторе:

 pip install plaidml-keras && plaidml-setup

В коде нужно прописать использование PlaidML как бэкэнда:

os.environ["KERAS_BACKEND"] = "plaidml.keras.backend"

После этого все вычисления будут выполняться на видеокарте. Запустим бенчмарк:

plaidbench keras mobilenet

Сравним результаты нашего видеоадаптера с некоторыми другими. RX 580 и Ryzen 2600 я тестировал локально, результаты остальных устройств взяты от других пользователей:

Устройство

Время компиляции

Время исполнения

Radeon RX 580

6.14s

6.51s

Radeon Vega Frontier Edition

4.56s

5.50s

GeForce GTX 1080 TI

2.52s

4.83s

Intel HD Graphics 5500

36.64s

755.23s

AMD Ryzen 2600 (CPU)

5.04s

254.70s

Видеоадаптеры AMD показывают себя ощутимо медленнее видеокарт Nvidia. Впрочем, разрыв между видеокартами на порядок меньше пропасти между видеокартами и процессорами. Исключением выступает Intel HD Graphics: PlaidML совершенно не оптимизирован для видеокарт Intel и их использование не имеет особого смысла.

ROCm: Старший брат

Со своей платформой Radeon Open Compute Platform (ROCm), AMD обеспечивает интерфейс для выполнения кода на GPU и процессорах. ROCm конкурирует с платформой NVIDIA CUDA. Он работает только на UNIX-системах.

На использовании ROCm я в итоге и остановился. По моим ощущениям, он работает в ~2 раза быстрее, чем PlaidML, и позволяет загружать в память более сложные модели, когда PlaidML выбрасывает Out Of Memory.

Я установил свежую Ubuntu 20.04 LTS. Для установки и настройки ROCm я предпринял следующие шаги: (они немного отличаются от официальной документации, т.к. она успела несколько устареть)

  1. Обновил пакеты:

    sudo apt update && sudo apt dist-upgrade && sudo apt install libnuma-dev && sudo reboot
  2. Откатил ядро с версии 5.8 до 5.6. Для этого я зашел на http://kernel.ubuntu.com/~kernel-ppa/mainline/ и скачал файлы:

    linux-headers-VERSION-NUMBER_all.deb
    linux-headers-VERSION-NUMBER_amd64.deb
    linux-image-VERSION-NUMBER_amd64.deb
    linux-modules-VERSION-NUMBER_amd64.deb
  3. Далее скопировал их в отдельную папку, в которой выполнил:

    sudo dpkg -i *.deb
  4. Перезагрузил ПК с ядром 5.6, выбрав его в GRUB. После этого удалил ядро 5.8:

    sudo apt-get purge *5.8.0*
  5. Перезагрузил ПК.

  6. Добавил репозиторий:

    wget -q -O - https://repo.radeon.com/rocm/rocm.gpg.key | sudo apt-key add -
    echo 'deb [arch=amd64] https://repo.radeon.com/rocm/apt/debian/ xenial main' | sudo tee /etc/apt/sources.list.d/rocm.list
  7. Установил ROCm:

    sudo apt update && sudo apt install rocm-dkms && sudo reboot
  8. Настроил права:

    sudo usermod -a -G video $LOGNAME
    sudo usermod -a -G render $LOGNAME
  9. Для проверки успешности установки запустил эти команды. Если установка прошла успешно, обе из них выведут название GPU:

    /opt/rocm/bin/rocminfo
    /opt/rocm/opencl/bin/clinfo
  10. Добавил ROCm в PATH:

    echo 'export PATH=$PATH:/opt/rocm/bin:/opt/rocm/rocprofiler/bin:/opt/rocm/opencl/bin' | sudo tee -a /etc/profile.d/rocm.sh
  11. После этого установил пакеты для машинного обучения:

    sudo apt install rocm-libs miopen-hip rccl
  12. Установил Pip и TensorFlow:

    sudo apt install python3-pip
    pip3 install --user tensorflow-rocm

Готово! После этого TensorFlow автоматически стал использовать мой GPU:

Давайте посмотрим на бенчмарки:

python3 ./tf_cnn_benchmarks.py --num_gpus=1 --batch_size=64 --model=resnet50

RX 580 я тестировал локально, результаты остальных устройств взяты от других пользователей:

Устройство

Изображений/сек (ResNet 50)

AMD Radeon VII

284

AMD Radeon RX Vega 56

131

AMD Radeon RX 580

92

Nvidia GeForce 2080 Ti

293

Nvidia GeForce GTX 1070

126

Nvidia GeForce RTX 3080 10GB

396

Выводы

В 2021 году в сфере машинного обучения становится всё менее и менее важно, какая у вас видеокарта. Видеокарты AMD всё ещё ощутимо отстают в производительности от собратьев из Nvidia, однако при этом и стоят дешевле. Тем не менее, поддержка видеокарт Radeon далека от идеальной, и необходимая настройка для них сложнее и дольше.

Если у вас уже есть видеокарта от AMD, то возможно для целей разработки вам не понадобится менять её на видеокарту Nvidia. Оптимальным выбором для машинного обучения на видеокартах Radeon я считаю фреймворк ROCm. Он обеспечивает приличную производительность, и позволяет запустить TensorFlow 2.2.0 и Keras.

UPD: В комментариях выяснили, что последняя версия связки ROCm+TensorFlow не всегда корректно работает на чипе Polaris 10 (Radeon RX 580). Написал туториал, как поставить ROCm 3.5.1 + TF 2.2: https://github.com/boriswinner/RX580-rocM-tensorflow-ubuntu20.4-guide

Комментарии 38

    +1
    «Видеокарты AMD всё ещё ощутимо отстают в производительности от собратьев из Nvidia, однако при этом и стоят дешевле.»

    — а можно сравнение с ценами? цена единицы производительности? я не удивлюсь если окажется что более дешевые карты дают куда лучше коэффициент. Занимаясь рендером я не раз видел что цена просчёта ниже на домашних картах нежели на титанах. Всё дело в том что цена видеокарт растет быстрее производительности. Проблема лишь в том если хочешь собрать ферму — там получается что одну и ту же производительности получаешь либо в 1м серверном шкафу либо уже в 8ми на более медленных картах. Но вот для домашних пользователей с одним компьютером и одной картой это может быть актуально — сразу поймешь что потратив дополнительно X денег получишь Y% прибавки скорости
      +1

      При учёте, насколько сейчас отличаются цены от рекомендованных, скачки и разницу между странами даже СНГ — смысла мало, через месяц это станет неактуально

        0
        Можно посчитать и в рекомендованных + 20% налога и в текущих, например.
      +2

      Проблема в том, что AMD не спешит добавлять поддержку ROCm в новые GPU.

        +2
        Зато спешит дропнуть поддержку существующих чипов

        «gfx8 support is officially dropped from now.»
        github.com/RadeonOpenCompute/ROCm/issues/1353#issuecomment-753772733

        «R9 390X is no more officially ROCm supported device.»
        github.com/RadeonOpenCompute/ROCm/issues/484#issuecomment-755272927

        www.x.org/wiki/RadeonFeature

        GCN2/GFX7 BONAIRE, KABINI, MULLINS, KAVERI, HAWAII
        GCN3,4/GFX8 TONGA, ICELAND/TOPAZ, CARRIZO, FIJI, STONEY, POLARIS10, POLARIS11, POLARIS12, VEGAM
        Т.е. включает и упомянутую тут RX580 (POLARIS)
          0
          Вот и мне интересно как автор сделал это… Без отката версий на более старую. Просто статья написана позавчера, А поддержка gfx803 (это чип на котором сделана rx580) закончилась на 4й версии ROCm полностью. мне даже танцы с бубном включающие пересобирание из исходников не помогли, в итоге я устал и откатился на ранние версии ROCm. Как так?
            0

            Сам процесс установки происходил несколько дней назад. Версию на более старую не откатывал, ставил из репозитория. В понедельник вернусь на работу и посмотрю версии пакетов

              0
              хорошо, буду ждать. а то если честно неделю уже на это убил. Кстати откат версии тоже работает нестабильно кэш постоянно переполняется… Вот ошибка которую выдает TF при попытки создать тензор /src/external/hip-on-vdi/rocclr/hip_code_object.cpp:120: guarantee(false && "hipErrorNoBinaryForGpu: Coudn't find binary for current devices!")
              Aborted (core dumped)
              . И у меня еще вопрос про версию ядра линукса. Чтобы установить ROCm-dkms нужно ядро 5.4 по крайней мере так написано в всё там же. github.com/RadeonOpenCompute/ROCm/ как вы его установили на 5.6?
              Вы не подумайте что я придираюсь, просто практически все шаги которые вы описали у меня не сработали, и поверьте я пробовал их в разных вариациях за эту неделю… и это большая боль для меня…
      0

      ROCm, насколько я знаю, официально поддерживает RX580 (Polaris). Я как-то пытался запустить на RX5700XT (Navi), где ROCm официально не поддерживается, но, как говорили на гитзхабе, в терории, это возможно. Не осилил.

        +1

        Давно ждал пока выйдет такая статья! Руки никак не доходили поиграться самому, да и брать AMD не хотелось "просто так".


        Да, раз уж затронули эту тему, по-хорошему в будущем в сравнении неплохо бы привести:


        • Хотя бы референcные цены (можно и какую-то цену среднюю с авито) и характеристики карт (и может архитектуру / поколение) на FP32 хотя бы;


        • Пара разных сеток (CNN, RNN, Transformer) и какая-то самописная экзотика;


        • Хотя бы поресерчить поддержку разных модулей и PyTorch;



        А то конечно непонятно, что типовые CV сетки чет заведутся, но можно ли реально работать и планировать пока неясно.

          0
          Спасибо за комментарий! В будущем попробую провести более подробный анализ. Пока могу сказать, что UNet спокойно работает. С референсными ценами сложно будет, т.к. сейчас они постоянно скачут.
            0

            Ну юнет это как обычная сетка, только две штуки
            Upsampling слои и transposed conv поддерживаются уже давно везде
            Это наверное показатель что поддержка есть хотя бы не только 2D конвов

          0
          А меня вот такой вопрос интересует а не дешевле платный гугл колаб за 10$ в месяц?
            +4
            На самом деле не все так однозначно. Просто добавлю свое мнение на эту тему.

            Начнем с того что RX580 это даже близко не аналог 1080. Думаю на сегодняшний день топовые модели AMD и NVDIA приблизительно равны по производительности. Вопрос на самом деле в другом. А толку даже от самых мощных видеокарт, если серьезные вычисления и большие датасеты доступны только гигантским и богатым корпорациям. Все остальное лишь «игрушки», либо только для исследований.

            А теперь про сам десктопный ML.
            Если у вас видеокарта NVDIA — вы автоматом не сможете работать на экосистеме Apple из-за конфликта Apple и Nvidia. Самые популярные фреймворки Tensorflow и PyTorch работают (с ускорением) только c Nvidia CUDA.

            Далее Keras. Keras задумывался как высокоуровневый интерфейс. Соответственно остальные бекенды, как PlaidML могли обеспечить работу с другими видео ускорителями без закрытой технологии CUDA. И так было до тех пор, пока авторы не заявили, что Keras будет развиваться только в рамках Tensorflow. Все — «накрылась медным тазом ваша качалка». И получается что PlaidML может работать только с Keras, a не с tf.Keras — API разбежалось. Cоответственно смысл юзать PlaidML, когда он не совместим с последней версией Keras API в Tensorflow. Пацаны из PlaidML (они часть Intel) были вынуждены поменять roadmap и идти в другом направлении.

            Как писал автор — есть и другой путь. Это использовать rocm или «cuda для нищих». Дело в том, что весь ML, по сути, это работа грубо говоря с массивчиками, а именно с матрицами и тензорами (векторами чисел). Оказалось, что видеокарты работают с ними очень быстро уже давно (спасибо видеоиграм). Но есть вопрос — а как программисту сообщить видеокарте, что вот эта структура в его любимом языке программирования это тензор или матрица, чтобы она посчитала нам наши замечательные веса в модельке? Оказалось что у каждого производителя видео чипов есть для этого свой формат/язык. Соответсвенно (очень грубо говоря) rocm это попытка транслировать код написанный для CUDA в код, который понимает AMD видеочипы. Но c ROCm не все так просто — он работает только для некоторых линукс ядер и редакций ОС (Ubuntu, Fedora, CentOS).

            Вывод — ML на десктоп это боль. По сути доступен только Linux и Nvidia, все остальное это танцы с бубном.
            Если где-то ошибся — дайте знать.
              0
              Ну я бы не сказал прям большая проблема ML на Apple. На Apple есть свой фреймворк от того же Apple — CoreML. Ну и есть преобразователи весов и моделей из PyTorch и прочего в модели CoreML. Так что на тему ML у любителей продукции Apple — «cвоя атмосфера» =)
                0

                А вы пробовали учить модели на CoreML?)

                  0
                  Пробывал =)
                  0
                  Все равно шляпа получается. CoreML подразумевает, что вы работаете с swift/objective-c окружением, а весь, скажем, популярный и актуальный софт, это в основном python библиотеки. В итоге надо учить swift, xcode и так далее и/или конвертировать модели. А как получить исходную модель tensorflow, если Nvidia Cuda не работает с Mac? В итоге возвращаемся к исходной проблеме — страдаем и тренируем на CPU.
                    0

                    Под питон кстати есть порт coreML. Там я бы сказал проблема в том что Эппл уже подумал за нас на счёт архитектур нейросетей. А так под Свифт есть куча приблуд типа скачивание с шифрование модели :). Я вообще нынче за Гугл колаб с его питоном ;)

                  0
                  Согласен с вашим комментарием. Информацию про устаревание PlaidML добавлю в пост.

                  ROCm действительно довольно капризен к окружению и требует больше шагов для настройки, чем окружение с CUDA. Однако это может того стоить — вся настройка вкупе с установкой Ubuntu с нуля отняла у меня не больше 3-4 часов.
                  +4

                  image

                    0
                    А что там с DirectML от Майкрософта? Вроде бы же и поддержка AMD есть, и к Тензорфлоу его прикрутили?
                      0

                      Спасибо за наводку! Думаю, эта библиотека тоже заслуживает внимания. Правда, она до сих пор сидит на ветке Tensorflow 1.x

                      0
                      Спасибо за подробную статью
                        0

                        Я где то полгода обучал тензор флоу модели на Radeon VII. И был в общем-то доволен, карта с большим количеством памяти стоила сильно дешевле чем аналог от Nvidia. Но все для меня сломалась после выхода tensorflow 2.0. Я долго на него не переходил, но в какой то момент все же пришлось, по моему это уже 2.2 было. В общем оказалось что в 2.2 для rocm какой-то баг, обучение идёт нормально, а валидация глючит, тренировать модели практически невозможно. Это наверное где то в сентябре было. Но при этом 2.2 на VII работает раза в два быстрее чем на 1080, которая тоже была в наличии. Откат на 2.1 проблему решал, но скорость падала чуть ли не на порядок, смысла в такой тренировке не было. По состоянию на декабрь, баг так и не был поправлен, при этом выходили очередные версии rocm и под них портировались очередные версии tensorflow, но они все так же не работали. В общем с одной стороны карта просто зверь за свои деньги, с другой стороны как с этим работать я не понимаю. Я правда впервые с убунтой столкнулся, может быть кто-то прошаренный и нашел бы выход из положения. Но мне непонятно как может столько времени висеть баг, который убивает всю полезность рокм. Зачем что то писать дальше, если текущее не работает?

                          0

                          А в интернете есть какая-то информация насчет этого бага, может быть, issue на github?

                            0
                            Да, вот он
                            github.com/ROCmSoftwarePlatform/tensorflow-upstream/issues/1105
                            Поскольку от разработчиков никаких комментариев нет, я не знаю в чем тут дело. Наверное все же какая то особенная конфигурация железа. Не может же это у всех не работать? Простейшие тесты не проходят
                              0
                              Запустил ваш MWE, отписался в Issue. Проблема такая же, как и у вас.
                                0
                                issue на самом деле не я создавал — я настолько детально наверное не смог бы это все описать. Я нашел его поиском, когда получил несоответствие обучения и валидации на своей сетке. Но получается, что ошибка воспроизводится у многих, и текущее состояние rocm нерабочее уже 4 месяца.
                                  0
                                  Кажется, последняя рабочая для нашего чипа версия — 3.5.1. Но и у неё есть свои проблемы:
                                  github.com/RadeonOpenCompute/ROCm/issues/1309
                                  Пишут, что пофиксили в 3.10. Но из-за другой проблемы топикстартер не смог её поставить. Попробую я :)

                                  Сейчас попробую даунгрейнднуться на 3.10, а если не получится то на 3.5.1:
                                  github.com/Grench6/RX580-rocM-tensorflow-ubuntu20.4-guide
                                    0
                                    Там как то не только и не столько дело в RocM
                                    У меня нормально работал Tensorflow 2.1 (только медленно)
                                    hub.docker.com/r/rocm/tensorflow/tags?page=1&ordering=last_updated&name=2.1
                                    Я правда докеры тестировал, переставлять на железо не пробовал

                                    (Последний который я тестировал был кажется на основе 3.7, сейчас уже 4.0 вышел, но это уже мимо меня прошло)

                                    В любом случае интересно, получится ли у вас запустить tf2.4
                                      0
                                      В итоге даунгрейднулся сразу на 3.5.1 с tf 2.2. C tf 2.4 ругается на отсутствие libamdhip64.so. Возможно, пофиксить возможно, но дальше копать уже не хочется :)
                                      На tf 2.2 Всё работает без ошибок, протестировал на бенчмарке ResNet и коде из Issue. Вот туториал:
                                      github.com/boriswinner/RX580-rocM-tensorflow-ubuntu20.4-guide
                          +1

                          Rx 6800 xt протестируйте. У неё 16 гб памяти, и вообще хотелось бы чтобы эта видеокарта была полезной для чего то кроме игр и что еще хуже, майнинга. Новое поколение которое вышло как тебя ведёт в машинном обучении?

                            +1

                            А там есть поддержка ROCm? У предыдущиего поколения нет.

                              +1
                              Тут вот пишут www.phoronix.com/scan.php?page=article&item=amd-rx6800-opencl&num=2
                              Radeon RX 6800 Series Has Excellent ROCm-Based OpenCL Performance On Linux

                              Но при этом на картинке не Rocm a PlaidML
                              0
                              На ядре linux 5.8, Rocm тоже работает, можно установить как написано в документации
                              sep5.readthedocs.io/en/latest/Installation_Guide/Installation-Guide.html#using-debian-based-rocm-with-upstream-kernel-drivers

                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                              Самое читаемое