是否可以在带有AMD GPU的Mac中与Keras一起使用?

时间:2020-02-01 12:26:39

标签: keras tensorflow2.0 pyopencl amd-gpu plaidml

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

2 个答案:

答案 0 :(得分:13)

您可以 OpenCL 库来克服此问题。我已经对其进行了测试,并且对我来说很好。

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

步骤:

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

    pip3 install pyopencl

  2. 使用以下命令安装PlaidML

    pip3 install pip install plaidml-keras

  3. 运行 PlaidML 的设置。设置过程中,您可能会提示您选择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并运行以下命令。 (安装在GPU中运行的第2步中安装了keras)
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

答案 1 :(得分:0)

实际上,Keras仅支持NVIDIA GPU并不是正确的。您可以选择Keras使用的是哪个后端,如果该后端支持AMD GPU,那么Keras在这种情况下也应适用。

但是,在MacOS上唯一可使用的后端是PlaidML。还提供了适用于AMD处理器的ROCm,但截至2020年10月,MacOS尚不支持ROCm(请参见this discussion)。