1. 程式人生 > >Caffe之win10版安裝小結--細數自己遇到的各種坑

Caffe之win10版安裝小結--細數自己遇到的各種坑

背景:

    最近翻開了《深度學習-21天實戰Caffe》作為自己Caffe的入門,看到後面章節通過python draw_net.py 可以繪出各種深度學習模型的層次圖,為了鞏固自己前面的學習知識,並加深印象,所以也來嘗試繪製。 但天不隨人願,發現自己pycaffe以及matlab等第三方介面庫都未編譯,所以此次來嘗試編譯。

   本人機器ThinkPad E430c,已屬於5年前配置了,裝個VMWare的Redhat Linux實在感覺像老牛拉車,故不得已只能現在win10上嘗試編譯Caffe。

   編譯順序:libcafffe->caffe->pycaffe->matcaffe,為何要採用這種順序?因為各工程間存在依賴關係,當然pycaffe和matcaffe是並列關係,它倆都依賴前面的編譯生成結果。  

   由於本人機器python版本混亂,現對安裝情況作簡單梳理:C盤根目錄下面安裝了兩個python版本 ;D盤先安裝了Anaconda3,Anaconda2(因始終import caffe報模組找不到動態連結庫,但pycaffe.pyd早已經存在,DLL載入失敗 故安裝Anaconda2)。

   image C盤根目錄下面兩個python版本都是較純淨的python,裡面沒有裝numpy等一系列第三方包。

WHQY(CQ`S8T2HM[V2O5V}MF D盤根目錄下面兩個Anaconda。因為之前一直用python3,導致一直用著Anaconda3,但直到最後始終找不到pycaffe.pyd,實在沒法所以又裝了Anaconda2,並且補裝了所有第三方壓縮包。

Step 0:下載相關軟體,修改配置檔案:

CUDA

下載 CUDA Toolkit 7.5https://developer.nvidia.com/cuda-toolkit)。如果你電腦沒有NVIDIA的獨立顯示卡,那麼只能選擇用CPU進行編譯,就不需要安裝CUDA,去配置檔案 .\windows\CommonSettings.props 設定<CpuOnlyBuild>false</CpuOnlyBuild> ,同時設定 <UseCuDNN>false</UseCuDNN>

cuDNN

下載 cuDNN v4 或者 cuDNN v5

https://developer.nvidia.com/cudnn)。 解壓下載的檔案到 %CUDA_PATH% (這個路徑是CUDA安裝時預設設定的一個環境變數路徑,通過【系統】-》【高階設定】-》【環境變數】就可以找到)。當然如果你沒下載CUDA,也可以直接設定<UseCuDNN>false</UseCuDNN>

cuda_7.5.18_win10.exe安裝用的系統預設路徑:C:\Program Files\NVIDIA GPU Computing Toolkit

cudnn-7.5-windows10-x64-v5.0-ga.zip 解壓到了C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5 的目錄下

修改配置CommonSettings.props檔案

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ImportGroup Label="PropertySheets" />
    <PropertyGroup Label="UserMacros">
        <BuildDir>$(SolutionDir)..\Build</BuildDir>
        <!--NOTE: CpuOnlyBuild and UseCuDNN flags can't be set at the same time.-->
        <CpuOnlyBuild></CpuOnlyBuild>
        <UseCuDNN></UseCuDNN>
        <CudaVersion>7.5</CudaVersion>
        <!-- NOTE: If Python support is enabled, PythonDir (below) needs to be
         set to the root of your Python installation. If your Python installation
         does not contain debug libraries, debug build will not work. -->
        <PythonSupport></PythonSupport>
        <!-- NOTE: If Matlab support is enabled, MatlabDir (below) needs to be
         set to the root of your Matlab installation. -->
        <MatlabSupport></MatlabSupport>
        <CudaDependencies></CudaDependencies>

        <!-- Set CUDA architecture suitable for your GPU.
         Setting proper architecture is important to mimize your run and compile time. -->
        <CudaArchitecture></CudaArchitecture>

        <!-- CuDNN 3 and 4 are supported -->
        <CuDnnPath></CuDnnPath>
        <ScriptsDir>$(SolutionDir)\scripts</ScriptsDir>
    </PropertyGroup>
    <PropertyGroup Condition="'$(CpuOnlyBuild)'=='false'">
        <CudaDependencies>cublas.lib;cuda.lib;curand.lib;cudart.lib</CudaDependencies>
    </PropertyGroup>

    <PropertyGroup Condition="'$(UseCuDNN)'=='true'">
        <CudaDependencies>cudnn.lib;$(CudaDependencies)</CudaDependencies>
    </PropertyGroup>
    <PropertyGroup Condition="'$(UseCuDNN)'=='true' And $(CuDnnPath)!=''">
        <LibraryPath>$(CuDnnPath)\cuda\lib\x64;$(LibraryPath)</LibraryPath>
        <IncludePath>$(CuDnnPath)\cuda\include;$(IncludePath)</IncludePath>
    </PropertyGroup>

    <PropertyGroup>
        <OutDir>$(BuildDir)\$(Platform)\$(Configuration)\</OutDir>
        <IntDir>$(BuildDir)\Int\$(ProjectName)\$(Platform)\$(Configuration)\</IntDir>
    </PropertyGroup>
    <PropertyGroup>
        <LibraryPath>$(OutDir);$(CUDA_PATH)\lib\$(Platform);$(LibraryPath)</LibraryPath>
        <IncludePath>$(SolutionDir)..\include;$(SolutionDir)..\include\caffe\proto;$(CUDA_PATH)\include;$(IncludePath)</IncludePath>
    </PropertyGroup>
    <PropertyGroup Condition="'$(PythonSupport)'=='true'">
        <PythonDir></PythonDir>
        <LibraryPath>$(PythonDir)\libs;$(LibraryPath)</LibraryPath>
        <IncludePath>$(PythonDir)\include;$(IncludePath)</IncludePath>
    </PropertyGroup>
    <PropertyGroup Condition="'$(MatlabSupport)'=='true'">
        <MatlabDir></MatlabDir>
        <LibraryPath>$(MatlabDir)\extern\lib\win64\microsoft;$(LibraryPath)</LibraryPath>
        <IncludePath>$(MatlabDir)\extern\include;$(IncludePath)</IncludePath>
    </PropertyGroup>
    <ItemDefinitionGroup Condition="'$(CpuOnlyBuild)'=='true'">
        <ClCompile>
            <PreprocessorDefinitions>CPU_ONLY;%(PreprocessorDefinitions)</PreprocessorDefinitions>
        </ClCompile>
    </ItemDefinitionGroup>
    <ItemDefinitionGroup Condition="'$(UseCuDNN)'=='true'">
        <ClCompile>
            <PreprocessorDefinitions>USE_CUDNN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
        </ClCompile>
        <CudaCompile>
            <Defines>USE_CUDNN</Defines>
        </CudaCompile>
    </ItemDefinitionGroup>
    <ItemDefinitionGroup Condition="'$(PythonSupport)'=='true'">
        <ClCompile>
            <PreprocessorDefinitions>WITH_PYTHON_LAYER;BOOST_PYTHON_STATIC_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
        </ClCompile>
    </ItemDefinitionGroup>
    <ItemDefinitionGroup Condition="'$(MatlabSupport)'=='true'">
        <ClCompile>
            <PreprocessorDefinitions>MATLAB_MEX_FILE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
        </ClCompile>
    </ItemDefinitionGroup>
    <ItemDefinitionGroup>
        <ClCompile>
            <MinimalRebuild>false</MinimalRebuild>
            <MultiProcessorCompilation>true</MultiProcessorCompilation>
            <PreprocessorDefinitions>_SCL_SECURE_NO_WARNINGS;USE_OPENCV;USE_LEVELDB;USE_LMDB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
            <TreatWarningAsError>true</TreatWarningAsError>
        </ClCompile>
    </ItemDefinitionGroup>
    <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
        <ClCompile>
            <Optimization>Full</Optimization>
            <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
            <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
            <FunctionLevelLinking>true</FunctionLevelLinking>
        </ClCompile>
        <Link>
            <EnableCOMDATFolding>true</EnableCOMDATFolding>
            <GenerateDebugInformation>true</GenerateDebugInformation>
            <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
            <OptimizeReferences>true</OptimizeReferences>
        </Link>
    </ItemDefinitionGroup>
    <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
        <ClCompile>
            <Optimization>Disabled</Optimization>
            <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
            <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
        </ClCompile>
        <Link>
            <GenerateDebugInformation>true</GenerateDebugInformation>
        </Link>
    </ItemDefinitionGroup>
</Project>

Step1:編譯libcafffe->caffe->pycaffe->matcaffe

libcaffe的編譯及安裝使用請參考前一篇:Win10上編譯Caffe之Libcaffe,執行mnist案例 總體還算順利。貌似加不加這個C:\Python27\include問題都不大,都可以編譯通過。

]@2QCP@~V2MA{KDT0A)E$(6

caffe包的編譯:

43EOLIH)D7822}@B$1P%G`4

0GJNH6D92[XCW%XFC8OCB4C

之前這裡只加了C:\Python27\libs, 沒有把Anaconda3下面pkgs裡面python2.7下面的libs加進來,導致一直莫名的link錯,為此困擾了好久。最終還是通過報的連結錯LNK2001,分析出還是缺少靜態依賴庫,但這時又不打算重灌python2.7,所以就找了Anaconda3下面pkgs裡面python2.7下面的libs把它加到了連結器的附加庫目錄裡面。這裡也多虧了基於Windows10 x64+visual Studio2013+Python2.7.12環境下的Caffe配置學習文章末尾的一點提示。沒明白我的C:\Python27\libs下面為何會庫不全了。

出錯資訊如下:

 1>caffe.obj : error LNK2001: 無法解析的外部符號 __imp_PyErr_Print
 1>layer_factory.obj : error LNK2001: 無法解析的外部符號 __imp_PyErr_Print
 1>libboost_python-vc120-mt-1_59.lib(function_doc_signature.obj) : error LNK2001: 無法解析的外部符號 __imp__Py_NoneStruct
 1>libboost_python-vc120-mt-1_59.lib(dict.obj) : error LNK2001: 無法解析的外部符號 __imp__Py_NoneStruct
 1>libboost_python-vc120-mt-1_59.lib(module.obj) : error LNK2001: 無法解析的外部符號 __imp__Py_NoneStruct
 1>libboost_python-vc120-mt-1_59.lib(function.obj) : error LNK2001: 無法解析的外部符號 

問題解決後終於編譯通過了。

pycaffe的編譯:吃過前面的虧,這裡就學乖了,把可能的路徑都加上了。

T8[}]$AWD)KLODANJ[((BZ7

WZI)$S2LI]QB92EZ@VRTLD6

matcaffe的編譯:

D2MAID1F)K}9UV@}[]1A7Y1

_7~5~3RXWQBRT17[)52U93W

到這裡,各類caffe所支援的介面都已經編譯成功了。

Step2:使用caffe,並draw_net

1)解決import caffe

初始使用draw.net發現import caffe報錯,資訊如下:

在未裝Anaconda2之前:

import caffe 報找不到_caffe模組,原來還要把build生成的D:\VS2012\Projects\caffe-windows\Build\x64\Release\pycaffe\caffe模組copy到D:\VS2012\Projects\caffe-windows\python\目錄下。這之後,又報

File "D:\VS2012\Projects\caffe-windows\python\caffe\pycaffe.py", line 13, in
from ._caffe import Net, SGDSolver, NesterovSolver, AdaGradSolver,
ImportError: DLL load failed:

這個問題又折騰很久,始終想嘗試不安裝Anaconda2繞過,但最終沒有其他途徑來解決,只能安裝Anaconda2,同時還copy了一份caffe放到了D:\Anaconda2\Lib\site-packages\ 下面。

本以為大功告成,import caffe還出現ImportError: No module named google.protobuf. 知道是沒安裝protobuf,但是用pip install protobuf總是提示已經安裝了protobuf,原來前些日子,安裝tensorflow windows版的時候把protobuf已經預裝到Anaconda3目錄下的lib\sitepackages下面了,但是現在用python2.7卻引用不到這個包(每次pip install總告知已安裝protobuf),想在Anaconda2下的python2.7下面安裝並使用該包,應在D:\Anaconda2\Scripts 下面執行pip install protobuf。這樣就會呼叫該目錄下的pip指令碼來安裝protobuf到python2.7下面了。在D:\Anaconda2\Lib\site-packages下面查看了,終於有google\protobuf了。

至此終於可以import caffe成功了。

2)draw_net

終於可以打算用draw_net.py畫圖了,發現還缺pydot,於是又裝了pydot。但是呼叫draw_net.py畫圖時發現報:“Exception: "dot.exe" not found in path.”

先去這個網址http://www.graphviz.org/Download_windows.php將graphviz-2.38.msi下下來,進行安裝,可以發現它的bin目錄下有這個我們需要的dot.exe,將這個bin目錄新增到系統的環境變數中去即可,再pip install pygraphviz即可。

這裡我把graphviz-2.38.msi的安裝路徑D:\Program Files (x86)\Graphviz2.38\bin新增到了系統目錄,但是在pip install pygraphviz的時候有報錯(不管了)。使用draw_net.py的時候還是報Exception: "dot.exe" not found in path.”看來必須重啟電腦,才能使環境變數生效。重啟後果然一切都搞定了。

執行:

D:\VS2012\Projects\caffe-windows\python>python draw_net.py D:\VS2012\Projects\caffe-windows\models\bvlc_reference_caffenet\train_val.prototxt caffenet.png
Drawing net to caffenet.png

D:\VS2012\Projects\caffe-windows\python>python draw_net.py D:\VS2012\Projects\caffe-windows\models\bvlc_alexnet\train_val.prototxt alexnet.png
Drawing net to alexnet.png

D:\VS2012\Projects\caffe-windows\python>python draw_net.py D:\VS2012\Projects\caffe-windows\models\bvlc_googlenet\train_val.prototxt googlenet.png
Drawing net to googlenet.png

D:\VS2012\Projects\caffe-windows\python>python draw_net.py D:\VS2012\Projects\caffe-windows\models\bvlc_reference_rcnn_ilsvrc13\deploy.prototxt rcnn.png
Drawing net to rcnn.png

D:\VS2012\Projects\caffe-windows\python>python draw_net.py D:\VS2012\Projects\caffe-windows\examples\mnist\lenet_train_test.prototxt lenet5.png
Drawing net to lenet5.png

D:\VS2012\Projects\caffe-windows\python>python draw_net.py D:\VS2012\Projects\caffe-windows\examples\mnist\mnist_autoencoder.prototxt mnist_ae.png
Drawing net to mnist_ae.png

D:\VS2012\Projects\caffe-windows\python>python draw_net.py D:\VS2012\Projects\caffe-windows\examples\cifar10\cifar10_full_sigmoid_train_test_bn.prototxt cifar10_full_sigmoid_bn.png
Drawing net to cifar10_full_sigmoid_bn.png

caffenet:

caffenet

mnist_ae:

mnist_ae

總結:開源軟體caffe的windows安裝需要有耐心,解決一個又一個坑,在對軟體不熟悉的前提下,解決問題的過程也是慢慢了解這個新軟體的學習過程,在時間允許的條件下可以慢慢嘗試分析各種可能原因。