Проблемы с использованием графического процессора в Theano (откат процессора, BLAS, cuDNN)

Я пытался заставить Theano использовать GPU, но безуспешно.

Возможно, файл.theanorc не работает, а cuDNN не работает.

Я установил файл.theanorc (ниже), но при вводе python cpu_gpu_test.py (Находится по адресу http://deeplearning.net/software/theano/tutorial/using_gpu.html) в терминал в среде Anaconda, возвращается [Elemwise{exp,no_inplace}(<TensorType(float64, vector)>)]... Used the cpu, Это не совпадает с файлом.theanorc float32,

[global]
device = gpu
floatX = float32
[nvcc]
compiler_bindir=C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin
[dnn]
enabled = True
include_path=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include
library_path=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64

Работает только при вводе THEANO_FLAGS=device=gpu python cpu_gpu_test.py, Консоль возвращается

Can not use cuDNN on context None: cannot compile with cuDNN. We got this error:
c:\cygwin64\tmp\try_flags_bspyee.c:4:19: fatal error: cudnn.h: No such file or directory
compilation terminated.

Mapped name None to device cuda: GeForce GTX 1050 (0000:01:00.0)
[GpuElemwise{exp,no_inplace}(<GpuArrayType<None>(float64, (False,))>), HostFromGpu(gpuarray)(GpuElemwise{exp,no_inplace}.0)]
Looping 1000 times took 0.084000 seconds

...

Used the gpu

Во-первых, я не уверен, почему появляется ошибка cuDNN, поскольку я ее установил. Во-вторых, возвращается no_inplace, Каково его значение? В-третьих, float64 появляется несмотря на то, что файл.theanorc указывает float32,

Когда я пытаюсь сделать это снова, указав параметры как таковые THEANO_FLAGS='floatX=float32,device=gpu,lib.cnmem=1' python cpu_gpu_test.py, появляются сообщения об ошибках. Обратите внимание, что имена устройств - это gpu для старого сервера.

WARNING (theano.sandbox.cuda): The cuda backend is deprecated and will be removed in the next release (v0.10).  Please switch to the gpuarray backend. You can get more information about how to switch at this URL:
 https://github.com/Theano/Theano/wiki/Converting-to-the-new-gpu-back-end%28gpuarray%29

ERROR (theano.sandbox.cuda): ERROR: Not using GPU. Initialisation of device gpu failed:
initCnmem: cnmemInit call failed! Reason=CNMEM_STATUS_OUT_OF_MEMORY. numdev=1

Traceback (most recent call last):
  File "cpu_gpu_test.py", line 3, in <module>
    from theano import function, config, shared, tensor
  File "C:\Users\chekb\Anaconda2\lib\site-packages\theano\__init__.py", line 116, in <module>
    theano.sandbox.cuda.tests.test_driver.test_nvidia_driver1()
  File "C:\Users\chekb\Anaconda2\lib\site-packages\theano\sandbox\cuda\tests\test_driver.py", line 40, in test_nvidia_driver1
    if not numpy.allclose(f(), a.sum()):
  File "C:\Users\chekb\Anaconda2\lib\site-packages\theano\compile\function_module.py", line 898, in __call__
    storage_map=getattr(self.fn, 'storage_map', None))
  File "C:\Users\chekb\Anaconda2\lib\site-packages\theano\gof\link.py", line 325, in raise_with_op
    reraise(exc_type, exc_value, exc_trace)
  File "C:\Users\chekb\Anaconda2\lib\site-packages\theano\compile\function_module.py", line 884, in __call__
    self.fn() if output_subset is None else\
RuntimeError: Cuda error: kernel_reduce_ccontig_node_544270fe7a21a748315f83abfe0913cc_0: out of memory. (grid: 1 x 1; block: 256 x 1 x 1)

Apply node that caused the error: GpuCAReduce{add}{1}(<CudaNdarrayType(float32, vector)>)
Toposort index: 0
Inputs types: [CudaNdarrayType(float32, vector)]
Inputs shapes: [(10000,)]
Inputs strides: [(1,)]
Inputs values: ['not shown']
Outputs clients: [[HostFromGpu(GpuCAReduce{add}{1}.0)]]

HINT: Re-running with most Theano optimization disabled could give you a back-trace of when this node was created. This can be done with by setting the Theano flag 'optimizer=fast_compile'. If that does not work, Theano optimizations can be disabled with 'optimizer=None'.
HINT: Use the Theano flag 'exception_verbosity=high' for a debugprint and storage map footprint of this apply node.

Меняя его на THEANO_FLAGS='floatX=float32,device=cuda0,lib.cnmem=1' python cpu_gpu_test.py (Примечание: устройство - cuda), список номеров возвращается, но снова появляется следующий текст относительно cuDNN.

Can not use cuDNN on context None: cannot compile with cuDNN. We got this error:
c:\cygwin64\tmp\try_flags_4ufpg5.c:4:19: fatal error: cudnn.h: No such file or directory
compilation terminated.

Mapped name None to device cuda0: GeForce GTX 1050 (0000:01:00.0)
[GpuElemwise{exp,no_inplace}(<GpuArrayType<None>(float32, (False,))>), HostFromGpu(gpuarray)(GpuElemwise{exp,no_inplace}.0)]
Looping 1000 times took 0.097000 seconds

BLAS требуется для регрессионной модели, процессор быстрее, чем GPU, несмотря на N=4000

Далее я проверил систему, используя модель логистической регрессии, найденную здесь http://deeplearning.net/software/theano/tutorial/modes.html. Я изменил его на N=4000 с N = 400, так как ранее я заметил, что в тесте GPU CPU процессор (0,02 с) превосходит GPU (0,8 с), и это может быть связано с относительно простыми вычислениями.

Ввод time python time_python_file.pyЯ получаю следующее:

WARNING (theano.tensor.blas): We did not found a dynamic library into the library_dir of the library we use for blas. If you use ATLAS, make sure to compile it with dynamics library.
Used the cpu
target values for D
[ 1.  1.  1. ...,  1.  0.  0.]
prediction on D
[False False  True ...,  True  True False]

real    0m37.809s
user    0m0.000s
sys     0m0.000s

Ввод time THEANO_FLAGS=device=gpu python time_python_file.py возвращается

WARNING (theano.sandbox.cuda): The cuda backend is deprecated and will be removed in the next release (v0.10).  Please switch to the gpuarray backend. You can get more information about how to switch at this URL:
 https://github.com/Theano/Theano/wiki/Converting-to-the-new-gpu-back-end%28gpuarray%29

C:\Users\chekb\Anaconda2\lib\site-packages\theano\sandbox\cuda\__init__.py:556: UserWarning: Theano flag device=gpu* (old gpu back-end) only support floatX=float32. You have floatX=float64. Use the new gpu back-end with device=cuda* for that value of floatX.
  warnings.warn(msg)
Using gpu device 0: GeForce GTX 1050 (CNMeM is disabled, cuDNN 5110)
WARNING (theano.tensor.blas): We did not found a dynamic library into the library_dir of the library we use for blas. If you use ATLAS, make sure to compile it with dynamics library.
Used the cpu
target values for D
[ 1.  1.  0. ...,  0.  1.  0.]
prediction on D
[ True False False ..., False  True False]

real    0m38.876s
user    0m0.000s
sys     0m0.000s

которая все еще имеет проблему BLAS и имеет очень близкое время вычислений к предполагаемой версии только для процессора выше (в течение 1 с).

Когда на самом деле указать использовать процессор time THEANO_FLAGS=device=cpu python time_python_file.py, это возвращает

WARNING (theano.tensor.blas): We did not found a dynamic library into the library_dir of the library we use for blas. If you use ATLAS, make sure to compile it with dynamics library.
Used the cpu
target values for D
[ 1.  1.  0. ...,  0.  0.  0.]
prediction on D
[ True  True  True ..., False False False]

real    0m34.395s
user    0m0.015s
sys     0m0.000s

это время гораздо ниже, чем у GPU, и ничего не указывается.

Означает ли это, что в первом случае используется графический процессор, но вместо этого используется код, возвращающий процессор? Нужен ли мне пакет BLAS? И показывают ли результаты, что мой процессор быстрее, чем мой графический процессор, и если да, то я должен использовать процессор для будущих задач?

Резюме

Как мне настроить мой файл.theanorc так, чтобы по умолчанию использовался gpu в float32 без необходимости THEANO_FLAGS каждый раз, когда я запускаю скрипт? Мой процессор быстрее моего процессора? Как я могу включить cuDNN? Нужен ли мне пакет BLAS?

Информация об оборудовании

Ноутбук с i7-7700HQ и GTX 1050 4GB на Windows 10

Спасибо!

0 ответов

Другие вопросы по тегам