微调流程图

一.数据集准备
1.数据集介绍
MedTrinity-25M 是一个全面的大型医学多模态数据集,由华中科技大学、加州大学、哈佛大学、斯坦福大学等机构合作发布,涵盖 10 种模态 2500 多万张图像,为 65 多种疾病提供多粒度注释。这些注释既包括全局文本信息,例如疾病/病变类型、模态、区域特定描述和区域间关系,也包括感兴趣区域 (ROI) 的详细局部注释,包括边界框、分割蒙版。支持全面的多模态任务,例如字幕和报告生成,以及以视觉为中心的分类、分割等任务。
此次微调使用到了其中的 16万+张影像,主要使用了其中有关脑部疾病的影像数据集
2.数据下载
2.1安装Hugging Face的Datasets库
pip install datasets
2.2下载数据集
from datasets import load_dataset
# 加载数据集
ds = load_dataset("UCSC-VLAA/MedTrinity-25M", "25M_demo", cache_dir="cache")

- 以上方法是使用HuggingFace的Datasets库下载数据集,下载的路径为当前脚本所在路径下的cache文件夹。
- 使用HuggingFace下载需要能够访问https://huggingface.co/ 并且在网站上申请数据集读取权限才可以。
♥直接加载本地数据集
from datasets import load_dataset
dataset = load_dataset('包括所有数据集文件的目录地址')
eg:E:/模型微调/MedTrinity-25M/原始数据/25Mdemo/cache/UCSC-VLAAMedTrinity-25M/25M_demo/0.0.0/89e5c684794e5c4cc1af9e8f1a7798af7c937dbf
2.3预览数据集
# 查看训练集的前1个样本
print(ds['train'][:1])
运行结果:
{
'image': [<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=512x512 at 0x15DD6D06530>],
'id': ['8031efe0-1b5c-11ef-8929-000066532cad'],
'caption': ['The image is a non-contrasted computed tomography (CT) scan of the brain, showing the cerebral structures without any medical devices present. The region of interest, located centrally and in the middle of the image, exhibits an area of altered density, which is indicative of a brain hemorrhage. This area is distinct from the surrounding brain tissue, suggesting a possible hematoma or bleeding within the brain parenchyma. The location and characteristics of this abnormality may suggest a relationship with the surrounding brain tissue, potentially causing a mass effect or contributing to increased intracranial pressure.'
]
}
使用如下命令对数据集的图片进行可视化查看:
# 可视化image内容
from PIL import Image
import matplotlib.pyplot as plt
image = ds['train'][0]['image'] # 获取第一张图像
plt.imshow(image)
plt.axis('off') # 不显示坐标轴
plt.show()
运行结果

3.数据预处理
由于后续我们要通过LLama Factory进行多模态大模型微调,所以我们需要对上述的数据集进行预处理以符合LLama Factory的要求。
3.1 LLama Factory数据格式
LLama Factory要求的数据格式要求如下:
[
{
"messages": [
{
"content": "<image>他们是谁?",
"role": "user"
},
{
"content": "他们是拜仁慕尼黑的凯恩和格雷茨卡。",
"role": "assistant"
},
{
"content": "他们在做什么?",
"role": "user"
},
{
"content": "他们在足球场上庆祝。",
"role": "assistant"
}
],
"images": [
"mllm_demo_data/1.jpg"
]
}
]
3.2数据格式转换脚本
from datasets import load_dataset
import os
import json
from PIL import Image
def save_images_and_json(ds, output_dir="mllm_data"):
"""
将数据集中的图像和对应的 JSON 信息保存到指定目录。
参数:
ds: 数据集对象,包含图像和标题。
output_dir: 输出目录,默认为 "mllm_data"。
"""
# 创建输出目录
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 创建一个列表来存储所有的消息和图像信息
all_data = []
# 遍历数据集中的每个项目
for item in ds:
img_path = f"{output_dir}/{item['id']}.jpg" # 图像保存路径
image = item["image"] # 假设这里是一个 PIL 图像对象
# 将图像对象保存为文件
image.save(img_path) # 使用 PIL 的 save 方法
# 添加消息和图像信息到列表中
all_data.append(
{
"messages": [
{
"content": "<image>图片中的诊断结果是怎样?",
"role": "user",
},
{
"content": item["caption"], # 从数据集中获取的标题
"role": "assistant",
},
],
"images": [img_path], # 图像文件路径
}
)
# 创建 JSON 文件
json_file_path = f"{output_dir}/mllm_data.json"
with open(json_file_path, "w", encoding='utf-8') as f:
json.dump(all_data, f, ensure_ascii=False) # 确保中文字符正常显示
if __name__ == "__main__":
# 加载数据集
ds = load_dataset("UCSC-VLAA/MedTrinity-25M", "25M_demo", cache_dir="cache")
# 保存数据集中的图像和 JSON 信息
save_images_and_json(ds['train'])

♥数据集处理代码
二.模型准备
模型下载
使用阿里的多模态大模型:Qwen2-VL-2B-Instruct
作为底座模型。
模型说明地址 :通义千问2-VL-2B-Instruct
安装lfs
apt-get update
apt-get install -y curl git
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash
apt-get install -y git-lfs
git lfs install
使用以下命令下载模型
# 下载模型
pip install modelscope
# git clone https://www.modelscope.cn/Qwen/Qwen2-VL-2B-Instruct.git
modelscope download --model Qwen/Qwen2-VL-2B-Instruct
(❌)使用命令下载可能会下载模型权重文件失败,即以下两个文件

此时需要手动打开官网下载模型权重文件并上传服务器
AutoDL的数据盘地址为 /root/atodl_tmp
模型说明地址 :通义千问2-VL-2B-Instruct
完整模型文件↓

三.环境准备
1.硬件环境
- 硬件:
-
- GPU:推荐使用24GB显存的显卡或者更高配置
- 软件:
-
- python:3.10
- pytorch:2.1.2 + cuda12.1
- 操作系统:Ubuntu 22.04
推荐选择DSW官方镜像: modelscope:1.14.0-pytorch2.1.2-gpu-py310-cu121-ubuntu22.04
2.准备虚拟环境
安装conda环境
# 首先,更新系统软件包索引
sudo apt update
sudo apt upgrade -y
# 下载Miniconda安装脚本,适用于Linux x86_64架构
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
# 给下载的安装脚本添加执行权限
chmod +x Miniconda3-latest-Linux-x86_64.sh
# 运行安装脚本,按照提示完成安装
# 注意:您可能需要同意许可协议,并选择是否将conda添加到PATH环境变量中
./Miniconda3-latest-Linux-x86_64.sh
# 安装完成后,关闭终端并重新打开一个新的终端窗口
# 或者,您也可以通过运行以下命令来初始化conda环境
source ~/.bashrc
# 验证conda是否安装成功
conda --version
# # 设置conda使用清华镜像源,以加快下载速度
# conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
# conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
# conda config --set show_channel_urls yes
# 更新conda到最新版本
conda update conda
# 配置conda镜像源
conda config --remove-key channels
conda config --add channels defaults
conda config --add channels conda-forge
conda config --show channels
# 创建python3.10版本虚拟环境
conda create --name train_env python=3.10
# 激活环境
conda init bash
source ~/.bashrc
conda activate train_env
# 安装依赖包
pip install streamlit torch torchvision
pip install -e ".[torch,metrics]"
# 安装Qwen2建议的transformers版本
pip install transformers==4.47.0
四.准备训练框架(LLama-Factory)
这里以魔塔社区ModelScope的PAI-DSW为例
1.登录ModelScope平台,启动PAI-DSW的GPU环境,并进入容器。


2.在容器中,通过命令行拉取代码
a.环境准备
b.
# 拉取代码
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
# 进入代码目录
cd LLaMA-Factory
# 安装依赖
pip install -e ".[torch,metrics]"
检查环境是否安装成功
llamafactory-cli version
安装成功会显示如下信息

- 如果安装不成功,需要根据提示信息进行逐个问题解决。
- 一般情况下,在ModelScope平台中,一般会出现 Keras**版本不匹配的问题,可以运行 pip install tf-keras**解决。
3.进行端口映射命令
a.魔塔社区(如果未报错可以跳过这步)
由于阿里云平台的端口映射似乎存在问题,这会导致启动LLaMA Factory的Web界面显示异常,所以需要手动在命令行运行如下命令:
export GRADIO_SERVER_PORT=7860 GRADIO_ROOT_PATH=/${JUPYTER_NAME}/proxy/7860/
b.AutoDL(必须进行这步)

4.修改LLaMaFactory源码以适配transformer
由于Qwen2-VL使用的transformer
的版本为4.47.0
,LLamaFactory还不支持,所以需要修改LLaMaFactory的代码,具体方法如下:
# 卸载旧的 transformer
pip uninstall transformer
# 安装新的 transformer
pip install transformer==4.47.0
第一步 :在 llamafactory
源码中,找到 check_dependencies()
函数,这个函数位于 src/llamafactory/extras/misc.py
文件的第 82
行。
第二步 :修改 check_dependencies()
函数并保存
# 原始代码
check_version("transformers>=4.45.0,<=4.51.3,!=4.46.0,!=4.46.1,!=4.46.2,!=4.46.3,!=4.47.0,!=4.47.1,!=4.48.0")
# 修改后代码
check_version("transformers>=4.45.0,<=4.51.3,!=4.46.0,!=4.46.1,!=4.46.2,!=4.46.3,!=4.47.1,!=4.48.0")
第三步:重新启动LLaMaFactory服务
llamafactory-cli webui
这个过程可能会提示 ImportError: accelerate>=0.34.0 is required for a normal functioning of this module, but found accelerate==0.32.0.
如遇到上述问题,可以重新安装accelerate,如下:
# 卸载旧的 accelerate
pip uninstall accelerate
# 安装新的 accelerate
pip install accelerate==0.34.0
5.命令行下运行命令,启动WebUI界面
llamafactory-cli webui
启动后,点击返回信息中的http://0.0.0.0:7860,可以看到Web界面。
无法正确打开的解决办法?(待完善)
解决方案:将链接转为公共链接。
llamafactory-cli webui执行之后会出来一行信息:
Running on local URL: http://0.0.0.0:7860
To create a public link, set `share=True` in `launch()`.
转为公共链接,将launch()中的share参数改为True即可。
打开interface.py文件,路径为:LLaMA-Factory-main/src/llamafactory/webui/interface.py
将share参数修改为True


五.测试当前模型
在web页面配置模型路径为 二.模型准备
下载的模型路径,并点击加载模型

上传一张CT图片并输入问题:"请使用中文描述下这个图像并给出你的诊断结果"

由上图可以看到,模型能够识别到这是一个CT图像,显示了大概的位置以及相应的器官,但是并不能给出诊断结果
六.模型训练
1.数据准备
将 2.2数据格式转换脚本
生成的mllm_data文件拷贝到LLaMaFactory的data目录下
数据集过大可以先压缩为.tar文件

然后解压缩
tar -xvf mllm_data.tar
将 二.模型准备
下载的底座模型Qwen2-VL 拷贝到LLaMaFactory的model目录下
修改 LLaMaFactory data目录下的dataset_info.json,增加自定义数据集,在dataset_info.json
完成数据集的注册
"mllm_med": {
"file_name": "mllm_data/mllm_data.json",
"formatting": "sharegpt",
"columns": {
"messages": "messages",
"images": "images"
},
"tags": {
"role_tag": "role",
"content_tag": "content",
"user_tag": "user",
"assistant_tag": "assistant"
}
},

2.配置训练参数
访问LLaMaFactory的web页面,配置微调的训练参数:
- Model name:
Qwen2-VL-2B-Instruct
- Model path:
models/Qwen2-VL-2B-Instruct
- Finetuning method:
lora
- Stage :
Supervised Fine-Tuning
- Dataset:
mllm_med
- Output dir:
saves/Qwen2-VL/lora/Qwen2-VL-sft-demo1
配置参数中最好将 save_steps
设置大一点,否则训练过程会生成非常多的训练日志,导致硬盘空间不足而训练终止。

点击Preview Command预览命令行无误后,点击Run按钮开始训练。
预览命令行
llamafactory-cli train \
--do_train True \
--model_name_or_path models/Qwen2-VL-2B-Instruct \
--preprocessing_num_workers 16 \
--finetuning_type lora \
--template qwen2_vl \
--flash_attn auto \
--dataset_dir data \
--dataset mllm_med \
--cutoff_len 1024 \
--learning_rate 5e-05 \
--num_train_epochs 3.0 \
--max_samples 100000 \
--per_device_train_batch_size 2 \
--gradient_accumulation_steps 8 \
--lr_scheduler_type cosine \
--max_grad_norm 1.0 \
--logging_steps 5 \
--save_steps 3000 \
--warmup_steps 0 \
--optim adamw_torch \
--packing False \
--report_to none \
--output_dir saves/Qwen2-VL-2B/full/Qwen2-VL-sft-demo1 \
--bf16 True \
--plot_loss True \
--ddp_timeout 180000000 \
--include_num_input_tokens_seen True \
--lora_rank 8 \
--lora_alpha 16 \
--lora_dropout 0 \
--lora_target all


HeaderTooLarge错误
确保您使用的是最新版本的 Safetensors。旧版本可能无法处理大型标头。
pip install --upgrade safetensors
pip show safetensors
七、合并导出模型
接下来,我们将 Lora补丁
与 原始模型
合并导出:
- 切换到
Expert
标签下 - Model path: 选择Qwen2-VL的基座模型,即:
models/Qwen2-VL-2B-Instruct
- Checkpoint path: 选择lora微调的输出路径,即
saves/Qwen2-VL/lora/Qwen2-VL-sft-demo1
- Export path:设置一个新的路径,例如:
Qwen2-VL-sft-final
- 点击
开始导出
按钮 - 导出完成即可在LLaMA-Factory根目录找到


八、将权重文件下载到本地
压缩模型文件夹
tar -cvf models.tar.gz /root/autodl-tmp/models/Qwen2-VL-2B-Instruct
tar -cvf models.tar.gz /root/autodl-tmp/saves/train_2025-04-25-19-02-45

九、模型试用(LLamaFactory调用)
Chat模式->设置模型路径为模型导出路径


1.测试结果

十、Ollama部署模型
由于通过LlaMA-Factory导出的模型(safetensors格式)与Ollama所需格式(gguf格式)有区别 ,需要借助Llama.cpp的代码进行转换。
1.Docker安装(Ubuntu)-GPU版本
a.Docker
## 更新包索引
sudo apt update
## 安装依赖包
sudo apt install apt-transport-https ca-certificates curl software-properties-common
## 添加Docker的官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
## 验证GPG密钥(可选,但推荐)
sudo apt-key fingerprint 0EBFCD88
## 设置Docker稳定版仓库
## sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
## 设置镜像仓库
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
## 再次更新包索引
sudo apt update
## 安装Docker CE(社区版)
sudo apt install docker-ce docker-ce-cli containerd.io
## 启动Docker服务
sudo systemctl start docker
## 检查Docker是否正确安装
sudo docker run hello-world ## 这个命令会下载一个测试镜像并在容器中运行它,以验证Docker是否正确安装。
## 设置Docker开机自启(可选)
sudo systemctl enable docker
## 添加当前用户到docker组(以便无需sudo运行Docker命令,可选)
sudo usermod -aG docker $USER
## 然后,您需要注销并重新登录,或者重新启动系统,以使组更改生效。
b.NVDIA Docker
## 确保NVIDIA驱动已安装:
## 在安装任何Docker GPU支持之前,确保你的GPU驱动已经正确安装。
## 安装NVIDIA Container Toolkit:
## NVIDIA Container Toolkit是一个Docker插件,它允许Docker容器访问GPU资源。你可以按照以下步骤安装它:
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
## 重启Docker服务:
## 安装完NVIDIA Container Toolkit后,重启Docker服务以使更改生效:
sudo systemctl restart docker
## 验证NVIDIA Container Toolkit是否正确安装:
## 你可以通过运行一个简单的NVIDIA GPU信息命令来验证NVIDIA Container Toolkit是否正确安装:
sudo docker run --rm --gpus all nvidia/cuda:12.4-base nvidia-smi
## 这个命令会下载一个包含nvidia-smi工具的CUDA容器,并运行它来显示GPU信息。
## 运行Docker容器时指定GPU:
## 当你运行Docker容器时,你可以使用--gpus标志来指定容器可以使用的GPU。例如:
sudo docker run --rm --gpus all nvidia/cuda:12.4-base nvidia-smi
## 这个命令会运行一个CUDA容器,并允许它访问所有可用的GPU。
## 请注意,上述命令中的CUDA版本(例如12.4)可能需要根据你的NVIDIA驱动版本进行调整。你可以在NVIDIA Docker GitHub页面上找到更多关于不同CUDA版本的信息。
NVDIA驱动命令
nvidia-smi
查看CUDA版本
nvcc --version
c.配置docker国内镜像源
# 创建目录
sudo mkdir -p /etc/docker
# 写入配置文件cd
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.tbedu.top",
"https://docker-0.unsee.tech",
"https://hub.fast360.xyz",
"https://image.cloudlayer.icu",
"https://pull.loridocker.com",
"https://docker-cf.registry.cyou",
"https://docker.1panel.live"
]
}
EOF
# 重启docker服务
sudo systemctl daemon-reload && sudo systemctl restart docker
d.docker自启动
sudo systemctl start docker
sudo systemctl enable docker
1*.命令行安装ollama
安装
运行以下命令安装 Ollama:
curl -fsSL https://ollama.com/install.sh | sh
启动
设置开机自启动
sudo systemctl enable ollama
查看ollama服务状态
sudo systemctl status ollama
启动ollama服务
sudo systemctl start ollama
2.ollama操作
docker pull ollama/ollama ##拉取最新ollama镜像源
docker run -d \
--gpus=all \
-v ollama:/root/.ollma \
-p 19020:11434 \
--name ollama \
--restart=always \
ollama/ollama
#配置自启动
docker exec -it id bash #进入控制台
2.使用Llama.cpp转换模型格式
git clone https://github.com/ggerganov/llama.cpp
安装依赖
pip install -r requirements.txt
转换命令
python convert_hf_to_gguf.py /home/yyx/LLaMA-Factory/saves/Llama-3-8B-Chinese-Chat/output-100 \
--outfile /home/yyx/output-100.gguf \
--outtype q8_0
3.导入模型
运行代码后会把safetensors 格式转换为gguf 格式,接下来创建Modelfile ,用于将模型导入Ollama中,Modelfile 文件中写下面内容,gguf文件所在路径:
FROM /xxx/xxx/xxx.gguf
docker exec -it id bash #进入控制台
在ollama中创建模型:
ollama create model_name -f /path/to/Modelfile
查看模型是否创建:
ollama list
4.运行模型
ollama run model_name