Використання Keras & Tensorflow з графічним процесором AMD


75

Я починаю вивчати Keras, який, на мою думку, є шаром поверх Tensorflow і Theano. Однак я маю доступ лише до графічних процесорів AMD, таких як AMD R9 280X.

Як я можу налаштувати своє середовище Python таким чином, щоб я міг використовувати свої графічні процесори AMD за допомогою підтримки Keras / Tensorflow для OpenCL?

Я працюю на OSX.


Я вважаю, що новий сервер Theano підтримуватиме OpenCL, а також карти NVIDIA. Що стосується Tensorflow, існує відкрите питання щодо підтримки OpenCL; не схоже, що було досягнуто великого прогресу.
gobrewers

3
Графічні процесори AMD не підтримуються в TensorFlow або більшості інших нейромережевих пакетів. Причина полягає в тому, що NVidia інвестувала в швидку безкоштовну реалізацію нейромережевих блоків (CuDNN), на яку покладаються всі швидкі реалізації нейронних мереж GPU (Torch / Theano / TF), тоді як AMD, схоже, не цікавить цей ринок.
Ярослав Булатов

4
Нещодавно Google оголосив, що купуватиме графічні процесори AMD для використання в своїх центрах обробки даних, імовірно, також для програм машинного навчання. Такий крок не має сенсу, якщо не існує дорожньої карти, яка б підтримувала GPUS більш загально.
Торнхейл

1
На більшості платформ (наразі Mac / Win / Linux) ви можете запустити Keras поверх PlaidML. PlaidML є відкритим кодом та включає альтернативу cuDNN, яка працює на більшості графічних процесорів: github.com/plaidml/plaidml
Ng

Простий спосіб встановити Opencl на Linux gist.github.com/kytulendu/3351b5d0b4f947e19df36b1ea3c95cbe
user1462442

Відповіді:


67

Я пишу бекенд OpenCL 1.2 для Tensorflow за адресою https://github.com/hughperkins/tensorflow-cl

Ця вилка тензорного потоку для OpenCL має такі характеристики:

  • він націлений на будь-який / всі пристрої OpenCL 1.2. Він не потребує OpenCL 2.0, не потребує SPIR-V або SPIR. Не потрібна спільна віртуальна пам’ять. І так далі ...
  • він базується на базовій бібліотеці під назвою 'cuda-on-cl', https://github.com/hughperkins/cuda-on-cl
    • cuda-on-cl, щоб мати змогу взяти будь-який soure-код NVIDIA® CUDA ™ і скомпілювати його для пристроїв OpenCL 1.2. Це дуже загальна мета і дуже загальний компілятор
  • на даний момент реалізовані такі функціональні можливості:
    • операції за елементом, використовуючи Eigen через OpenCL, (докладніше на https://bitbucket.org/hughperkins/eigen/src/eigen-cl/unsupported/test/cuda-on-cl/?at=eigen-cl )
    • blas / matrix-multiplication, за допомогою CLBlast Седрика Нугтерена https://github.com/cnugteren/CLBlast
    • скорочення, argmin, argmax, знову використовуючи Eigen, згідно з попередньою інформацією та посиланнями
    • навчання, тренери, градієнти. Принаймні, інструктор StochasticGradientDescent працює, а інші - віддані, але ще не перевірені
  • він розроблений на Ubuntu 16.04 (з використанням графічних процесорів Intel HD5500 та NVIDIA) та Mac Sierra (з використанням Intel HD 530 та Radeon Pro 450)

Це не єдина доступна вилка OpenCL Tensorflow. Також існує форк, який розробляється Codeplay https://www.codeplay.com , використовуючи Computecpp, https://www.codeplay.com/products/computesuite/computecpp Їх вилка має більш високі вимоги, ніж моя, наскільки я знати, з точки зору яких конкретних пристроїв графічного процесора він працює. Вам потрібно буде перевірити Примітки щодо підтримки платформи (внизу сторінки hte computecpp), щоб визначити, чи підтримується ваш пристрій. Вилка кодової гри насправді є офіційною форкою Google, яка знаходиться тут: https://github.com/benoitsteiner/tensorflow-opencl


Мені цікаво: що раціонально створювати лише підтримку Opencl 1.2. Здається, в Opencl 2.0 є багато можливостей, які можуть бути корисними для глибокого навчання: developer.amd.com/tools-and-sdks/opencl-zone/…
Торнхейл

2
Хто-небудь без спеціального графічного процесора не перевіряв, наскільки швидше тензорний потік стає, коли замість центрального процесора використовується інтегрований графічний процесор (Intel або AMD)?
Торнхейл

2
Обґрунтування @Thonhale: націлювання на портативність. Наприклад, драйвер Mac Sierra Radeon Pro 450 підтримує лише OpenCL 1.2, як і драйвер Intel HD 530, на тій же платформі. (а це, в основному, абсолютно новий Mac Book Pro)
Х'ю Перкінс,

36

Оригінальне запитання в цьому дописі було: як змусити Keras і Tensorflow працювати з графічним процесором AMD.

Відповідь на це запитання така:

1.) Keras буде працювати, якщо ви зможете змусити Tensorflow працювати належним чином (необов’язково у вашому віртуальному / кондо-середовищі).

2.) Щоб змусити Tensorflow працювати на графічному процесорі AMD, як заявляли інші, один із способів, що це може працювати, - це компіляція Tensorflow для використання OpenCl. Для цього прочитайте посилання нижче. Але для стислості я підсумую необхідні кроки тут:

  • Вам знадобляться власні драйвери AMD. Наразі вони доступні лише в Ubuntu 14.04 (версія до того, як Ubuntu вирішила змінити спосіб відображення інтерфейсу). Підтримка Ubuntu 16.04 при написанні цього повідомлення обмежена кількома графічними процесорами через AMDProDrivers. Читачі, які хочуть глибоко навчитися на графічних процесорах AMD, повинні це знати!

  • Компіляція Tensorflow з підтримкою OpenCl також вимагає отримання та встановлення таких передумов: заголовки OpenCl, ComputeCpp.

  • Після виконання передумов налаштуйте свою збірку. Зверніть увагу, що існує 3 варіанти компіляції Tensorflow: Std Tensorflow (стабільний), Benoits Steiner's Tensorflow-opencl (розвиваючий) та Tensorflow-opencl Люка Іванського (дуже експериментальний), який ви можете отримати з github. Також зверніть увагу, що якщо ви вирішите побудувати з будь-якої з версій opencl, питання щодо використання opencl буде відсутнє, оскільки передбачається, що ви використовуєте його. І навпаки, це означає, що якщо ви налаштовуєте за стандартним тензорним потоком, вам потрібно буде вибрати "Так", коли сценарій налаштування попросить вас використовувати opencl та "НІ" для CUDA.

  • Потім запустіть тести так:

    $ bazel test --config = sycl -k --test_timeout 1600 - // tensorflow / ... - // tensorflow / contrib / ... - // tensorflow / java / ... - // tensorflow / compiler / ...

Оновлення: Це робиться на моїй установці триває надто довго під час моєї установки. Частина, яка займає багато часу, це всі запущені тести. Я не впевнений, що це означає, але у багатьох моїх тестів очікується 1600 секунд. Ймовірно, тривалість може бути скорочена за рахунок збільшення часу очікування. Крім того, ви можете просто побудувати тензорний потік без тестів. На момент написання цієї статті проведення тестів тривало вже 2 дні.

Або просто побудуйте пакет pip так:

bazel build --local_resources 2048,.5,1.0 -c opt --config=sycl //tensorflow/tools/pip_package:build_pip_package

Будь ласка, насправді прочитайте допис у блозі на Codeplay: Лукас Іванський опублікував вичерпний підручник про те, як змусити Tensorflow працювати з OpenCl, лише 30 березня 2017 року. Отже, це зовсім недавня публікація. Є також деякі деталі, про які я тут не писав.

Як зазначено у багатьох публікаціях вище, невеликі шматочки інформації поширюються по всій мережі. Пост Лукаса з точки зору вартості додає, що вся інформація була зібрана в одному місці, що мало б зробити налаштування Tensforflow та OpenCl трохи менш страшним. Я надаю лише посилання тут:

https://www.codeplay.com/portal/03-30-17-setting-up-tensorflow-with-opencl-using-sycl

Тут було опубліковано трохи повнішу інструкцію:

http://deep-beta.co.uk/setting-up-tensorflow-with-opencl-using-sycl/

Він відрізняється головним чином явним повідомленням користувачеві, що йому / їй потрібно:

  • створити символічні посилання на підпапку
  • а потім фактично встановити tensorflow за допомогою команди "python setup.py razvijaти".

Зверніть увагу, що вище згаданий альтернативний підхід з використанням tensorflow-cl:

https://github.com/hughperkins/tensorflow-cl

На даний момент я не можу зрозуміти, який підхід є кращим, хоча, схоже, такий підхід є менш активним. Розміщується менше проблем, і відбувається менше розмов для їх вирішення. Торік відбувся великий поштовх. Додаткові натискання зменшились з листопада 2016 року, хоча Х'ю, здається, висував деякі оновлення кілька днів тому на момент написання цього допису. (Оновлення: якщо ви прочитали деяку частину документації readme, ця версія tensorflowo тепер покладається лише на підтримку спільноти, оскільки основний розробник зайнятий життям.)

ОНОВЛЕННЯ (2017-04-25): У мене є кілька приміток, заснованих на тестуванні tensorflow-opencl нижче.

  • Майбутній користувач цього пакету повинен зауважити, що використання opencl означає, що вся важка робота з точки зору обчислень перекладається на графічний процесор. Я згадую це, тому що особисто думав, що обчислювальне робоче навантаження буде розподілено між моїм центральним процесором та iGPU. Це означає, що потужність вашого графічного процесора дуже важлива (зокрема, пропускна здатність та доступна VRAM).

Нижче наведено деякі цифри для обчислення 1 епохи за допомогою набору даних CIFAR10 для МОЄГО НАСТРОЮВАННЯ (A10-7850 з iGPU). Ваш пробіг майже напевно буде змінюватися!

  • Tensorflow (за допомогою встановлення піп): ~ 1700 с / епоха
  • Тенсорний потік (із SSE + AVX): ~ 1100 с / епоха
  • Tensorflow (з / opencl і iGPU): ~ 5800 с / епоха

Ви бачите, що в цьому конкретному випадку продуктивність гірша. Я пояснюю це наступними факторами:

  • IGPU має лише 1 Гб. Це призводить до великої кількості копіювання вперед і назад між процесором і графічним процесором. (Opencl 1.2 ще не має можливості передавати дані через покажчики; натомість дані потрібно копіювати вперед і назад).
  • IGPU має лише 512 потокових процесорів (і 32 Гбіт / с пропускну здатність пам’яті), що в цьому випадку повільніше, ніж 4 процесори з використанням наборів команд SSE4 + AVX.
  • Розробка tensorflow-opencl знаходиться на початковій стадії, і багато оптимізацій в SYCL тощо ще не зроблено.

Якщо ви використовуєте графічний процесор AMD з більшою кількістю VRAM і більше потокових процесорів, ви напевно отримаєте набагато кращі показники продуктивності. Мені було б цікаво прочитати, яких цифр люди досягають, щоб знати, що можливо.

Я продовжуватиму підтримувати цю відповідь, якщо / коли оновлення надсилатимуться.

3.) В даний час натякається на альтернативний спосіб, який полягає у використанні ініціативи AMD RocM та бібліотеки miOpen (еквівалент cuDNN). Це / будуть бібліотеки з відкритим кодом, що дозволяють глибоке навчання. Застереження полягає в тому, що підтримка RocM наразі існує лише для Linux, і що miOpen ще не випущений в дику природу, але Раджа (керівник графічного процесора AMD) заявив в AMA, що, використовуючи вищезазначене, слід мати можливість глибокого навчання на Графічні процесори AMD. Насправді підтримка запланована не лише для Tensorflow, а й для Cafe2, Cafe, Torch7 та MxNet.


Я хотів би бачити, як AMD починає діяти - особисто у мене є всі карти AMD - але нам повідомили це вже занадто скоро (не те, що AMD тут має весь контроль над тим, чи буде TensorFlow застосовувати це тощо). Чи є у AMD якийсь еквівалент "відстежувача проблем", про який ви знаєте випадково?
ehiller

Чи знаєте ви, як змінилася сцена, відколи ви написали цю відповідь?
Maxie Berkmann

21

Можна використовувати графічний процесор AMD через серверну плату PlaidML Keras.

Найшвидший : PlaidML часто в 10 разів швидший (або більше), ніж популярні платформи (наприклад, TensorFlow CPU), оскільки він підтримує всі графічні процесори, незалежно від марки та моделі. PlaidML прискорює глибоке навчання на AMD, Intel, NVIDIA, ARM та вбудованих графічних процесорах.

Найпростіший : PlaidML простий у встановленні та підтримує декілька інтерфейсів (Keras та ONNX)

Безкоштовно : PlaidML є повністю відкритим кодом і не покладається на жодну бібліотеку постачальників, що має власні та обмежувальні ліцензії.

Для більшості платформ почати роботу з прискореного глибокого навчання так само просто, як запустити кілька команд (за умови, що у вас встановлений Python (v2 або v3)):

virtualenv plaidml
source plaidml/bin/activate
pip install plaidml-keras plaidbench

Виберіть, який прискорювач ви хочете використовувати (багато комп’ютерів, особливо ноутбуки, мають кілька):

plaidml-setup

Далі спробуйте порівняльний аналіз продуктивності умовиводів MobileNet:

plaidbench keras mobilenet

Або спробуйте навчити MobileNet:

plaidbench --batch-size 16 keras --train mobilenet

Щоб використовувати його з набором керас

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

Для отримання додаткової інформації

https://github.com/plaidml/plaidml

https://github.com/rstudio/keras/issues/205#issuecomment-348336284


Я постійно використовую plaidML і провів порівняльний аналіз залежно від графічного процесора. Це працює досить добре на всіх моїх Mac.
Bryan Butler

1
Ці три команди працюють вгорі кожного сценарію: import plaidml.keras plaidml.keras.import_backend() from keras import backend as K
Брайан Батлер

7

Це давнє запитання, але оскільки останні кілька тижнів я намагався це зрозуміти самостійно:

  1. Підтримка OpenCL для Theano є невдалою. Вони додали інтерфейс libgpuarray, який, як видається, все ще глючить (тобто процес працює на графічному процесорі, але відповідь неправильна - як 8% точність на MNIST для моделі DL, яка отримує ~ 95 +% точності на процесорі або nVidia CUDA). Також тому, що ~ 50-80% підвищення продуктивності стека nVidia надходить із бібліотек CUDNN, OpenCL просто залишиться в пилу. (ДИВИСЬ НИЖЧЕ!) :)
  2. ROCM, здається, дуже крутий, але документацію (і навіть чітку декларацію про те, що таке ROCM / що вона робить) важко зрозуміти. Вони роблять все можливе, але відстають на 4+ роки. Це НЕ НЕ працює на RX550 (на момент написання статті). Тож не витрачайте час даремно (саме тут пройшов 1 тиждень :)). Спочатку здається, що ROCM є новим доповненням до набору драйверів (замінюючи AMDGPU-Pro або доповнюючи його), але насправді це модуль ядра та набір бібліотек, які по суті замінюють AMDGPU-Pro. (Подумайте про це як про еквівалент драйвера Nvidia-381 + CUDA для деяких бібліотек). https://rocm.github.io/dl.html (Чесно кажучи, я досі не перевіряв продуктивність і не намагався змусити її працювати з новішими драйверами Mesa. Я зроблю це колись.
  3. Додайте MiOpen до ROCM, і це по суті CUDNN. Вони також мають досить чіткі інструкції щодо міграції. Але ще краще.
  4. Вони створили "HIP", який є автоматичним перекладачем з CUDA / CUDNN на MiOpen. Здається, це працює досить добре, оскільки вони вишикували API безпосередньо для перекладу. Є концепції, які не є ідеальними картами, але загалом це виглядає добре.

Нарешті, після 3-4 тижнів спроб з’ясувати OpenCL тощо я знайшов цей посібник, який допоможе вам швидко розпочати роботу. Це крок за кроком для запуску та запуску hipCaffe. На відміну від nVidia, будь ласка, переконайтесь, що ви підтримуєте обладнання !!!! https://rocm.github.io/hardware.html . Думаєте, ви можете змусити його працювати без підтримуваного обладнання? Удачі. Вас попереджали. Після того, як ви запустили та запустили ROCM (І ЗАПУСКИЛИ ТЕСТИ НА ВЕРИФІКАЦІЮ), ось підручник з hipCaffe - якщо у вас є ROCM, ви пройдете перевірочний тест MNIST протягом 10 хвилин - солодко! https://rocm.github.io/ROCmHipCaffeQuickstart.html


Посилання на рішення вітається, але будь ласка, переконайтеся, що ваша відповідь корисна без нього: додайте контекст навколо посилання, щоб ваші однодумці мали певне уявлення, що це таке і чому воно є, а потім цитуйте найбільш відповідну частину сторінки, яку ви хочете повторне посилання на випадок, якщо цільова сторінка буде недоступна. Відповіді, які є лише кількома посиланнями, можуть бути видалені.
paper1111

FYI, сторінки, на які ви зв’язали, більше не існують і переспрямовують кудись ще, де не повністю містять відповіді.
Maxie Berkmann,

Дозвольте мені переглянути останній статус протягом наступного тижня, щоб оновити відповідь.
Торнхейл


4

Theano має підтримку OpenCL, але вона все ще перебуває на початковій стадії. Сам Теано не цікавиться OpenCL і покладається на підтримку громади .

Більшість операцій вже реалізовані, і це в основному питання налаштування та оптимізації даних операцій.

Щоб користуватися серверною базою OpenCL, вам потрібно побудувати libgpuarray себе.

З власного досвіду я можу сказати вам, що ви отримаєте продуктивність процесора, якщо вам пощастить. Виділення пам'яті, здається, дуже наївно реалізовано (тому обчислення будуть повільними) і вийдуть з ладу, коли в нього закінчиться пам'ять. Але я закликаю вас спробувати і, можливо, навіть оптимізувати код або допомогти повідомити про помилки.


4
Чи щось змінилося за останні 6 місяців у цьому плані?
Торнхейл

5
Теано було припинено
Ерік Айгнер

@ErikAigner Офіційно. Помилки все ще виправлені, і спільнота може внести свій внесок.
nemo


3

Якщо у вас є доступ до інших процесорів AMD, будь ласка, дивіться тут: https://github.com/ROCmSoftwarePlatform/hiptensorflow/tree/hip/rocm_docs

Це повинно допомогти вам рухатись у правильному напрямку для тензор-потоку на платформі ROCm, але пост Селлі про https://rocm.github.io/hardware.html - це угода з цим маршрутом. Ця сторінка не є вичерпним списком, я сам з'ясував, що Xeon E5 v2 Ivy Bridge чудово працює з ROCm, хоча вони перелічують v3 або новіші версії, проте відеокарти трохи вибагливіші. gfx8 або новіша версія, за невеликими винятками, polaris та, можливо, інші з часом.

ОНОВЛЕННЯ - Схоже, у hiptensorflow є опція підтримки opencl під час налаштування. Я б сказав, дослідіть посилання, навіть якщо у вас немає gfx8 + або polaris gpu, якщо реалізація opencl працює. Це затяжний процес, але годину чи три (залежно від апаратного забезпечення), дотримуючись добре написаних інструкцій, не надто багато, щоб втратити, щоб дізнатись.


0

Технічно ви можете, якщо використовуєте щось на зразок OpenCL, але CUDA від Nvidia набагато краща, і OpenCL вимагає інших кроків, які можуть працювати, а можуть і не працювати. Я б порадив, якщо у вас є процесор AMD, використовуйте щось на зразок Google Colab, де вони надають безкоштовний графічний процесор Nvidia, який ви можете використовувати при кодуванні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.