你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Linux 上设置CNTK

CNTK生产生成和测试配置

CNTK可能会在许多 Linux 配置中成功运行,但如果你想避免可能的兼容性问题,你可能熟悉CNTK生产生成和测试配置,其中列出了我们使用的所有依赖项组件和组件版本。

CNTK为 Docker 容器

在进一步移动之前,可以考虑将CNTK部署为 Docker 容器。 读取 相应的部分

当前限制和预防措施

请在继续系统配置之前仔细阅读本部分。 以下信息可能会节省很多时间,否则在生成错误调试上花费了很多时间。

注意

此页面假定你正在尝试生成CNTK的主分支。

配置和生成文件脚本中的预期组件位置

目前 configureMakefile 脚本仅支持本节中列出的所有依赖项组件的有限安装路径集。 我们知道,这是一个限制,并且会很快修复它 (,如果你觉得自己改进这些脚本,并 提交建议的更改, 你的帮助是欢迎的,非常感谢) 。

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

(Open 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-py36cntk-py35cntk-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代码

如果计划修改代码,则应阅读 有关开发和测试的信息。

后续步骤