使用CUDNN_STATUS_ALLOC_FAILED进行Tensorflow崩溃
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用CUDNN_STATUS_ALLOC_FAILED进行Tensorflow崩溃相关的知识,希望对你有一定的参考价值。
在网上搜索了几个小时没有结果,所以我想在这里问。
我正在尝试按照Sentdex的教程制作自动驾驶汽车,但在运行模型时,我得到了一堆致命的错误。我在互联网上搜索了解决方案,很多人似乎也遇到了同样的问题。但是,我找到的解决方案(包括this Stack-post)都不适用于我。
这是我的软件:
- Tensorflow:1.5,GPU版本
- CUDA:9.0,补丁
- CUDnn:7
- Windows 10专业版
- Python 3.6
硬件:
- Nvidia 1070ti,带有最新的驱动程序
- 英特尔i5 7600K
这是崩溃日志:
2018-02-04 16:29:33.606903: E C:\tf_jenkins\workspace\rel-win\M\windows-gpu\PY\36\tensorflow\stream_executor\cuda\cuda_blas.cc:444] failed to create cublas handle: CUBLAS_STATUS_ALLOC_FAILED
2018-02-04 16:29:33.608872: E C:\tf_jenkins\workspace\rel-win\M\windows-gpu\PY\36\tensorflow\stream_executor\cuda\cuda_blas.cc:444] failed to create cublas handle: CUBLAS_STATUS_ALLOC_FAILED
2018-02-04 16:29:33.609308: E C:\tf_jenkins\workspace\rel-win\M\windows-gpu\PY\36\tensorflow\stream_executor\cuda\cuda_blas.cc:444] failed to create cublas handle: CUBLAS_STATUS_ALLOC_FAILED
2018-02-04 16:29:35.145249: E C:\tf_jenkins\workspace\rel-win\M\windows-gpu\PY\36\tensorflow\stream_executor\cuda\cuda_dnn.cc:385] could not create cudnn handle: CUDNN_STATUS_ALLOC_FAILED
2018-02-04 16:29:35.145563: E C:\tf_jenkins\workspace\rel-win\M\windows-gpu\PY\36\tensorflow\stream_executor\cuda\cuda_dnn.cc:352] could not destroy cudnn handle: CUDNN_STATUS_BAD_PARAM
2018-02-04 16:29:35.149896: F C:\tf_jenkins\workspace\rel-win\M\windows-gpu\PY\36\tensorflow\core\kernels\conv_ops.cc:717] Check failed: stream->parent()->GetConvolveAlgorithms( conv_parameters.ShouldIncludeWinogradNonfusedAlgo<T>(), &algorithms)
这是我的代码:
import tensorflow as tf
import numpy as np
import cv2
import time
from PIL import ImageGrab
from getkeys import key_check
from alexnet import alexnet
import os
from sendKeys import PressKey, ReleaseKey, W,A,S,D,Sp
import random
WIDTH = 80
HEIGHT = 60
LR = 1e-3
EPOCHS = 10
MODEL_NAME = 'DiRT-AI-Driver----epochs.model'.format(LR, 'alexnetv2', EPOCHS)
def straight():
PressKey(W)
ReleaseKey(A)
ReleaseKey(S)
ReleaseKey(D)
ReleaseKey(Sp)
def left():
PressKey(A)
ReleaseKey(W)
ReleaseKey(S)
ReleaseKey(D)
ReleaseKey(Sp)
def right():
PressKey(D)
ReleaseKey(A)
ReleaseKey(S)
ReleaseKey(W)
ReleaseKey(Sp)
def brake():
PressKey(S)
ReleaseKey(A)
ReleaseKey(W)
ReleaseKey(D)
ReleaseKey(Sp)
def handbrake():
PressKey(Sp)
ReleaseKey(A)
ReleaseKey(S)
ReleaseKey(D)
ReleaseKey(W)
model = alexnet(WIDTH, HEIGHT, LR)
model.load(MODEL_NAME)
def main():
last_time = time.time()
for i in list(range(4))[::-1]:
print(i+1)
time.sleep(1)
paused = False
while(True):
if not paused:
screen = np.array(ImageGrab.grab(bbox=(0,40,1024,768)))
screen = cv2.cvtColor(screen,cv2.COLOR_BGR2GRAY)
screen = cv2.resize(screen,(80,60))
print('Loop took seconds'.format(time.time()-last_time))
last_time = time.time()
print('took time')
prediction = model.predict([screen.reshape(WIDTH,HEIGHT,1)])[0]
print('predicted')
moves = list(np.around(prediction))
print('got moves')
print(moves,prediction)
if moves == [1,0,0,0,0]:
straight()
elif moves == [0,1,0,0,0]:
left()
elif moves == [0,0,1,0,0]:
brake()
elif moves == [0,0,0,1,0]:
right()
elif moves == [0,0,0,0,1]:
handbrake()
keys = key_check()
if 'T' in keys:
if paused:
pased = False
time.sleep(1)
else:
paused = True
ReleaseKey(W)
ReleaseKey(A)
ReleaseKey(S)
ReleaseKey(D)
ReleaseKey(Sp)
time.sleep(1)
main()
我发现崩溃python并产生前三个错误的行是这一行:
prediction = model.predict([screen.reshape(WIDTH,HEIGHT,1)])[0]
运行代码时,CPU上升到100%,表明某些事情严重脱落。 GPU达到约40-50%
我已经尝试过Tensorflow 1.2和1.3,以及CUDA 8,没有好处。安装CUDA时,我没有安装特定的驱动程序,因为它们对于我的GPU太旧了。尝试了不同的CUDnn,也没有好处。
在我的情况下,问题发生的原因是另一个导入了tensorflow
的python控制台正在运行。关闭它解决了这个问题。
我有Windows 10,主要错误是:
无法创建cublas句柄:CUBLAS_STATUS_ALLOC_FAILED
无法创建cudnn句柄:CUDNN_STATUS_ALLOC_FAILED
尝试将cuda路径添加到环境变量中。似乎这个问题与cuda有关。
在〜/ .bashrc中设置CUDA路径(使用nano编辑):
#Cuda Nvidia path
$ export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64"
$ export CUDA_HOME=/usr/local/cuda
我遇到了同样的问题,然后我发现因为我也使用GPU运行其他东西,即使它没有在使用GPU的任务管理器(windows)上显示。甚至可能是(渲染视频,视频编码或玩繁重的工作负载游戏,硬币挖掘......)。如果您认为它仍在使用重型GPU,请关闭它并解决问题。
以上是关于使用CUDNN_STATUS_ALLOC_FAILED进行Tensorflow崩溃的主要内容,如果未能解决你的问题,请参考以下文章
在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?
Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)