本节课为王若晖老师和北京超算沈平岗老师主讲,将要介绍了openmmlabclassification的使用,以及在北京超算平台上的使用。
MMClassification 是一款基于 PyTorch 的开源图像分类工具箱,是 OpenMMLab 项目的成员之一
主分支代码目前支持 PyTorch 1.5 以上的版本。
支持多样的主干网络与预训练模型
支持配置多种训练技巧
大量的训练配置文件
高效率和高可扩展性
功能强大的工具箱
以windows为例(linux可以参考在下一节)
conda安装:根据自己网络环境选择conda镜像源进行下载,为快速下载可以选择minconda,这里总结了部分国内conda镜像源帮助地址:
anaconda | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
anaconda切换镜像源(以阿里云为例)-阿里云开发者社区 (aliyun.com)
南京大学Help (nju.edu.cn)
哈尔滨工业大学Index of /anaconda/ (hit.edu.cn)
Anaconda Mirror | SUSTech Open Source Mirrors
安装后以管理员身份运行powershell,并初始化
conda init powershell
如有英伟达显卡,可以更新驱动
之后创建、配置环境,所谓新的环境可以理解成为windows再创建一个用户,不需要考虑别的软件包的影响。
conda create -n <给环境取名字> python=3.8
这里使用pip进行下载,可以避免conda的智能化操作造成了不希望的情况(GPU版本出现不兼容的时候会去下载cpu版本的)
可以根据自己的cuda版本下载一个向下兼容的pytorch (python版本要完全一致),这里是最新的python3.8的GPU版本下载命令
pip3 install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117/torch-1.13.1%2Bcu117-cp38-cp38-win_amd64.whl
如果安装过程中缺乏包的错误安装后再次尝试即可
这里参考 欢迎来到 MMEngine 的中文文档! — mmengine 0.5.0 文档 ,欢迎来到 MMCV 的中文文档! — mmcv 1.7.1 文档 和 依赖环境 — MMClassification 1.0.0rc5 文档 安装 mmcv1.x系列
安装openmm管理软件
pip install -U openmim
通过min下载其他
mim install mmengine
mim install mmcv-full==1.7.0
mim install "mmcls>=1.0rc0"
当然mmcls可以选择源码安装,mmcls使用的时候往往要再源码库中构建config文件,所以直接下载源码是个不错的选择
git clone -b 1.x https://github.com/open-mmlab/mmclassification.git
cd mmclassification
pip install -U openmim && mim install -e .
作业一要求
下载数据集、并整理为要求的格式
再源码库中添加配置文件
训练
powershell移动到源码文件,方便起见先开个分支
git branch flower_train
git checkout flower_train
数据集划分和整理可以借助python的shutil和random可以轻松实现,这里给出我的方法,欢迎大家提pull requests
先下载必要的模型文件,这里可以根据自己的电脑配置选一个能跑起来的模型进行修改(modellist)
这里以moblienetv3-large为例,下载模型文件和configs文件,这里我们需要参考教程 1:如何编写配置文件 — MMClassification 0.25.0 文档
简单来说配置文件编写类似类的继承,只需要引入微调模型的config文件,做覆盖修改即可,创建一个名为 configs/mobilenet_v3/mobilenet-v3-large_flower.py 的配置文件,将 原来configs/mobilenet_v3/mobilenet-v3-large_8xb32_in1k.py 内容复制到flower里
_base_ = [
'../_base_/models/mobilenet_v3_large_imagenet.py',
'../_base_/datasets/imagenet_bs32_pil_resize.py',
'../_base_/default_runtime.py'
]
_base_ 是继承的配置文件,原配置文件分别继承了模型mobilenet_v3_large_imagenet配置,imagenet数据集配置imagenet_bs32_pil_resize,以及默认运行配置
对于flower数据集,只要修改模型的分类头、优化策略,并将flower替换imagenet即可
所以_base_这样定义:
_base_ = [
'../_base_/models/mobilenet_v3_large_flower.py',
'../_base_/datasets/flower.py',
'../_base_/default_runtime.py'
]
下面分别构建两个新的配置文件进行
为了方便起见模仿configs/_base_/datasets/imagenet_bs32_pil_resize.py写一个configs/_base_/datasets/flower.py,主要修改路径,当然也可以选择性修改归一化的参数:
_base_ = ['./imagenet_bs32_pil_resize.py']
dataset_type = 'CustomDataset'
classes = ["daisy", "dandelion", "rose", "sunflower", "tulip"]
img_norm_cfg = dict(
#TODO use the mean and std of flower is better
mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)
data = dict(
train=dict(
type=dataset_type,
data_prefix='',
ann_file='data/flower_dataset_split/train.txt',
pipeline=train_pipeline,
classes=classes,
),
val=dict(
type=dataset_type,
data_prefix='',
ann_file='data/flower_dataset_split/val.txt',
pipeline=test_pipeline,
classes=classes,
),
test=dict(
type=dataset_type,
data_prefix='',
ann_file='data/flower_dataset_split/val.txt',
pipeline=test_pipeline,
classes=classes,
),
)
# valuation = dict(interval=1, metric='accuracy')
evaluation = dict(interval=1, metric_options={'topk': (1, )})
为了方便起见模仿configs/_base_/models/mobilenet_v3_large_imagenet.py写一个configs/_base_/models/mobilenet_v3_large_flower.py,主要分类的数量和topk:
# model settings
_base_ = ['./mobilenet_v3_large_imagenet.py']
model = dict(head=dict(num_classes=5, topk=(1, )))
完善configs/mobilenet_v3/mobilenet-v3-large_8xb32_in1k.py
_base_ = [
'../_base_/models/mobilenet_v3_large_flower.py',
'../_base_/datasets/flower.py',
'../_base_/default_runtime.py'
]
# 优化器和学习率
optimizer = dict(type='SGD', lr=0.001, momentum=0.9, weight_decay=0.00004)
optimizer_config = dict(grad_clip=None)
lr_config = dict(policy='step', step=2, gamma=0.973, by_epoch=True)
# 加载模型参数做微调
load_from = r"你的模型文件下载到的路径\mobilenet_v3_large-3ea3c186.pth"
# max_epochs 设小一点
runner = dict(type='EpochBasedRunner', max_epochs=10)
python tools/train.py configs/mobilenet_v3/mobilenet_v3_large_flower.py --work-dir logs/2023-02-04/001
结果 accuracy_top-1: 98.0668
超算是用的集群,在环境配置和加载配置文件上有所不同,
conda和cudatool通过module load指令加载,而不需要下载,可用 module avail查询所有可以加载的module
module avail
module load anaconda/202x/xx/xx
conda init bash
module load cuda/xxx
之后安装pytorch和openmmlab同windows
加载配置文件就是提交集群任务,这里可以参考北大超算文档,北京超算30区mmcls课件
cat <run.sh
#!/bin/bash
module load anaconda/xxxx
module load cuda/xx
source activate
export PYTHONUNBUFFERED=1
python tools/train.py \
configs/mobilenet_v3/mobilenet_v3_large_flower.py \
--work-dir logs/2023-02-04/001
EOF
sbatch --gpus=1 run.sh
parajobs
tail -f slurm-<换成JOBID>.out