使用 Intel® 软件优化 Theano 和 Intel® Python 发行版入门
Theano 是 LISA 实验室开发的一个 Python 库,用于定义、优化和评估数学表达式,包括包含多维数组(numpy.ndarray)的表达式。
目录
总结
Theano 是 LISA 实验室开发的一个 Python* 库,用于定义、优化和评估数学表达式,包括包含多维数组(numpy.ndarray)的表达式。Intel® 优化的 Theano 是基于 Theano 0.0.8rc1 的新版本,它针对 Intel® 架构进行了优化,并启用了 Intel® 数学核心库 (Intel® MKL) 2017。最新版本的 Intel MKL 包括针对 Intel® 高级矢量扩展 2 (Intel® AVX2) 和 AVX-512 指令的优化,这些指令在 Intel® Xeon® 处理器和 Intel® Xeon Phi™ 处理器中得到支持。
Theano 可以在多种平台上与多种开发工具和库组合进行安装和使用。本教程提供了一种方法,介绍了在基于 CentOS* 和 Ubuntu* 的系统上使用 Intel® 编译器和 Intel MKL 2017 构建和安装 Intel 优化 Theano 的步骤。我们还将通过运行 MNIST*、DBN-Kyoto*、LSTM* 和 ImageNet* 等行业标准基准测试来验证安装。
先决条件
Intel® 编译器和 Intel® 数学核心库 2017
本教程假设 Intel 编译器(C/C++ 和 Fortran)已安装并验证。如果没有,可以作为 Intel® Parallel Studio XE 的一部分下载和安装,或者独立安装。
在使用 Intel® Python 发行版* 时,安装 Intel MKL 2017 是可选的。对于其他 Python 发行版,Intel MKL 2017 可以作为 Intel Parallel Studio XE 2017 的一部分下载,或者使用社区许可证免费下载和安装。要下载它,请先在此处 注册 免费社区许可证,然后按照安装说明进行操作。
Python* 工具
在本教程中,将使用 Intel® Python 发行版*,因为它提供了对在 Intel 架构上实现更高性能的工具和技术的即时访问。这将允许使用 Intel 优化的预编译工具,如 NumPy* 和 SciPy*,而无需担心构建和安装它们。
Intel Distribution for Python 可作为 Intel Parallel Studio XE 的一部分提供,也可以在此处 免费独立下载。
以下是安装 Intel Distribution for 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 开发工具的步骤,以防使用非 Intel 发行版的 Python。
构建和安装 Intel® Theano* 软件优化
可以从以下 git 存储库检出并安装针对 Intel 架构优化的 Theano 分支。
git clone https://github.com/intel/theano.git theano cd theano python setup.py build python setup.py install theano-cache clear
下面提供了一个 Theano 配置文件示例供参考。要使用 Intel 编译器并指定要与 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 库后,验证它们引用的版本非常重要。本文中引用的 NumPy 和 Theano 版本通过以下方式进行验证:
python -c "import numpy; print (numpy.__version__)" ->1.11.1 python -c "import theano; print (theano.__version__)" -> 0.9.0dev1.dev-*
同时,验证安装的 NumPy 和 Theano 版本是否使用 Intel MKL 也非常重要。
python -c "import theano; print (theano.numpy.show_config())"
基准测试
DBN-Kyoto 和 ImageNet 基准测试可在 theano/democase 目录中找到。
DBN-Kyoto
获取用于运行 DBN-Kyoto 的数据集
DBN-Kyoto 的示例数据集可以通过以下链接从 Dropbox 下载:https://www.dropbox.com/s/ocjgzonmxpmerry/dataset1.pkl.7z?dl=0。解压文件并将其保存在 theano/democase/DBN-Kyoto 目录中。
必备组件
DBN-Kyoto 训练的依赖项可以使用 Anaconda 安装,或者使用 tools 目录中提供的源代码构建。由于 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 中构建和训练神经网络的轻量级库。将使用 Intel 编译器构建和安装 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
获取用于 AlexNet 训练的 ImageNet 数据集
ImageNet 数据集可从 image-net 网站 获取。
必备组件
AlexNet 训练的依赖项可以使用 Anaconda 安装,或从 fedora epel 源存储库安装。目前,Hickle(用于预处理数据的必需依赖项)仅在 Python 2 中可用,在 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'
可以使用提供的脚本 - 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* 文件以更新解析后的玩具数据集的路径。
# 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)模型的递归神经网络的一个例子。IMDB 数据集用于使用 LSTM 模型对电影评论进行情感分析。
获取数据集
从 http://www-labs.iro.umontreal.ca/~lisa/deep/data/ 获取 *imdb.pkl* 文件,并将其解压到本地文件夹。
预处理
页面 http://deeplearning.net/tutorial/lstm.html 提供了两个脚本:
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 命令链接库。同时,请确保 MKL 安装路径在 LD_LIBRARY_PATH
环境变量中设置正确。
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。对于玩具数据集,这将创建比必需更多的进程,导致应用程序崩溃。要解决此问题,请在文件 *Alexnet_CPU/preprocessing/make_hkl.py:258* 中将进程数从 16 更改为 2。但是,在预处理完整数据集时,建议使用较高的 num_process 值以加快预处理速度。
num_process = 2
错误 3:通过 Conda 安装 Intel(R) Python 发行版* 时引用当前版本的 Numpy
如果从 Conda 中安装 Intel(R) Python 发行版*,而不是通过 Intel(R) Python 发行版* 安装程序,请确保将 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 进行科学计算所需的基础包。此包包含:
- 一个强大的 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
- 构建和安装针对 Intel 架构优化的 NumPy
git clone https://github.com/pcs-theano/numpy.git //update site.cfg file to point to required MKL directory. This step is optional if parallel studio or MKL were installed in default /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 的依赖项
运行 AlexNet(CPU 版本)可能需要访问 fedora 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). Long short-term memory. Neural computation, 9(8), 1735-1780.
- 在 LSTM 模型中添加遗忘门
- [pdf] Gers, F. A., Schmidhuber, J., & Cummins, F. (2000). Learning to forget: Continual prediction with LSTM. Neural computation, 12(10), 2451-2471.
- LSTM 论文
- [pdf] Graves, Alex. Supervised sequence labelling with recurrent neural networks. Vol. 385. Springer, 2012.
- Theano
- [pdf] Bastien, Frédéric, Lamblin, Pascal, Pascanu, Razvan, Bergstra, James, Goodfellow, Ian, Bergeron, Arnaud, Bouchard, Nicolas, and Bengio, Yoshua. Theano: new features and speed improvements. NIPS Workshop on Deep Learning and Unsupervised Feature Learning, 2012.
- [pdf] Bergstra, James, Breuleux, Olivier, Bastien, Frédéric, Lamblin, Pascal, Pascanu, Razvan, Desjardins, Guillaume, Turian, Joseph, Warde-Farley, David, and Bengio, Yoshua. Theano: a CPU and GPU math expression compiler. In Proceedings of the Python for Scientific Computing Conference (SciPy), June 2010.
- https://github.com/Theano
- ImageNet
- NumPy
- SciPy
关于作者
Sunny Gogar
软件工程师
Sunny Gogar 在佛罗里达大学盖恩斯维尔分校获得了电气与计算机工程硕士学位,并在印度孟买大学获得了电子与通信学士学位。他目前是 Intel 公司软件与服务事业部的一名软件工程师。他的兴趣包括并行编程以及针对多核和众核处理器架构的优化。
Meghana Rao 在波特兰州立大学获得了工程与技术管理硕士学位,在印度班加罗尔大学获得了计算机科学与工程学士学位。她是 Intel 软件与服务事业部的开发者布道师,专注于机器学习和深度学习。