英特尔® Theano*软件优化包和英特尔® Python* 分发包入门指南

目录

总结

Theano 是 LISA 实验室开发的 Python* 库,用于定义、优化和评估数学表达式,包括带有多维阵列 (numpy.ndarray) 的数学表达式。 为了优化英特尔® 架构,支持英特尔® 数学核心函数库 (Intel® MKL) 2017,英特尔推出了基于 Theano 0.0.8rc1 的英特尔® Theano*软件优化包。 英特尔 MKL 的最新版包括针对英特尔® 高级矢量扩展指令集 2(英特尔® AVX2)和AVX-512 指令的优化,英特尔® 至强® 处理器和英特尔® 至强融核™ 处理器均支持这些指令。

Theano 可以在各种平台安装使用,支持不同开发工具和库的组合。 关于如何利用英特尔® 编译器和英特尔 MKL 2017 在基于 CentOS* 和 Ubuntu* 的系统构建和安装英特尔® Theano*软件优化包,本教程会提供详细步骤。 通过运行常见的行业标准性能指标评测(如 MNIST*、DBN-Kyoto*、LSTM* 和 ImageNet*)来进一步验证安装。

前提条件

英特尔® 编译器和英特尔®数学核心函数库 2017

本教程假定已经安装并验证英特尔编译器(C/C++ 和 Fortran)。 如果没有,请下载并安装英特尔编译器,可以作为 英特尔® Parallel Studio XE 的组件安装,也可以独立安装。

使用英特尔® Python* 分发包时,可以选择是否安装英特尔 MKL 2017。 对于其他的 Python 分发包,英特尔 MKL 2017 可以作为英特尔 Parallel Studio XE 2017 的组件下载,也可以使用社区许可免费下载安装。 请点击 此处 免费注册社区许可,并按照安装说明进行下载。

Python* 工具

英特尔® Python* 分发包支持用户随时获取工具和技术,这些工具和技术经过精心的设计和验证,能够在英特尔架构上实现更高的性能。因此,本教程使用英特尔® Python* 分发包。 可以直接使用英特尔优化的预编译工具,如 NumPy* 和 SciPy*,不需要构建和安装。 

英特尔® Python* 分发包可以作为 英特尔 Parallel Studio XE 的组件下载,也可以点击 此处 免费下载。

英特尔® Python* 分发包的安装过程如下所示。 本文假设 Python 安装在本地用户账户。

Python 2.7
tar -xvzf l_python27_p_2017.0.028.tgz
cd l_python27_p_2017.0.028
./install.sh

Python 3.5
tar -xvzf l_python35_p_2017.0.028.tgz
cd l_python35_p_2017.0.028
./install.sh

使用 anaconda,按照以下步骤创建独立的用户环境。 通过以下指令,安装所需的 NumPy、SciPy 和 Cython 程序包。 

Python 2.7
conda create -n pcs_theano_2 -c intel python=2 numpy scipy cython
source activate pcs_theano_2

Python 3.5
conda create -n pcs_theano_2 -c intel python=3 numpy scipy cython
source activate pcs_theano_2

或者,可以按照附录 A的源代码,构建并安装 NumPy 和 SciPy。 如果使用非英特尔® Python* 分发包,需要安装其它 python 开发工具,安装步骤详见本文。

 

构建和安装英特尔® Theano*软件优化包

利用以下存储库,查看并安装针对英特尔架构的 theano 优化包分支。

git clone https://github.com/intel/theano.git theano
cd theano
python setup.py build
python setup.py install
theano-cache clear

下面给出 Theano 配置文件的示例,以供参考。 要使用英特尔编译器,并指定与 Theano 一起使用的编译器标志,请在用户的主目录创建该文件的副本。

vi ~/.theanorc

[cuda]
root = /usr/local/cuda

[global]
device = cpu
floatX = float32
cxx = icpc
mode = FAST_RUN
openmp = True
openmp_elemwise_minsize = 10
[gcc]
cxxflags = -qopenmp -march=native -O3 -vec-report3 -fno-alias -opt-prefetch=2 -fp-trap=none
[blas]
ldflags = -lmkl_rt

 

验证 Theano 和 NumPy 安装

Theano 和 NumPy 库导入 python 后,必须验证引用的版本。 本文引用的 Theano 和 NumPy 的版本按照如下方法验证:  

python -c "import numpy; print (numpy.__version__)"
->1.11.1
python -c "import theano; print (theano.__version__)"
-> 0.9.0dev1.dev-*

还需要验证 Theano 和 NumPy 的安装版本是否使用英特尔 MKL。

python -c "import theano; print (theano.numpy.show_config())"

NumPy_Config

图 1。 theano.numpy.show_config() 的预期结果

 

性能指标评测

theano/democase 目录下可以找到 DBN-Kyoto 和 ImageNet 的性能指标评测。

DBN-Kyoto

采集数据集,并运行 DBN-Kyoto

从 Dropbox 中为 DBN-Kyoto 下载样本数据集,链接地址:https://www.dropbox.com/s/ocjgzonmxpmerry/dataset1.pkl.7z?dl=0. 将文件解压,并保存到theano/democase/DBN-Kyoto 目录。

前提条件

可以使用 Anaconda 安装关联组件,用于训练 DBN-Kyoto,也可以利用工具目录中的已有资源构建关联组件。 由于 pandas 库和 Python 3 存在冲突,性能指标评测只是经过 Python 2.7 验证。

Python 2.7
conda install -c intel --override-channels pandas
conda install imaging

也可以利用 附录 B中的源代码安装关联组件。

在 CPU 上运行 DBN-Kyoto

可以用 run.sh 脚本下载数据集(如果数据集不存在的话),并开始训练。.

cd theano/democase/DBN-Kyoto/
./run.sh

 

MNIST

本文展示了如何使用 Lasagne 在 MNIST 中训练神经网络。Lasagne 是一个轻型库,用于在 Theano 中构建并训练神经网络。 利用英特尔编译器构建并安装 Lasagne 库。

下载 MNIST 数据库

如欲下载 MNIST 数据库,请点击 http://yann.lecun.com/exdb/mnist/。 下载图像和标签,以训练并验证数据。 

安装 Lasagne 库

构建并安装新版 Lasagne 库,请使用如下的 Lasagne git 存储库。

Python 2.7 and Python 3.5
git clone https://github.com/Lasagne/Lasagne.git
cd Lasagne
python setup.py build
python setup.py install

训练

cd Lasagne/examples
python mnist.py [model [epochs]]
                    --  where model can be mlp - simple multi layer perceptron (default) or 
                         cnn - simple convolution neural network.
                         and epochs = 500 (default)

 

AlexNet

采集 ImageNet 数据集,以训练 AlexNet。

ImageNet 数据集可从 image-net 网站 上获取。 

前提条件

可以使用 Anaconda 安装用于训练 AlexNet 的关联组件,也可以在 fedora epel 源资源库中安装。 目前,只有 Python 2 支持 Hickle(预处理数据所必需的关联组件),Python 3 不支持。

  • 利用 Anaconda 安装 h5py、pyyaml 和 pyzmq:
conda install h5py 
conda install -c intel --override-channels pyyaml pyzmq
  • 安装 Hickle (基于 HDF5 的 Pickle 的克隆版本):
git clone https://github.com/telegraphic/hickle.git
cd hickle
python setup.py build
python setup.py install

也可以利用 附录 B中的源代码安装关联组件

预处理 ImageNet 数据集

转储 Hickle 文件,创建训练、验证数据的标签,首先需要预处理

  • 在预处理目录中修改 paths.yaml 文件,以更新数据集的路径。 给出 paths.yaml 文件的一个示例,以供参考。
cat theano/democase/alexnet_grp1/preprocessing/paths.yaml

train_img_dir: '/mnt/DATA2/TEST/ILSVRC2012_img_train/'
# the dir that contains folders like n01440764, n01443537, ...

val_img_dir: '/mnt/DATA2/TEST/ILSVRC2012_img_val/'
# the dir that contains ILSVRC2012_val_00000001~50000.JPEG

tar_root_dir: '/mnt/DATA2/TEST/parsed_data_toy'  # dir to store all the preprocessed files
tar_train_dir: '/mnt/DATA2/TEST/parsed_data_toy/train_hkl'  # dir to store training batches
tar_val_dir: '/mnt/DATA2/TEST/parsed_data_toy/val_hkl'  # dir to store validation batches
misc_dir: '/mnt/DATA2/TEST/parsed_data_toy/misc'
# dir to store img_mean.npy, shuffled_train_filenames.npy, train.txt, val.txt

meta_clsloc_mat: '/mnt/DATA2/imageNet-2012-images/ILSVRC2014_devkit/data/meta_clsloc.mat'
val_label_file: '/mnt/DATA2/imageNet-2012-images/ILSVRC2014_devkit/data/ILSVRC2014_clsloc_validation_ground_truth.txt'
# although from ILSVRC2014, these 2 files still work for ILSVRC2012

# caffe style train and validation labels
valtxt_filename: '/mnt/DATA2/TEST/parsed_data_toy/misc/val.txt'
traintxt_filename: '/mnt/DATA2/TEST/parsed_data_toy/misc/train.txt'

如欲创建 Toy 数据集,可以使用现有的脚本 - generate_toy_data.sh1

cd theano/democase/alexnet_grp1/preprocessing
chmod u+x make_hkl.py make_labels.py make_train_val_txt.py
./generate_toy_data.sh

在 CPU 上训练 AlexNet

  • 修改 config.yaml 文件,以更新预处理数据集的路径:
cd theano/democase/alexnet_grp1/

# Sample changes to the path for input(label_folder, mean_file) and output(weights_dir)
label_folder: /mnt/DATA2/TEST/parsed_data_toy/labels/
mean_file: /mnt/DATA2/TEST/parsed_data_toy/misc/img_mean.npy
weights_dir: ./weight/  # directory for saving weights and results
  • 以同样的方式修改 spec.yaml 文件,以更新解析 toy 数据集的路径:
# Directories
train_folder: /mnt/DATA2/TEST/parsed_data_toy/train_hkl_b256_b256_bchw/
val_folder: /mnt/DATA2/TEST/parsed_data_toy/val_hkl_b256_b256_bchw/
  • 开始训练:
./run.sh

大型电影评论数据集 (IMDB)

大型电影评论数据集是利用长期短期存储器 (LSTM) 模型的重复神经网络。 使用 LSTM 模型,IMDB 数据集对电影评论进行情绪分析。

采集数据集:

如欲获取 imdb.pkl 文件,请访问 http://www-labs.iro.umontreal.ca/~lisa/deep/data/,并解压缩到本地文件夹。

预处理

http://deeplearning.net/tutorial/lstm.html 页面提供 2 个脚本:

Imdb.py – 加载 IMDB 数据集的预处理。

Lstm.py – 定义、训练模型的主要脚本。

复制上述两个文件,存放到 imdb.pkl 所在的文件夹。

训练

执行如下命令,开始训练:

THEANO_FLAGS="floatX=float32" python lstm.py

故障排除

错误 1: 在有些情况下,会出现无法打开的错误,如 libmkl_rt.so 和 libimf.so。 在这种情况下,进行如下操作:

find /opt/intel -name library_name.so

添加路径,转到 /etc/ ld.so.conf 文件,运行 ldconfig 命令以链接到库。 同时,要保证在 LD_LIBRARY_PATH 环境变量中正确设置 MKL 安装路径。

错误 2: toy 数据的 AlexNet 的预处理错误

python make_hkl.py toy
generating toy dataset ...
Traceback (most recent call last):
  File "make_hkl.py", line 293, in <module>
    train_batchs_per_core)
ValueError: xrange() arg 3 must not be zero

目前,用于预处理 ImageNet 的默认进程数量设为 16。 toy 数据集会产生多余的进程,导致应用崩溃。 若要解决这个问题,在 Alexnet_CPU/preprocessing/make_hkl.py:258 文件中,把进程数量改为 2 个。 在预处理整个数据集时,建议提高 num_process 的数值,以提升预处理的速度。

num_process = 2

错误 3: 利用 Conda 安装英特尔® Python* 分发包时,引用 Numpy 的最新版本。

如果您的英特尔® Python* 分发包不是通过英特尔® Python* 分发包安装程序安装的,而是在 Conda 内安装的,请把 PYTHONNOUSERSITE 的环境变量设置为 True。 目的是确保 Conda 环境引用正确的 Numpy 版本。 这是 Conda 的已知错误。 如欲了解更多信息,请点击此处

export PYTHONNOUSERSITE=True

资源

附录 A

为其他 Python 分发包安装 Python* 工具

CentOS:
Python 2.7 - sudo yum install python-devel python-setuptools
Python 3.5 - sudo yum install python35-libs python35-devel python35-setuptools
//Note - Python 3.5 packages can be obtained from Fedora EPEL source repository
Ubuntu:
Python 2.7 - sudo apt-get install python-dev python-setuptools
Python 3.5 - sudo apt-get install libpython3-dev python3-dev python3-setuptools
  • 如果系统没有安装 pip 和 cython,请执行如下命令以完成安装:
sudo -E easy_install pip
sudo -E pip install cython

 

安装 NumPy

NumPy 是用于 Python 的科学计算的基础软件包。 软件包包含:

  1. 强大的 n 维度阵列对象
  2. 高级(广播)函数
  3. 集成 C/C++ 和 Fortran 编码的工具
  4. 实用的线性代数、傅立叶变换和随机数功能

注: 通过验证、删除相关文件,可以删除旧版的 NumPy 库。 然而,本教程剩余的库将安装在用户的本地目录中,所以这一步是可选的。 如果需要的话,旧版可按如下步骤清除:

  • 验证旧版是否存在:
python -c "import numpy; print numpy.version"
<module 'numpy.version' from '/home/plse/.local/lib/python2.7/site-packages/numpy-1.11.0rc1-py2.7-linux-x86_64.egg/numpy/version.pyc'>
  • 删除之前安装的 NumPy 程序包:
rm -r /home/plse/.local/lib/python2.7/site-packages/numpy-1.11.0rc1-py2.7-linux-x86_64.egg
  • 构建并安装针对英特尔架构优化的 NumPy:
git clone https://github.com/pcs-theano/numpy.git
//update site.cfg file to point to required MKL directory. 如果 parallel studio 或 MKL 安装在默认 /opt/intel  directory. 
python setup.py config --compiler=intelem build_clib --compiler=intelem build_ext --compiler=intelem install --user,这一步骤是可选的。

 

安装 SciPy

SciPy 是开源 Python 库,用于科学计算和技术计算。 SciPy 包含优化模块、线性代数、集成、插值、特殊函数、FFT、信号和图像处理、ODE 解算器和其他常见的科学和工程任务。

  • 构建并安装 SciPy:
tar -xvzf scipy-0.16.1.tar.gz    (can be downloaded from: https://sourceforge.net/projects/scipy/files/scipy/0.16.1/  or 
     obtain the latest sources from https://github.com/scipy/scipy/releases) 
cd scipy-0.16.1/
python setup.py config --compiler=intelem --fcompiler=intelem build_clib --compiler=intelem --fcompiler=intelem build_ext --compiler=intelem --fcompiler=intelem install --user

附录B

利用源代码构建、安装性能指标评测的关联组件

DBN-Kyoto

//Untar and install all the provided tools:

cd theano/democase/DBN-Kyoto/tools
tar -xvzf Imaging-1.1.7.tar.gz
cd Imaging-1.1.7
python setup.py build
python setup.py install --user

cd theano/democase/DBN-Kyoto/tools
tar -xvzf python-dateutil-2.4.1.tar.gz
cd python-dateutil-2.4.1
python setup.py build
python setup.py install --user

cd theano/democase/DBN-Kyoto/tools
tar -xvzf pytz-2014.10.tar.gz
cd pytz-2014.10
python setup.py build
python setup.py install --user

cd theano/democase/DBN-Kyoto/tools
tar -xvzf pandas-0.15.2.tar.gz
cd pandas-0.15.2
python setup.py build
python setup.py install --user

 

AlexNet

  • 利用源代码安装 AlexNet 的关联组件

如欲在 CPU 运行 AlexNet,需要访问 fedrora epel 源资源库的附加软件包

wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm
sudo rpm -ihv epel-release-7-8.noarch.rpm
sudo yum install hdf5-devel
sudo yum install zmq-devel
sudo yum install zeromq-devel
sudo yum install python-zmq
  • 安装 Hickle (基于 HDF5 的 Pickle 的克隆版本):
git clone https://github.com/telegraphic/hickle.git
python setup.py build install --user
  • 安装 h5py(HDF5 二进制数据格式的 Python 界面):
git clone https://github.com/h5py/h5py.git
python setup.py build install --user

 

参考资料

 

作者简介

Sunny GogarSunny Gogar
软件工程师

Sunny Gogar 获得了佛罗里达大学电子与计算机工程专业的硕士学位,以及印度孟买大学电子与电信学专业的学士学位。  目前在英特尔公司软件及服务事业部担任软件工程师。 他的兴趣在于面向多核和众核处理器架构的并行编程与优化。

Meghana Rao 获得了波特兰州立大学工程与技术管理专业的硕士学位,以及印度班加罗尔大学计算机科学和工程专业的学士学位。  她是英特尔软件与服务事业部的开发人员宣传官,专注于机器学习和深度学习。

 

有关编译器优化的更完整信息,请参阅优化通知