2016 年 AlphaGo 战胜李世石,预示我们进入了 AI 时代。深度学习是 AI 的核心技术,在图像分类,自然语言处理,无人驾驶等众多领域显示出了强大的能力,各大巨头纷纷投入巨资研发。语音助手,人脸识别,外文翻译等等,AI 已融入到了我们生活的方方面面,极大了促进了社会的发展。其中 Caffe,TensorFlow,Keras,PyTorch 是主流的深度学习框架,拥有强大的社区支持,是实践深度学习不可或缺的工具。
Caffe 是一个被广泛使用的深度学习框架,由 BVLC 开发。Caffe 容易上手,训练速度快,组件模块化,并拥有大量训练好的经典模型。Caffe 在 GPU 上训练的性能很好,但只能支持单机多 GPU 的训练,不支持分布式多机训练。
TensorFlow 由 Google 大脑主导开发,是一个分布式系统上的大规模深度学习框架。移植性好,可以运行在移动设备上,并支持分布式多机多卡训练,支持多种深度学习模型。TensorFlow 还有功能强大的可视化组件 TensorBoard,能可视化网络结构和训练过程,对于观察复杂的网络结构和监控长时间、大规模的训练很有帮助。
PyTorch 从 Torch 发展而来,并经过了大量改进,由 FaceBook AI 团队主导开发。不同于 TensorFlow,PyTorch 采用动态计算图的方式,并提供良好的 Python 接口,代码简单灵活,使用起来非常方便。内存分配也经过了优化,能支持分布式多机训练。
Keras 是一个高层神经网络 API,由 Python 编写,通过调用其他深度学习框架来进行计算,如 TensorFlow、Theano 以及 CNTK。Keras 高度模块化,能快速搭建神经网络,并且非常容易上手。
基于青云提供的 NVIDIA Tesla P100 GPU,青云深度学习平台配置了 CUDA8.0 和 cuDNN5,并安装了流行的深度学习框架,如 Caffe(BVLC),TensorFlow(1.2.1),Keras(2.0.9),PyTorch(0.2.0_4),省去了用户搭建环境的麻烦,提高开发效率。用户无需修改代码,即可把本地的代码运行在云上,还能动态扩展所需资源。
目前仅 pek3a , sh1a 支持 GPU,如需在其他区创建可以将 GPU 数量设置为 0。TensorFlow,PyTorch 和 Keras 支持用 CPU 进行深度学习应用的训练和测试,Caffe 需要重新编译才可以。
- 填写服务名称和描述,选择版本。
- 填写节点 CPU、GPU、内存、节点类型、节点个数、数据盘大小等配置信息。
- 出于安全考虑,所有的集群都需要部署在私有网络中,选择自己创建的已连接路由器的私有网络中。
- Deep Learning app 与 QingStor 命令行工具集成,配置 QingStor 相关参数,可以方便的从 QingStor 拉取数据。如果 QingStor 选用 false,access_key 和 secret_key 则无需填写。
深度学习平台使用 miniconda2 来管理 Python 环境,Python 的版本为2.7,并装有 numpy,scipy,pandas,matplotlib,nltk,scikit-learn,jupyter notebook 等常用工具包。下面将以 MNIST 数据集为例,分别测试 Caffe,TensorFlow,PyTorch 和 Keras。
MNIST 是著名的手写数字数据集,包含 0~9 十个各种风格的手写数字,经常用于深度学习入门及测试。其内容分为训练集和测试集,训练数据集包含 60,000 个样本,测试数据集包含 10,000 样本,数据集中的每张图片由 28x28 个像素点构成。
Deep Learning 训练往往需要大量的数据,数据存储经常占用很大的空间。青云 QingStor 可以存储海量数据,用户可以方便的把数据放在 QingStor,再使用 QingStor 命令行工具快速的下载到本地。如果在环境设置中配置好了 QingStor (如果没有也可在本地配置),从 QingStor 获取数据:
cd /home/ubuntu/tensorflow
mkdir data
qsctl cp -r qs://mydata/ data/
节点登录信息:ubuntu/p12cHANgepwD
Caffe 支持 Python 接口,用户也可以根据需要重新配置编译,目前不支持多机分布式训练,详情请见 Caffe 文档。(Caffe 预先用 GPU 版本进行编译,如果选择的 GPU 的个数为 0,需修改配置文件,重新编译。)
单机示例:
cd /home/ubuntu/caffe
./build/tools/caffe train --solver=examples/mnist/lenet_solver.prototxt
查看 GPU 使用情况,可以使用如下命令:
nvidia-smi
完整信息请见 TensorFlow 文档
cd /home/ubuntu/tensorflow
python mnist.py
增加节点,在线扩容:在详情页点击 新增节点
按钮,可以对每个新增节点指定 IP 或选择自动分配。
TensorFlow 增加节点
TensorFlow 分布式训练需要指定 parameter server 和 worker 的 IP 地址和端口号(根据自己的 IP 进行修改)
下面是一个 parameter server 和两个 worker 进行分布式训练的示例:
节点 1:
- 启动 parameter server
cd /home/ubuntu/tensorflow
python mnist_dist.py --ps_hosts=192.168.1.6:2221 --worker_hosts=192.168.1.6:2223,192.168.1.7:2223 --job_name=ps --task_index=0
- 启动第一个 worker
python mnist_dist.py --ps_hosts=192.168.1.6:2221 --worker_hosts=192.168.1.6:2223,192.168.1.7:2223 --job_name=worker --task_index=0
节点 2:
- 启动第二个 worker (注意:是在第二个节点即新增节点上启动)
cd /home/ubuntu/tensorflow
python mnist_dist.py --ps_hosts=192.168.1.6:2221 --worker_hosts=192.168.1.6:2223,192.168.1.7:2223 --job_name=worker --task_index=1
TensorFlow 中的 TensorBoard 提供了训练过程中丰富的信息,默认端口号为 6006
。在某一节点上启动一下命令:
tensorboard --logdir=./tflog/
您可以通过如下方式之一查看 TensorBoard UI:
- 如需在TensorBoard中显示相关信息,需要编写相关代码。TensorBoard详细用法请参考 Github TensorBoard 页面。
- 通过公网访问,您需要先申请一个公网 IP 绑定在路由器上,在路由器上设置端口转发,同时打开防火墙相应的下行端口。
- 或参考VPN 隧道指南 配置 VPN,通过私网 IP 地址访问。
完整信息请见 PyTorch文档
cd /home/ubuntu/pytorch
python mnist.py
PyTorch 分布式训练时,由于现在版本的 PyTorch 自身的一些缺陷,每个节点的 GPU 个数应该大于 1 个,否则容易出现错误。
节点 1:
cd /home/ubuntu/pytorch
python mnist_dist.py
节点 2:
cd /home/ubuntu/pytorch
python mnist_dist.py
Keras 默认使用 TensorFlow 来计算,目前青云平台上也只支持 TensorFlow 作为其计算框架。详情请见 Keras 文档
cd /home/ubuntu/keras
python mnist.py
为了方便开发,环境中配有 jupyter notebook,用户可以交互式编程,并能直观展现实时计算结果。
jupyter notebook 启动命令
cd /home/ubuntu/keras
jupyter notebook
jupyter noetbook 默认端口号为 8888
,启动上述命令后会输出 token 信息,这个信息在下面访问 notebook 时候需要。
如果需要通过公网访问这些信息您需要先申请一个公网 IP 绑定在路由器上,在路由器上设置端口转发,同时打开防火墙相应的下行端口。为了方便使用 jupyter notebook,也可参考VPN 隧道指南 配置 VPN。