目录
更新记录:
2020.12.15:更新最新版pytorch安装,更新因项目文件命名修改引起的代码示例无法运行问题,补充更加详细的说明。
项目地址:https://github.com/open-mmlab/mmclassification
1、环境安装
python 3.7+
mmcv 1.2.1
opencv-contrib-python 4.3.0.36
opencv-python 4.3.0.36
Pillow 7.2.0
pycocotools 2.0.1
torch 1.7.0
torchvision 0.8.1
cuda 11.0
conda install pytorch torchvision cudatoolkit=11.0 -c pytorch # 依据官方最新版本安装
git clone https://github.com/open-mmlab/mmclassification.git
cd mmclassification
pip install -e . # or "python setup.py develop"
照上述说明,mmclassification是在dev模式下安装的,对代码进行的任何本地修改都将生效,而无需重新安装它(除非您提交了一些提交并希望更新版本号)。
2、训练测试
2.1、测试
测试一个数据集:
1)single GPU;
2)single node multiple GPU;
3)multiple node;
测试实例:
# single-gpu testing
python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}]
# multi-gpu testing
./tools/dist_test.sh ${CONFIG_FILE} ${CHECKPOINT_FILE} ${GPU_NUM} [--out ${RESULT_FILE}]
测试:
测试时,需要提供config文件及权重文件。首先,在工程目录下configs,任选一个,以cifar10下resnet50_b16x8.py为例。
在项目端,model_zoo页面,下载与之对应的模型文件,这里对应文件为CIFAR10下的ResNet-50-b16x8模型,点击model进行下载。下载后,在工程目录新建checkpoints文件夹,将模型放入。https://github.com/open-mmlab/mmclassification/blob/master/docs/model_zoo.md
python tools/test.py configs/cifar10/resnet50.py checkpoints/resnet50_batch256_20200708.pth
运行该脚本会自动下载模型及数据。自带的下载方式较慢,可手动下载后放对应目录。
测试结果如下:
2.2、训练
支持分布式、非分布式训练,分别使用MMDistributedDataParallel和MMDataParallel实现。所有输出都会在配置的work_dir里。
默认在每个epoch迭代进行进行验证集测试,改变验证频率可设置interval:
evaluation = dict(interval=12) # This evaluate the model per 12 epoch.
单GPU训练:
python tools/train.py ${CONFIG_FILE} [optional arguments]
实例:
python tools/train.py configs/cifar10/resnet50_b16x8.py
多GPU训练:
./tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM} [optional arguments]
可选参数为:
--no-validate:不验证。
--work-dir:覆盖配置文件中指定的工作目录。
--resume-from:从先前的检查点文件恢复。
resume-from与load-from之间的差异:
resume-from同时加载模型权重和优化器状态,并且epoch 也从指定的检查点继承,它通常用于恢复意外中断的训练过程。
load-from仅加载模型权重,并且训练时期从0开始。通常用于微调。
实例:
python tools/train.py configs/cifar10/resnet50_b16x8.py --resume-from=work_dirs/resnet50/epoch_14.pth
多机器训练:
[GPUS=${GPUS}] ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} ${CONFIG_FILE} ${WORK_DIR}
在一个机子上运行多任务训练:
CUDA_VISIBLE_DEVICES=0,1,2,3 PORT=29500 ./tools/dist_train.sh ${CONFIG_FILE} 4
CUDA_VISIBLE_DEVICES=4,5,6,7 PORT=29501 ./tools/dist_train.sh ${CONFIG_FILE} 4
3、使用工具
3.1、计算floats
python tools/get_flops.py ${CONFIG_FILE} [--shape ${INPUT_SHAPE}]
结果如下:
==============================
Input shape: (3, 224, 224)
Flops: 4.12 GFLOPs
Params: 25.56 M
==============================
1)FLOP与输入形状有关,而参数与输入形状无关。默认输入形状为(1、3、224、224);
2)像GN和自定义运算符一样,某些运算符不计入FLOP中。mmcv.cnn.get_model_complexity_info()有关详情,请参阅。
3.2、发布模型
在将模型上载到AWS之前,您可能需要:
1)将模型权重转换为CPU张量;
2)删除优化器状态;
3)计算检查点文件的哈希并将哈希ID附加到文件名中。
python tools/publish_model.py ${INPUT_FILENAME} ${OUTPUT_FILENAME}
实例:
python tools/publish_model.py work_dirs/resnet50/latest.pth imagenet_resnet50_20200708.pth
最后输出文件将会是:imagenet_resnet50_20200708-{hash id}.pth。
传送门:mmclassification项目阅读系列文章目录
教程文档翻译: