首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AMD plaidml vs CPU Tensorflow -意外结果

AMD plaidml vs CPU Tensorflow -意外结果
EN

Stack Overflow用户
提问于 2019-09-29 15:19:08
回答 2查看 3.9K关注 0票数 4

我目前正在运行一个简单的脚本来训练mnist数据集。

通过Tensorflow通过我的CPU运行培训将给我49us/sample和一个3e时代,使用以下代码:-

代码语言:javascript
复制
# 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)

当我使用opencl_amd_radeon_pro_580_compute_engine通过plaidml安装程序运行数据集时,我使用以下代码获得了具有15s时间的249us/sample结果:

代码语言:javascript
复制
# 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会以5的倍数执行GPU。

这应该是预期的结果吗?

我的代码做错了什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-29 15:52:02

我认为观察到的情况有两个方面:

  1. plaidml在我的经验中没有那么好,我也有类似的结果,遗憾的是,
  2. 向gpu移动数据的速度很慢。在这种情况下,MNIST数据非常小,移动数据的时间超过了并行计算的“好处”。实际上,TF可能也做并行矩阵乘法,但是它的速度要快得多,因为数据很小,而且离处理单元更近。
票数 6
EN

Stack Overflow用户

发布于 2020-04-19 14:05:19

看来我已经找到了正确的解决方案,至少对macOS/Keras/AMD GPU的安装是这样的。

TL;DR:

  • Do not使用OpenCL,使用*metal代替
  • Do不要使用Tensorflow 2.0,只使用Keras APIH 211F 212

以下是详细信息:

运行plaidml-setup和拾取金属这是很重要的!

代码语言:javascript
复制
...
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
...

确保保存了更改:

代码语言:javascript
复制
Save settings to /Users/alexanderegorov/.plaidml? (y,n)[y]:y
Success!

现在运行MNIST示例,您应该会看到如下内容:

代码语言:javascript
复制
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.197(编译),14.620(执行)

llvm_cpu.0

  • 示例完成,运行:3.619 s(编译),47.837 s(执行)
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58156573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档