|
| 1 | +# 学习如何训练模型并测试 |
| 2 | + |
| 3 | +## 训练模型 |
| 4 | + |
| 5 | +本节将展示如何在支持的数据集上训练现有模型。 |
| 6 | + |
| 7 | +支持以下训练环境: |
| 8 | + |
| 9 | +- CPU |
| 10 | +- 单 GPU |
| 11 | +- 单节点多 GPU |
| 12 | +- 多节点 |
| 13 | + |
| 14 | +您也可以使用 Slurm 完成工作。 |
| 15 | + |
| 16 | +重点: |
| 17 | + |
| 18 | +- 您可以通过修改 `train_cfg` 为 `train_cfg = dict(val_interval=10)` 。 |
| 19 | + |
| 20 | + 从而在训练过程中更改评估间隔。这意味着每 10 个周期对模型进行一次评估。 |
| 21 | + |
| 22 | +- 所有配置文件的学习率设置默认是基于 8 个 GPUs 训练。 |
| 23 | + |
| 24 | + 根据 [Linear Scaling Rule](https://arxiv.org/abs/1706.02677) , |
| 25 | + |
| 26 | + 如果你使用不同数量的 GPUs 或者 单张 GPU 上图片数量有改动, 你需要设置学习率与批数据大小成正比。 |
| 27 | + |
| 28 | + 例如,`lr=0.01` 对应 8 GPU * 1 img/gpu,lr=0.04 对应 16 GPU * 2 imgs/gpu 。 |
| 29 | + |
| 30 | +- 在训练过程中,日志文件和历史模型会保存到工作目录中,工作目录由 CLI 参数 `--work-dir` 指定。它使用 `./work_dirs/CONFIG_NAME` 作为默认值。 |
| 31 | + |
| 32 | +- 如果你想要混合精确训练,只需指定 CLI 参数 `--amp` 。 |
| 33 | + |
| 34 | +#### 1. 基于 CPU 进行训练 |
| 35 | + |
| 36 | +模型默认放在 cuda 设备上训练。只有在没有 cuda 设备的情况下,模型才会放在 CPU 上。所以如果你想在 CPU 上训练模型,你需要设置 `export CUDA_VISIBLE_DEVICES=-1` 来禁用 GPU 可见性。更多内容详见 [MMEngine](https://github.com/open-mmlab/mmengine/blob/ca282aee9e402104b644494ca491f73d93a9544f/mmengine/runner/runner.py#L849-L850) |
| 37 | + |
| 38 | +```shell script |
| 39 | +CUDA_VISIBLE_DEVICES=-1 python tools/train.py ${CONFIG_FILE} [optional arguments] |
| 40 | +``` |
| 41 | + |
| 42 | +在 CPU 上训练 VID 模型 DFF 的例子: |
| 43 | + |
| 44 | +```shell script |
| 45 | +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/vid/dff/dff_faster-rcnn_r50-dc5_8xb1-7e_imagenetvid.py |
| 46 | +``` |
| 47 | + |
| 48 | +#### 2. 基于单 GPU 进行训练 |
| 49 | + |
| 50 | +如果你想在单 GPU 上训练模型,你可以直接使用 `tools/train.py` 如下所示。 |
| 51 | + |
| 52 | +```shell script |
| 53 | +python tools/train.py ${CONFIG_FILE} [optional arguments] |
| 54 | +``` |
| 55 | + |
| 56 | +你可以使用 `export CUDA_VISIBLE_DEVICES=$GPU_ID` 来选择 GPU 。 |
| 57 | + |
| 58 | +在单 GPU 上训练 MOT 模型 ByteTrack 的例子: |
| 59 | + |
| 60 | +```shell script |
| 61 | +CUDA_VISIBLE_DEVICES=2 python tools/train.py configs/mot/bytetrack/bytetrack_yolox_x_8xb4-80e_crowdhuman-mot17halftrain_test-mot17halfval.py |
| 62 | +``` |
| 63 | + |
| 64 | +#### 3. 基于单节点多 GPU 进行训练 |
| 65 | + |
| 66 | +我们提供 `tools/dist_train.sh` 在多个 GPU 上训练。 |
| 67 | + |
| 68 | +基本用法如下: |
| 69 | + |
| 70 | +```shell script |
| 71 | +bash ./tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM} [optional arguments] |
| 72 | +``` |
| 73 | + |
| 74 | +如果您想在一台机器上启动多个作业,例如,在一台8个 GPU 的机器上进行2个 4-GPU 训练作业, |
| 75 | + |
| 76 | +您需要为每个作业指定不同的端口(默认为29500),以避免通信冲突。 |
| 77 | + |
| 78 | +您可以通过以下命令设置端口: |
| 79 | + |
| 80 | +```shell script |
| 81 | +CUDA_VISIBLE_DEVICES=0,1,2,3 PORT=29500 ./tools/dist_train.sh ${CONFIG_FILE} 4 |
| 82 | +CUDA_VISIBLE_DEVICES=4,5,6,7 PORT=29501 ./tools/dist_train.sh ${CONFIG_FILE} 4 |
| 83 | +``` |
| 84 | + |
| 85 | +在单节点多 GPU 上训练 SOT 模型 SiameseRPN++ 的例子: |
| 86 | + |
| 87 | +```shell script |
| 88 | +bash ./tools/dist_train.sh ./configs/sot/siamese_rpn/siamese-rpn_r50_8xb16-20e_imagenetvid-imagenetdet-coco_test-otb100.py 8 |
| 89 | +``` |
| 90 | + |
| 91 | +#### 4. 基于多节点进行训练 |
| 92 | + |
| 93 | +如果你启动多台通过以太网简单连接的机器。你可以直接运行以下命令: |
| 94 | + |
| 95 | +在第一台机器上: |
| 96 | + |
| 97 | +```shell script |
| 98 | +NNODES=2 NODE_RANK=0 PORT=$MASTER_PORT MASTER_ADDR=$MASTER_ADDR bash tools/dist_train.sh $CONFIG $GPUS |
| 99 | +``` |
| 100 | + |
| 101 | +在第二台机器上: |
| 102 | + |
| 103 | +```shell script |
| 104 | +NNODES=2 NODE_RANK=1 PORT=$MASTER_PORT MASTER_ADDR=$MASTER_ADDR bash tools/dist_train.sh $CONFIG $GPUS |
| 105 | +``` |
| 106 | + |
| 107 | +如果你没有像 InfiniBand 这样的高速网络,它通常是很慢的。 |
| 108 | + |
| 109 | +#### 5. 基于 Slurm 进行训练 |
| 110 | + |
| 111 | +[Slurm](https://slurm.schedmd.com/) 是计算集群的一个很好的作业调度系统。在由 Slurm 管理的集群上,可以使用 `slurm_train.sh` 来生成培训作业。它支持单节点和多节点训练。 |
| 112 | + |
| 113 | +基本用法如下: |
| 114 | + |
| 115 | +```shell script |
| 116 | +bash ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} ${CONFIG_FILE} ${WORK_DIR} ${GPUS} |
| 117 | +``` |
| 118 | + |
| 119 | +用 Slurm 训练 VIS 模型 MaskTrack R-CNN 的例子: |
| 120 | + |
| 121 | +```shell script |
| 122 | +PORT=29501 \ |
| 123 | +GPUS_PER_NODE=8 \ |
| 124 | +SRUN_ARGS="--quotatype=reserved" \ |
| 125 | +bash ./tools/slurm_train.sh \ |
| 126 | +mypartition \ |
| 127 | +masktrack \ |
| 128 | +configs/vis/masktrack_rcnn/masktrack-rcnn_mask-rcnn_r50_fpn_8xb1-12e_youtubevis2019.py \ |
| 129 | +./work_dirs/MaskTrack_RCNN \ |
| 130 | +8 |
| 131 | +``` |
| 132 | + |
| 133 | +## 测试 |
| 134 | + |
| 135 | +本节将展示如何在受支持的数据集上测试现有模型。 |
| 136 | + |
| 137 | +支持以下测试环境: |
| 138 | + |
| 139 | +- CPU |
| 140 | +- 单 GPU |
| 141 | +- 单节点多 GPU |
| 142 | +- 多节点 |
| 143 | + |
| 144 | +您也可以使用 Slurm 完成工作。 |
| 145 | + |
| 146 | +重点: |
| 147 | + |
| 148 | +- 您可以通过修改评估器中的 `outfile_prefix` 来设置结果保存路径。例如, `val_evaluator = dict(outfile_prefix='results/stark_st1_trackingnet')` 。否则,将创建一个临时文件,并将在评估后删除。 |
| 149 | +- 如果你只想要格式化的结果而不需要求值,你可以设置 `format_only=True` 。例如, `test_evaluator = dict(type='YouTubeVISMetric', metric='youtube_vis_ap', outfile_prefix='./youtube_vis_results', format_only=True)` |
| 150 | + |
| 151 | +#### 1. 基于 CPU 进行测试 |
| 152 | + |
| 153 | +模型默认放在 cuda 设备上训练。只有在没有 cuda 设备的情况下,模型才会放在 CPU 上。所以如果你想在 CPU 上测试模型,你需要设置 `export CUDA_VISIBLE_DEVICES=-1` 来禁用 GPU 可见性。详情请浏览 [MMEngine](https://github.com/open-mmlab/mmengine/blob/ca282aee9e402104b644494ca491f73d93a9544f/mmengine/runner/runner.py#L849-L850) 。 |
| 154 | + |
| 155 | +```shell script |
| 156 | +CUDA_VISIBLE_DEVICES=-1 python tools/test.py ${CONFIG_FILE} [optional arguments] |
| 157 | +``` |
| 158 | + |
| 159 | +在 CPU 上测试 VID 模型 DFF 的例子: |
| 160 | + |
| 161 | +```shell script |
| 162 | +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/vid/dff/dff_faster-rcnn_r50-dc5_8xb1-7e_imagenetvid.py --checkpoint https://download.openmmlab.com/mmtracking/vid/dff/dff_faster_rcnn_r50_dc5_1x_imagenetvid/dff_faster_rcnn_r50_dc5_1x_imagenetvid_20201227_213250-548911a4.pth |
| 163 | +``` |
| 164 | + |
| 165 | +#### 2. 基于单 GPU 进行测试 |
| 166 | + |
| 167 | +如果你想在单个 GPU 上测试模型,你可以直接使用下面的 `tools/test.py` 。 |
| 168 | + |
| 169 | +```shell script |
| 170 | +python tools/test.py ${CONFIG_FILE} [optional arguments] |
| 171 | +``` |
| 172 | + |
| 173 | +你可以使用 `export CUDA_VISIBLE_DEVICES=$GPU_ID` 来选择 GPU 。 |
| 174 | + |
| 175 | +在单 GPU 上测试 MOT 模型 ByteTrack 的一个例子: |
| 176 | + |
| 177 | +```shell script |
| 178 | +CUDA_VISIBLE_DEVICES=2 python tools/test.py configs/mot/bytetrack/bytetrack_yolox_x_8xb4-80e_crowdhuman-mot17halftrain_test-mot17halfval.py --checkpoint https://download.openmmlab.com/mmtracking/mot/bytetrack/bytetrack_yolox_x/bytetrack_yolox_x_crowdhuman_mot17-private-half_20211218_205500-1985c9f0.pth |
| 179 | +``` |
| 180 | + |
| 181 | +#### 3. 基于单节点多 GPU 进行测试 |
| 182 | + |
| 183 | +我们提供 `tools/dist_test.sh` 在多个 GPU 上启动测试。基本用法如下。 |
| 184 | + |
| 185 | +```shell script |
| 186 | +bash ./tools/dist_test.sh ${CONFIG_FILE} ${GPU_NUM} [optional arguments] |
| 187 | +``` |
| 188 | + |
| 189 | +在单节点多 GPU 上测试 SOT 模型 siameserpn++ 的例子: |
| 190 | + |
| 191 | +```shell script |
| 192 | +bash ./tools/dist_test.sh ./configs/sot/siamese_rpn/siamese-rpn_r50_8xb16-20e_imagenetvid-imagenetdet-coco_test-otb100.py 8 --checkpoint https://download.openmmlab.com/mmtracking/sot/siamese_rpn/siamese_rpn_r50_1x_otb100/siamese_rpn_r50_20e_otb100_20220421_144232-6b8f1730.pth |
| 193 | +``` |
| 194 | + |
| 195 | +#### 4. 基于多节点进行测试 |
| 196 | + |
| 197 | +您可以在多个节点上进行测试,这与 ”在多个节点上进行训练” 类似。 |
| 198 | + |
| 199 | +#### 5. 基于 Slurm 进行测试 |
| 200 | + |
| 201 | +在由Slurm管理的集群上,可以使用 `slurm_test.sh` 生成测试工作。它支持单节点和多节点测试。 |
| 202 | + |
| 203 | +基本用法如下。 |
| 204 | + |
| 205 | +```shell script |
| 206 | +bash ./tools/slurm_test.sh ${PARTITION} ${JOB_NAME} ${CONFIG_FILE} ${GPUS} |
| 207 | +``` |
| 208 | + |
| 209 | +用 Slurm 测试 VIS 模型 MaskTrack R-CNN 的例子: |
| 210 | + |
| 211 | +```shell script |
| 212 | +PORT=29501 \ |
| 213 | +GPUS_PER_NODE=8 \ |
| 214 | +SRUN_ARGS="--quotatype=reserved" \ |
| 215 | +bash ./tools/slurm_test.sh \ |
| 216 | +mypartition \ |
| 217 | +masktrack \ |
| 218 | +configs/vis/masktrack_rcnn/masktrack-rcnn_mask-rcnn_r50_fpn_8xb1-12e_youtubevis2019.py \ |
| 219 | +8 \ |
| 220 | +--checkpoint https://download.openmmlab.com/mmtracking/vis/masktrack_rcnn/masktrack_rcnn_r50_fpn_12e_youtubevis2019/masktrack_rcnn_r50_fpn_12e_youtubevis2019_20211022_194830-6ca6b91e.pth |
| 221 | +``` |
0 commit comments