MXNet应用之一:Large Scale Image Classification
来源:互联网 发布:分水岭算法 编辑:程序博客网 时间:2024/05/16 12:06
Tutorial地址:
一、MXNet简介
1.概述(摘自开源中国社区)
MXNet(轻量级机器学习库) 是一款设计为效率和灵活性的深度学习框架。它允许你混合符号编程和命令式编程,从而最大限度提高效率和生产力。在其核心是一个动态的依赖调度,它能够自动并行符号和命令的操作。
有一个图形优化层,使得符号执行速度快,内存使用高效。这个库便携,轻量,而且能够扩展到多个 GPU和多台机器。
中文文档地址:
从上到下分别为各种主语言的嵌入,编程接口(矩阵运算,符号表达式,分布式通讯),两种编程模式的统一系统实现,以及各硬件的支持。
MXnet的设计和实现可以参考
包含详细的讲解和实例(引用博客)
一、Large Scale Image Classification
训练大量图像的对神经网络提出了几个挑战。 即使使用最新的GPU,也不可能使用单个GPU在合理的时间内使用大量图像来训练大型网络。 通过在单个机器中使用多个GPU可以稍微减轻这个问题。 但是,可以连接到一台机器(通常为8或16个)的GPU数量有限制。 本教程介绍如何使用包含多个GPU的多台计算机来训练大型网络的TB级数据。
1.前提:
MXNet. 请参阅安装和安装中的操作系统说明:
二、Large Scale Image Classification
训练大量图像的对神经网络提出了几个挑战。 即使使用最新的GPU,也不可能使用单个GPU在合理的时间内使用大量图像来训练大型网络。 通过在单个机器中使用多个GPU可以稍微减轻这个问题。 但是,可以连接到一台机器(通常为8或16个)的GPU数量有限制。 本教程介绍如何使用包含多个GPU的多台计算机来训练大型网络的TB级数据。
1.前提
MXNet. 请参阅安装和安装中的操作系统说明:
OpenCV Python 库
pip install opencv-python
2.预处理
大数据训练的第一步是下载数据并对其进行预处理。 对于本教程,我们将使用完整的ImageNet数据集。 请注意,下载和预处理此数据至少需要2 TB的磁盘空间。 强烈建议使用SSD而不是HDD。SSD在处理大量小图像文件方面要好得多。 预处理完成后,图像被打包到recordIO文件中,硬盘应该适合训练。
在本教程中,我们将使用AWS存储实例进行数据预处理。 存储实例i3.4xlarge在两个NVMe SSD磁盘上具有3.8 TB的磁盘空间。 我们将使用软件RAID将它们组合成一个磁盘,并将其安装在〜/ data。
sudo mdadm --create --verbose /dev/md0 --level=stripe --raid-devices=2 \ /dev/nvme0n1 /dev/nvme1n1sudo mkfs /dev/md0sudo mkdir ~/datasudo mount /dev/md0 ~/datasudo chown ${whoami} ~/data
现在我们有充足的空间下载数据集了
在本教程中,我们将使用可从http://www.image-net.org/download-images下载的完整ImageNet数据集。 fall11_whole.tar包含所有图像。 该文件大小为1.2 TB,可能需要很长时间才能下载。
下载后,解压文件。
export ROOT=fullmkdir $ROOTtar -xvf fall11_whole.tar -C $ROOT
2.2删除不常见的类用于迁移学习(可选)
训练网络数据的一个常见原因是将其用于转换学习(包括特征提取或微调其他模型)。 根据这项研究,图像太少的类无助于迁移学习。 因此,我们可以删除少于一定数量图像的类。 以下代码将删除少于500张图像的类。
BAK=${ROOT}_filteredmkdir -p ${BAK}for c in ${ROOT}/n*; do count=`ls $c/*.JPEG | wc -l` if [ "$count" -gt "500" ]; then echo "keep $c, count = $count" else echo "remove $c, $count" mv $c ${BAK}/ fidone
2.3生成验证集
为了确保我们不会对数据进行过拟合,我们将创建一个与训练集分开的验证集。 在培训期间,我们将经常监测验证集上的损失。 我们通过从每个类中挑选五十个随机图像并将它们移动到验证集合来创建验证集。
VAL_ROOT=${ROOT}_valmkdir -p ${VAL_ROOT}for i in ${ROOT}/n*; do c=`basename $i` echo $c mkdir -p ${VAL_ROOT}/$c for j in `ls $i/*.JPEG | shuf | head -n 50`; do mv $j ${VAL_ROOT}/$c/ donedone
2.4将图像包装到记录文件中
MXNet可以直接读取图像文件,建议将图像文件打包到recordIO文件中,以提高性能。 MXNet提供了一个工具(tools / im2rec.py)来执行此操作。 要使用此工具,需要在系统中安装MXNet和OpenCV的python模块。
将环境变量MXNET设置为指向MXNet安装目录,并将NAME指定为数据集的名称。 在这里,我们假设MXNet安装在〜/ mxnet
MXNET=~/mxnetNAME=full_imagenet_500_filtered
mkdir -p train_metapython ${MXNET}/tools/im2rec.py --list True --chunks 8 --recursive True \train_meta/${NAME} ${ROOT}
python ${MXNET}/tools/im2rec.py --resize 480 --quality 90 \--num-thread 16 train_meta/${NAME} ${ROOT}
mkdir -p trainmv train_meta/*.rec train/
mkdir -p val_metapython ${MXNET}/tools/im2rec.py --list True --recursive True \val_meta/${NAME} ${VAL_ROOT}python ${MXNET}/tools/im2rec.py --resize 480 --quality 90 \--num-thread 16 val_meta/${NAME} ${VAL_ROOT}mkdir -p valmv val_meta/*.rec val/
3.训练
ResNet已经显示其在ImageNet竞争中的有效性。 我们的实验也转载了文中报道的结果。 当我们将层数从18增加到152时,我们看到验证准确性有了很大提高。 鉴于这是一个巨大的数据集,我们将使用152层的Resnet。
由于巨大的计算复杂性,即使最快的GPU需要一天以上的单次传输数据。 我们经常需要数十个迭代,训练收敛到良好的验证准确性。 虽然我们可以在机器中使用多个GPU,但机器中的GPU数量通常限制为8或16.为了更快的训练,在本教程中,我们将使用多台机器,每个机器包含多个GPU来训练模型。
3.1 安装
我们将使用16台机器(P2.16x实例),每台机器包含16个GPU(特斯拉K80)。 这些机器通过20 Gbps以太网互连。AWS CloudFormation使得创建深入学习群集非常容易。 我们遵循本页面的说明,并创建一个具有16个P2.16x实例的深入学习群集。我们在第一台机器中加载数据和代码(我们将把这台机器称为主机)。 我们将数据和代码共享给使用EFS的其他机器。如果您手动设置集群,而不使用AWS CloudFormation,请记住执行以下操作:
(1)使用USE_DIST_KVSTORE = 1编译MXNet以启用分布式培训。
(2)在主节点中创建主机文件,其中包含集群中所有计算机的主机名。 例如,
$ head -3 hosts deeplearning-worker1 deeplearning-worker2 deeplearning-worker3
$ ssh deeplearning-worker2 =================================== Learning AMI for Ubuntu =================================== ... ubuntu@ip-10-0-1-199:~$
集群设置完成后,登录到master并从$ {MXNET} / example / image-classification运行以下命令
../../tools/launch.py -n 16 -H $DEEPLEARNING_WORKERS_PATH python train_imagenet.py --network resnet \ --num-layers 152 --data-train ~/data/train --data-val ~/data/val/ --gpus 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 \ --batch-size 8192 --model ~/data/model/resnet152 --num-epochs 1 --kv-store dist_sync
4.Scalability
使用大量机器进行培训的一个常见问题是可扩展性。 我们已经对可扩展性进行了基准测试,在集群上运行多个流行网络,最多256个GPU,加速非常接近理想。这种可扩展性测试在16个P2.16xl实例上运行,总共256个GPU。 我们使用AWS深度学习AMI与CUDA 7.5和CUDNN 5.1安装。我们修复每个GPU的批量大小常数,并且每次后续测试的GPU数量翻一番。 使用了同步的SGD(-kv-store dist_device_sync)。 所使用的CNN位于这里。
每秒处理的图像数量如下表所示:
下图显示了加速使用的GPU数量,并将其与理想的加速比较。
- MXNet应用之一:Large Scale Image Classification
- Deep Fisher Networks for Large-Scale Image Classification(精读)
- Very Deep Convolutional Networks for Large-Scale Image Classification
- [深度学习论文笔记][Image Classification] Very Deep Convolutional Networks for Large-Scale Image Recognitio
- 论文笔记:Deep convolutional activation features for large scale histopathology image classification
- Large-Scale Scene Classification Using Gist Feature
- Large-scale Video Classification with Convolutional Neural Networks(泛读)
- Large-scale Video Classification with Convolution Neural Networks
- Large-scale Video Classification with Convolutional Neural Networks
- YouTube-8M: A Large-Scale Video Classification Benchmark
- 【论文学习】Large-scale Video Classification with Convolutional Neural Networks
- [深度学习论文笔记][Video Classification] Large-scale Video Classification with Convolutional Neural Networks
- cvpr-Edgel Index for Large-Scale Sketch-based Image Search
- Weak Attributes for Large-Scale Image Retrieval 阅读笔记
- Very Deep Convolutional Networks for Large-Scale Image Recognition
- Very Deep Convolutional Networks for Large-Scale Image Recognition(精读)
- Very Deep Convolutional Networks for Large-Scale Image Recognition
- Very Deep Convolutional Networks for Large-Scale Image Recognition
- PAT(Basic Level)_1049_数列的片段和
- 复习EKF
- KotLin的认识(一)
- CCF201412-3 集合竞价 日常暴力带BUG修复
- Zcash钱包(ZEC钱包)官方客户端常见命令实测(一)
- MXNet应用之一:Large Scale Image Classification
- JavaScript Date 对象 详解
- PAT(Basic Level)_1050_螺旋矩阵
- Test run failed: Unable to find instrumentation target package: android.support.v7.appcompat
- c++ STL中容器迭代器失效
- Java数据结构与算法
- Android优化方案汇总
- 工薪阶层如何经营自己?
- java数据类型与基础