моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Из предыдущей статьи мы обнаружили, что при работе больших моделей при использовании ЦП для работы загрузка ЦП очень высока. Поэтому мы подумаем здесь, что если в машине есть видеокарта с графическим процессором, как мы можем использовать преимущества видеокарты в векторных операциях и быстро и хорошо выполнять операции, связанные с машинным обучением.
Мы знаем, что в настоящее время распространенными видеокартами, поддерживающими машинное обучение, являются видеокарты серии Nvida, широко известные как карты N. Однако на компьютерах Mac обычно интегрированы видеокарты серии AMD. Разница между двумя разными наборами аппаратных инструкций приводит к необходимости использования разных технологий реализации на верхнем уровне.
Но в видеокартах AMD есть технология PlaidML, с помощью этого плагина можно инкапсулировать различия разных видеокарт.
Адрес проекта PlaidML: https://github.com/plaidml/plaidml.
В настоящее время PlaidML уже поддерживает такие инструменты, как Keras, ONNX и nGraph. Вы можете напрямую использовать Keras для построения модели, и ваш MacBook может легко вызвать графический процессор.
С помощью этого инструмента под названием PlaidML можно легко проводить обучение глубокому обучению независимо от видеокарт NVIDIA, AMD или Intel.
Ссылаться на:Mac ускоряет обучение с подкреплением с помощью PlaidML
В этой операции для обычного алгоритма keras выполняется несколько раундов вычислений на процессоре и графическом процессоре соответственно, а сбор статистики занимает много времени. Составьте сравнительную статистику.
Программные и аппаратные параметры компьютера Mac, использованного в этот раз, следующие:
Поскольку процесс установки зависимых пакетов требует командного взаимодействия, установка пакета plaidML выполняется в командной строке, а выполнение кода — в jupyter.
Поскольку в Jupyter будут технические моменты, требующие создания ядра при использовании виртуальной среды, рекомендуется на данный момент напрямую использовать исходную среду Python для проверки. Студенты, которые понимают характеристики конфигурации Jupyter в виртуальной среде, могут попробовать использовать его в виртуальной среде.
pip3 install plaidml-keras
После того, как автор использовал команду pip3 install plaidml-keras для установки последней версии plaidml-keras, то есть 0.7.0, я столкнулся с ошибкой при выполнении операции инициализации. Впоследствии она была уменьшена до 0.6.4 и выполнение было выполнено. нормальный. Но потом я установил его снова как 0.7.0 и все снова стало нормально.
plaidml в github
Выполнить в командной строке
plaidml-setup
Интерактивный контент выглядит следующим образом.
(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 и нажмите 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
Для выбранных по умолчанию настроек установите устройство по умолчанию. Здесь мы сначала устанавливаем 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!
Нажмите Enter, чтобы записать информацию о конфигурации в файл конфигурации по умолчанию и завершить настройку.
В этом разделе Jupyter используется для запуска простого кода алгоритма и подсчета его времени.
#!/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)
Обратите внимание, что вычислительный сервер Keral по умолчанию должен использовать tenerflow, проверьте вывод
2024-07-11 14:36:02.753107: I tensorflow/core/platform/cpu_feature_guard.cc:210] Этот двоичный файл TensorFlow оптимизирован для использования доступных инструкций ЦП в операциях, критичных для производительности.
Чтобы включить следующие инструкции: AVX2 FMA, в других операциях перестройте TensorFlow с соответствующими флагами компилятора.
model = kapp.VGG19()
model.compile(optimizer='sgd', loss='categorical_crossentropy',metrics=['accuracy'])
print("Running initial batch (compiling tile program)")
y = model.predict(x=x_train, batch_size=batch_size)
Запуск начальной партии (компиляция программы плитки)
1/1 ━━━━━━━━━━━━━━━━━━━━━ 1с 1с/шаг
# 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/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 секунд
# 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. Если используется версия plaidml=0.7.0, в операции plaidml.keras.install_backend() произойдет ошибка.
2. На этом этапе keras будет импортирован через plaidml, а в качестве механизма фоновых вычислений будет выбран plaidml вместо tenerflow.
#!/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)
model = kapp.VGG19()
Вывод информации о видеокарте при первом запуске
ИНФОРМАЦИЯ:plaidml:Открытие устройства «metal_intel®_uhd_graphics_630.0»
model.compile(optimizer='sgd', loss='categorical_crossentropy',metrics=['accuracy'])
print("Running initial batch (compiling tile program)")
y = model.predict(x=x_train, batch_size=batch_size)
Запуск начальной партии (компиляция программы плитки)
Поскольку вывод выполняется быстрее, печатается только одна строка содержимого.
# 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))
Пробежал за 4.241918087005615 секунд
Пробежал за 8.452141046524048 секунд
Пробежал за 12.665411949157715 секунд
Пробежал за 16.849968910217285 секунд
Пробежал за 21.025720834732056 секунд
Пробежал за 25.212764024734497 секунд
Пробежал за 29.405478954315186 секунд
Пробежал за 33,594977140426636 секунд
Пробежал за 37,7886438369751 секунд
Пробежал за 41.98136305809021 секунд
На этапе выбора видеокарты в настройках 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!
# 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. Если используется версия plaidml=0.7.0, в операции plaidml.keras.install_backend() произойдет ошибка.
2. На этом этапе keras будет импортирован через plaidml, а в качестве механизма фоновых вычислений будет выбран plaidml вместо tenerflow.
#!/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)
model = kapp.VGG19()
ИНФОРМАЦИЯ:plaidml:Открытие устройства «metal_amd_radeon_pro_5300m.0»
Обратите внимание, что информация о видеокарте вводится здесь впервые.
model.compile(optimizer='sgd', loss='categorical_crossentropy',metrics=['accuracy'])
print("Running initial batch (compiling tile program)")
y = model.predict(x=x_train, batch_size=batch_size)
Запуск начальной партии (компиляция программы плитки)
Поскольку вывод выполняется быстрее, печатается только одна строка содержимого.
# 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))
Посмотреть результат
Пробежал за 0,43606019020080566 секунд
Пробежал за 0,8583459854125977 секунд
Пробежал за 1,2787911891937256 секунд
Пробежал за 1,70143723487854 секунды
Пробежал за 2.1235032081604004 секунды
Пробежал за 2,5464580059051514 секунд
Пробежал за 2,9677979946136475 секунд
Пробежал за 3.390064001083374 секунды
Пробежал за 3,8117799758911133 секунды
Пробежал за 4.236911058425903 секунды
Объем памяти видеокарты metal_intel®_uhd_graphics_630.0 составляет 1536 МБ. Хотя в качестве видеокарты ее производительность в вычислениях не так хороша, как у 6-ядерного процессора этой машины;
Видеокарта metal_amd_radeon_pro_5300m.0 имеет объем памяти 4G. По сравнению с родным CPU ее производительность почти в 1 раз выше.
Отсюда мы видим огромные преимущества использования графических процессоров в операциях машинного обучения.