1. 程式人生 > >(二)Distributed Training分散式訓練

(二)Distributed Training分散式訓練

Caffe2 Distributed Training分散式訓練

Caffe2 最重要的一個特點是,便於分散式訓練,無須重構設計即可快速實現網路的伸縮.

  • Gloo - 用於多機訓練的通訊庫
  • NCLL - NVIDIA推出的多GPU通訊的NCCL庫
  • Redis - 為了對分散式訓練的節點進行有效管理, Caffe2採用NFS在節點間分享資料,或者採用Redis伺服器來處理節點間的通訊

Caffe2 提供的一個分散式訓練例項resnet50_trainer中,可以在單個GPU上執行 resnet50_trainer指令碼. 其中,訓練資料需要先載入到 lmdb database

, 或者LevelDB.

例項

安裝成功Caffe2後,分散式訓練至少有一個GPU,多個GPU更適合體現其分散式特點.

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值]