在Windows 8上安装启用GPU的Theano

15 投票
7 回答
21663 浏览
提问于 2025-04-20 12:27

我知道Theano在Windows 8.1上的支持还处于实验阶段,但我想知道有没有人解决过我遇到的问题。根据我的配置,我会遇到三种不同类型的错误。我猜解决其中任何一个错误都能帮我解决我的问题。

我使用WinPython 32位系统安装了Python,并按照这里的说明使用了MinGW。我的.theanorc文件内容如下:

[global]
openmp=False
device = gpu

[nvcc]
flags=-LC:\TheanoPython\python-2.7.6\libs
compiler_bindir=C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\

[blas]
ldflags = 

当我运行import theano时,出现的错误是:

nvcc fatal   : nvcc cannot find a supported version of Microsoft Visual Studio.
Only the versions 2010, 2012, and 2013 are supported

['nvcc', '-shared', '-g', '-O3', '--compiler-bindir', 'C:\\Program Files (x86)\\
Microsoft Visual Studio 10.0\\VC\\bin# flags=-m32 # we have this hard coded for
now', '-Xlinker', '/DEBUG', '-m32', '-Xcompiler', '-DCUDA_NDARRAY_CUH=d67f7c8a21
306c67152a70a88a837011,/Zi,/MD', '-IC:\\TheanoPython\\python-2.7.6\\lib\\site-pa
ckages\\theano\\sandbox\\cuda', '-IC:\\TheanoPython\\python-2.7.6\\lib\\site-pac
kages\\numpy\\core\\include', '-IC:\\TheanoPython\\python-2.7.6\\include', '-o',
 'C:\\Users\\Matej\\AppData\\Local\\Theano\\compiledir_Windows-8-6.2.9200-Intel6
4_Family_6_Model_60_Stepping_3_GenuineIntel-2.7.6-32\\cuda_ndarray\\cuda_ndarray
.pyd', 'mod.cu', '-LC:\\TheanoPython\\python-2.7.6\\libs', '-LNone\\lib', '-LNon
e\\lib64', '-LC:\\TheanoPython\\python-2.7.6', '-lpython27', '-lcublas', '-lcuda
rt']
ERROR (theano.sandbox.cuda): Failed to compile cuda_ndarray.cu: ('nvcc return st
atus', 1, 'for cmd', 'nvcc -shared -g -O3 --compiler-bindir C:\\Program Files (x
86)\\Microsoft Visual Studio 10.0\\VC\\bin# flags=-m32 # we have this hard coded
 for now -Xlinker /DEBUG -m32 -Xcompiler -DCUDA_NDARRAY_CUH=d67f7c8a21306c67152a
70a88a837011,/Zi,/MD -IC:\\TheanoPython\\python-2.7.6\\lib\\site-packages\\thean
o\\sandbox\\cuda -IC:\\TheanoPython\\python-2.7.6\\lib\\site-packages\\numpy\\co
re\\include -IC:\\TheanoPython\\python-2.7.6\\include -o C:\\Users\\Matej\\AppDa
ta\\Local\\Theano\\compiledir_Windows-8-6.2.9200-Intel64_Family_6_Model_60_Stepp
ing_3_GenuineIntel-2.7.6-32\\cuda_ndarray\\cuda_ndarray.pyd mod.cu -LC:\\TheanoP
ython\\python-2.7.6\\libs -LNone\\lib -LNone\\lib64 -LC:\\TheanoPython\\python-2
.7.6 -lpython27 -lcublas -lcudart')
WARNING (theano.sandbox.cuda): CUDA is installed, but device gpu is not availabl
e

我还测试了在我的系统上安装的Visual Studio 12.0,结果出现了以下错误:

mod.cu
nvlink fatal   : Could not open input file 'C:/Users/Matej/AppData/Local/Temp/tm
pxft_00001b70_00000000-28_mod.obj'

['nvcc', '-shared', '-g', '-O3', '--compiler-bindir', 'C:\\Program Files (x86)\\
Microsoft Visual Studio 12.0\\VC\\bin\\', '-Xlinker', '/DEBUG', '-m32', '-Xcompi
ler', '-LC:\\TheanoPython\\python-2.7.6\\libs,-DCUDA_NDARRAY_CUH=d67f7c8a21306c6
7152a70a88a837011,/Zi,/MD', '-IC:\\TheanoPython\\python-2.7.6\\lib\\site-package
s\\theano\\sandbox\\cuda', '-IC:\\TheanoPython\\python-2.7.6\\lib\\site-packages
\\numpy\\core\\include', '-IC:\\TheanoPython\\python-2.7.6\\include', '-o', 'C:\
\Users\\Matej\\AppData\\Local\\Theano\\compiledir_Windows-8-6.2.9200-Intel64_Fam
ily_6_Model_60_Stepping_3_GenuineIntel-2.7.6-32\\cuda_ndarray\\cuda_ndarray.pyd'
, 'mod.cu', '-LC:\\TheanoPython\\python-2.7.6\\libs', '-LNone\\lib', '-LNone\\li
b64', '-LC:\\TheanoPython\\python-2.7.6', '-lpython27', '-lcublas', '-lcudart']
ERROR (theano.sandbox.cuda): Failed to compile cuda_ndarray.cu: ('nvcc return st
atus', 1, 'for cmd', 'nvcc -shared -g -O3 --compiler-bindir C:\\Program Files (x
86)\\Microsoft Visual Studio 12.0\\VC\\bin\\ -Xlinker /DEBUG -m32 -Xcompiler -LC
:\\TheanoPython\\python-2.7.6\\libs,-DCUDA_NDARRAY_CUH=d67f7c8a21306c67152a70a88
a837011,/Zi,/MD -IC:\\TheanoPython\\python-2.7.6\\lib\\site-packages\\theano\\sa
ndbox\\cuda -IC:\\TheanoPython\\python-2.7.6\\lib\\site-packages\\numpy\\core\\i
nclude -IC:\\TheanoPython\\python-2.7.6\\include -o C:\\Users\\Matej\\AppData\\L
ocal\\Theano\\compiledir_Windows-8-6.2.9200-Intel64_Family_6_Model_60_Stepping_3
_GenuineIntel-2.7.6-32\\cuda_ndarray\\cuda_ndarray.pyd mod.cu -LC:\\TheanoPython
\\python-2.7.6\\libs -LNone\\lib -LNone\\lib64 -LC:\\TheanoPython\\python-2.7.6
-lpython27 -lcublas -lcudart')
WARNING (theano.sandbox.cuda): CUDA is installed, but device gpu is not availabl
e

在这个错误中,会弹出几个窗口问我想用什么打开(.res)文件,然后才会出现错误。

cl.exe在两个文件夹中都有(也就是VS 2010和VS 2013)。

最后,如果我在环境路径中设置VS 2013,并将.theanorc的内容设置为:

[global]
base_compiledir=C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin
openmp=False
floatX = float32
device = gpu

[nvcc]
flags=-LC:\TheanoPython\python-2.7.6\libs
compiler_bindir=C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\

[blas]
ldflags = 

我会得到以下错误:

c:\theanopython\python-2.7.6\include\pymath.h(22): warning: dllexport/dllimport conflict with "round"
c:\program files\nvidia gpu computing toolkit\cuda\v6.5\include\math_functions.h(2455): here; dllimport/dllexport dropped

mod.cu(954): warning: statement is unreachable

mod.cu(1114): error: namespace "std" has no member "min"

mod.cu(1145): error: namespace "std" has no member "min"

mod.cu(1173): error: namespace "std" has no member "min"

mod.cu(1174): error: namespace "std" has no member "min"

mod.cu(1317): error: namespace "std" has no member "min"

mod.cu(1318): error: namespace "std" has no member "min"

mod.cu(1442): error: namespace "std" has no member "min"

mod.cu(1443): error: namespace "std" has no member "min"

mod.cu(1742): error: namespace "std" has no member "min"

mod.cu(1777): error: namespace "std" has no member "min"

mod.cu(1781): error: namespace "std" has no member "min"

mod.cu(1814): error: namespace "std" has no member "min"

mod.cu(1821): error: namespace "std" has no member "min"

mod.cu(1853): error: namespace "std" has no member "min"

mod.cu(1861): error: namespace "std" has no member "min"

mod.cu(1898): error: namespace "std" has no member "min"

mod.cu(1905): error: namespace "std" has no member "min"

mod.cu(1946): error: namespace "std" has no member "min"

mod.cu(1960): error: namespace "std" has no member "min"

mod.cu(3750): error: namespace "std" has no member "min"

mod.cu(3752): error: namespace "std" has no member "min"

mod.cu(3784): error: namespace "std" has no member "min"

mod.cu(3786): error: namespace "std" has no member "min"

mod.cu(3789): error: namespace "std" has no member "min"

mod.cu(3791): error: namespace "std" has no member "min"

mod.cu(3794): error: namespace "std" has no member "min"

mod.cu(3795): error: namespace "std" has no member "min"

mod.cu(3836): error: namespace "std" has no member "min"

mod.cu(3838): error: namespace "std" has no member "min"

mod.cu(4602): error: namespace "std" has no member "min"

mod.cu(4604): error: namespace "std" has no member "min"

31 errors detected in the compilation of "C:/Users/Matej/AppData/Local/Temp/tmpxft_00001d84_00000000-10_mod.cpp1.ii".
ERROR (theano.sandbox.cuda): Failed to compile cuda_ndarray.cu: ('nvcc return status', 2, 'for cmd', 'nvcc -shared -g -O3 -Xlinker /DEBUG -m32 -Xcompiler -DCUDA_NDARRAY_CUH=d67f7c8a21306c67152a70a88a837011,/Zi,/MD -IC:\\TheanoPython\\python-2.7.6\\lib\\site-packages\\theano\\sandbox\\cuda -IC:\\TheanoPython\\python-2.7.6\\lib\\site-packages\\numpy\\core\\include -IC:\\TheanoPython\\python-2.7.6\\include -o C:\\Users\\Matej\\AppData\\Local\\Theano\\compiledir_Windows-8-6.2.9200-Intel64_Family_6_Model_60_Stepping_3_GenuineIntel-2.7.6-32\\cuda_ndarray\\cuda_ndarray.pyd mod.cu -LC:\\TheanoPython\\python-2.7.6\\libs -LNone\\lib -LNone\\lib64 -LC:\\TheanoPython\\python-2.7.6 -lpython27 -lcublas -lcudart')
ERROR:theano.sandbox.cuda:Failed to compile cuda_ndarray.cu: ('nvcc return status', 2, 'for cmd', 'nvcc -shared -g -O3 -Xlinker /DEBUG -m32 -Xcompiler -DCUDA_NDARRAY_CUH=d67f7c8a21306c67152a70a88a837011,/Zi,/MD -IC:\\TheanoPython\\python-2.7.6\\lib\\site-packages\\theano\\sandbox\\cuda -IC:\\TheanoPython\\python-2.7.6\\lib\\site-packages\\numpy\\core\\include -IC:\\TheanoPython\\python-2.7.6\\include -o C:\\Users\\Matej\\AppData\\Local\\Theano\\compiledir_Windows-8-6.2.9200-Intel64_Family_6_Model_60_Stepping_3_GenuineIntel-2.7.6-32\\cuda_ndarray\\cuda_ndarray.pyd mod.cu -LC:\\TheanoPython\\python-2.7.6\\libs -LNone\\lib -LNone\\lib64 -LC:\\TheanoPython\\python-2.7.6 -lpython27 -lcublas -lcudart')
mod.cu

['nvcc', '-shared', '-g', '-O3', '-Xlinker', '/DEBUG', '-m32', '-Xcompiler', '-DCUDA_NDARRAY_CUH=d67f7c8a21306c67152a70a88a837011,/Zi,/MD', '-IC:\\TheanoPython\\python-2.7.6\\lib\\site-packages\\theano\\sandbox\\cuda', '-IC:\\TheanoPython\\python-2.7.6\\lib\\site-packages\\numpy\\core\\include', '-IC:\\TheanoPython\\python-2.7.6\\include', '-o', 'C:\\Users\\Matej\\AppData\\Local\\Theano\\compiledir_Windows-8-6.2.9200-Intel64_Family_6_Model_60_Stepping_3_GenuineIntel-2.7.6-32\\cuda_ndarray\\cuda_ndarray.pyd', 'mod.cu', '-LC:\\TheanoPython\\python-2.7.6\\libs', '-LNone\\lib', '-LNone\\lib64', '-LC:\\TheanoPython\\python-2.7.6', '-lpython27', '-lcublas', '-lcudart']

如果我在没有开启GPU选项的情况下运行import theano,就没有问题。此外,CUDA示例也能正常运行。

7 个回答

0

如果你想在Windows 8.1 x64上升级到MS Visual Studio 2012和CUDA 7,可以看看这个教程:

http://machinelearning.berlin/?p=383

只要你严格按照教程来操作,它应该能顺利运行。祝你好运!

克里斯蒂安

0

按照Matt的教程,我在使用nvcc的时候遇到了一些问题。为了让nvcc正常工作,我需要在nvcc.profile文件中添加VS2010的可执行文件路径(这个文件可以在cuda的bin文件夹里找到):

"compiler-bindir = C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64"

2

这是一个关于在64位Windows上安装Theano和CUDA的指南。

看起来很简单,但我实际上并没有测试过,不能保证它一定有效。

http://pavel.surmenok.com/2014/05/31/installing-theano-with-gpu-on-windows-64-bit/

5

下面是我在64位Windows 10电脑上安装Theano的简单步骤。这些步骤在这里的代码中经过测试过:这里

(所有安装都是使用默认的安装路径)

  • 首先,安装Anaconda Python 3.x版本(它已经包含了numpy、scipy、matplotlib等库)
  • 在命令行中运行 'conda install mingw libpython'
  • 从官方网站下载Theano,然后运行 `python setup.py install` 来安装它
  • 安装适用于64位Windows 10的最新CUDA工具包(现在是7.5版本)
  • 安装Visual Studio 2013(Windows 10可以免费使用)
  • 在 %USERPROFILE% 路径下创建一个 .theanorc.txt 文件,下面是这个文件的内容,用来让Theano使用GPU

[global]

floatX = float32

device = gpu

[nvcc]

fastmath = True

compiler_bindir=C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\cl.exe

[cuda]

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5


30

Theano是一个很棒的机器学习工具,但我发现它在Windows上的安装对初学者(像我一样)来说并不简单。在我的情况下,当我在GPU上运行我的脚本时,速度提升了5到6倍,所以这确实值得我花时间去折腾。

我写了这个指南,基于我的安装过程,希望能详细且完整,即使是对Windows环境下构建程序没有任何了解的人也能看懂。这个指南大部分是基于这些说明,但我不得不修改一些步骤,以便它能在我的系统上正常工作。如果你发现我做的某些事情可能不是最优的,或者在你的机器上不工作,请告诉我,我会尽量修改这个指南。

以下是我在Windows 8.1机器上安装启用GPU的Theano时遵循的步骤(按顺序):

CUDA安装

你可以从这里下载CUDA。在我的情况下,我选择了适合我的NVIDIA Optimus笔记本(配备Geforce 750m)的64位笔记本版本。

通过命令行启动deviceQuery来验证安装是否成功。在我的情况下,它位于以下文件夹:C:\ProgramData\NVIDIA Corporation\CUDA Samples\v6.5\bin\win64\Release。如果成功,你应该在测试结束时看到PASS。

Visual Studio 2010安装

我通过dreamspark安装了这个。如果你是学生,可以获得免费的版本。如果不是,你仍然可以安装Express版本,这也应该很好用。安装完成后,你应该能从开始菜单调用Visual Studio Command Prompt 2010。

Python安装

在撰写时,Theano在GPU上只支持32位浮点数,并且主要是为Python 2.7版本构建的。Theano需要大多数基本的科学Python库,比如scipynumpy。我发现通过WinPython安装这些库是最简单的。它会在一个自包含的文件夹中安装所有依赖项,这样如果安装过程中出现问题,可以轻松重新安装,同时你还会免费获得一些有用的IDE工具,比如ipython notebook和Spyder。为了方便使用,你可能想把你的python.exe路径和Scripts文件夹路径添加到环境变量中。

Git安装

可以在这里找到。

MinGW安装

安装文件在这里。在安装过程中,我检查了所有基本安装文件。如果你遇到下面描述的g++错误,这是必需的。

Cygwin安装

你可以在这里找到它。我基本上只使用这个工具来解压PyCUDA的tar文件,这个文件在基本安装中已经提供(所以安装应该很简单)。

Python distutils修复

打开你Python安装目录下的/lib/distutils/中的msvc9compiler.py。在我的情况下,第641行是:ld_args.append ('/IMPLIB:' + implib_file)。在这一行后面添加以下内容(保持相同的缩进):

ld_args.append('/MANIFEST')

PyCUDA安装

PyCUDA的源代码在这里

步骤:

打开cygwin,导航到PyCUDA文件夹(即/cygdrive/c/etc/etc),执行tar -xzf pycuda-2012.1.tar.gz

打开Visual Studio Command Prompt 2010,导航到解压的目录,执行python configure.py

打开./siteconf.py,修改值,使其读取(例如,对于CUDA 6.5):

BOOST_INC_DIR = []
BOOST_LIB_DIR = []
BOOST_COMPILER = 'gcc43'
USE_SHIPPED_BOOST = True
BOOST_PYTHON_LIBNAME = ['boost_python']
BOOST_THREAD_LIBNAME = ['boost_thread']
CUDA_TRACE = False
CUDA_ROOT = 'C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v6.5'
CUDA_ENABLE_GL = False
CUDA_ENABLE_CURAND = True
CUDADRV_LIB_DIR = ['${CUDA_ROOT}/lib/Win32']
CUDADRV_LIBNAME = ['cuda']
CUDART_LIB_DIR = ['${CUDA_ROOT}/lib/Win32']
CUDART_LIBNAME = ['cudart']
CURAND_LIB_DIR = ['${CUDA_ROOT}/lib/Win32']
CURAND_LIBNAME = ['curand']
CXXFLAGS = ['/EHsc']
LDFLAGS = ['/FORCE']

在VS2010命令提示符下执行以下命令:

set VS90COMNTOOLS=%VS100COMNTOOLS%
python setup.py build
python setup.py install

创建这个python文件并验证你得到了结果:

# from: http://documen.tician.de/pycuda/tutorial.html
import pycuda.gpuarray as gpuarray
import pycuda.driver as cuda
import pycuda.autoinit
import numpy
a_gpu = gpuarray.to_gpu(numpy.random.randn(4,4).astype(numpy.float32))
a_doubled = (2*a_gpu).get()
print a_doubled
print a_gpu

安装Theano

打开git bash shell,选择一个文件夹来放置Theano安装文件,执行:

git clone git://github.com/Theano/Theano.git
python setup.py install

尝试在VS2010命令提示符中打开python并运行import theano

如果你遇到与g++相关的错误,打开MinGW的msys.bat,我的安装路径是C:\MinGW\msys\1.0,然后在MinGW shell中尝试导入theano。然后再次尝试从VS2010命令提示符导入theano,现在应该可以正常工作了。

在WordPad中创建一个文件(不是Notepad!),命名为.theanorc.txt,并将其放在C:\Users\Your_Name\或你的用户文件夹所在的位置:

#!sh
[global]
device = gpu
floatX = float32

[nvcc]
compiler_bindir=C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin
# flags=-m32 # we have this hard coded for now

[blas]
ldflags =
# ldflags = -lopenblas # placeholder for openblas support

创建一个测试python脚本并运行:

from theano import function, config, shared, sandbox
import theano.tensor as T
import numpy
import time

vlen = 10 * 30 * 768  # 10 x #cores x # threads per core
iters = 1000

rng = numpy.random.RandomState(22)
x = shared(numpy.asarray(rng.rand(vlen), config.floatX))
f = function([], T.exp(x))
print f.maker.fgraph.toposort()
t0 = time.time()
for i in xrange(iters):
    r = f()
t1 = time.time()
print 'Looping %d times took' % iters, t1 - t0, 'seconds'
print 'Result is', r
if numpy.any([isinstance(x.op, T.Elemwise) for x in f.maker.fgraph.toposort()]):
    print 'Used the cpu'
else:
    print 'Used the gpu'

验证你在最后得到了Used the gpu,这样就完成了!

撰写回答