#!/usr/bin/env python # coding: utf-8 # # Theano 在 Windows 上的配置 # 注意:不建议在 `windows` 进行 `theano` 的配置。 # # 务必确认你的显卡支持 `CUDA`。 # # 我个人的电脑搭载的是 `Windows 10 x64` 系统,显卡是 `Nvidia GeForce GTX 850M`。 # ## 安装 theano # 首先是用 `anaconda` 安装 `theano`: # # conda install mingw libpython # pip install theano # ## 安装 VS 和 CUDA # 按顺序安装这两个软件: # - 安装 Visual Studio 2010/2012/2013 # - 安装 对应的 x64 或 x86 CUDA # # Cuda 的版本与电脑的显卡兼容。 # # 我安装的是 Visual Studio 2012 和 CUDA v7.0v。 # ## 配置环境变量 # `CUDA` 会自动帮你添加一个 `CUDA_PATH` 环境变量(环境变量在 控制面板->系统与安全->系统->高级系统设置 中),表示你的 `CUDA` 安装位置,我的电脑上为: # # - `CUDA_PATH` # - `C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.0` # # 我们配置两个相关变量: # # - `CUDA_BIN_PATH` # - `%CUDA_PATH%\bin` # - `CUDA_LIB_PATH` # - `%CUDA_PATH%\lib\Win32` # # 接下来在 `Path` 环境变量的后面加上: # # - `Minicoda` 中关于 `mingw` 的项: # - `C:\Miniconda\MinGW\bin;` # - `C:\Miniconda\MinGW\x86_64-w64-mingw32\lib;` # # - `VS` 中的 `cl` 编译命令: # - `C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin;` # - `C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE;` # 生成测试文件: # In[1]: get_ipython().run_cell_magic('file', 'test_theano.py', "from theano import config\nprint 'using device:', config.device\n") # 我们可以通过临时设置环境变量 `THEANO_FLAGS` 来改变 `theano` 的运行模式,在 linux 下,临时环境变量直接用: # # THEANO_FLAGS=xxx # # 就可以完成,设置完成之后,该环境变量只在当前的命令窗口有效,你可以这样运行你的代码: # # THEANO_FLAGS=xxx python .py # # 在 `Windows` 下,需要使用 `set` 命令来临时设置环境变量,所以运行方式为: # # set THEANO_FLAGS=xxx && python .py # In[2]: import sys if sys.platform == 'win32': get_ipython().system('set THEANO_FLAGS=mode=FAST_RUN,device=cpu,floatX=float32 && python test_theano.py') else: get_ipython().system('THEANO_FLAGS=mode=FAST_RUN,device=cpu,floatX=float32 python test_theano.py') # In[3]: if sys.platform == 'win32': get_ipython().system('set THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32 && python test_theano.py') else: get_ipython().system('THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32 python test_theano.py') # 测试 `CPU` 和 `GPU` 的差异: # In[4]: get_ipython().run_cell_magic('file', 'test_theano.py', '\nfrom theano import function, config, shared, sandbox\nimport theano.tensor as T\nimport numpy\nimport time\n\nvlen = 10 * 30 * 768 # 10 x #cores x # threads per core\niters = 1000\n\nrng = numpy.random.RandomState(22)\nx = shared(numpy.asarray(rng.rand(vlen), config.floatX))\nf = function([], T.exp(x))\n\nt0 = time.time()\nfor i in xrange(iters):\n r = f()\nt1 = time.time()\nprint("Looping %d times took %f seconds" % (iters, t1 - t0))\nprint("Result is %s" % (r,))\nif numpy.any([isinstance(x.op, T.Elemwise) for x in f.maker.fgraph.toposort()]):\n print(\'Used the cpu\')\nelse:\n print(\'Used the gpu\')\n') # In[5]: if sys.platform == 'win32': get_ipython().system('set THEANO_FLAGS=mode=FAST_RUN,device=cpu,floatX=float32 && python test_theano.py') else: get_ipython().system('THEANO_FLAGS=mode=FAST_RUN,device=cpu,floatX=float32 python test_theano.py') # In[6]: if sys.platform == 'win32': get_ipython().system('set THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32 && python test_theano.py') else: get_ipython().system('THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32 python test_theano.py') # 可以看到 `GPU` 明显要比 `CPU` 快。 # # 使用 `GPU` 模式的 `T.exp(x)` 可以获得更快的加速效果: # In[7]: get_ipython().run_cell_magic('file', 'test_theano.py', '\nfrom theano import function, config, shared, sandbox\nimport theano.sandbox.cuda.basic_ops\nimport theano.tensor as T\nimport numpy\nimport time\n\nvlen = 10 * 30 * 768 # 10 x #cores x # threads per core\niters = 1000\n\nrng = numpy.random.RandomState(22)\nx = shared(numpy.asarray(rng.rand(vlen), \'float32\'))\nf = function([], sandbox.cuda.basic_ops.gpu_from_host(T.exp(x)))\n\nt0 = time.time()\nfor i in xrange(iters):\n r = f()\nt1 = time.time()\nprint("Looping %d times took %f seconds" % (iters, t1 - t0))\nprint("Result is %s" % (r,))\nprint("Numpy result is %s" % (numpy.asarray(r),))\nif numpy.any([isinstance(x.op, T.Elemwise) for x in f.maker.fgraph.toposort()]):\n print(\'Used the cpu\')\nelse:\n print(\'Used the gpu\')\n') # In[8]: if sys.platform == 'win32': get_ipython().system('set THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32 && python test_theano.py') else: get_ipython().system('THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32 python test_theano.py') # In[9]: get_ipython().system('rm test_theano.py') # ## 配置 .theanorc.txt # 我们可以在个人文件夹下配置 .theanorc.txt 文件来省去每次都使用环境变量设置的麻烦: # # 例如我现在的 .theanorc.txt 配置为: # ``` # [global] # device = gpu # floatX = float32 # # [nvcc] # fastmath = True # flags = -LC:\Miniconda\libs # compiler_bindir=C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin # # [gcc] # cxxflags = -LC:\Miniconda\MinGW # ``` # # 具体这些配置有什么作用之后可以查看官网上的教程。