Обмен технологиями

[AIGC] 2. Mac локально использует графический процессор для запуска вычислений keras.

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Mac локально использует графический процессор для запуска вычислений Keras

1. Предыстория проблемы

Из предыдущей статьи мы обнаружили, что при работе больших моделей при использовании ЦП для работы загрузка ЦП очень высока. Поэтому мы подумаем здесь, что если в машине есть видеокарта с графическим процессором, как мы можем использовать преимущества видеокарты в векторных операциях и быстро и хорошо выполнять операции, связанные с машинным обучением.

2. Техническая подготовка

Мы знаем, что в настоящее время распространенными видеокартами, поддерживающими машинное обучение, являются видеокарты серии Nvida, широко известные как карты N. Однако на компьютерах Mac обычно интегрированы видеокарты серии AMD. Разница между двумя разными наборами аппаратных инструкций приводит к необходимости использования разных технологий реализации на верхнем уровне.
Но в видеокартах AMD есть технология PlaidML, с помощью этого плагина можно инкапсулировать различия разных видеокарт.

Адрес проекта PlaidML: https://github.com/plaidml/plaidml.
В настоящее время PlaidML уже поддерживает такие инструменты, как Keras, ONNX и nGraph. Вы можете напрямую использовать Keras для построения модели, и ваш MacBook может легко вызвать графический процессор.
С помощью этого инструмента под названием PlaidML можно легко проводить обучение глубокому обучению независимо от видеокарт NVIDIA, AMD или Intel.

Ссылаться на:Mac ускоряет обучение с подкреплением с помощью PlaidML

3. Экспериментальная проверка

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

Собственная конфигурация

Программные и аппаратные параметры компьютера Mac, использованного в этот раз, следующие:
Вставьте сюда описание изображения

Установить ПлаидМЛ

Поскольку процесс установки зависимых пакетов требует командного взаимодействия, установка пакета plaidML выполняется в командной строке, а выполнение кода — в jupyter.

Поскольку в Jupyter будут технические моменты, требующие создания ядра при использовании виртуальной среды, рекомендуется на данный момент напрямую использовать исходную среду Python для проверки. Студенты, которые понимают характеристики конфигурации Jupyter в виртуальной среде, могут попробовать использовать его в виртуальной среде.

Установите plaidml-keras

pip3  install plaidml-keras
  • 1

После того, как автор использовал команду pip3 install plaidml-keras для установки последней версии plaidml-keras, то есть 0.7.0, я столкнулся с ошибкой при выполнении операции инициализации. Впоследствии она была уменьшена до 0.6.4 и выполнение было выполнено. нормальный. Но потом я установил его снова как 0.7.0 и все снова стало нормально.
plaidml в github

Настройка видеокарты по умолчанию

Выполнить в командной строке

plaidml-setup
  • 1

Интерактивный контент выглядит следующим образом.

(venv) tsingj@tsingjdeMacBook-Pro-2 ~  # plaidml-setup

PlaidML Setup (0.6.4)

Thanks for using PlaidML!

Some Notes:
  * Bugs and other issues: https://github.com/plaidml/plaidml
  * Questions: https://stackoverflow.com/questions/tagged/plaidml
  * Say hello: https://groups.google.com/forum/#!forum/plaidml-dev
  * PlaidML is licensed under the Apache License 2.0


Default Config Devices:
   metal_intel(r)_uhd_graphics_630.0 : Intel(R) UHD Graphics 630 (Metal)
   metal_amd_radeon_pro_5300m.0 : AMD Radeon Pro 5300M (Metal)

Experimental Config Devices:
   llvm_cpu.0 : CPU (LLVM)
   metal_intel(r)_uhd_graphics_630.0 : Intel(R) UHD Graphics 630 (Metal)
   opencl_amd_radeon_pro_5300m_compute_engine.0 : AMD AMD Radeon Pro 5300M Compute Engine (OpenCL)
   opencl_cpu.0 : Intel CPU (OpenCL)
   opencl_intel_uhd_graphics_630.0 : Intel Inc. Intel(R) UHD Graphics 630 (OpenCL)
   metal_amd_radeon_pro_5300m.0 : AMD Radeon Pro 5300M (Metal)

Using experimental devices can cause poor performance, crashes, and other nastiness.

Enable experimental device support? (y,n)[n]:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

Перечислите поддерживаемые на данный момент видеокарты и выберите между двумя видеокартами, поддерживаемыми по умолчанию, или всеми шестью поддерживаемыми аппаратными средствами на экспериментальной стадии.
Вы можете увидеть две видеокарты, поддерживаемые по умолчанию, и это две настоящие видеокарты на первом снимке экрана. Для стабильности теста сначала выберите N и нажмите Enter.

Multiple devices detected (You can override by setting PLAIDML_DEVICE_IDS).
Please choose a default device:

   1 : metal_intel(r)_uhd_graphics_630.0
   2 : metal_amd_radeon_pro_5300m.0

Default device? (1,2)[1]:1

Selected device:
    metal_intel(r)_uhd_graphics_630.0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

Для выбранных по умолчанию настроек установите устройство по умолчанию. Здесь мы сначала устанавливаем metal_intel®_uhd_graphics_630.0 в качестве устройства по умолчанию. Конечно, производительность этого устройства на самом деле относительно низкая. Позже мы установим metal_amd_radeon_pro_5300m.0 в качестве устройства по умолчанию. сравнение.
Написав 1, нажмите Enter.

Almost done. Multiplying some matrices...
Tile code:
  function (B[X,Z], C[Z,Y]) -> (A) { A[x,y : X,Y] = +(B[x,z] * C[z,y]); }
Whew. That worked.

Save settings to /Users/tsingj/.plaidml? (y,n)[y]:y
Success!
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Нажмите Enter, чтобы записать информацию о конфигурации в файл конфигурации по умолчанию и завершить настройку.

Запуск кода, использующего вычисления ЦП

В этом разделе Jupyter используется для запуска простого кода алгоритма и подсчета его времени.

Шаг 1. Сначала импортируйте пакет keras и импортируйте данные cifar10. Это может включать загрузку из внешней сети. Если у вас есть какие-либо вопросы, обратитесь к нему.Основные вопросы об использовании keras
#!/usr/bin/env python
import numpy as np
import os
import time
import keras
import keras.applications as kapp
from keras.datasets import cifar10
(x_train, y_train_cats), (x_test, y_test_cats) = cifar10.load_data()
batch_size = 8
x_train = x_train[:batch_size]
x_train = np.repeat(np.repeat(x_train, 7, axis=1), 7, axis=2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

Обратите внимание, что вычислительный сервер Keral по умолчанию должен использовать tenerflow, проверьте вывод

2024-07-11 14:36:02.753107: I tensorflow/core/platform/cpu_feature_guard.cc:210] Этот двоичный файл TensorFlow оптимизирован для использования доступных инструкций ЦП в операциях, критичных для производительности.
Чтобы включить следующие инструкции: AVX2 FMA, в других операциях перестройте TensorFlow с соответствующими флагами компилятора.

Шаг 2. Импортируйте расчетную модель. Если данные модели не существуют локально, они будут автоматически загружены. Если у вас есть какие-либо вопросы, обратитесь к ним.Основные вопросы об использовании keras
model = kapp.VGG19()
  • 1
компиляция модели Step3
model.compile(optimizer='sgd', loss='categorical_crossentropy',metrics=['accuracy'])
  • 1
шаг 4 Сделайте прогноз
print("Running initial batch (compiling tile program)")
y = model.predict(x=x_train, batch_size=batch_size)
  • 1
  • 2

Запуск начальной партии (компиляция программы плитки)
1/1 ━━━━━━━━━━━━━━━━━━━━━ 1с 1с/шаг

шаг 5 Сделайте 10 прогнозов
# Now start the clock and run 10 batchesprint("Timing inference...")
start = time.time()
for i in range(10):
    y = model.predict(x=x_train, batch_size=batch_size)
    print("Ran in {} seconds".format(time.time() - start))
  • 1
  • 2
  • 3
  • 4
  • 5

1/1 ━━━━━━━━━━━━━━━━━━━━━ 1с 891мс/шаг
Пробежал за 0,9295139312744141 секунды
1/1 ━━━━━━━━━━━━━━━━━━━━━ 1с 923мс/шаг
Пробежал за 1,8894760608673096 секунд
1/1 ━━━━━━━━━━━━━━━━━━━━━ 1с 893мс/шаг
Пробежал за 2,818492889404297 секунд
1/1 ━━━━━━━━━━━━━━━━━━━━━ 1с 932мс/шаг
Пробежал за 3,7831668853759766 секунд
1/1 ━━━━━━━━━━━━━━━━━━━━━ 1с 892мс/шаг
Пробежал за 4.71358585357666 секунд
1/1 ━━━━━━━━━━━━━━━━━━━━━ 1с 860мс/шаг
Пробежал за 5.609835863113403 секунд
1/1 ━━━━━━━━━━━━━━━━━━━━━ 1с 878мс/шаг
Пробежал за 6.5182459354400635 секунд
1/1 ━━━━━━━━━━━━━━━━━━━━━ 1с 871мс/шаг
Пробежал за 7.423128128051758 секунд
1/1 ━━━━━━━━━━━━━━━━━━━━━ 1с 896мс/шаг
Пробежал за 8.352543830871582 секунд
1/1 ━━━━━━━━━━━━━━━━━━━━━ 1с 902мс/шаг
Пробежал за 9.288795948028564 секунд

Запуск кода с использованием вычислений на графическом процессоре

Использование видеокарты metal_intel®_uhd_graphics_630.0

Step0 Импортируйте keras через plaidml, а затем выполните операции, связанные с keras.
# Importing PlaidML. Make sure you follow this order
import plaidml.keras
plaidml.keras.install_backend()
import os
os.environ["KERAS_BACKEND"] = "plaidml.keras.backend"
  • 1
  • 2
  • 3
  • 4
  • 5

Примечание:
1. Если используется версия plaidml=0.7.0, в операции plaidml.keras.install_backend() произойдет ошибка.
2. На этом этапе keras будет импортирован через plaidml, а в качестве механизма фоновых вычислений будет выбран plaidml вместо tenerflow.

шаг 1 Сначала импортируйте пакет keras и импортируйте данные cifar10.
#!/usr/bin/env python
import numpy as np
import os
import time
import keras
import keras.applications as kapp
from keras.datasets import cifar10
(x_train, y_train_cats), (x_test, y_test_cats) = cifar10.load_data()
batch_size = 8
x_train = x_train[:batch_size]
x_train = np.repeat(np.repeat(x_train, 7, axis=1), 7, axis=2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
шаг 2. Импортируйте расчетную модель. Если данные модели не существуют локально, они будут загружены автоматически.
model = kapp.VGG19()
  • 1

Вывод информации о видеокарте при первом запуске

ИНФОРМАЦИЯ:plaidml:Открытие устройства «metal_intel®_uhd_graphics_630.0»

компиляция модели Step3
model.compile(optimizer='sgd', loss='categorical_crossentropy',metrics=['accuracy'])
  • 1
шаг 4 Сделайте прогноз
print("Running initial batch (compiling tile program)")
y = model.predict(x=x_train, batch_size=batch_size)
  • 1
  • 2

Запуск начальной партии (компиляция программы плитки)

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

шаг 5 Сделайте 10 прогнозов
# Now start the clock and run 10 batchesprint("Timing inference...")
start = time.time()
for i in range(10):
    y = model.predict(x=x_train, batch_size=batch_size)
    print("Ran in {} seconds".format(time.time() - start))
  • 1
  • 2
  • 3
  • 4
  • 5

Пробежал за 4.241918087005615 секунд
Пробежал за 8.452141046524048 секунд
Пробежал за 12.665411949157715 секунд
Пробежал за 16.849968910217285 секунд
Пробежал за 21.025720834732056 секунд
Пробежал за 25.212764024734497 секунд
Пробежал за 29.405478954315186 секунд
Пробежал за 33,594977140426636 секунд
Пробежал за 37,7886438369751 секунд
Пробежал за 41.98136305809021 секунд

Использование видеокарты metal_amd_radeon_pro_5300m.0

На этапе выбора видеокарты в настройках plaidml-setup видеокарта metal_intel®_uhd_graphics_630.0 больше не выбирается, а выбирается metal_amd_radeon_pro_5300m.0.

(venv) tsingj@tsingjdeMacBook-Pro-2 ~  # plaidml-setup

PlaidML Setup (0.6.4)

Thanks for using PlaidML!

Some Notes:
  * Bugs and other issues: https://github.com/plaidml/plaidml
  * Questions: https://stackoverflow.com/questions/tagged/plaidml
  * Say hello: https://groups.google.com/forum/#!forum/plaidml-dev
  * PlaidML is licensed under the Apache License 2.0


Default Config Devices:
   metal_intel(r)_uhd_graphics_630.0 : Intel(R) UHD Graphics 630 (Metal)
   metal_amd_radeon_pro_5300m.0 : AMD Radeon Pro 5300M (Metal)

Experimental Config Devices:
   llvm_cpu.0 : CPU (LLVM)
   metal_intel(r)_uhd_graphics_630.0 : Intel(R) UHD Graphics 630 (Metal)
   opencl_amd_radeon_pro_5300m_compute_engine.0 : AMD AMD Radeon Pro 5300M Compute Engine (OpenCL)
   opencl_cpu.0 : Intel CPU (OpenCL)
   opencl_intel_uhd_graphics_630.0 : Intel Inc. Intel(R) UHD Graphics 630 (OpenCL)
   metal_amd_radeon_pro_5300m.0 : AMD Radeon Pro 5300M (Metal)

Using experimental devices can cause poor performance, crashes, and other nastiness.

Enable experimental device support? (y,n)[n]:n

Multiple devices detected (You can override by setting PLAIDML_DEVICE_IDS).
Please choose a default device:

   1 : metal_intel(r)_uhd_graphics_630.0
   2 : metal_amd_radeon_pro_5300m.0

Default device? (1,2)[1]:2

Selected device:
    metal_amd_radeon_pro_5300m.0

Almost done. Multiplying some matrices...
Tile code:
  function (B[X,Z], C[Z,Y]) -> (A) { A[x,y : X,Y] = +(B[x,z] * C[z,y]); }
Whew. That worked.

Save settings to /Users/tsingj/.plaidml? (y,n)[y]:y
Success!
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
Step0 Импортируйте keras через plaidml, а затем выполните операции, связанные с keras.
# Importing PlaidML. Make sure you follow this order
import plaidml.keras
plaidml.keras.install_backend()
import os
os.environ["KERAS_BACKEND"] = "plaidml.keras.backend"
  • 1
  • 2
  • 3
  • 4
  • 5

Примечание:
1. Если используется версия plaidml=0.7.0, в операции plaidml.keras.install_backend() произойдет ошибка.
2. На этом этапе keras будет импортирован через plaidml, а в качестве механизма фоновых вычислений будет выбран plaidml вместо tenerflow.

шаг 1 Сначала импортируйте пакет keras и импортируйте данные cifar10.
#!/usr/bin/env python
import numpy as np
import os
import time
import keras
import keras.applications as kapp
from keras.datasets import cifar10
(x_train, y_train_cats), (x_test, y_test_cats) = cifar10.load_data()
batch_size = 8
x_train = x_train[:batch_size]
x_train = np.repeat(np.repeat(x_train, 7, axis=1), 7, axis=2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
шаг 2. Импортируйте расчетную модель. Если данные модели не существуют локально, они будут загружены автоматически.
model = kapp.VGG19()
  • 1

ИНФОРМАЦИЯ:plaidml:Открытие устройства «metal_amd_radeon_pro_5300m.0»
Обратите внимание, что информация о видеокарте вводится здесь впервые.

компиляция модели Step3
model.compile(optimizer='sgd', loss='categorical_crossentropy',metrics=['accuracy'])
  • 1
шаг 4 Сделайте прогноз
print("Running initial batch (compiling tile program)")
y = model.predict(x=x_train, batch_size=batch_size)
  • 1
  • 2

Запуск начальной партии (компиляция программы плитки)

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

шаг 5 Сделайте 10 прогнозов
# Now start the clock and run 10 batchesprint("Timing inference...")
start = time.time()
for i in range(10):
    y = model.predict(x=x_train, batch_size=batch_size)
    print("Ran in {} seconds".format(time.time() - start))
  • 1
  • 2
  • 3
  • 4
  • 5

Посмотреть результат

Пробежал за 0,43606019020080566 секунд
Пробежал за 0,8583459854125977 секунд
Пробежал за 1,2787911891937256 секунд
Пробежал за 1,70143723487854 секунды
Пробежал за 2.1235032081604004 секунды
Пробежал за 2,5464580059051514 секунд
Пробежал за 2,9677979946136475 секунд
Пробежал за 3.390064001083374 секунды
Пробежал за 3,8117799758911133 секунды
Пробежал за 4.236911058425903 секунды

4. Обсуждение оценки

Объем памяти видеокарты metal_intel®_uhd_graphics_630.0 составляет 1536 МБ. Хотя в качестве видеокарты ее производительность в вычислениях не так хороша, как у 6-ядерного процессора этой машины;
Видеокарта metal_amd_radeon_pro_5300m.0 имеет объем памяти 4G. По сравнению с родным CPU ее производительность почти в 1 раз выше.

Отсюда мы видим огромные преимущества использования графических процессоров в операциях машинного обучения.