L2 Intern-S1/InternVL 微调公式识别实践(Swift)
本课程将带您基于MS-Swift框架,完成Intern-S1-mini与InternVL3_5-1B两款模型的公式识别任务微调,从GPU环境配置,到超参数调整、LoRA权重合并,再到最终模型上传至ModelScope并提交评测。intern-s1-mini 用swift 微调合并后,会有文件缺失,我们只需讲源权重目录下文件对应的补回来即可。等微调运行完成后,将 lora 微调产生的部分权重和源权重
·
1. 环境安装
- 环境安装
在创建开发机界面选择镜像为Cuda12.8-conda,并选择 GPU 为 50% A100。
安装必要的包和ms-swift:
conda create -n ms-swift11 python=3.10 -y
conda activate ms-swift11
cd /root
git clone https://gh.llkk.cc/https://github.com/fak111/VLM-formula-recognition-dataset.git
cd VLM-formula-recognition-dataset
pip install -r requirements.txt
pip install transformers -U
git clone https://gh.llkk.cc/https://github.com/modelscope/ms-swift.git
cd ms-swift
git checkout cab4aa59
pip install -e .
pip install timm==1.0.9 msgspec==0.19.0
2. Intern-S1-mini微调
2.1 启动微调训练
cd /root/VLM-formula-recognition-dataset
bash swift_config/interns1_mini_train.sh
输入下面命令可以查看 log
tail -f xxx.log

等微调运行完成后,将 lora 微调产生的部分权重和源权重进行合并。
2.2 合并
swift export --adapters 模型输出文件夹 --merge_lora True
如
swift export --adapters /root/VLM-formula-recognition-dataset/swift_output/SFT-Interns1mini/v0-20251010-124124/checkpoint-3 --merge_lora True
2.3 补全
intern-s1-mini 用swift 微调合并后,会有文件缺失,我们只需讲源权重目录下文件对应的补回来即可。
SRC="/root/share/new_models/Intern-S1-mini"
DST=" 填写你微调后的权重"
rsync -ah --ignore-existing --exclude='/proc' --exclude='proc' "$SRC"/ "$DST"/
示例
SRC="/root/share/new_models/Intern-S1-mini"
DST="/root/VLM-formula-recognition-dataset/swift_output/SFT-Interns1mini/v0-20251010-124124/checkpoint-3-merged"
rsync -ah --ignore-existing --exclude='/proc' --exclude='proc' "$SRC"/ "$DST"/
3. InternVL3_5-1B微调
本教程使用 Swift 框架进行模型微调。在 swift_config/ 目录下提供了一个训练脚本 internvl3.5_1b_train.sh 作为参考。
您可以根据自己的需求,调整脚本中的超参数,例如:
- dataset 数据集目录 (可自行进行探索制作数据集)
- learning_rate 自调学习率
- num_train_epochs 自调训练轮数
配置完成后,执行训练脚本:
#!/bin/bash
# 创建日志目录
LOG_DIR="logs"
mkdir -p $LOG_DIR
# 获取当前时间戳
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
LOG_FILE="$LOG_DIR/[SFT]internvl3.5_1b_${TIMESTAMP}.log"
# 设置环境变量
# export ENABLE_AUDIO_OUTPUT=False
export OMP_NUM_THREADS=1
export CUDA_VISIBLE_DEVICES=0
# 设置随机端口号,避免端口冲突
export MASTER_PORT=$((10000 + RANDOM % 50000))
# 先打印启动信息
echo "Starting training..."
echo "Log file: $LOG_FILE"
echo "Using port: $MASTER_PORT"
# 没有指定 model_type
# 启动训练并获取PID
nohup swift sft \
--model '/root/share/new_models/InternVL3.5/InternVL3_5-1B'\
--dataset '/root/share/datasets/VLM-formula-recognition-dataset_intern_camp/train/train_mini_abs.jsonl' \
--eval_steps 1000 \
--train_type lora \
--lora_rank 4 \
--lora_dropout 0.01 \
--lora_alpha 8 \
--torch_dtype bfloat16 \
--num_train_epochs 5 \
--per_device_train_batch_size 1 \
--per_device_eval_batch_size 1 \
--learning_rate 1e-4 \
--warmup_ratio 0.05 \
--gradient_accumulation_steps 4 \
--save_steps 2000 \
--save_total_limit 10 \
--gradient_checkpointing_kwargs '{"use_reentrant": false}' \
--logging_steps 1 \
--max_length 6000 \
--output_dir ./swift_output/SFT-InternVL3_5-1B\
--dataset_num_proc 8 \
--dataloader_num_workers 8 \
--metric acc \
--freeze_vit true \
> "$LOG_FILE" 2>&1 &
# 获取PID并等待一下确保进程启动
TRAIN_PID=$!
sleep 2
# 检查进程是否还在运行
if kill -0 $TRAIN_PID 2>/dev/null; then
echo "Training started successfully with PID $TRAIN_PID"
echo "To view logs in real-time, use:"
echo "tail -f $LOG_FILE"
echo ""
echo "To stop training, use:"
echo "kill -9 $TRAIN_PID"
else
echo "Failed to start training process"
echo "Check log file for errors: $LOG_FILE"
fi
3.1 启动
cd /root/VLM-formula-recognition-dataset
bash swift_config/internvl3.5_1b_train.sh
输入下面命令可以查看 log
tail -f xxx.log
等微调运行完成后,将 lora 微调产生的部分权重和源权重进行合并。
3.2 合并
swift export --adapters 模型输出文件夹 --merge_lora True
4. 提交结果
4.1 上传
运行upload.py 上传模型
from modelscope.hub.api import HubApi
from modelscope.hub.constants import Licenses, ModelVisibility
# 配置基本信息
YOUR_ACCESS_TOKEN = 'ms-9fxx7e'#填写自己的 api token
api = HubApi()
api.login(YOUR_ACCESS_TOKEN)
# 取名字
owner_name = 'xx' # ModelScope 的用户名,需根据自己情况修改
model_name = 'xx' # 为模型库取个响亮优雅又好听的名字,需根据自己情况修改
model_id = f"{owner_name}/{model_name}"
#创建模型仓库
api.create_model(
model_id,
visibility=ModelVisibility.PUBLIC,
license=Licenses.APACHE_V2,
chinese_name=f"{owner_name}的 latex 分类"
)
#上传模型到仓库
api.upload_folder(
repo_id=f"{owner_name}/{model_name}",
folder_path='xx', # 微调后模型的文件夹名称
commit_message='upload model folder to repo', # 写上传信息
)

提交表单的 prompt 参考如下,这里也有优化空间,可自行探索最优 prompt:
"""请根据图片中的公式生成对应的 latex 公式文本,不要任何解释。
输出格式要求:
1. 必须使用 ```latex 代码块包裹
2. 仅包含 LaTeX 代码,无任何文字说明
3. 确保语法正确,下标用 {} 括起来
输出案例:
案例 1:
```latex
\sum_{i=1}^{n} x_i = \mu
```案例 2:
```latex
\begin{bmatrix}
a & b \\
c & d
\end{bmatrix}
查询分数
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)