Не удалось создать дескриптор CUBLAS. Взаимодействие Tensorflow с OpenCV

Я пытаюсь использовать PlayStation Eye Camera для проекта глубокого обучения с подкреплением. Сеть, установка TensorFlow (0.11) и CUDA (8.0) работают, потому что мне удалось обучить сеть на симуляции.

Теперь, когда я пытаюсь прочитать изображения с реальной камеры, сетевой код вылетает с ошибкой ниже. Есть ли ошибка в моей установке OpenCV (3.2.0) или есть другая проблема? Я был бы бесконечно благодарен, потому что я не нашел никакой информации об этой проблеме.

E tensorflow/stream_executor/cuda/cuda_blas.cc:367] failed to create      cublas handle: CUBLAS_STATUS_NOT_INITIALIZED
W tensorflow/stream_executor/stream.cc:1390] attempting to perform BLAS operation using StreamExecutor without BLAS support


Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 754, in run
    self.__target(*self.__args, **self.__kwargs)
  File "main.py", line 48, in worker
    action = dqn.getAction()
  File "../network/evaluation.py", line 141, in getAction
    Q_value = self.Q_value.eval(feed_dict= {self.input_state:[self.currentState]})[0]
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 559, in eval
    return _eval_using_default_session(self, feed_dict, self.graph, session)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 3761, in _eval_using_default_session
    return session.run(tensors, feed_dict)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 717, in run
    run_metadata_ptr)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 915, in _run
    feed_dict_string, options, run_metadata)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 965, in _do_run
    target_list, options, run_metadata)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 985, in _do_call
    raise type(e)(node_def, op, message)
InternalError: Blas SGEMM launch failed : a.shape=(1, 1600), b.shape=(1600, 4), m=1, n=4, k=1600
     [[Node: MatMul = MatMul[T=DT_FLOAT, transpose_a=false, transpose_b=false, _device="/job:localhost/replica:0/task:0/gpu:0"](Reshape, Variable_6/read)]]

Соответствующий код из класса камеры:

# OpenCV
import numpy as np
import cv2

# scipy
from scipy.misc import imresize

# Time
from time import time

# Clean exit
import sys
import os

# Max value for the gray values
MAX_GRAY = 255.0
INPUT_SIZE = 75

class Camera:


    # Initialization method
    def __init__(self, duration, exchanger, framesPerAction = 10, width = 640, height = 480, show = True):

        # Create the video capture
        self.cap = cv2.VideoCapture(1)

        # Set the parameters of the capture
        self.cap.set(3, width)
        self.cap.set(4, height)
        self.cap.set(5, 30)

        # Get the properties of the capture
        self.width = int(self.cap.get(3))
        self.height = int(self.cap.get(4))
        self.fps = int(self.cap.get(5))

        # Print these properties
        print 'Width:', self.width, '| Height:', self.height, '| FPS:', self.fps

        # Duration that the camera should be running
        self.duration = duration

        # Number of frames that should be between every extracted frame
        self.framesPerAction = framesPerAction

        # Exchanges the frames with the network
        self.exchanger = exchanger

        # Display the frames on the monitor
        self.show = show

        # Counter for the number of frames since the last action
        self.frameCounter = 0

    # Starts the loop for the camera
    def run(self):

        startTime = time()

        # Loop for a certain time
        while(self.duration > time() - startTime):

            # Check frames per second
#           print 'Start of this frame', time()-startTime

            # Capture frame-by-frame
            ret, frame = self.cap.read()

            # Close when user types ESCAPE(27)
            if cv2.waitKey(1) & 0xFF == 27:
                break

            # Increment framecounter
            if(self.frameCounter != self.framesPerAction):
                self.frameCounter += 1

            # Extract the resulting frame
            else:

                # Crop to square
                step = int((640 - 480) / 2)
                result = frame[0 : 480, step : step + 480]

                # Downsample the image
#               result = cv2.resize(gray, (75, 75))
                result = imresize(result, size=(75, 75, 3))

                # Transform to grayscale
#               gray = cv2.cvtColor(input, cv2.COLOR_BGR2GRAY)
                result = self.rgb2gray(result)

                # Change range of image from [0,255] --> [0, 1]
                result = result / 255.0

                # Store the frame on the exchanger
                self.exchanger.store(0, False, result)

                # reset framecounter
                self.frameCounter = 0

            # Display the frame on the monitor
            if(self.show):
                    cv2.imshow('frame', frame)

        # When everything done, release the capture
        self.cap.release()
        cv2.destroyAllWindows()

        # Exit so that the network thread also stops running
        os._exit(0)

person RandomEngineer    schedule 27.02.2017    source источник
comment
Возможный дубликат сбой Tensorflow с CUBLAS_STATUS_ALLOC_FAILED   -  person talonmies    schedule 27.02.2017
comment
У вас все еще есть проблема с TensorFlow 1.0?   -  person Neal    schedule 28.02.2017
comment
@talonmies, это исправление здесь не работает. Я думаю, что проблема связана с тем, что сеть не может использовать кублас, потому что opencv уже использует его.   -  person RandomEngineer    schedule 28.02.2017
comment
@Neal Спасибо, это действительно решило проблему. Не планировал обновлять из-за проблем с обратной совместимостью, но на самом деле это было проще сделать, чем ожидалось. Спасибо за чаевые   -  person RandomEngineer    schedule 28.02.2017
comment
Потрясающий! Для справки в будущем, если вам нужно обновить код со старой версии TensorFlow до 1.0, вы можете использовать этот скрипт обновления: github.com/tensorflow/tensorflow/tree/master/tensorflow/tools/   -  person Neal    schedule 28.02.2017


Ответы (3)


Возможно, поможет следующая команда:

sudo rm -rf .nv/

Удачи.

person Haozhe Xie    schedule 24.11.2017
comment
Это помогло - после автообновления Ubuntu испортил драйвер графического процессора. Спасибо. - person toobee; 22.06.2018
comment
Это должен быть принятый ответ. Большое спасибо, Хаоже! - person John Jiang; 02.12.2019

По-видимому, эта ошибка может иметь множество причин. Я решил эту проблему, следуя этой проблеме в официальном репозитории. Сборка PyPi Tensorflow GPU 2.2 использует CUDA 10.1 и libcublas 10.2.1.243, но у меня была установлена ​​cublas 10.2.2.89. Чтобы решить эту проблему:

Центос:

yum remove libcublas
yum install libcublas10-10.2.1.243-1.x86_64

Убунту:

sudo apt remove libcublas10
sudo apt install libcublas10=10.2.1.243-1

Затем я удалил кеш nvidia:

rm -rf ~/.nv/

И это сработало.

Короче говоря, политика закрытого исходного кода nvidia создала лабиринт несоответствий версий, где вам нужно либо создать свой дистрибутив tensorflow с собственной версией CUDA, cudnn и cublas, что не так просто, как кажется, либо убедиться, что у вас есть точно правильная версия для всех установленных, что опять же, из-за того, что nvidia практически не сотрудничает с фондом Linux и проектами с открытым исходным кодом, не так просто, как могло бы быть.

person Iman Akbari    schedule 23.06.2020

У меня была эта проблема, но с более простым решением. Моя проблема заключалась в том, что я запускал сценарий в командной строке, и в то же время была открыта оболочка Idle того же сценария. Закрытие оболочки и решение проблемы.

person Vasco Cansado Carvalho    schedule 26.03.2020