分类目录归档:Deep Learning

编译带有 Intel MKL 的 TensorFlow

我永远也不知道该用哪个版本的 Bazel 编译 TensorFlow;以及……牙膏厂能不能好好写文档。

本文均在 Python3 环境下进行编译,0202 年了为什么还有人在用 Python2。

环境准备

Python 开发环境:

sudo apt install python3-dev python3-pip
pip3 install -U --user pip six numpy wheel setuptools mock 
pip3 install -U --user keras_applications --no-deps
pip3 install -U --user keras_preprocessing --no-deps

Bazel:

这里不直接安装,而是使用 Bazelisk 这个 wrapper 完成对 bazel 的调用。Bazelisk 的 release 为一个 standalone 的二进制包,我们可以直接把它改名为 bazel 放入 PATH 中直接进行调用,所有的参数会自动 passthrough 到具体的 bazel 上。在调用 bazelisk 之前,可以使用 USE_BAZEL_VERSION 这个环境变量指定需要的 bazel 版本,如果没有在本地缓存过,则会被自动下载。由于编译 TensorFlow 对 bazel 版本有严格的要求,使用 bazelisk 可以不用反复重新安装 bazel 就能尝试不同的版本。

Intel MKL:

Intel 有 apt 源可以直接安装这个包

wget https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
rm GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB

sudo wget https://apt.repos.intel.com/setup/intelproducts.list -O /etc/apt/sources.list.d/intelproducts.list
sudo apt-get update

之后可以在这个页面取得想要安装的包的版本的名字,或者直接用 apt-cache search 也可以。目前最新的 MKL 版本为 intel-mkl-64bit-2020.0-088。

编译

git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow
git checkout branch_name  # r1.9, r1.10, etc.
./configure

在 configure 中完成一些配置,比如是否需要 GPU 支持,MPI 支持等等,这里不赘述。

如果我们要编译一个带有 CPU 优化、MKL 库以及 CUDA 支持的 TensorFlow:

bazel build --config=opt --config=mkl --config=cuda //tensorflow/tools/pip_package:build_pip_package

之后创建 Python 的 .whl 安装包

./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

然后在 /tmp/tensorflow_pkg 下就可以看到编译好的安装包了。

Reference

https://www.tensorflow.org/install/source
https://github.com/bazelbuild/bazelisk
https://github.com/tensorflow/tensorflow/issues/26249
https://gist.github.com/pachamaltese/afc4faef2f191b533556f261a46b3aa8
https://software.intel.com/en-us/articles/installing-intel-free-libs-and-python-apt-repo

无 root 权限的服务器使用的一些记录

在没有 root 权限的服务器上安装 pip

假设有这么一台服务器,你没有 root 权限,然后预配置的 tensorflow 环境很神奇地调用不了 GPU,只有 pip2 没有 pip3,python2 python3 都试过了都没法用 GPU,pip list 也显示安装了 tensorflow-gpu,且给你用户的人信誓旦旦地告诉你我这配置没问题,但是你就是用不了 GPU,那么怎么办呢?

解决方法还是比较简单的,首先在用户态安装一个 pip(本文要装 pip3)

wget https://bootstrap.pypa.io/get-pip.py && python3 get-pip.py --user

这时候 pip3 会被安装到 ~/.local/bin 下面,如果你的 PATH 里面有这个路径的话,直接 pip3 就可以运行。

然后就很简单了,该干嘛干嘛,比如安装 virtualenv 等等,只不过这时候你安装任何 python 包的时候,要加上 –user 参数,才能安装到 $HOME 下面,例如 pip3 install virtualenv –user。

我之前提到的那台服务器呢,在装了 pip3 以后,list 一下发现根本就没有 tensorflow-gpu,只有 tensorflow;pip2 里面有,但是调用不了显卡,搞不懂 IT 究竟是怎么配置的。最后我也懒得烦了,直接 virtualenv,装一个 tensorflow-gpu,问题就解决了。

安装一个简单的 deb 包(没有 dependency 问题那种)

apt download <package>
dpkg-deb -x package_x.y.z_x86_64.deb my-private-root
#dpkg-deb -e package_x.y.z_x86_64.deb my-private-control

然后就装在了你自己的 $HOME 下面。

如果你装的是 screen,且你对 /var/run/screen/ 也没权限的话,这么干:

mkdir ~/.screen && chmod 700 ~/.screen
export SCREENDIR=$HOME/.screen

然后把对应的内容添加到 .bashrc 里面去让你每次都可用,比如说:

PATH=~/usr/bin:$PATH
export SCREENDIR=$HOME/.screen

 

控制 AWS p2 实例的 GPU 频率

AWS p2 实例虽然方便,不用本地买显卡,但是碰到比较大的网络,p2 开一天就得 50 块钱,还是有点肉疼的。那么,既然付了钱,就把实例的性能发挥到极致吧。

Tesla K80 显卡通常工作在 AutoBoost 模式,这个模式会动态调整显卡的频率,在很多情况下都比最大频率要低,并且显卡驱动默认的功率限制并没有被开到最大,因此这两点都会影响我们最终获得的性能。

设置显卡工作频率比较简单:

sudo nvidia-persistenced
sudo nvidia-smi --auto-boost-default=0
sudo nvidia-smi -ac 2505,875 #(2505,875) for p2; (877,1530) for p3; (2505,1177) for g3

关于功率的调整,首先我们要查看显卡的最大功率限制 nvidia-smi -q | grep 'Power Limit',如果是 p2 实例,发现这个值是 175W,而驱动默认的限制是 149W,我们需要提高这个限制,使用  nvidia-smi -pl 175 即可,如果权限不足,用 sudo 运行。

参考资料:

https://www.ibm.com/support/knowledgecenter/en/SSFHY8_5.5.0/com.ibm.cluster.essl.v5r5.essl100.doc/am5gr_nvidcap.htm
https://devblogs.nvidia.com/increase-performance-gpu-boost-k80-autoboost/
https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/optimize_gpu.html

NumPy 部分操作的理解

  • 矩阵操作中 axis = -1,相当与对矩阵最后一维进行操作
  • NumPy 的 ndarray 进行算术运算符操作是 element-wise 的,即是逐元素进行操作
  • np.mean 等操作中的 keepdim 选项,将平均掉的那一维保留,但是长度只为 1

Reference:

  • http://www.scipy-lectures.org/intro/numpy/operations.html

Amazon AWS 配置 TensorFlow 与 Keras 环境记录

因为一些需求,需要在 AWS 上进行一些 GPU 的计算,按道理 AWS 已经提供了深度学习的 AMI 映像供我们使用,但是我实在是搞不清他到底做了些什么,因此也不怎么会用。加上自带各种用不到的库实在太大,为了放下我所有的数据需要开 80G 的 EBS 存储卷,感觉有些小贵,无奈之下只能从最干净的 Ubuntu 16.04 开始配置一台符合我需求的 EC2 实例。

具体步骤我打算按照 Keras 官方文档上的方案,由于我也不确定能不能搞定,这里就做一个实时的记录:

  • 配置 python 与 CUDA 环境,这个相对比较简单,需要注意一点的是 cuDNN 库需要在国内自己找,这个 CSDN 上有很多,文件名是 cudnn-8.0-linux-x64-v5.1.tgz 就好了。这一步我进行得十分顺利。
  • Keras 相关依赖包的安装,这里开始出现了问题
    • 首先安装 Anaconda,需要注意一点的是,Anaconda 安装包会将其自身路径写入 .bashrc,但是需要执行 source .bashrc 这条命令才能使 Anaconda 做的修改生效,这里一定要注意,不要认为是安装出了问题。完成之后运行 python,应该就会发现你的 python 已经是 Anaconda 发行版了。
    • 接下来 pip install –U –pre pip setuptools wheel 这步也出现了问题,执行 pip 后报错 “FileNotFoundError: [Errno 2] No such file or directory: ‘/home/ubuntu/anaconda3/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg’
      • 解决方案是这里,手工指定 setuptools 版本进行安装:pip install setuptools==27.2.0
    • 然后是安装 scipy numpy tensorflow-gpu keras 等一干所必要的包,安装一切顺利
    • 检查 TensorFlow 安装时再次出现问题,import tensorflow 出现 ImportError: libcudnn.so.6: cannot open shared object file: No such file or directory
      • 查询后发现,pip 默认安装是 tensorflow 1.3,这个版本需要 cuDNN 6.0,但是考虑到教程通用性需求,不选择升级到 tf 1.3,采用 pip install –U –pre tensorflow-gpu==1.2 命令强制安装 1.2 版本使用 cuDNN 5.1

之后的操作就相当顺利了,所有的操作都和本地类似,还是熟悉的东西好用啊。

由于我不需要现在就继续进行计算,因此在停止了实例之后,为其配置的环境创建一个 AMI,供下次继续计算时开启竞价型实例使用。