你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
在 Linux 上设置CNTK
CNTK生产生成和测试配置
CNTK可能会在许多 Linux 配置中成功运行,但如果你想避免可能的兼容性问题,你可能熟悉CNTK生产生成和测试配置,其中列出了我们使用的所有依赖项组件和组件版本。
CNTK为 Docker 容器
在进一步移动之前,可以考虑将CNTK部署为 Docker 容器。 读取 相应的部分。
当前限制和预防措施
请在继续系统配置之前仔细阅读本部分。 以下信息可能会节省很多时间,否则在生成错误调试上花费了很多时间。
注意
此页面假定你正在尝试生成CNTK的主分支。
配置和生成文件脚本中的预期组件位置
目前 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,请使用:
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
我们使用协议缓冲区进行序列化。 若要安装,请执行以下步骤:
- Install the required packages using
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 安装到其他路径, INSTALL
请参阅 libzip 分发文件夹中的根目录中的说明。
但是请注意,在这种情况下,必须手动编辑configure
用于Makefile
支持此路径的CNTK。
使用以下命令:
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
提升库
提升库是构建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 特定包
如果要将CNTK与 GPU 支持配合使用,请按照此页面相应地安装和配置环境。
可选。 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 python 环境 (调用
cntk-py36
,cntk-py35
或cntk-py27
) 可以使用以下命令使用最新的所需包更新它:
# 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 环境,则可以 CNTK在基于 Python 环境的 Python 2.7、3.5 或 3.6 之间进行选择。
- 使用以下命令 之一 在现有 Python 3.5 Anaconda 或 Miniconda 安装中创建所选的 Python 环境,具体取决于所需的 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 环境。
例如,如果具有基于 Python 3.5 的环境,请运行以下命令 cntk-py35
:
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 环境并且 Python 环境位于$HOME/anaconda3/envs/cntk-py35
提供以下附加参数:configure
--with-swig=/usr/local/swig-3.0.10 --with-py35-path=$HOME/anaconda3/envs/cntk-py35
- 之后,像往常一样运行生成CNTK Python 模块
bindings/python/cntk
,并在生成输出文件夹的子文件夹中生成包 (.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]/Tutorials
或[CNTK clone root]/Examples
目录中运行 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) ,但在 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
传递给配置命令。
生成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 ID 可能有所不同。 该 deviceId
参数定义要用于计算的处理器。
-
deviceId=-1
表示使用 CPU。 默认值 -
deviceId=X
其中 X 是整数 >=0 表示使用 GPU X,即deviceId=0
表示 GPU 0 等。 -
deviceId=auto
表示使用 GPU,自动选择 GPU
参与CNTK代码
如果计划修改代码,则应阅读 有关开发和测试的信息。
后续步骤