超详细微调Chinese Clip以及解决各种报错

为了重头开始演示,和为了重新再次遇到各种问题,我将从头创建环境重新开始微调。

准备工作

拉取项目

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分,因为我把最后结果修改格式后取提交其他比赛了,也就没研究为啥官方的评分脚本为啥不能用,有兴趣的同学可以研究之后在评论区打出来问题所在,至此我们微调结束,感谢观看!

### 解决 llamaFactory 大模型微调过程中的常见错误 #### 1. 显卡通信与分配问题 当使用 `llamaFactory` 进行多GPU配置时,可能会遇到显卡通信和分配方面的问题。具体表现为程序无法正确识别多个GPU设备,在尝试获取显卡设备进行设置时出现问题[^1]。 为了确保多GPU环境下的稳定运行: - **确认PyTorch版本兼容性**:保证所使用的 PyTorch 版本支持当前硬件平台上的分布式训练功能。 - **调整CUDA_VISIBLE_DEVICES环境变量**:通过设定此环境变量来指定可用的 GPU 设备编号,例如: ```bash export CUDA_VISIBLE_DEVICES=0,1 ``` - **采用DistributedDataParallel (DDP)**:相比于简单的数据并行模式(DataParallel),DDP 提供更高效的跨节点/设备间的同步机制,适合大规模集群部署场景。 #### 2. SignalException 错误处理 对于因非正常退出终端而导致的 `SignalException: Process XXXXX got signal: 1` 的异常情况,建议采取以下措施防止此类事件发生[^2]: - 使用 screen 或 tmux 工具创建持久化的 shell session 来执行长时间任务; - 将作业提交至批处理队列管理系统(如 SLURM、PBS Pro 等),从而避免人为因素干扰; - 修改启动脚本以忽略特定类型的信号,默认情况下 Python 应用会捕获 SIGINT 和 SIGHUP 并触发优雅关闭流程,可以通过修改代码逻辑绕过这些行为。 #### 3. ModuleNotFoundError 错误修复 针对 `ModuleNotFoundError: No module named 'llamafactory'` 的提示信息,这通常意味着项目依赖关系未被妥善管理或安装路径存在问题。解决方案包括但不限于: - 安装缺失模块及其子包,可通过 pip 命令完成操作: ```bash pip install --upgrade git+https://github.com/path_to_repo.git@branch_name#egg=package-name ``` - 如果是从源码构建,则需确保 setup.py 文件定义无误,并按照官方文档指引完成本地编译工作。 #### 4. AttributeError 错误修正 关于 `'AdamW' object has no attribute 'train'` 类型属性访问失败的情况,往往是因为不同版本之间的 API 变化引起。降低 `transformers` 库的版本号可能有助于缓解这一矛盾[^3]: ```bash pip uninstall transformers pip install transformers==specific_version_number ```
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

范sr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值