如何在Mac OS X EI Capitan下安装带有OpenCL支持的Theano

我有两台Mac,一台Mac pro和一台Macbook pro。他们都是用AMD,所以我无法使用CUDA加速机器学习,所以,我想使用OpenCL。

首先安装一些必备的库和工具:

然后建立一个安装环境 (使用virtualenv可以避免很多麻烦的问题):

安装Theano:

然后,你可以用这个测试代码 ( test.py ) 测试Theano的安装:

这测试会显示如下的信息:

其实就是做一些数学运算做1000次,花了1.49225秒,它在使用CPU。

然后我们必须安装libgpuarray,这样Theano才能支持OpenCL:

然后,我们可以用THEANO_FLAGS设置我们需要用的OpenCL设备。

在我的Mac pro使用OpenCL和CPU:

注意: 代码显示“Used the gnu”,但是实际上你能看出这是CPU。

在我的Mac pro使用OpenCL和GPU:

终于,我们可以使用OpenCL和GPU了。

性能:

我的Mac pro

屏幕截图 2016-04-01 15.09.25

我的Macbook pro

屏幕截图 2016-04-01 15.09.32

注意:现在我们可以用Theano和OpenCL了。但是,当我发现Theano使用CUNN的时候,我很悲哀,因为当你用Theano做神经网络训练的时候,它仍旧需要CUDA的支持。暂时,我还没办法解决这个问题。

英文版本:How to install Theano on Mac OS X EI Caption with OpenCL support

打赏

4 thoughts on “如何在Mac OS X EI Capitan下安装带有OpenCL支持的Theano

  1. 你好,我最近也在做theano+OpenCL的配置,我的实验平台是windows+AMD HD 7400M,前面安装了AMD驱动和AMD APP SDK 2.9,GPU Caps Viewer显示电脑上有了OpenCL2.0平台。
    但是在安装libgpuarray时出现了以下错误:

    (venv) D:\Theano\libgpuarray\build>cmake ..

    — Building for: Visual Studio 11 2012

    — The C compiler identification is MSVC 17.0.50727.1

    — Check for working C compiler using: Visual Studio 11 2012

    — Check for working C compiler using: Visual Studio 11 2012 — works

    — Detecting C compiler ABI info

    — Detecting C compiler ABI info – done

    CUDA_TOOLKIT_ROOT_DIR not found or specified

    — Could NOT find CUDA (missing: CUDA_TOOLKIT_ROOT_DIR CUDA_NVCC_EXECUTABLE CUDA_INCLUDE_DIRS CUDA_CUDART_LIBRARY)

    — Could NOT find OpenCL (missing: OPENCL_LIBRARIES OPENCL_INCLUDE_DIRS)

    — Looking for strlcat

    — Looking for strlcat – not found

    — Looking for mkstemp

    — Looking for mkstemp – not found

    — Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE)

    — Checking for one of the modules ‘check’

    Tests disabled because Check was not found

    — Configuring done

    — Generating done

    — Build files have been written to: D:/Theano/libgpuarray/build

    然后对应的CmakeError.log中的内容如下:

    Determining if the function strlcat exists failed with the following output:
    Change Dir: D:/Theano/libgpuarray/build/CMakeFiles/CMakeTmp

    Run Build Command:”C:/Windows/Microsoft.NET/Framework/v4.0.30319/MSBuild.exe” “cmTC_84b56.vcxproj” “/p:Configuration=Debug” “/p:VisualStudioVersion=11.0”
    Microsoft(R) 生成引擎版本 4.6.81.0

    [Microsoft .NET Framework 版本 4.0.30319.42000]

    版权所有 (C) Microsoft Corporation。保留所有权利。

    生成启动时间为 2016/6/21 星期二 下午 2:38:23。

    节点 1 上的项目“D:\Theano\libgpuarray\build\CMakeFiles\CMakeTmp\cmTC_84b56.vcxproj”(默认目标)。

    PrepareForBuild:

    正在创建目录“cmTC_84b56.dir\Debug\”。

    正在创建目录“D:\Theano\libgpuarray\build\CMakeFiles\CMakeTmp\Debug\”。

    InitializeBuildStatus:

    正在创建“cmTC_84b56.dir\Debug\cmTC_84b56.unsuccessfulbuild”,因为已指定“AlwaysCreate”。

    ClCompile:

    D:\Microsoft Visual Studio 11.0\VC\bin\CL.exe /c /Zi /Wall /WX- /Od /Ob0 /Oy- /D WIN32 /D _WINDOWS /D CHECK_FUNCTION_EXISTS=strlcat /D _DEBUG /D “CMAKE_INTDIR=\”Debug\”” /D _MBCS /Gm- /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fo”cmTC_84b56.dir\Debug\” /Fd”cmTC_84b56.dir\Debug\vc110.pdb” /Gd /TC /analyze- /errorReport:queue “D:\CMake\share\cmake-3.5\Modules\CheckFunctionExists.c”

    用于 x86 的 Microsoft (R) C/C++ 优化编译器 17.00.50727.1 版版权所有(C) Microsoft Corporation。保留所有权利。

    cl /c /Zi /Wall /WX- /Od /Ob0 /Oy- /D WIN32 /D _WINDOWS /D CHECK_FUNCTION_EXISTS=strlcat /D _DEBUG /D “CMAKE_INTDIR=\”Debug\”” /D _MBCS /Gm- /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fo”cmTC_84b56.dir\Debug\” /Fd”cmTC_84b56.dir\Debug\vc110.pdb” /Gd /TC /analyze- /errorReport:queue “D:\CMake\share\cmake-3.5\Modules\CheckFunctionExists.c”

    CheckFunctionExists.c

    D:\CMake\share\cmake-3.5\Modules\CheckFunctionExists.c(6): warning C4255: “strlcat”: 未给出函数原型: 将“()”转换为“(void)” [D:\Theano\libgpuarray\build\CMakeFiles\CMakeTmp\cmTC_84b56.vcxproj]

    Link:

    D:\Microsoft Visual Studio 11.0\VC\bin\link.exe /ERRORREPORT:QUEUE /OUT:”D:\Theano\libgpuarray\build\CMakeFiles\CMakeTmp\Debug\cmTC_84b56.exe” /INCREMENTAL /NOLOGO kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTUAC:”level=’asInvoker’ uiAccess=’false'” /manifest:embed /DEBUG /PDB:”D:/Theano/libgpuarray/build/CMakeFiles/CMakeTmp/Debug/cmTC_84b56.pdb” /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:”D:/Theano/libgpuarray/build/CMakeFiles/CMakeTmp/Debug/cmTC_84b56.lib” /MACHINE:X86 /SAFESEH /machine:X86 cmTC_84b56.dir\Debug\CheckFunctionExists.obj

    CheckFunctionExists.obj : error LNK2019: 无法解析的外部符号 _strlcat,该符号在函数 _main 中被引用 [D:\Theano\libgpuarray\build\CMakeFiles\CMakeTmp\cmTC_84b56.vcxproj]

    D:\Theano\libgpuarray\build\CMakeFiles\CMakeTmp\Debug\cmTC_84b56.exe : fatal error LNK1120: 1 个无法解析的外部命令 [D:\Theano\libgpuarray\build\CMakeFiles\CMakeTmp\cmTC_84b56.vcxproj]

    已完成生成项目“D:\Theano\libgpuarray\build\CMakeFiles\CMakeTmp\cmTC_84b56.vcxproj”(默认目标)的操作 – 失败。

    生成失败。

    “D:\Theano\libgpuarray\build\CMakeFiles\CMakeTmp\cmTC_84b56.vcxproj”(默认目标) (1) ->

    (ClCompile 目标) ->

    D:\CMake\share\cmake-3.5\Modules\CheckFunctionExists.c(6): warning C4255: “strlcat”: 未给出函数原型: 将“()”转换为“(void)” [D:\Theano\libgpuarray\build\CMakeFiles\CMakeTmp\cmTC_84b56.vcxproj]

    “D:\Theano\libgpuarray\build\CMakeFiles\CMakeTmp\cmTC_84b56.vcxproj”(默认目标) (1) ->

    (Link 目标) ->

    CheckFunctionExists.obj : error LNK2019: 无法解析的外部符号 _strlcat,该符号在函数 _main 中被引用 [D:\Theano\libgpuarray\build\CMakeFiles\CMakeTmp\cmTC_84b56.vcxproj]

    D:\Theano\libgpuarray\build\CMakeFiles\CMakeTmp\Debug\cmTC_84b56.exe : fatal error LNK1120: 1 个无法解析的外部命令 [D:\Theano\libgpuarray\build\CMakeFiles\CMakeTmp\cmTC_84b56.vcxproj]

    已用时间 00:00:00.51

    Determining if the function mkstemp exists failed with the following output:
    Change Dir: D:/Theano/libgpuarray/build/CMakeFiles/CMakeTmp

    Run Build Command:”C:/Windows/Microsoft.NET/Framework/v4.0.30319/MSBuild.exe” “cmTC_0bdbe.vcxproj” “/p:Configuration=Debug” “/p:VisualStudioVersion=11.0”
    Microsoft(R) 生成引擎版本 4.6.81.0

    [Microsoft .NET Framework 版本 4.0.30319.42000]

    版权所有 (C) Microsoft Corporation。保留所有权利。

    生成启动时间为 2016/6/21 星期二 下午 2:38:23。

    节点 1 上的项目“D:\Theano\libgpuarray\build\CMakeFiles\CMakeTmp\cmTC_0bdbe.vcxproj”(默认目标)。

    PrepareForBuild:

    正在创建目录“cmTC_0bdbe.dir\Debug\”。

    正在创建目录“D:\Theano\libgpuarray\build\CMakeFiles\CMakeTmp\Debug\”。

    InitializeBuildStatus:

    正在创建“cmTC_0bdbe.dir\Debug\cmTC_0bdbe.unsuccessfulbuild”,因为已指定“AlwaysCreate”。

    ClCompile:

    D:\Microsoft Visual Studio 11.0\VC\bin\CL.exe /c /Zi /Wall /WX- /Od /Ob0 /Oy- /D WIN32 /D _WINDOWS /D CHECK_FUNCTION_EXISTS=mkstemp /D _DEBUG /D “CMAKE_INTDIR=\”Debug\”” /D _MBCS /Gm- /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fo”cmTC_0bdbe.dir\Debug\” /Fd”cmTC_0bdbe.dir\Debug\vc110.pdb” /Gd /TC /analyze- /errorReport:queue “D:\CMake\share\cmake-3.5\Modules\CheckFunctionExists.c”

    用于 x86 的 Microsoft (R) C/C++ 优化编译器 17.00.50727.1 版版权所有(C) Microsoft Corporation。保留所有权利。

    cl /c /Zi /Wall /WX- /Od /Ob0 /Oy- /D WIN32 /D _WINDOWS /D CHECK_FUNCTION_EXISTS=mkstemp /D _DEBUG /D “CMAKE_INTDIR=\”Debug\”” /D _MBCS /Gm- /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fo”cmTC_0bdbe.dir\Debug\” /Fd”cmTC_0bdbe.dir\Debug\vc110.pdb” /Gd /TC /analyze- /errorReport:queue “D:\CMake\share\cmake-3.5\Modules\CheckFunctionExists.c”

    CheckFunctionExists.c

    D:\CMake\share\cmake-3.5\Modules\CheckFunctionExists.c(6): warning C4255: “mkstemp”: 未给出函数原型: 将“()”转换为“(void)” [D:\Theano\libgpuarray\build\CMakeFiles\CMakeTmp\cmTC_0bdbe.vcxproj]

    Link:

    D:\Microsoft Visual Studio 11.0\VC\bin\link.exe /ERRORREPORT:QUEUE /OUT:”D:\Theano\libgpuarray\build\CMakeFiles\CMakeTmp\Debug\cmTC_0bdbe.exe” /INCREMENTAL /NOLOGO kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTUAC:”level=’asInvoker’ uiAccess=’false'” /manifest:embed /DEBUG /PDB:”D:/Theano/libgpuarray/build/CMakeFiles/CMakeTmp/Debug/cmTC_0bdbe.pdb” /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:”D:/Theano/libgpuarray/build/CMakeFiles/CMakeTmp/Debug/cmTC_0bdbe.lib” /MACHINE:X86 /SAFESEH /machine:X86 cmTC_0bdbe.dir\Debug\CheckFunctionExists.obj

    CheckFunctionExists.obj : error LNK2019: 无法解析的外部符号 _mkstemp,该符号在函数 _main 中被引用 [D:\Theano\libgpuarray\build\CMakeFiles\CMakeTmp\cmTC_0bdbe.vcxproj]

    D:\Theano\libgpuarray\build\CMakeFiles\CMakeTmp\Debug\cmTC_0bdbe.exe : fatal error LNK1120: 1 个无法解析的外部命令 [D:\Theano\libgpuarray\build\CMakeFiles\CMakeTmp\cmTC_0bdbe.vcxproj]

    已完成生成项目“D:\Theano\libgpuarray\build\CMakeFiles\CMakeTmp\cmTC_0bdbe.vcxproj”(默认目标)的操作 – 失败。

    生成失败。

    “D:\Theano\libgpuarray\build\CMakeFiles\CMakeTmp\cmTC_0bdbe.vcxproj”(默认目标) (1) ->

    (ClCompile 目标) ->

    D:\CMake\share\cmake-3.5\Modules\CheckFunctionExists.c(6): warning C4255: “mkstemp”: 未给出函数原型: 将“()”转换为“(void)” [D:\Theano\libgpuarray\build\CMakeFiles\CMakeTmp\cmTC_0bdbe.vcxproj]

    “D:\Theano\libgpuarray\build\CMakeFiles\CMakeTmp\cmTC_0bdbe.vcxproj”(默认目标) (1) ->

    (Link 目标) ->

    CheckFunctionExists.obj : error LNK2019: 无法解析的外部符号 _mkstemp,该符号在函数 _main 中被引用 [D:\Theano\libgpuarray\build\CMakeFiles\CMakeTmp\cmTC_0bdbe.vcxproj]

    D:\Theano\libgpuarray\build\CMakeFiles\CMakeTmp\Debug\cmTC_0bdbe.exe : fatal error LNK1120: 1 个无法解析的外部命令 [D:\Theano\libgpuarray\build\CMakeFiles\CMakeTmp\cmTC_0bdbe.vcxproj]

    已用时间 00:00:00.42

    不知道您有没有遇到过类似的问题,希望您能帮我看一下,小弟当不胜感激。
    另外,我在网上查到的遇到添加一个.theanorc文件,里边有对nvcc的配置,那对于theano+OpenCL还需要这个文件吗?
    祝好。

      1. 谢谢您的帮助,之前在windows上没能成功,需要装很多没有接触过的东西。后来看到网上有人在ubuntu上安装成功了,于是装了ubuntu14.04的双系统,重新试了一下。
        我在装好AMD APP SDK3.0后终端运行clinfo显示两个计算设备,一个是AMD独显,一个是CPU。但是在装libgpuarray时在cmake一步显示没有找到opencl,这是不是说AMDSDK没有配置好啊,具体输出信息如下:

        marcovaldo@marcovaldong:~/myvenv/hehe/libgpuarray/build$ cmake ..
        — The C compiler identification is GNU 4.8.4
        — Check for working C compiler: /usr/bin/cc
        — Check for working C compiler: /usr/bin/cc — works
        — Detecting C compiler ABI info
        — Detecting C compiler ABI info – done
        — Detecting C compile features
        — Detecting C compile features – done
        CUDA_TOOLKIT_ROOT_DIR not found or specified
        — Could NOT find CUDA (missing: CUDA_TOOLKIT_ROOT_DIR CUDA_NVCC_EXECUTABLE CUDA_INCLUDE_DIRS CUDA_CUDART_LIBRARY)
        — Could NOT find OpenCL (missing: OPENCL_LIBRARIES OPENCL_INCLUDE_DIRS)
        — Looking for strlcat
        — Looking for strlcat – not found
        — Looking for mkstemp
        — Looking for mkstemp – found
        — Found PkgConfig: /usr/bin/pkg-config (found version “0.26”)
        — Checking for one of the modules ‘check’
        — Configuring done
        — Generating done
        — Build files have been written to: /home/marcovaldo/myvenv/hehe/libgpuarray/build

        另外在执行THEANO_FLAGS=mode=FAST_RUN,device=opencl0:0,floatX=float32 python check1.py时报错如下:

        ERROR (theano.sandbox.gpuarray): Could not initialize pygpu, support disabled
        Traceback (most recent call last):
        File “/home/marcovaldo/myvenv/venv/local/lib/python2.7/site-packages/theano/sandbox/gpuarray/init.py”, line 95, in
        init_dev(config.device)
        File “/home/marcovaldo/myvenv/venv/local/lib/python2.7/site-packages/theano/sandbox/gpuarray/init.py”, line 46, in init_dev
        “Make sure Theano and libgpuarray/pygpu ”
        RuntimeError: (‘Wrong major API version for gpuarray:’, -9997, ‘Make sure Theano and libgpuarray/pygpu are in sync.’)

        还有,在python虚拟环境中运行pygpu.test()时报错如下:

        ERROR: Failure: GpuArrayException (Invalid value or operation: 0)

        Traceback (most recent call last):
        File “/home/marcovaldo/myvenv/venv/local/lib/python2.7/site-packages/nose/loader.py”, line 418, in loadTestsFromName
        addr.filename, addr.module)
        File “/home/marcovaldo/myvenv/venv/local/lib/python2.7/site-packages/nose/importer.py”, line 47, in importFromPath
        return self.importFromDir(dir_path, fqname)
        File “/home/marcovaldo/myvenv/venv/local/lib/python2.7/site-packages/nose/importer.py”, line 94, in importFromDir
        mod = load_module(part_fqname, fh, filename, desc)
        File “/home/marcovaldo/myvenv/venv/local/lib/python2.7/site-packages/pygpu-0.2.1-py2.7-linux-x86_64.egg/pygpu/tests/test_blas.py”, line 4, in
        from .support import (guard_devsup, gen_gpuarray, context)
        File “/home/marcovaldo/myvenv/venv/local/lib/python2.7/site-packages/pygpu-0.2.1-py2.7-linux-x86_64.egg/pygpu/tests/support.py”, line 32, in
        context = gpuarray.init(get_env_dev())
        File “pygpu/gpuarray.pyx”, line 562, in pygpu.gpuarray.init (pygpu/gpuarray.c:8359)
        File “pygpu/gpuarray.pyx”, line 508, in pygpu.gpuarray.pygpu_init (pygpu/gpuarray.c:7974)
        File “pygpu/gpuarray.pyx”, line 965, in pygpu.gpuarray.GpuContext.cinit (pygpu/gpuarray.c:12332)
        GpuArrayException: Invalid value or operation: 0

        不知道您有没有遇到过这个问题,请您再帮我看看,小弟不胜感激。

Leave a Reply

Your email address will not be published. Required fields are marked *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax