ai实战训练营Day3

摘要

本节课为王若晖老师和北京超算沈平岗老师主讲,将要介绍了openmmlabclassification的使用,以及在北京超算平台上的使用。

mmcls

MMClassification 是一款基于 PyTorch 的开源图像分类工具箱,是 OpenMMLab 项目的成员之一

主分支代码目前支持 PyTorch 1.5 以上的版本。

主要特性

  • 支持多样的主干网络与预训练模型

  • 支持配置多种训练技巧

  • 大量的训练配置文件

  • 高效率和高可扩展性

  • 功能强大的工具箱

环境配置

以windows为例(linux可以参考在下一节)

conda安装:根据自己网络环境选择conda镜像源进行下载,为快速下载可以选择minconda,这里总结了部分国内conda镜像源帮助地址:

  1. anaconda | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

  1. anaconda切换镜像源(以阿里云为例)-阿里云开发者社区 (aliyun.com)

  1. 南京大学Help (nju.edu.cn)

  1. 哈尔滨工业大学Index of /anaconda/ (hit.edu.cn)

  1. Anaconda Mirror | SUSTech Open Source Mirrors

安装后以管理员身份运行powershell,并初始化

conda init powershell

如有英伟达显卡,可以更新驱动

之后创建、配置环境,所谓新的环境可以理解成为windows再创建一个用户,不需要考虑别的软件包的影响。

conda create -n <给环境取名字> python=3.8

这里使用pip进行下载,可以避免conda的智能化操作造成了不希望的情况(GPU版本出现不兼容的时候会去下载cpu版本的)

pytorch

可以根据自己的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

如果安装过程中缺乏包的错误安装后再次尝试即可

openmmlab

这里参考 欢迎来到 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 .

使用mmcls完成作业一

作业一要求

  1. 下载数据集、并整理为要求的格式

  1. 再源码库中添加配置文件

  1. 训练

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_ = [
    '../_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

在超算中心使用mmcls

超算是用的集群,在环境配置和加载配置文件上有所不同,

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课件

编写run.sh

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

提交run.sh

sbatch --gpus=1 run.sh

查询任务

parajobs

查看日志

tail -f slurm-<换成JOBID>.out

你可能感兴趣的:(ai实战营笔记,人工智能,神经网络,深度学习)