Хабрахабр

Почему не стоит выкидывать Radeon, если ты увлекся машинным обучением?

image

Достаточно логично, что я отдавал предпочтение вычислительным решениям 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. Идем далее. Данный язык обладает следующими основными преимуществами — близость синтаксиса к математическим нотациям (да с ума же сойти!):

image

Например, в TensorFlow при создании новой пользовательской операции настоятельно рекомендуется написать функцию для вычисления градиентов. И автоматическая дифференциация всех объявляемых операций. Таким образом, при создании собственных операций на языке Tile нам нужно сказать лишь, ЧТО мы хотим посчитать, не задумываясь о том, КАК это считать в отношении аппаратных устройств.

Вспомним схематичное устройство: Дополнительно производится оптимизация работы с DRAM и аналогом L1-кэша в GPU.

image

Основные способы — обеспечение одновременного считывания достаточно больших блоков из DRAM(попытка избежать адресации в разные области) и достижение того, что данные, загруженные в кэш, используются несколько раз(попытка избежать перезагрузок одних и тех же данных несколько раз). Для оптимизации используются все доступные данные об оборудовании — размер кэша, ширина линии кэша, полоса пропускания DRAM и тд.

Все оптимизации проходят во время первой эпохи обучения, при этом сильно увеличивая время первого прогона:

image

Главный плюс OpenCL в том, что это стандарт для гетерогенных систем и ничего не мешает Вам запустить kernel на CPU. Кроме того, стоит отметить, что данный фреймворк завязан на OpenCL. Да, именно тут кроется один из главных секретов кроссплатформенности PlaidML.

Заключение

Потом у меня появилась RX 580 8gb(мне одолжили!) и время прогона эпохи сократилось до 20 сек, что уже почти сопоставимо. Конечно, обучение на RX 460 всё еще идет в 5-6 раз медленнее, чем на 1060, но вы сравните и ценовые категории видеокарт!

В блоге vertex.ai есть честные графики (больше — лучше):

image

Но в такую открытую схватку разработчики 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'ы!

Показать больше

Похожие публикации

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»