Почему не стоит выкидывать Radeon, если ты увлекся машинным обучением?
Достаточно логично, что я отдавал предпочтение вычислительным решениям AMD. Свою рабочую станцию мне выдалось собирать, будучи студентом. Я долго подбирал компоненты, в итоге уложился в 40к с комплектом из FX-8320 и RX-460 2GB. потому что это дешево выгодно по соотношению цена/качество. Мы с соседом по комнате слегка майнили Monero и мой набор показывал 650h/s против 550h/s на наборе из i5-85xx и Nvidia 1050Ti. Сначала этот комплект казался идеальным! Правда, от моего набора в комнате бывало слегка жарковато по ночам, но это решилось, когда я приобрел башенный кулер к CPU.
Сказка кончилась
Даже точнее — до тех пор, пока мне не пришлось работать с входными изображениями разрешением больше 100х100px (до этого момента мой 8-ядерный FX резво справлялся). Всё было как в сказке ровно до тех пор, пока я не увлекся машинным обучением в сфере компьютерного зрения. 4 слоя ResNet, входное изображение 100х100 и 3000 изображений в обучающей выборке. Первой сложностью оказалась задача определения эмоций. На работе у нас стояла Nvidia 1060 6GB и обучение похожей структуры(правда, там обучалась регрессия для локализации объектов) на ней пролетало за 15-20 минут — 8 секунд на эпоху из 3. И вот — 9 часов обучения 150 эпох на CPU.
Конечно, из-за такой задержки страдает итеративный процесс разработки. Когда у тебя такой контраст под носом, дышать становится еще труднее. 5к изображений.
Да, я пошёл выторговывать 1050Ti у моего соседа. Что-ж, угадайте мой первый ход после всего этого? Но всё тщетно. С аргументами о ненужности CUDA для него, с предложением обмена на мою карту с доплатой. Даже в случае успешной продажи карты мне пришлось бы найти еще 10к(я студент, пусть и работающий). И вот я уже выкладываю свою RX 460 на Авито и рассматриваю заветную 1050Ti на сайтах Ситилинка и Технопоинта.
Гуглю
Я иду гуглить, как юзать Radeon под Tensorflow. Окей. Собирать под Ubuntu, заведётся или нет, получить кирпич — фразы, выхваченные с форумов. Заведомо зная, что это экзотическая задача, я особо не надеялся найти что-то толковое.
Меня моментально кидает на страничку PlaidML. И вот я пошел другим путём — я гуглю не "Tensorflow AMD Radeon", а "Keras AMD Radeon". 0. Я завожу его за 15 минут(правда, пришлось сдаунгрейдить Keras до 2. Первое наблюдение — эпоха идет 35 сек вместо 200. 5) и ставлю учиться сеть.
Лезу исследовать
Цель разработки — максимальная кроссплатформенность. Авторы PlaidML — vertex.ai, входящая в группу проектов Intel(!). Их статья рассказывает, что PlaidML конкурентноспособен с Tensorflow 1. Конечно, это добавляет уверенности в продукте. 3 + cuDNN 6 за счет "тщательной оптимизации".
Следующая статья в какой-то степени раскрывает нам внутреннее устройство библиотеки. Однако, продолжим. Для автоматической генерации ядер в PlaidML очень важны точные размеры всех тензоров, константы, шаги, размеры сверток и граничные значения, с которыми далее придется работать. Основное отличие от всех других фреймворков — это автоматическая генерация ядер вычислений(в нотации Tensorflow "ядро" — это полный процесс выполнения определенной операции в графе). Имея эти данные фреймворк сам сгенерирует максимально эффективный способ распараллеливания и исполнения всех операций для конкретного устройства с конкретными характеристиками. Например, утверждается, что дальнейшее создание эффективных ядер различается для батчсайзов 1 и 32 или для сверток размеров 3х3 и 7х7. Т.е. Если посмотреть на Tensorflow, то при создании новых операций нам необходимо реализовать и ядро для них — и реализации сильно различаются для однопоточных, многопоточных или CUDA-совместимых ядер. в PlaidML явно больше гибкости.
Реализация написана на самописном языке Tile. Идем далее. Данный язык обладает следующими основными преимуществами — близость синтаксиса к математическим нотациям (да с ума же сойти!):
Например, в TensorFlow при создании новой пользовательской операции настоятельно рекомендуется написать функцию для вычисления градиентов. И автоматическая дифференциация всех объявляемых операций. Таким образом, при создании собственных операций на языке Tile нам нужно сказать лишь, ЧТО мы хотим посчитать, не задумываясь о том, КАК это считать в отношении аппаратных устройств.
Вспомним схематичное устройство: Дополнительно производится оптимизация работы с DRAM и аналогом L1-кэша в GPU.
Основные способы — обеспечение одновременного считывания достаточно больших блоков из DRAM(попытка избежать адресации в разные области) и достижение того, что данные, загруженные в кэш, используются несколько раз(попытка избежать перезагрузок одних и тех же данных несколько раз). Для оптимизации используются все доступные данные об оборудовании — размер кэша, ширина линии кэша, полоса пропускания DRAM и тд.
Все оптимизации проходят во время первой эпохи обучения, при этом сильно увеличивая время первого прогона:
Главный плюс OpenCL в том, что это стандарт для гетерогенных систем и ничего не мешает Вам запустить kernel на CPU. Кроме того, стоит отметить, что данный фреймворк завязан на OpenCL. Да, именно тут кроется один из главных секретов кроссплатформенности PlaidML.
Заключение
Потом у меня появилась RX 580 8gb(мне одолжили!) и время прогона эпохи сократилось до 20 сек, что уже почти сопоставимо. Конечно, обучение на RX 460 всё еще идет в 5-6 раз медленнее, чем на 1060, но вы сравните и ценовые категории видеокарт!
В блоге vertex.ai есть честные графики (больше — лучше):
Но в такую открытую схватку разработчики PlaidML, вероятно, и не планируют вступать. Видно, что PlaidML конкурентноспособен по отношению к Tensorflow+CUDA, но точно не быстрее для актуальных версий. Их цель — универсальность, кроссплатформенность.
Оставлю здесь и не совсем сравнительную таблицу со своими замерами производительности:
Вычислительное устройство
Время прогона эпохи (батч — 16), с
AMD FX-8320 tf
200
RX 460 2GB plaid
35
RX 580 8 GB plaid
20
1060 6GB tf
8
1060 6GB plaid
10
Intel i7-2600 tf
185
Intel i7-2600 plaid
240
GT 640 plaid
46
Кажется, если разработчики данного инструмента не перестанут релизить новые версии и всё больше людей, обиженных Nvidia, будут ознакомлены с PlaidML, то про vertex.ai скоро будут говорить намного чаще. Последняя статья в блоге vertex.ai и последние правки в репозитории датированы маем 2018 года.
Расчехляйте свои Radeon'ы!