python - AMD plaidml 与 CPU Tensorflow - 意外结果
问题描述
我目前正在运行一个简单的脚本来训练mnist
数据集。
49us/sample
使用以下代码通过我的 CPU 通过 Tensorflow 运行训练给了我和 3e 纪元:-
# CPU
import tensorflow as tf
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = tf.keras.utils.normalize(x_train, axis=1)
x_test = tf.keras.utils.normalize(x_test, axis=1)
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(10, activation=tf.nn.softmax))
model.compile(optimizer='adam', loss="sparse_categorical_crossentropy", metrics=["accuracy"])
model.fit(x_train, y_train, epochs=3)
当我使用 via plaidml 设置通过我的 AMD Pro 580 运行数据集时,我使用以下代码在 15 秒的时期opencl_amd_radeon_pro_580_compute_engine
得到以下结果249us/sample
:-
# GPU
import plaidml.keras
plaidml.keras.install_backend()
import keras
from keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = keras.utils.normalize(x_train, axis=1)
x_test = keras.utils.normalize(x_test, axis=1)
model = keras.models.Sequential()
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(128, activation='relu'))
model.add(keras.layers.Dense(128, activation='relu'))
model.add(keras.layers.Dense(10, activation='softmax'))
model.compile(optimizer='adam', loss="sparse_categorical_crossentropy", metrics=["accuracy"])
model.fit(x_train, y_train, epochs=3)
我可以看到我的 CPU 在 CPU 测试中启动,而我的 GPU 在 GPU 测试中达到最大值,但我很困惑为什么 CPU 的性能比 GPU 高出 5 倍。
这应该是预期的结果吗?
我在我的代码中做错了吗?
解决方案
看来我至少为 macOS/Keras/AMD GPU 设置找到了正确的解决方案。
TL;博士:
- 不要使用 OpenCL,而是
*metal
使用。 - 不要使用Tensorflow 2.0,仅使用 Keras API
以下是详细信息:
奔跑plaidml-setup
并捡起金属,这很重要!
...
Multiple devices detected (You can override by setting PLAIDML_DEVICE_IDS).
Please choose a default device:
1 : llvm_cpu.0
2 : metal_intel(r)_uhd_graphics_630.0
3 : metal_amd_radeon_pro_560x.0
Default device? (1,2,3)[1]:3
...
确保您保存了更改:
Save settings to /Users/alexanderegorov/.plaidml? (y,n)[y]:y
Success!
现在运行 MNIST 示例,您应该会看到如下内容:
INFO:plaidml:Opening device "metal_amd_radeon_pro_560x.0"
就是这个。我使用以下方法进行了比较plaidbench keras mobilenet
:
metal_amd_radeon_pro_560x.0最快!
- 示例完成,经过:0.435s(编译),8.057s(执行)
opencl_amd_amd_radeon_pro_560x_compute_engine.0
- 示例完成,经过:3.197s(编译),14.620s(执行)
llvm_cpu.0
- 示例完成,经过:3.619s(编译),47.837s(执行)
推荐阅读
- sql - 日期时间字段中的 SQL 总和值
- c - C:如果我们不知道长度,如何用 fgets() 填充表格?
- spring-boot - 如何使用 spring restdocs 记录包含 JSON 对象的请求正文
- github - Travis CI 发布到 GitHub 不包含文件
- oracle - 传递给 SQL*Plus 脚本的参数会覆盖调用它的脚本的参数
- camera - 在 Tinker OS V2.0.8 中找不到 gstreamer 的 gst/video/colorbalance.h
- android - 单击另一个按钮后如何处理按钮单击
- node.js - 使用不是 Sequelize.Model 子类的东西调用 Sequelize 关联
- css - 框架外的文本如何用css解决?
- java - Java 替代看起来很糟糕的 if-else 或 switch 结构