在 Linux 上設定CNTK
CNTK生產組建和測試組態
CNTK可能會在許多 Linux 設定中順利執行,但如果您想要避免可能的相容性問題,您可能會熟悉CNTK生產組建和測試組態,其中列出我們使用的所有相依性元件和元件版本。
以 Docker 容器CNTK
在進一步移動之前,您可以考慮將CNTK部署為 Docker 容器。 讀取 對應的區段。
目前的限制和預防措施
請先仔細閱讀本節,再繼續進行系統設定。 下列資訊可能會節省您許多時間,否則會花費在建置錯誤偵錯上。
注意
此頁面假設您嘗試建置CNTK的主要分支。
設定和 Makefile 腳本中的預期元件位置
現今 configure
和 Makefile
腳本僅支援本節所列所有相依性元件的有限安裝路徑集。 我們知道,這是一項限制, (而且如果您覺得想要自行改善這些腳本,並 提交建議的變更 ,歡迎使用您的協助,並且非常感謝您的) 。
configure
在腳本內定義的變數中 default_path_list
,尋找所有相依性元件。
重要
如果您想要修改 default_path_list
中的 configure
變數,以新增特定相依性元件的自訂路徑,請務必檢查 的 Makefile
對應項區段。 否則,您可能會因為找不到 INCLUDE 檔案、程式庫等而收到建置錯誤。
相依性元件的安裝方法和路徑
以下列出建置CNTK所需的所有相依性元件,並說明如何安裝它們。 我們瞭解有許多其他方法可以取得相同的元件。 不過,如果您偏好替代安裝方式,請確定 您得到相同的專案,因為通常是替代安裝來源,也就是網路散發套件 (,例如 Debian、RPM 等) 包含舊版的軟體、遺漏某些程式庫等等。在以下幾節中,我們特別強調這些限制,但請將其視為一般預防措施。
使用方式 make -j
在大部分的章節中,我們建議使用 命令來叫用 make -j
平行建置作業,進而增加建置程式的速度。 不過請注意,在某些系統上 ,特別是 使用 make -j
的虛擬機器,可能會導致「記憶體不足」錯誤。 如果您遇到這個問題,只要使用「純文字」 make
或限制同時執行的作業數目, (兩個同時作業通常適用于大部分的系統 ,請使用 命令 make -j 2
) 。
同時安裝相同開發套件的不同版本
如果您想要在相同系統上安裝一些開發套件,請非常小心。 這可能會導致非常難以偵錯組建錯誤,因為您可以在這篇文章中看到。
現在讓我們繼續進行設定。
如果您想要知道CNTK生產環境中所使用的必要條件設定,也就是我們在內部用來建置和測試的內容,請參閱本節
64 位 OS
您需要 64 位 Linux 安裝才能使用 CNTK。
C++ 編譯器
請確定您的安裝具有 C++ 編譯器。 許多散發套件預設不會包含它。 請參閱您的平臺檔,以瞭解如何檢查並取得 C++ 編譯器。
範例:針對 Ubuntu,請執行下列命令:
dpkg --list | grep compiler
如果您在輸出中看不到類似的內容
g++-5 5.4.0-6ubuntu1~16.04.5 amd64 GNU C++ compiler
則不會安裝 C++ 編譯器。 如果您有 Ubuntu 1604,請使用下列專案安裝 gcc 5.4:
sudo apt-get install g++
Git
如 這裡所述,在您的系統上安裝 Git。
MKL
預設的CNTK數學程式庫是 Intel 數學核心程式庫, (Intel MKL) 。 遵循 此頁面 進行安裝
開啟 MPI
我們建議從來源安裝,如下所示,因為許多散發套件包含較舊的版本,並遺漏CNTK所需的程式庫。 目前的CNTK Open MPI 版本需求至少為1.10。 請檢查您的系統上是否有較舊的版本安裝,以及您是否這麼做,請將其卸載,或確保透過 (,例如符號連結) CNTK建置程式正在使用所需的版本。 否則,您可能會難以偵錯組建錯誤,如 本文所示。
- 取得安裝來源:
wget https://www.open-mpi.org/software/ompi/v1.10/downloads/openmpi-1.10.3.tar.gz
- 在此範例中,將 Open MPI (解壓縮、建置並安裝至
/usr/local/mpi
) :
tar -xzvf ./openmpi-1.10.3.tar.gz
cd openmpi-1.10.3
./configure --prefix=/usr/local/mpi
make -j all
sudo make install
- 將下列環境變數新增至目前的會話,而設定檔
.bashrc
(新增路徑之前,可確保此版本是使用,而不是透過 OS) 提供的預設版本:
export PATH=/usr/local/mpi/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/mpi/lib:$LD_LIBRARY_PATH
Protobuf
我們使用通訊協定緩衝區進行序列化。 如需安裝,請遵循下列步驟:
- 使用 安裝必要的套件
sudo apt-get install autoconf automake libtool curl make g++ unzip
- 下載並解壓縮 protobuf 來源
wget https://github.com/google/protobuf/archive/v3.1.0.tar.gz
tar -xzf v3.1.0.tar.gz
- 編譯 protobuf
cd protobuf-3.1.0
./autogen.sh
./configure CFLAGS=-fPIC CXXFLAGS=-fPIC --disable-shared --prefix=/usr/local/protobuf-3.1.0
make -j $(nproc)
sudo make install
ZLIB
zlib 今天是許多熱門 Linux 散發套件的一部分,因此您預先安裝的機率很高。 不過請注意, libzip 需要 zlib 1.1.2 版或更新版本 ,這通常不會預先安裝。 zlib 必須先安裝,才能在下方建置 Boost。
請參閱您的平臺檔,以瞭解如何取得所需的 zlib 套件,或直接從 zlib 網站取得。
範例:針對 Ubuntu,請使用下列命令:
sudo apt-get install zlib1g-dev
LIBZIP
libzip 可在不同的網路散發套件中使用,但我們發現其中許多套件都包含舊版本。 使用這些版本可能會導致建置錯誤。 因此,強烈建議從來源建置 libzip,如下所示。
請注意,下列程式會將 libzip 安裝至 /usr/local
。 這是CNTK建置程式預期 (請參閱此頁面開頭的確切位置,以取得詳細資料) 。 如果您想要將 libzip 安裝至不同的路徑,請參閱 libzip 散發資料夾根目錄中檔案中的 INSTALL
指示。
不過請注意,在此情況下,您必須手動編輯 configure
支援此路徑之 CNTK 的 AND Makefile
。
使用下列命令:
wget http://nih.at/libzip/libzip-1.1.2.tar.gz
tar -xzvf ./libzip-1.1.2.tar.gz
cd libzip-1.1.2
./configure
make -j all
sudo make install
將下列環境變數新增至您目前的會話和設定檔 .bashrc
:
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
Boost 程式庫
Boost 程式庫是建置Microsoft Cognitive Toolkit的必要條件。 請遵循下列步驟,在您的系統上安裝 Boost 程式庫:
sudo apt-get install libbz2-dev
sudo apt-get install python-dev
wget -q -O - https://sourceforge.net/projects/boost/files/boost/1.60.0/boost_1_60_0.tar.gz/download | tar -xzf -
cd boost_1_60_0
./bootstrap.sh --prefix=/usr/local/boost-1.60.0
sudo ./b2 -d0 -j"$(nproc)" install
GPU 特定套件
如果您想要搭配 GPU 支援使用CNTK,請遵循此頁面來據以安裝和設定環境。
選擇性。 SWIG。
如果您想要利用 Python 的CNTK,您必須安裝SWIG。
SWIG 也需要建置適用于 JAVA 的CNTK評估程式庫。
若要安裝,請執行腳本: [CNTK clone root]/Tools/devInstall/Linux/install-swig.sh
。
這會在 資料夾中 /usr/local/swig-3.0.10
建立已安裝的版本。
選擇性。 CNTK v2 Python 支援
本節說明如何使用 Python 支援建置 CNTK v2。
步驟 1:建置 Python API
- 如果您尚未這麼做,請安裝 SWIG 工具 。
- 安裝 Anaconda3 4.1.1 (64 位)
- 如果您已經有稱為 、
cntk-py35
或cntk-py27
) 的 CNTK Python 環境 (cntk-py36
,您可以使用下列命令,以最新的必要套件加以更新:
# For cntk-py36:
conda env update --file [CNTK clone root]/Scripts/install/linux/conda-linux-cntk-py36-environment.yml --name cntk-py36
# For cntk-py35:
conda env update --file [CNTK clone root]/Scripts/install/linux/conda-linux-cntk-py35-environment.yml --name cntk-py35
# For cntk-py27:
conda env update --file [CNTK clone root]/Scripts/install/linux/conda-linux-cntk-py27-environment.yml --name cntk-py27
- 如果您還沒有CNTK Python 環境,您可以在 Python 2.7、3.5 或 3.6 型CNTK Python 環境之間進行選擇。
- 根據您的所需Python 版本,在現有的 Python 3.5 Anaconda 或 Miniconda 安裝中建立您選擇的 Python 環境:
# For a Python 3.6 based version:
conda env create --file [CNTK clone root]/Scripts/install/linux/conda-linux-cntk-py36-environment.yml
# For a Python 3.5 based version:
conda env create --file [CNTK clone root]/Scripts/install/linux/conda-linux-cntk-py35-environment.yml
# For a Python 2.7 based version:
conda env create --file [CNTK clone root]/Scripts/install/linux/conda-linux-cntk-py27-environment.yml
注意:請確定已針對上述指示的其餘部分啟用或更新的 Python 環境。
例如,如果您有名為 cntk-py35
的 Python 3.5 型環境,請執行此命令:
source activate cntk-py35
同樣地,適用于 Python 3.6 或 2.7 型環境。
步驟 2:卸載先前的CNTK套件
- 如果您先前已在電腦上安裝任何版本的 CNTK pip-package,請執行下列命令將其卸載:
pip uninstall cntk
步驟 3:建置 Python 套件
- 若要使用 Python 設定組建,請在執行
configure
時包含這兩個選項:
--with-swig[=directory]
和下列 其中一個 (適用于您環境的任何) :
--with-py36-path[=directory]
--with-py35-path[=directory]
--with-py27-path[=directory]
- 此階段僅支援發行組建。 例如,如果您將 SWIG 安裝至
/usr/local/swig-3.0.10
,而 Python 環境位於$HOME/anaconda3/envs/cntk-py35
提供下列其他參數給configure
:
--with-swig=/usr/local/swig-3.0.10 --with-py35-path=$HOME/anaconda3/envs/cntk-py35
- 之後,執行 make 就像平常一樣,它會在 內
bindings/python/cntk
建置 CNTK Python 模組,並在組建輸出檔案夾的子資料夾中產生套件 (.whl) (,例如build/gpu/release/python
) 。
cd [CNTK clone root]
export PYTHONPATH=$PWD/bindings/python:$PYTHONPATH
cd [CNTK clone root]/bindings/python
export LD_LIBRARY_PATH=$PWD/cntk/libs:$LD_LIBRARY_PATH
注意
相較于 Pip 套件安裝所顯示的安裝程式,我們在這裡會從CNTK存放庫複製載入CNTK模組,而不是作為 Python 環境中的已安裝套件。 (因此,設定) 的差異 PYTHONPATH
步驟 4:驗證設定
Python
- 從 或
[CNTK clone root]/Examples
目錄內[CNTK clone root]/Tutorials
執行 Python 範例,以確認您的安裝。 例如,移至 資料夾[CNTK clone root]/Tutorials/NumpyInterop
並執行python FeedForwardNet.py
。 您應該會在主控台上看到下列輸出:
Minibatch: 0, Train Loss: 0.7915553283691407, Train Evaluation Criterion: 0.48
Minibatch: 20, Train Loss: 0.6266774368286133, Train Evaluation Criterion: 0.48
Minibatch: 40, Train Loss: 1.0378565979003906, Train Evaluation Criterion: 0.64
Minibatch: 60, Train Loss: 0.6558118438720704, Train Evaluation Criterion: 0.56
選擇性。 OpenCV
CNTK 2.2 需要安裝OpenCV 電腦視覺 (OpenCV) ,但在 CNTK 2.3 之後是選擇性的。 遵循 此頁面 進行安裝
選擇性。 Java
若要建置CNTK評估程式庫的 JAVA 系結,如果您尚未這麼做,請安裝SWIG 工具。 此外,需要 JAVA 開發工具組 (JDK) 。 目前我們使用 64 位 OpenJDK 8。
如果預設找不到 JDK 目錄,設定腳本會提供 --with-jdk
手動指定 JDK 目錄的選項。
取得原始程式碼CNTK
在繼續之前,請注意,如果您打算修改CNTK程式碼,您應該閱讀開發和測試的相關資訊。
使用Git複製CNTK存放庫並存取原始程式碼:
git clone --recursive https://github.com/Microsoft/cntk
cd cntk
Submodule Multiverso 用於啟用 DataParallelASGD 以進行定型。
選 如果您不需要 DataParallelASGD 支援,請將 選項 --asgd=no
傳遞至 configure 命令。
建置CNTK
若要建置CNTK請使用下列命令, (我們假設CNTK存放庫已複製到 ~/Repos/cntk
) :
cd ~/Repos/cntk
mkdir build/release -p
cd build/release
../../configure
請確定 configure
輸出對應至您在上一節中安裝的套件。 亦即,如果已安裝,請確定 configure
會尋找 CUDA 等等。
執行下列動作以使用所有核心建置CNTK,以將建置時間降到最低。 請注意,在某些電腦上,這會導致系統在建置期間停止回應或中斷。
make -j all
如果上述內容讓您的電腦超載,請嘗試指定較少的核心。 例如,如果您有 2 個以上的核心,而且想要讓 2 個核心不受組建限制,您可以嘗試:
make -j"$(($(nproc) - 2))" all
如果您想要絕對安全,只要使用 1 核心:
make all
這應該會產生 CNTK 的版本組建。 如果您想要在叫 configure
用 時使用下列參數來取得偵錯組建:
../../configure --with-buildtype=debug
快速測試CNTK建置功能
為了確保CNTK在您的系統中正常運作,您可以從Hello World - 羅吉斯回歸教學課程快速執行範例。 此範例會訓練簡單的網路,並可導向使用 CPU 或 GPU,這有助於快速確保CNTK正常運作。
我們假設CNTK存放庫已複製到 ~/Repos/cntk
,並 build/release
用來作為組建的子目錄。
- 提供CNTK二進位檔的路徑,並變更為
Tutorials/HelloWorld-LogisticRegression
目錄:
export PATH=$HOME/Repos/cntk/build/release/bin:$PATH
cd ~/Repos/cntk/Tutorials/HelloWorld-LogisticRegression
首先,請嘗試下列範例:
cntk configFile=lr_bs.cntk makeMode=false
如果範例執行,亦即,如果沒有錯誤訊息,您會先取得與讀取組態相關的輸出,後面接著實際網路定型的輸出。
嘗試使用 GPU CNTK
如果您為 GPU 使用量建置CNTK,請嘗試執行下列命令來使用 GPU:
cntk configFile=lr_bs.cntk makeMode=false deviceId=auto
在輸出的開頭附近,您應該會看到一行確認已使用 GPU:
Model has 9 nodes. Using GPU 0.
請注意,GPU 識別碼可能不同。 參數 deviceId
會定義要用於計算的處理器。
-
deviceId=-1
表示使用 CPU。 預設值 -
deviceId=X
其中 X 是整數 > =0 表示使用 GPU X,也就是deviceId=0
GPU 0 等等。 -
deviceId=auto
表示使用 GPU,自動選取 GPU
參與CNTK程式碼
如果您打算修改程式碼,您應該閱讀 開發和測試的相關資訊。
後續步驟