无论如何要在 Mac 中与 AMD GPU 一起使用 Keras?

Anyway to work with Keras in Mac with AMD GPU?

我有一台配备 AMD 处理器的 MacBook Pro,我想 运行 在此 GPU 中使用 Keras(Tensorflow 后端)。我开始知道 Keras 只适用于 NVIDIA GPU。解决方法是什么(如果可能)?

您可以使用 OpenCL 库来克服这个问题。我已经测试过了,对我来说效果很好。

注意:我有 python 3.7 版,我将使用 pip3 进行软件包安装。

步骤:

  1. 使用以下命令安装 OpenCL 包

    pip3 install pyopencl

  2. 使用以下命令安装 PlaidML

    pip3 install pip install plaidml-keras

  3. 运行 PlaidML 设置。在设置过程中,您可能会收到 select 您的 GPU 的提示。如果设置正确,您将在最后收到一条成功消息。

    plaidml-setup

  4. 安装 plaidbench 以在您的 GPU 上测试 plaidml。

    pip3 install plaidbench

  5. 测试一下。如果到目前为止一切顺利,您将获得基准分数。

    plaidbench keras mobilenet

  6. 现在我们必须设置一个环境路径。把它放在代码的顶部。

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

os.environ["RUNFILES_DIR"] = "/Library/Frameworks/Python.framework/Versions/3.7/share/plaidml"
# plaidml might exist in different location. Look for "/usr/local/share/plaidml" and replace in above path

os.environ["PLAIDML_NATIVE_PATH"] = "/Library/Frameworks/Python.framework/Versions/3.7/lib/libplaidml.dylib"
# libplaidml.dylib might exist in different location. Look for "/usr/local/lib/libplaidml.dylib" and replace in above path
  1. 在实际代码中测试。在您的代码中使用 keras 而不是 tensorflow.keras,并在以下代码中使用 运行。 (keras 在步骤 2 中安装,GPU 中 运行s)
import os

# IMPORTANT: PATH MIGHT BE DIFFERENT. SEE STEP 6
os.environ["KERAS_BACKEND"] = "plaidml.keras.backend"
os.environ["RUNFILES_DIR"] = "/Library/Frameworks/Python.framework/Versions/3.7/share/plaidml"
os.environ["PLAIDML_NATIVE_PATH"] = "/Library/Frameworks/Python.framework/Versions/3.7/lib/libplaidml.dylib"

# Don't use tensorflow.keras anywhere, instead use keras
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K
batch_size = 128
num_classes = 10
epochs = 12
# input image dimensions
img_rows, img_cols = 28, 28
# the data, split between train and test sets
(x_train, y_train), (x_test, y_test) = mnist.load_data()
if K.image_data_format() == 'channels_first':
    x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
    x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
    input_shape = (1, img_rows, img_cols)
else:
    x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
    x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
    input_shape = (img_rows, img_cols, 1)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')
# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
                 activation='relu',
                 input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.Adadelta(),
              metrics=['accuracy'])
model.fit(x_train, y_train,
          batch_size=batch_size,
          epochs=epochs,
          verbose=1,
          validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

当你运行这个你会得到

Using plaidml.keras.backend backend.
INFO:plaidml:Opening device "metal_intel(r)_iris(tm)_graphics_6100.0"
# or whatever GPU you selected in step 3

确认您正在 运行GPU 中安装它。

参考:https://towardsdatascience.com/gpu-accelerated-machine-learning-on-macos-48d53ef1b545

事实上,Keras 只支持 NVIDIA GPU 的说法是不正确的。您可以选择 Keras 使用的后端,如果该后端支持 AMD GPU,那么 Keras 也应该适用于这种情况。

然而,唯一适用于 MacOS 的后端是 PlaidML。还有用于 AMD 处理器的 ROCm,但截至 2020 年 10 月,MacOS 不支持它(参见 this discussion)。