Compartir tecnología

[AIGC] 2. Mac usa GPU localmente para iniciar los cálculos de Keras

2024-07-12

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

Mac usa GPU localmente para iniciar la computación keras

1. Antecedentes del problema

En el artículo anterior, descubrimos que en el funcionamiento de modelos grandes, cuando se utiliza la CPU para el funcionamiento, el uso de la CPU es muy alto. Por lo tanto, pensaremos aquí, si hay una tarjeta gráfica GPU en la máquina, ¿cómo podemos aprovechar la tarjeta gráfica en operaciones vectoriales y realizar operaciones relacionadas con el aprendizaje automático de manera rápida y bien?

2. Antecedentes técnicos

Sabemos que las tarjetas gráficas actuales que admiten el aprendizaje automático son las tarjetas gráficas de la serie Nvida, comúnmente conocidas como tarjetas N. Sin embargo, las tarjetas gráficas de la serie AMD generalmente están integradas en las máquinas Mac. La diferencia entre dos conjuntos de instrucciones de hardware diferentes conduce a la necesidad de diferentes tecnologías de implementación en la capa superior.
Pero en las tarjetas gráficas AMD, existe una tecnología PlaidML, a través de este complemento, se pueden encapsular las diferencias entre diferentes tarjetas gráficas.

Dirección del proyecto PlaidML: https://github.com/plaidml/plaidml
Actualmente, PlaidML ya admite herramientas como Keras, ONNX y nGraph. Puede usar Keras directamente para construir un modelo y su MacBook puede llamar fácilmente a la GPU.
A través de esta herramienta llamada PlaidML, se puede realizar fácilmente un entrenamiento de aprendizaje profundo independientemente de las tarjetas gráficas NVIDIA, AMD o Intel.

Referirse a:Mac usa PlaidML para acelerar el entrenamiento de aprendizaje por refuerzo

3. Verificación experimental

En esta operación, para un algoritmo keras convencional, se realizan múltiples rondas de cálculos en la CPU y GPU respectivamente, y las estadísticas consumen mucho tiempo. Hacer estadísticas comparativas.

Configuración nativa

Los parámetros de software y hardware de la máquina Mac utilizada esta vez son los siguientes:
Insertar descripción de la imagen aquí

Instalar PlaidML

Dado que el proceso de instalación de paquetes dependientes requiere interacción de comandos, la instalación del paquete plaidML se realiza en la línea de comandos y la ejecución del código se realiza en jupyter.

Dado que jupyter tendrá puntos técnicos que requerirán la creación de un kernel cuando se use un entorno virtual, se recomienda usar directamente el entorno Python original para la verificación por el momento. Los estudiantes que comprendan las características de configuración de jupyter en un entorno virtual pueden intentar operarlo en un entorno virtual.

Instalar cuadrosml-keras

pip3  install plaidml-keras
  • 1

Después de que el autor usó el comando pip3 install plaidml-keras para instalar la última versión de plaidml-keras, que es 0.7.0, encontré un error al realizar la operación de inicialización. Posteriormente, se redujo a 0.6.4 y se ejecutó. normal. Pero después de instalarlo nuevamente en 0.7.0, volvió a ser normal.
plaidml en github

Configurar la tarjeta gráfica predeterminada

Ejecutar en línea de comando

plaidml-setup
  • 1

El contenido interactivo es el siguiente.

(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

Enumere las tarjetas gráficas actualmente compatibles y elija entre las 2 tarjetas gráficas compatibles de forma predeterminada o los 6 hardware compatibles en la fase experimental.
Puedes ver las dos tarjetas gráficas admitidas de forma predeterminada, que son las dos tarjetas gráficas reales en la captura de pantalla inicial. Por el bien de la estabilidad de la prueba, seleccione N primero y presione 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

Para la configuración seleccionada predeterminada, configure un dispositivo predeterminado. Aquí primero configuramos metal_intel®_uhd_graphics_630.0 como el dispositivo predeterminado. Por supuesto, el rendimiento de este dispositivo es relativamente pobre. Más adelante configuraremos metal_amd_radeon_pro_5300m.0 como el dispositivo predeterminado. comparación.
Después de escribir 1, presione 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

Presione Entrar para escribir la información de configuración en el archivo de configuración predeterminado para completar la configuración.

Ejecutar código que utiliza computación CPU

En esta sección, se utiliza jupyter para ejecutar un código de algoritmo simple y se cuenta su tiempo.

Paso 1 Primero importe el paquete keras e importe los datos cifar10. Esto puede implicar la descarga desde la red externa. Si tiene alguna pregunta, consúltela.Preguntas básicas sobre el uso de 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

Tenga en cuenta que el backend de computación keral predeterminado aquí debería usar tenserflow, verifique el resultado

2024-07-11 14:36:02.753107: I tensorflow/core/platform/cpu_feature_guard.cc:210] Este binario de TensorFlow está optimizado para usar las instrucciones de CPU disponibles en operaciones de rendimiento crítico.
Para habilitar las siguientes instrucciones: AVX2 FMA, en otras operaciones, reconstruya TensorFlow con los indicadores del compilador adecuados.

Paso 2 Importe el modelo de cálculo. Si los datos del modelo no existen localmente, se descargarán automáticamente. Si tiene alguna pregunta, consúltela.Preguntas básicas sobre el uso de keras
model = kapp.VGG19()
  • 1
compilación del modelo paso 3
model.compile(optimizer='sgd', loss='categorical_crossentropy',metrics=['accuracy'])
  • 1
paso 4 Haz una predicción
print("Running initial batch (compiling tile program)")
y = model.predict(x=x_train, batch_size=batch_size)
  • 1
  • 2

Ejecutar el lote inicial (compilar el programa)
1/1 ━━━━━━━━━━━━━━━━━━━━ 1s 1s/paso

paso 5 Haz 10 predicciones
# 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 s 891 ms/paso
Corrió en 0,9295139312744141 segundos
1/1 ━━━━━━━━━━━━━━━━━━━━ 1 s 923 ms/paso
Corrió en 1.8894760608673096 segundos
1/1 ━━━━━━━━━━━━━━━━━━━━ 1 s 893 ms/paso
Corrió en 2.818492889404297 segundos
1/1 ━━━━━━━━━━━━━━━━━━━━ 1 s 932 ms/paso
Corrió en 3.7831668853759766 segundos
1/1 ━━━━━━━━━━━━━━━━━━━━ 1 s 892 ms/paso
Corrió en 4.71358585357666 segundos
1/1 ━━━━━━━━━━━━━━━━━━━━ 1 s 860 ms/paso
Corrió en 5.609835863113403 segundos
1/1 ━━━━━━━━━━━━━━━━━━━━ 1 s 878 ms/paso
Corrió en 6,5182459354400635 segundos
1/1 ━━━━━━━━━━━━━━━━━━━━ 1 s 871 ms/paso
Corrió en 7,423128128051758 segundos
1/1 ━━━━━━━━━━━━━━━━━━━━ 1 s 896 ms/paso
Corrió en 8.352543830871582 segundos
1/1 ━━━━━━━━━━━━━━━━━━━━ 1 s 902 ms/paso
Corrió en 9,288795948028564 segundos

Ejecutar código usando computación GPU

Usando tarjeta gráfica metal_intel®_uhd_graphics_630.0

paso 0 Importe keras a través de plaidml y luego realice operaciones relacionadas con 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

Nota:
1. Cuando se utiliza la versión plaidml=0.7.0, se producirá un error en la operación plaidml.keras.install_backend().
2. En este paso, keras se importará a través de plaidml y el motor informático en segundo plano se configurará en plaidml en lugar de tenserflow.

paso 1 Primero importe el paquete keras e importe los datos 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
paso 2 Importe el modelo de cálculo. Si los datos del modelo no existen localmente, se descargarán automáticamente.
model = kapp.VGG19()
  • 1

Información de salida de la tarjeta gráfica en la primera ejecución

INFO:plaidml:Dispositivo de apertura “metal_intel®_uhd_graphics_630.0”

compilación del modelo paso 3
model.compile(optimizer='sgd', loss='categorical_crossentropy',metrics=['accuracy'])
  • 1
paso 4 Haz una predicción
print("Running initial batch (compiling tile program)")
y = model.predict(x=x_train, batch_size=batch_size)
  • 1
  • 2

Ejecutar el lote inicial (compilar el programa)

Debido a que la salida es más rápida, solo se imprime una línea de contenido.

paso 5 Haz 10 predicciones
# 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

Corrió en 4.241918087005615 segundos
Corrió en 8,452141046524048 segundos
Corrió en 12.665411949157715 segundos
Corrió en 16.849968910217285 segundos
Corrió en 21.025720834732056 segundos
Corrió en 25,212764024734497 segundos
Corrió en 29.405478954315186 segundos
Corrió en 33.594977140426636 segundos
Corrió en 37.7886438369751 segundos
Corrió en 41.98136305809021 segundos

Usando tarjeta gráfica metal_amd_radeon_pro_5300m.0

En la etapa de selección de la tarjeta gráfica en la configuración de plaidml-setup, la tarjeta gráfica metal_intel®_uhd_graphics_630.0 ya no está seleccionada, pero sí 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
paso 0 Importe keras a través de plaidml y luego realice operaciones relacionadas con 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

Nota:
1. Cuando se utiliza la versión plaidml=0.7.0, se producirá un error en la operación plaidml.keras.install_backend().
2. En este paso, keras se importará a través de plaidml y el motor informático en segundo plano se configurará en plaidml en lugar de tenserflow.

paso 1 Primero importe el paquete keras e importe los datos 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
paso 2 Importe el modelo de cálculo. Si los datos del modelo no existen localmente, se descargarán automáticamente.
model = kapp.VGG19()
  • 1

INFO:plaidml:Apertura del dispositivo “metal_amd_radeon_pro_5300m.0”
Tenga en cuenta que la información de la tarjeta gráfica se ingresa aquí por primera vez.

compilación del modelo paso 3
model.compile(optimizer='sgd', loss='categorical_crossentropy',metrics=['accuracy'])
  • 1
paso 4 Haz una predicción
print("Running initial batch (compiling tile program)")
y = model.predict(x=x_train, batch_size=batch_size)
  • 1
  • 2

Ejecutar el lote inicial (compilar el programa)

Debido a que la salida es más rápida, solo se imprime una línea de contenido.

paso 5 Haz 10 predicciones
# 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

Ver salida

Corrió en 0,43606019020080566 segundos
Corrió en 0,8583459854125977 segundos
Corrió en 1.2787911891937256 segundos
Corrió en 1.70143723487854 segundos
Corrió en 2.1235032081604004 segundos
Corrió en 2,5464580059051514 segundos
Corrió en 2.9677979946136475 segundos
Corrió en 3.390064001083374 segundos
Corrió en 3.8117799758911133 segundos
Corrió en 4.236911058425903 segundos

4. Discusión de evaluación

El valor de memoria de la tarjeta gráfica metal_intel®_uhd_graphics_630.0 es de 1536 MB. Aunque como tarjeta gráfica, su rendimiento en los cálculos no es tan bueno como el de la CPU de 6 núcleos de esta máquina;
La tarjeta gráfica metal_amd_radeon_pro_5300m.0 tiene un valor de memoria de 4G. En comparación con la CPU nativa, su rendimiento es casi 1 veces mayor.

A partir de esto podemos ver las poderosas ventajas de usar GPU en operaciones de aprendizaje automático.