Чому не варто викидати Radeon, якщо ти захопився машинним навчанням?

Свою робочу станцію мені видалося збирати, будучи студентом. Досить логічно, що я віддавав перевагу обчислювальним рішенням AMD. тому що це дешево, вигідно по співвідношенню ціна/якість. Я довго підбирав компоненти, в результаті вклався в 40к з комплектом з FX-8320 та RX-460 2GB. Спочатку цей комплект здавався ідеальним! Ми з сусідом по кімнаті злегка майнили Monero і мій набір показував 650h/s проти 550h/s на наборі з i5-85xx і Nvidia 1050Ti. Правда, від мого набору в кімнаті бувало трохи жаркувато ночами, але це вирішилося, коли я придбав баштовий кулер до CPU.

 

Казка скінчилася

 

Все було як у казці рівно до тих пір, поки я не захопився машинним навчанням у сфері комп’ютерного зору. Навіть точніше — до тих пір, поки мені не довелося працювати з вхідними зображеннями роздільною здатністю більше 100х100рх (до цього моменту мій 8-ядерний FX жваво справлявся). Першою складністю виявилася задача визначення емоцій. 4 шари ResNet, вхідне зображення 100х100 і 3000 зображень у навчальній вибірці. І ось — 9 годин навчання 150 епох на CPU.
Звичайно, з-за такої затримки страждає ітеративний процес розробки. На роботі у нас стояла Nvidia 1060 6GB і навчання схожої структури(правда, там навчалася регресія для локалізації об’єктів) на ній пролітало за 15-20 хвилин 8 секунд на добу з 3.5 до зображень. Коли у тебе такий контраст під носом, дихати стає ще важче.

 

Що-ж, вгадайте мій перший хід після всього цього? Так, я пішов виторговувати 1050Ti у мого сусіда. З аргументами про непотрібність CUDA для нього, з пропозицією обміну на мою карту з доплатою. Але все марно. І ось я вже викладаю свою RX 460 на Авіто і розглядаю заповітну 1050Ti на сайтах Ситилинка і Технопоинта. Навіть у разі успішного продажу карти мені довелося б знайти ще 10к(я-студент, нехай і працюючий).

Читайте також  IObit Malware Fighter — видалення шкідливих і небажаних програм

 

Гуглю

 

Окей. Я йду гуглити, як юзати Radeon під Tensorflow. Завідомо знаючи, що це екзотичне завдання, я особливо не сподівався знайти щось путнє. Збирати під Ubuntu, заведеться чи ні, отримати цегла — фрази, вихоплені з форумів.

 

І ось я пішов іншим шляхом — я гуглю не “Tensorflow AMD Radeon”, а “Keras AMD Radeon”. Мене моментально кидає на сторінку PlaidML. Я заводжу його за 15 хвилин(правда, довелося сдаунгрейдить Keras до 2.0.5) і ставлю вчитися мережу. Перше спостереження — епоха йде 35 сек замість 200.

 

Лізу дослідити

 

Автори PlaidML — vertex.ai, що входить в групу проектів Intel(!). Мета розробки — максимальна кросплатформеність. Звичайно, це додає впевненості в продукті. Їх стаття розповідає, що PlaidML конкурентноздатний з Tensorflow 1.3 + cuDNN 6 за рахунок ретельної оптимізації”.

 

Однак, продовжимо. Наступна стаття в якійсь мірі розкриває нам внутрішній устрій бібліотеки. Основна відмінність від всіх інших фреймворків — це автоматична генерація ядер обчислень(в нотації Tensorflow “ядро” — це повний процес виконання певної операції в графі). Для автоматичної генерації ядер в PlaidML дуже важливі точні розміри всіх тензорів, константи, кроки, розміри згорток і граничні значення, з якими надалі доведеться працювати. Наприклад, стверджується, що подальше створення ефективних ядер розрізняється для батчсайзов 1 і 32 або для згорток розмірів 3х3 і 7х7. Маючи ці дані фреймворк сам згенерує максимально ефективний спосіб розпаралелювання та виконання всіх операцій для конкретного пристрою з конкретними характеристиками. Якщо подивитися на Tensorflow, то при створенні нових операцій нам необхідно реалізувати і ядро для них — і реалізації сильно розрізняються для однопоточних, багатопоточних або CUDA-сумісних ядер. Тобто в PlaidML явно більше гнучкості.

Читайте також  Американець першим в історії поодинці перетнув Антарктиду

 

Йдемо далі. Реалізація написана на самописній мові Tile. Дана мова володіє наступними основними перевагами — близькість до синтаксису математичних нотацій (так з розуму ж зійти!):

 

 

І автоматична диференціація всіх викликаних операцій. Наприклад, в TensorFlow при створенні нової користувальницької операції рекомендується написати функцію для обчислення градієнтів. Таким чином, при створенні власних операцій на мові Tile нам потрібно сказати лише, ЩО ми хочемо порахувати, не замислюючись про те, ЯК це вважати відносно апаратних пристроїв.

 

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

 

 

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

 

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

 

 

Крім того, варто відзначити, що даний фреймворк зав’язаний на OpenCL. Головний плюс OpenCL в тому, що це стандарт для гетерогенних систем і нічого не заважає Вам запустити kernel на CPU. Так, саме тут криється один з головних секретів кроссплатформенності PlaidML.

 

Висновок

 

Звичайно, навчання на RX 460 все ще йде в 5-6 разів повільніше, ніж на 1060, але ви порівняєте і цінові категорії відеокарт! Потім у мене з’явилася RX 580 8gb(мені позичили!) і час прогону епохи скоротилася до 20 сек, що вже майже порівнянно.

 

Читайте також  Про книгу “Принципи. Життя і робота" Рея Даліо

В блозі vertex.ai є чесні графіки (більше — краще):

 

 

Видно, що PlaidML конкурентоспроможний по відношенню до Tensorflow+CUDA, але точно не швидше для актуальних версій. Але в таку відкриту сутичку розробники PlaidML, ймовірно, і не планують вступати. Їх мета — універсальність, кросплатформеність.

 

Залишу тут і не зовсім порівняльну таблицю зі своїми вимірами продуктивності:

 

Обчислювальний пристрійЧас прогону епохи (батч — 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

 

Остання стаття в блозі vertex.ai і останні правки в репозиторії датовані травнем 2018 року. Здається, якщо розробники даного інструменту не перестануть релізувати нові версії і все більше людей, скривджених Nvidia, будуть ознайомлені з PlaidML, то про vertex.ai скоро будуть говорити набагато частіше.

 

“Расчехляйте свої Radeon’и!”

Степан Лютий

Обожнюю технології в сучасному світі. Хоча частенько і замислююся над тим, як далеко вони нас заведуть. Не те, щоб я прям і знаюся на ядрах, пікселях, коллайдерах і інших парсеках. Просто приходжу в захват від того, що може в творчому пориві вигадати людський розум.

You may also like...

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *