(二)Distributed Training分散式訓練
Caffe2 Distributed Training分散式訓練
Caffe2 最重要的一個特點是,便於分散式訓練,無須重構設計即可快速實現網路的伸縮.
- Gloo - 用於多機訓練的通訊庫
- NCLL - NVIDIA推出的多GPU通訊的NCCL庫
- Redis - 為了對分散式訓練的節點進行有效管理, Caffe2採用NFS在節點間分享資料,或者採用Redis伺服器來處理節點間的通訊
Caffe2 提供的一個分散式訓練例項resnet50_trainer中,可以在單個GPU上執行 resnet50_trainer指令碼. 其中,訓練資料需要先載入到 lmdb database
例項
安裝成功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值]