2017-11-18 376 views
0

我使用tensorflow網站上給出的測試代碼測試tensorflow與GPU在水蟒:Tensorflow GPU的錯誤:InvalidArgumentError:無法分配裝置操作「MATMUL」

import tensorflow as tf 
with tf.device('/device:GPU:0'): 
    a = tf.constant([1,2,3,4,5,6],shape=[2,3],name='a') 
    b = tf.constant([1,2,3,4,5,6],shape=[3,2],name='b') 
    c = tf.matmul(a,b) 
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True)) 
print(sess.run(c)) 

我創建蟒蛇環境使用pip install tensorflow-gpu安裝tensorflow + gpu。 IPython的筆記本電腦被用來執行上面的代碼,並不斷收到錯誤

InvalidArgumentError: Cannot assign a device for operation 'MatMul': Could not satisfy explicit device specification '/device:GPU:0' because no supported kernel for GPU devices is available. 
    [[Node: MatMul = MatMul[T=DT_INT32, transpose_a=false, transpose_b=false, _device="/device:GPU:0"](a, b)]] 

看來MatMul運營商無法在GPU上進行加載。我不知道爲什麼沒有支持GPU設備的內核,因爲正確安裝了cuda和cudNN。否則,tensorflow消息顯示gpu被識別:

name: GeForce GTX 1080 Ti 
major: 6 minor: 1 memoryClockRate (GHz) 1.683 
pciBusID 0000:02:00.0 
Total memory: 10.91GiB 
Free memory: 10.75GiB 
2017-11-17 19:12:50.212054: W tensorflow/stream_executor/cuda/cuda_driver.cc:523] A non-primary context 0x55a56f0c2420 exists before initializing the StreamExecutor. We haven't verified StreamExecutor works with that. 
2017-11-17 19:12:50.213035: I tensorflow/core/common_runtime/gpu/gpu_device.cc:955] Found device 1 with properties: 
name: GeForce GTX 1080 Ti 
major: 6 minor: 1 memoryClockRate (GHz) 1.683 
pciBusID 0000:82:00.0 
Total memory: 10.91GiB 
Free memory: 10.75GiB 
2017-11-17 19:12:50.213089: I tensorflow/core/common_runtime/gpu/gpu_device.cc:847] Peer access not supported between device ordinals 0 and 1 
2017-11-17 19:12:50.213108: I tensorflow/core/common_runtime/gpu/gpu_device.cc:847] Peer access not supported between device ordinals 1 and 0 
2017-11-17 19:12:50.213132: I tensorflow/core/common_runtime/gpu/gpu_device.cc:976] DMA: 0 1 
2017-11-17 19:12:50.213148: I tensorflow/core/common_runtime/gpu/gpu_device.cc:986] 0: Y N 
2017-11-17 19:12:50.213156: I tensorflow/core/common_runtime/gpu/gpu_device.cc:986] 1: N Y 
2017-11-17 19:12:50.213169: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:02:00.0) 
2017-11-17 19:12:50.213179: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:1) -> (device: 1, name: GeForce GTX 1080 Ti, pci bus id: 0000:82:00.0) 
Device mapping: 
/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:02:00.0 
/job:localhost/replica:0/task:0/gpu:1 -> device: 1, name: GeForce GTX 1080 Ti, pci bus id: 0000:82:00.0 
2017-11-17 19:12:50.471348: I tensorflow/core/common_runtime/direct_session.cc:300] Device mapping: 
/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:02:00.0 
/job:localhost/replica:0/task:0/gpu:1 -> device: 1, name: GeForce GTX 1080 Ti, pci bus id: 0000:82:00.0 

有兩個gpus,它們都遇到了同樣的問題。 cuda和cudnn庫安裝正確,環境變量設置在anaconda中。 cuda示例(deviceQuery)代碼能夠被編譯並且運行時沒有錯誤,並且顯示result = pass。否則,可以在CPU上加載Matmul並完成計算。程序中的變量ab能夠加載到GPU設備上。給予tensorflow消息:

2017-11-17 20:27:25.965655: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:02:00.0) 
2017-11-17 20:27:25.965665: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:1) -> (device: 1, name: GeForce GTX 1080 Ti, pci bus id: 0000:82:00.0) 
Device mapping: 
/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:02:00.0 
/job:localhost/replica:0/task:0/gpu:1 -> device: 1, name: GeForce GTX 1080 Ti, pci bus id: 0000:82:00.0 
2017-11-17 20:27:26.228395: I tensorflow/core/common_runtime/direct_session.cc:300] Device mapping: 
/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:02:00.0 
/job:localhost/replica:0/task:0/gpu:1 -> device: 1, name: GeForce GTX 1080 Ti, pci bus id: 0000:82:00.0 

MatMul: (MatMul): /job:localhost/replica:0/task:0/cpu:0 
2017-11-17 20:27:26.229489: I tensorflow/core/common_runtime/simple_placer.cc:872] MatMul: (MatMul)/job:localhost/replica:0/task:0/cpu:0 
b: (Const): /job:localhost/replica:0/task:0/gpu:0 
2017-11-17 20:27:26.229512: I tensorflow/core/common_runtime/simple_placer.cc:872] b: (Const)/job:localhost/replica:0/task:0/gpu:0 
a: (Const): /job:localhost/replica:0/task:0/gpu:0 
2017-11-17 20:27:26.229526: I tensorflow/core/common_runtime/simple_placer.cc:872] a: (Const)/job:localhost/replica:0/task:0/gpu:0 

我重新安裝了nvidia驅動,CUDA和蟒蛇幾次,但從來沒有解決這個問題。如果有任何建議,這將是非常好的。

  • OS平臺及分銷:Linux操作系統Ubuntu 16.04
  • 安裝TensorFlow:二進制
  • TensorFlow版本:1.3
  • Python版本:2.7.14
  • GCC/Compiler版本(如果從源代碼編譯):5.4.0
  • NVIDIA驅動程序:384.98
  • CUDA/cuDNN版本:CUDA 8.0/6.0 cuDNN
  • GPU型號和內存:的Geforce 1080Ti

回答

0

你嘗試在GPU上使用tf.int32DT_INT32)數據類型來生成多張張數。錯誤消息是說GPU不支持乘以DT_INT32張量。

注意的是,網站上的代碼被使用浮動張量(tf.float32)(假設你在https://www.tensorflow.org/tutorials/using_gpu談論代碼)

發生變化:

a = tf.constant([1,2,3,4,5,6],shape=[2,3],name='a') 

到:

a = tf.constant([1.,2.,3.,4.,5.,6.],shape=[2,3],name='a') 

或者:

a = tf.constant([1,2,3,4,5,6],shape=[2,3],name='a',dtype=tf.float32) 

b類似,應該使錯誤消失,因爲肯定有支持GPU上float32張量矩陣乘法的內核。

希望有所幫助。

+0

很好的解釋。它已經解決了,謝謝! – Xinzhou

相關問題