训练大规模图像的神经网络具有很多挑战。即使使用最新的GPU,也不可能使用单个GPU在合理的时间内使用大量图像来训练大型网络。通过在单个机器中使用多个GPU可以稍微缓解这个问题。但是,可以连接到一台机器(通常为8或16个)的GPU数量是有限制的。本教程介绍了如何使用多台机器(每个包含多个GPU)来训练具有TB级数据的大型网络。
前提条件
为了完成以下教程,我们需要:
- MXNet:安装教程
- OpenCV Python library
$ pip install opencv-python
- 1
预处理
磁盘空间
大数据训练的第一步是下载数据并对其进行预处理。对于本教程,我们将使用完整的ImageNet数据集。请注意,下载和预处理此数据至少需要2 TB的磁盘空间。强烈建议使用SSD而不是HDD。 SSD在处理大量小图像文件方面要好得多。预处理完成后,图像被打包到recordIO文件中,HDD应该适合训练。
在本教程中,我们将使用AWS存储实例进行数据预处理。存储实例i3.4xlarge 在两个NVMe SSD磁盘上具有3.8 TB的磁盘空间。我们将使用软件RAID将它们组合成一个磁盘,并将其安装在〜/ data 。
sudo mdadm --create --verbose /dev/md0 --level=stripe --raid-devices=2 \
/dev/nvme0n1 /dev/nvme1n1
sudo mkfs /dev/md0
sudo mkdir ~/data
sudo mount /dev/md0 ~/data
sudo chown ${whoami} ~/data
- 1
- 2
- 3
- 4
- 5
- 6
我们现在有足够的磁盘空间来下载和预处理数据。
下载ImageNet
在本教程中,我们将使用从http://www.image-net.org/download-images下载的完整ImageNet数据集。 fall11_whole.tar 包含了所有图像。 该文件大小为1.2 TB,可能需要很长时间才能下载。
下载之后,解压文件。
export ROOT=full
mkdir $ROOT
tar -xvf fall11_whole.tar -C $ROOT
- 1
- 2
- 3
你将得到tar文件的集合。每个tar文件代表一个类别,并包含属于该类别的所有图像。我们可以解压每个tar文件,并将图像复制到以tar文件名称命名的文件夹中。
for i in $ROOT/*.tar; do j=${i%.*}; echo $j; mkdir -p $j; tar -xf $i -C $j; done
rm $ROOT/*.tar
ls $ROOT | head
n00004475
n00005787
n00006024
n00006484
n00007846
n00015388
n00017222
n00021265
n00021939
n00120010