目录
总结
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())"
图 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 安装路径。
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
资源
- GitHub repo - 英特尔® Theano*软件优化包
- GitHub rep - Lasagne
- GitHub repo - 英特尔优化版 NumPy (如果通过源代码构建)
附录 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 的科学计算的基础软件包。 软件包包含:
- 强大的 n 维度阵列对象
- 高级(广播)函数
- 集成 C/C++ 和 Fortran 编码的工具
- 实用的线性代数、傅立叶变换和随机数功能
注: 通过验证、删除相关文件,可以删除旧版的 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
参考资料
- LSTM 教程
- DBN 教程
- CPU 的性能超越 GPU,获京都大学青睐
- LSTM 模型简介:
- [pdf] Hochreiter,S.和 Schmidhuber,J. (1997)。 长期短期存储器 神经计算,9(8), 1735-1780.
- 将 forget 栅极添加到 LSTM 模型:
- [pdf] Gers,F. A.、Schmidhuber,J. 和 Cummins,F. (2000)。 学会 forget: LSTM 的持续预测。 神经计算,12(10), 2451-2471.
- LSTM 白皮书:
- [pdf] Graves 和 Alex。 循环神经网络的监督式序列标注。 第 385 卷。 施普林格,2012。
- Theano:
- [pdf] Bastien、Frédéric、Lamblin、Pascal、Pascanu、Razvan、Bergstra、James、Goodfellow、Ian, Bergeron、Arnaud、Bouchard、Nicolas, 和 Bengio,Yoshua。 Theano:新特性和速度优化。 深度学习和无监督特征学习的 NIPS 研讨会,2012。
- [pdf] Bergstra、James、Breuleux、Olivier、Bastien、Frédéric、Lamblin、Pascal、Pascanu、Razvan、Desjardins、Guillaume、Turian、Joseph、Warde-Farley、David、和 Bengio,Yoshua。 Theano:CPU 和 GPU 数学表达式编译器。 用于科学计算的 Python 会议 (SciPy) 记录,2010 年 6 月。
- https://github.com/Theano
- ImageNet
- NumPy
- SciPy
作者简介
Sunny Gogar
软件工程师
Sunny Gogar 获得了佛罗里达大学电子与计算机工程专业的硕士学位,以及印度孟买大学电子与电信学专业的学士学位。 目前在英特尔公司软件及服务事业部担任软件工程师。 他的兴趣在于面向多核和众核处理器架构的并行编程与优化。
Meghana Rao 获得了波特兰州立大学工程与技术管理专业的硕士学位,以及印度班加罗尔大学计算机科学和工程专业的学士学位。 她是英特尔软件与服务事业部的开发人员宣传官,专注于机器学习和深度学习。