MXNet应用之一:Large Scale Image Classification

来源:互联网 发布:分水岭算法 编辑:程序博客网 时间:2024/05/16 12:06

Tutorial地址:

一、MXNet简介

1.概述(摘自开源中国社区)

    MXNet(轻量级机器学习库) 是一款设计为效率和灵活性的深度学习框架。它允许你混合符号编程和命令式编程,从而最大限度提高效率和生产力。在其核心是一个动态的依赖调度,它能够自动并行符号和命令的操作。

有一个图形优化层,使得符号执行速度快,内存使用高效。这个库便携,轻量,而且能够扩展到多个 GPU和多台机器。

中文文档地址:


从上到下分别为各种主语言的嵌入,编程接口(矩阵运算,符号表达式,分布式通讯),两种编程模式的统一系统实现,以及各硬件的支持。

MXnet的设计和实现可以参考

包含详细的讲解和实例(引用博客)

一、Large Scale Image Classification

   训练大量图像的对神经网络提出了几个挑战。 即使使用最新的GPU,也不可能使用单个GPU在合理的时间内使用大量图像来训练大型网络。 通过在单个机器中使用多个GPU可以稍微减轻这个问题。 但是,可以连接到一台机器(通常为816个)的GPU数量有限制。 本教程介绍如何使用包含多个GPU的多台计算机来训练大型网络的TB级数据。

1.前提:

MXNet. 请参阅安装和安装中的操作系统说明:

二、Large Scale Image Classification

   训练大量图像的对神经网络提出了几个挑战。 即使使用最新的GPU,也不可能使用单个GPU在合理的时间内使用大量图像来训练大型网络。 通过在单个机器中使用多个GPU可以稍微减轻这个问题。 但是,可以连接到一台机器(通常为816个)的GPU数量有限制。 本教程介绍如何使用包含多个GPU的多台计算机来训练大型网络的TB级数据。

1.前提

  • MXNet. 请参阅安装和安装中的操作系统说明:

  • OpenCV Python  

    pip install opencv-python

2.预处理

  大数据训练的第一步是下载数据并对其进行预处理。 对于本教程,我们将使用完整的ImageNet数据集。 请注意,下载和预处理此数据至少需要2 TB的磁盘空间。 强烈建议使用SSD而不是HDDSSD在处理大量小图像文件方面要好得多。 预处理完成后,图像被打包到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
现在我们有充足的空间下载数据集了

2.1下载数据集

  在本教程中,我们将使用可从http://www.image-net.org/download-images下载的完整ImageNet数据集。 fall11_whole.tar包含所有图像。 该文件大小为1.2 TB,可能需要很长时间才能下载。

下载后,解压文件。

export ROOT=fullmkdir $ROOTtar -xvf fall11_whole.tar -C $ROOT
这应该给你一个tar文件的集合。 每个tar文件表示一个类别,并包含属于该类别的所有图像。 我们可以解压缩每个tar文件,并将图像复制到以tar文件名称命名的文件夹中。


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
  要创建recordIO文件,我们首先在recordIO文件中创建我们想要的图像列表,然后使用im2rec将列表中的图像打包到recordIO文件中。 我们在train_meta中创建这个列表。 培训资料约1TB。 我们把它分成8个部分,每个部分的大小大约为100 GB。

mkdir -p train_metapython ${MXNET}/tools/im2rec.py --list True --chunks 8 --recursive True \train_meta/${NAME} ${ROOT}
  然后,我们调整图像的大小,使得短边长为480像素长,并将图像打包到recordIO文件中。 由于大多数工作是磁盘I / O,因此我们使用多个(16)线程来快速完成工作。

python ${MXNET}/tools/im2rec.py --resize 480 --quality 90 \--num-thread 16 train_meta/${NAME} ${ROOT}
  一旦完成,我们将rec文件移动到名为train的文件夹中

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/
  我们现在在train和val目录中分别具有recordIO格式的所有训练和验证图像。 我们现在可以使用这些.rec文件进行训练


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,可以将ssh从master中ssh转换成任何这些机器。 例如,

  

     $ ssh deeplearning-worker2     ===================================     Learning AMI for Ubuntu     ===================================     ...     ubuntu@ip-10-0-1-199:~$
3.2 执行训练

   集群设置完成后,登录到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
   launch.py启动在集群中的所有机器中提供的命令。 必须使用-H开关将集群中的计算机列表提供给launch.py。 这是用于launch.py的选项的描述。

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数量,并将其与理想的加速比较。





阅读全文
0 0
原创粉丝点击