无论如何在带有 AMD GPU 的 Mac 中使用 Keras?

Posted

技术标签:

【中文标题】无论如何在带有 AMD GPU 的 Mac 中使用 Keras?【英文标题】:Anyway to work with Keras in Mac with AMD GPU? 【发布时间】:2020-05-17 21:20:35 【问题描述】:

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

【问题讨论】:

【参考方案1】:

您可以通过 OpenCL 库来克服这个问题。我已经对其进行了测试,并且对我来说效果很好。

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

步骤:

    使用以下命令安装 OpenCL 包

    pip3 install pyopencl

    使用以下命令安装PlaidML 库

    pip3 install pip install plaidml-keras

    PlaidML 运行设置。设置时,您可能会收到选择 GPU 的提示。如果设置正确,您将在最后收到一条成功消息。

    plaidml-setup

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

    pip3 install plaidbench

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

    plaidbench keras mobilenet

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

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
    在实际代码中测试。在您的代码中使用 keras 而不是 tensorflow.keras 并运行以下命令。 (keras 安装在第 2 步,在 GPU 中运行)
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

【讨论】:

@bikram,感谢您的回答!经过自己的实验,我得出了相同的结论。所以你不能在 macOS+AMD GPU 上使用 TF2.0。我不确定这是否不好或以某种方式限制。基本上 TF2.0 正在朝着 Keras API 的易用性和简单性迈进?此外,采用 TF2.0 代码仅使用 Keras API 并不难。 @sashaegorov 完全正确。 PlaidML 可以使用 Metal 在 MacBook 上运行(至少在我的情况下,它的性能比 OpenCL 更好),所以第 1 步是可选的。步骤 6 也可以在不为 RUNFILES_DIR 和 PLAIDML_NATIVE_PATH 设置路径的情况下工作,并且唯一需要的环境变量是 KERAS_BACKEND 运行这段代码需要多长时间?我看到我的代码在 gpu 上运行,但每个 epoch 大约需要 79 秒 PlaidML 似乎不是 1-1 与 Tensorflow.keras。听起来对吗?我有以 Huber 损失函数为例的现有代码/模型。但是那个类 - tf.keras.losses.Huber - 在 PlaidML 中不存在。所以代码需要移植。这也是你的理解吗,这里使用 GPU 意味着它在功能上不是 1-1 的?【参考方案2】:

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

但是,唯一可以在 MacOS 上运行的后端是 PlaidML。 AMD 处理器也有 ROCm,但截至 2020 年 10 月,MacOS 不支持它(请参阅this discussion)。

【讨论】:

以上是关于无论如何在带有 AMD GPU 的 Mac 中使用 Keras?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GPU(AMD)中运行 ffmpeg

将 OSX 上的 OpenCL 设备设置为专用的 AMD GPU

我将如何从AMD GPU的显示输出中获取图像数据? [处于保留状态]

如何在 AMD/ATI GPU 上运行 TensorFlow?

ALU 如何在 AMD GPU (VLIW) 中执行指令?

如何将 AMD GPU 用于 fastai/pytorch?