Caffe2 - (二)Distributed Training分布式训练

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/oJiMoDeYe12345/article/details/72473303

Caffe2 Distributed Training分布式训练

Caffe2 最重要的一个特点是,便于分布式训练,无须重构设计即可快速实现网络的伸缩.

进一步学习Caffe2分布式训练的例子,可参考SynchronousSGD, 该材料阐述了Caffe2的data_parallel_model设计规则.

  • Gloo - 用于多机训练的通信库
  • NCLL - NVIDIA推出的多GPU通信的NCCL库
  • Redis - 为了对分布式训练的节点进行有效管理, Caffe2采用NFS在节点间分享数据,或者采用Redis服务器来处理节点间的通信

Caffe2 提供的一个分布式训练实例resnet50_trainer中,可以在单个GPU上运行 resnet50_trainer脚本. 其中,训练数据需要先加载到 lmdb database, 或者LevelDB.

实例

安装成功Caffe2后,分布式训练至少有一个GPU,多个GPU更适合体现其分布式特点.

首先,训练数据库转换成lmdb database, 或LevelDB格式;

resnet50_trainer.py说明:

usage: resnet50_trainer.py [-h] --train_data TRAIN_DATA 
                           [--test_data TEST_DATA] [--db_type DB_TYPE]
                           [--gpus GPUS] [--num_gpus NUM_GPUS]
                           [--num_channels NUM_CHANNELS]
                           [--image_size IMAGE_SIZE] [--num_labels NUM_LABELS]
                           [--batch_size BATCH_SIZE] [--epoch_size EPOCH_SIZE]
                           [--num_epochs NUM_EPOCHS]
                           [--base_learning_rate BASE_LEARNING_RATE]
                           [--weight_decay WEIGHT_DECAY]
                           [--num_shards NUM_SHARDS] [--shard_id SHARD_ID]
                           [--run_id RUN_ID] [--redis_host REDIS_HOST]
                           [--redis_port REDIS_PORT]
                           [--file_store_path FILE_STORE_PATH]
  • –train_data - 训练数据库的路径
  • –test_data - 测试数据库的路径
  • –db_type - lmdb或leveldb, 默认lmdb
  • –gpus - GPU IDs列表,其中 0 为第一个GPU设备, 多个GPU用逗号’,’隔开
  • –num_gpus - GPUs总数,或者gpus列表
  • –num_channels - 颜色通道数,默认为3
  • –image_size - 输入图像的高和宽的像素值,假设宽和高一样,默认为227, 不能处理小尺寸的
  • –num_labels - labels数,默认1000
  • –batch_size - batch size,所有GPUs上的总和,默认32,增加GPUs可以增加其值
  • –epoch_size - 每个epoch中图像数,默认1.5MM(1500000),可以进行自定义
  • –num_epochs - epochs数
  • –base_learning_rate - 初始化学习率,默认0.1(基于256个batch size)
  • –weight_decay - weight decay(L2 regularization)
  • –num_shards - 分布式运行的机器数,默认1
  • –shard_id - shard/node id,默认为0,下一个node为1,以此
  • –run_id RUNID - 唯一运行码, e.g. uuid
  • –redis_host - Redis服务器的host(for rendezvous)
  • –redis_port - rendezvous的Redis端口
  • –file_store_path - alternative to Redis, (NFS) path to shared directory to use for rendezvous temp files to coordinate between each shard/node

testing用到的参数:
- 1. –train_data[必需]
- 2. –db_type[默认lmdb]
- 3. –num_gpus<#> [使用该方式,替代利用 –gpus列出各gpu的方式]
- 4. –batch_size[默认为32]
- 5. –test_data [可选]

唯一一个必须要提供的参数是训练数据库. 其调用方式为,其它参数默认:

python resnet50_trainer.py --train_data <location of lmdb training database>

使用LevelDB:

python resnet50_trainer.py --train_data <location of leveldb training database> --db_type leveldb

默认batch_size均为32. 如果采用2个GPU,需要根据GPU数来增加batch_size,以更多的利用GPU显存,此时,batch_size=64:

python resnet50_trainer.py --train_data <location of lmdb training database> --num_gpus 2 --batch_size 64

增加一个GPU,可以加倍batch size,每各epoch的迭代数减半.

采用 nvidia-smi查看GPU状态,* watch -n1 nvidia-smi*可在多个experiments时连续记录GPU状态.

加入 –test_data 参数,可以监督网络训练的效果,给出accuracy,便于分析收敛情况.

日志 Logging

运行训练程序时,在同文件夹内会生成log文件,该文件记录了在不同参数时的状态. 比如,

resnet50_gpu2_b64_L1000_lr0.10_v2_20170411_141617.log

从该文件名可以得出:
- –gpus 2
- –batch_size 64
- –num_labels 1000
- –base_learning_rate 0.10
以时间戳排列.

log文件中,记录的值有:
- time_spent
- cumulative_time_spent
- input_count
- cumulative_input_count
- cumulative_batch_count
- inputs_per_sec
- accuracy
- epoch
- learning_rate
- loss
- test_accuracy[如果没有test data,该值默认为-1,反之,输出accuracy值]

阅读更多
换一批

没有更多推荐了,返回首页