为了重头开始演示,和为了重新再次遇到各种问题,我将从头创建环境重新开始微调。
准备工作
拉取项目
Chinese-Clip项目地址Chinese-Clip
git clone https://github.com/OFA-Sys/Chinese-CLIP.git
创建目录
根据官方要求构建目录
Chinese-CLIP/
├── run_scripts/
│ ├── muge_finetune_vit-b-16_rbt-base.sh
│ ├── flickr30k_finetune_vit-b-16_rbt-base.sh
│ └── … # 更多finetune或评测脚本…
└── cn_clip/
├── clip/
├── eval/
├── preprocess/
└── training/
${DATAPATH}
├── pretrained_weights/
├── experiments/
├── deploy/ # 用于存放ONNX & TensorRT部署模型
└── datasets/
├── MUGE/
├── Flickr30k-CN/
└── …/ # 更多自定义数据集…
Chinese-CLIP目录我们已经拉取了,所以需要自己创建${DATAPATH}目录,起一个名字就叫作clip-data,因为里面全是存放数据集和模型的地方,建立好如下:
clip-data目录
创建环境
conda create -n clipcsdn python==3.10
因为我的环境里面有clip了,这里创建clipcsdn来区别一下。
激活环境
conda activate clipcsdn
将目录切到Chinese-Clip目录,安装依赖
#切换目录
cd /home/fsy23/CSDN/Chinese-CLIP/
#使用清华源安装
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
数据集准备
由于官方要求的数据集格式比较特殊,我这里直接使用一份格式弄好的数据集,各位如果想用自己的数据集,官方也给出了数据集的修改代码。点这
我是用的数据集下载地址在这
这里面是标准的数据集格式,文件名是这个数据集的名字,将它放在clip-data/datasets目录下,并解压,弄完就是如下样式:
记得解压
#解压命令
unzip MUGE.zip
这个数据集是图文搜索的,是一些电商产品的图片和对应的描述。这里我们只演示文搜图的微调流程。
接下来我们开始微调
下载模型
下载模型可以根据官方的指定地址下载,这次我们微调的是基础版本的也就是clip-cn-vit-b-16.pt,下载地址
将下载好的模型放到clip-data/pretrained_weights目录之下,如下图:
微调
修改脚本
我们使用run_scripts/muge_finetune_vit-b-16_rbt-base.sh这个基础版的脚本。
这里面我们需要修改几个参数,各个参数的意义参考官方解释在这
下面还有需要改的地方
还有训练的超参数
改完之后我们开始微调,运行命令:
nohup bash run_scripts/muge_finetune_vit-b-16_rbt-base.sh /home/fsy23/CSDN/clip-data/ > train.log 2>&1 &
将这个进程挂到后台,这样可以防止断网或者关闭页面导致训练掉线了,我们脚本后面紧跟我们的clip-data路径,不知道这个命令其他部分具体含义的 可以看我这篇博客中的讲解:点这 这里有详细的讲解。
开始微调
训练日志我们可以通过两个地方看到,一个是我们自己在命令行指定的 train.log,一个是官方的指定目录。我们打开log看一眼:
发现报错了,这里是说我们有个参数定义的有歧义,这个参数是logs,会和logs-specs、logs_specs参数有歧义。这里我们修改一下这个bug,虽然我不知道官方是怎么跑通的,(应该是我的torch版本太高了,我用的2.4.0,官方的很低,所以没有这个错误)但是这个参数必须换一下名字。
还是打开我们的脚本,在下面有个logs参数,我们改一下名字:
我们改一下这个,在cn_clip/training/params.py
除了在这改,还需要在cn_clip/training/main.py脚本里面修改一下,因为这个参数是传到这个main文件里面使用的,依照目录打开这个py文件,按照图中修改就行。
接下来我们再重新运行一下脚本命令:
nohup bash run_scripts/muge_finetune_vit-b-16_rbt-base.sh /home/fsy23/CSDN/clip-data/ > train.log 2>&1 &
看日志我们已经开始训练了:
提取图文特征
我们微调好候得模型保存在**/clip-data/pretrained_weights/**,紧接着我们可以用它来进行,图文的特征提取,以便后续的预测和评估。
官方也给出了脚本,但是需要自己传路径,我嫌麻烦我就写到里面了,如下:
eexport CUDA_VISIBLE_DEVICES=0
export PYTHONPATH="${PYTHONPATH}:$(pwd)/cn_clip"
DATAPATH="/home/fsy23/CSDN/clip-data/"
dataset_name="MUGE"
split=test # 指定计算valid或test集特征
# 把刚训练好的模型路径填写在这
resume="${DATAPATH}/experiments/muge_finetune_vit-b-16_roberta-base_bs_22gpu/checkpoints/epoch_latest.pt"
python -u cn_clip/eval/extract_features.py \
--extract-image-feats \
--extract-text-feats \
--image-data="${DATAPATH}/datasets/${dataset_name}/lmdb/${split}/imgs" \
--text-data="${DATAPATH}/datasets/${dataset_name}/${split}_texts.jsonl" \
--img-batch-size=32 \
--text-batch-size=32 \
--context-length=52 \
--resume="${resume}" \
--vision-model=ViT-B-16 \
--text-model=RoBERTa-wwm-ext-base-chinese
KNN检索
新建脚本,内容如下,运行会得到最终预测结果
split=test # 指定计算valid或test集特征
DATAPATH="/home/fsy23/CSDN/clip-data/"
dataset_name="MUGE"
python -u cn_clip/eval/make_topk_predictions.py \
--image-feats="${DATAPATH}/datasets/${dataset_name}/${split}_imgs.img_feat.jsonl" \
--text-feats="${DATAPATH}/datasets/${dataset_name}/${split}_texts.txt_feat.jsonl" \
--top-k=10 \
--eval-batch-size=32768 \
--output="${DATAPATH}/datasets/${dataset_name}/${split}_predictions.jsonl"
到这我们就得到了,一个文本和其对应检索回来的10张排序好的图片,也就是top-k10.文件存放在clip-data/datasets/MUGE/test_predictions.jsonl
评分
官方还提供了评分脚本,但是我运行后是0分,因为我把最后结果修改格式后取提交其他比赛了,也就没研究为啥官方的评分脚本为啥不能用,有兴趣的同学可以研究之后在评论区打出来问题所在,至此我们微调结束,感谢观看!