# 简介

pytorch框架下VIT模型预训练和微调任务，使用数据集为pytorch版本的ImageNet数据集

[代码地址](https://github.com/facebookresearch/mae)

# 数据集&模型地址

```
#昆山
/public/software/apps/DeepLearning/Data/ImageNet-pytorch
#乌镇
/public/DL_DATA/ImageNet-pytorch
```

模型下载地址（finetune时加载）：

[mae_pretrain_vit_base.pth](https://dl.fbaipublicfiles.com/mae/pretrain/mae_pretrain_vit_base.pth)

[mae_pretrain_vit_large.pth](https://dl.fbaipublicfiles.com/mae/pretrain/mae_pretrain_vit_large.pth)

[mae_pretrain_vit_huge.pth](https://dl.fbaipublicfiles.com/mae/pretrain/mae_pretrain_vit_huge.pth)

# 运行前准备

## 依赖包版本

```
需要安装timm包，且版本必须为0.3.2，一些重要依赖包版本如下：
tensorboard            2.0.2
protobuf               3.20.0
matplotlib             3.5.3
numpy                  1.21.6
absl-py                1.2.0
```

## 报错

```
报错ImportError: cannot import name ‘container_abcs‘ from ‘torch._six‘

这是由于在1.8版本之后container_abcs就已经被移除了，而代码是基于1.8之前别的版本，所以导入方式不同会出现这样的错误：cannot import name ‘container_abcs’ from ‘torch._six’
因此使用不同版本的torch会出现这个问题。

1.8以下版本使用 ：
from torch._six import container_abcs；
1.8以上版本使用（改成这个）：
import collections.abc as container_abcs
int_classes = int
string_classes = str
```

## 环境变量

```
#环境变量
IMAGENET_DIR                  数据集地址
PRETRAIN_CHKPT                模型文件地址
```

# 预训练任务

```
#模型参数
model  模型类型,可选:mae_vit_base_patch16,mae_vit_large_patch16,mae_vit_huge_patch14
预训练不需要加载模型，只需给出模型类型
```

## 单卡

./run_pretrain.sh

```
#!/bin/bash
export HIP_VISIBLE_DEVICE=0
export IMAGENET_DIR=/public/DL_DATA/ImageNet-pytorch
python3 main_pretrain.py  --epochs 1 --model mae_vit_base_patch16 --batch_size 64 --model mae_vit_base_patch16  --data_path ${IMAGENET_DIR}
```

## 多卡

./run_pretrain-4.sh

```
export IMAGENET_DIR=/public/DL_DATA/ImageNet-pytorch
export HIP_VISIBLE_DEVICE=0,1,2,3
OMP_NUM_THREADS=1 python3 -m torch.distributed.launch   --nproc_per_node=4 main_pretrain.py --epochs 1 --accum_iter 4 --model mae_vit_base_patch16 --batch_size 64 --model mae_vit_base_patch16  --data_path ${IMAGENET_DIR}   

```



# 微调任务

```
#模型参数
model  模型类型,可选:vit_base_patch16,vit_large_patch16,vit_huge_patch14,注意这个参数要与PRETRAIN_CHKPT所给模型地址相匹配。例如：vit_base_patch16对应mae_pretrain_vit_base.pth
```

## 单卡

./run-finetune.sh

```
export HIP_VISIBLE_DEVICE=0
export PRETRAIN_CHKPT=/work/home/hepj/model/VIT/mae_pretrain_vit_base.pth
export IMAGENET_DIR=/public/DL_DATA/ImageNet-pytorch 
python3  main_finetune.py \
    --batch_size 32 \
    --model vit_base_patch16 \
    --finetune ${PRETRAIN_CHKPT} \
    --epochs 1 \
    --blr 5e-4 --layer_decay 0.65 \
    --weight_decay 0.05 --drop_path 0.1 --mixup 0.8 --cutmix 1.0 --reprob 0.25 \
    --dist_eval --data_path ${IMAGENET_DIR}

```

## 多卡

./run-finetune-4.sh

```
export HIP_VISIBLE_DEVICE=0,1,2,3
export PRETRAIN_CHKPT=/work/home/hepj/model/VIT/mae_pretrain_vit_base.pth  
export IMAGENET_DIR=/public/DL_DATA/ImageNet-pytorch 
OMP_NUM_THREADS=1 python3 -m torch.distributed.launch --nproc_per_node=4 main_finetune.py \
    --accum_iter 4 \
    --batch_size 32 \
    --model vit_base_patch16 \
    --finetune ${PRETRAIN_CHKPT} \
    --epochs 1 \
    --blr 5e-4 --layer_decay 0.65 \
    --weight_decay 0.05 --drop_path 0.1 --mixup 0.8 --cutmix 1.0 --reprob 0.25 \
    --dist_eval --data_path ${IMAGENET_DIR}
```

# 结果验证

验证使用的模型为mae_finetuned_vit_xxx.pth，下载地址：

[mae_finetuned_vit_base.pth](https://dl.fbaipublicfiles.com/mae/finetune/mae_finetuned_vit_base.pth)

[mae_finetuned_vit_large.pth](https://dl.fbaipublicfiles.com/mae/finetune/mae_finetuned_vit_large.pth)

[mae_finetuned_vit_huge.pth](https://dl.fbaipublicfiles.com/mae/finetune/mae_finetuned_vit_huge.pth)

./run_eval.sh

```
#注意 model 与 resume模型对应
export PRETRAIN_CHKPT=/work/home/hepj/model/VIT/mae_finetuned_vit_base.pth
export IMAGENET_DIR=/public/DL_DATA/ImageNet-pytorch 
python main_finetune.py\
   --eval\
   --resume ${PRETRAIN_CHKPT}\
   --model vit_base_patch16\
   --batch_size 16\
   --data_path ${IMAGENET_DIR}
```

