跳到主要内容

构建基于Qwen3-vl-30B-A3B-Instruct的医疗影像微调实战

更新时间:2025-10-29 14:55:10
使用超便捷高性能GPU卡医疗专家存储钜惠LoRA微调

Qwen3-vl-30B-A3B-Instruct模型是Qwen3系列开源的新一代多模态视觉语言模型。作为Qwen家族迄今最强的视觉语言模型,Qwen3-vl在保持纯文本能力的同时,将视觉理解指标推向了新高度。Qwen3-vl-30B-A3B-Instruct通过引入3B激活参数的稀疏架构,在仅激活30亿参数的情况下即可在STEM、VQA、OCR、视频解析及Agent任务上对标甚至超越GPT-5-Mini与Claude4-Sonnet,同时保持30B总参数量的稀疏激活能力,实现性能与效率的平衡。

我们可以通过LLaMA Factory Online平台,利用MedTrinity-25M子集(16K样本)对Qwen3-vl-30B-A3B-Instruct进行LORA微调,验证“小数据+稀疏激活”在医疗多模态场景的落地效果。LLaMA Factory Online是一个简单且高效的大语言模型(Large Language Model, LLM)训练与微调平台,支持按需自定义创建GPU和CPU实例,用户可一键启动符合业务需求的计算资源。其高性能GPU算力满足高精度推理与训练需求,同时提供“JupyterLab”和“VS Code”等开发环境,方便用户利用CPU实例进行数据预处理与模型调试,全面提升大模型应用开发效率。

前提条件

  • 用户已经获取LLaMA Factory Online平台账户和密码,如果需要帮助或尚未注册,可参考注册账户完成注册。
  • 当前账号的余额充裕,可满足模型微调服务的需要。点击可了解最新的活动费用信息,或前往充值,如需了解更多请联系我们

配置概览

配置参数配置项是否预置说明
模型Qwen3-vl-30B-A3B-InstructQwen3-vl-30B-A3B-Instruct是新一代多模态视觉语言模型,总参数量30B,在STEM、医疗影像病灶检测等任务上可对标主流大模型,兼顾性能与效率。
数据集train-00000-of-00010.parquet否(提供下载链接)选取的数据集是MedTrinity-25M子集中的其中一个(12931张图片),MedTrinity-25M是当前规模最大的公开医学影像-文本对数据集,涵盖CT、MR、X-Ray等多种模态,为医疗多模态模型的训练与评估提供了丰富燃料。
GPUH800*4(推荐)-模型规模较大,建议配置足够显存。
微调方法lora-显著降低计算与存储成本,兼具高性能与部署灵活性。

资源消耗预览

时长

使用推荐资源(H800*4)进行实例模式微调时微调过程总时长约45min。

操作步骤

步骤一:数据准备

  1. 单击链接,下载train-00000-of-00010.parquet数据集。数据集下载完成后,需上传至文件管理。具体操作,可参考SFTP上传下载完成数据集上传。

    SwanLab对比图

  2. 数据格式转换。

    LLaMA Factory作为主流的大语言模型微调框架,对医疗问诊类数据有明确的格式要求。因此需将原数据格式转换为LLaMA Factory兼容的数据格式。数据格式转换的具体步骤如下:

    a. 进入LLaMA-Factory Online平台,单击“控制台”,进入控制台后单击左侧导航栏的“实例空间”,然后在页面单击“开始微调”。

    开始微调

    b. 在弹出的页面选择“CPU”,核数选择“2核”,然后单击“启动”。

    开始微调

    c. 实例启动后,单击[JupyterLab处理专属数据]页签,进入JupyterLab编辑页面。您也可以根据需要打开VSCode处理专属数据,本示例指导您通过JupyterLab处理数据。

    d. 在JupyterLab页面左侧user-data/datasets目录下(如图①)新建一个.py后缀的文件(如图②),然后复制以下命令至文件中(如图③)。

    代码详情
    #多模态数据格式转换代码
    import os
    import json
    import random
    from tqdm import tqdm
    import datasets

    def save_images_and_json(ds, ratio=0.1, output_dir="mllm_data"):
    """
    保存数据集中的图像,并且构建多模态训练集和验证集。

    参数:
    ds: 数据集对象,包含图像和描述。
    ratio: 验证集比例,默认为 0.1。
    output_dir: 输出目录,默认为 "mllm_data"。
    """
    # 创建输出目录
    os.makedirs(output_dir, exist_ok=True)

    all_train_data = [] # 多模态训练数据
    all_val_data = [] # 多模态验证数据

    total_samples = len(ds)
    val_index = set(random.sample(range(total_samples), int(ratio * total_samples)))

    # 遍历数据集中的每个项目
    for idx, item in tqdm(enumerate(ds), total=total_samples, desc="Processing"):
    img_path = os.path.join(output_dir, f"{item['id']}.jpg")
    image = item["image"]

    # 保存图像
    image.save(img_path)

    sample = {
    "conversations": [
    {
    "from": "user",
    "value": "<image>图片中的诊断结果是怎样?"
    },
    {
    "from": "assistant",
    "value": item["caption"] # 从数据集中获取的描述
    }
    ],
    "images": [img_path] # 图像文件路径
    }

    if idx in val_index:
    all_val_data.append(sample)
    else:
    all_train_data.append(sample)

    # 将数据保存到 JSON 文件
    train_json_path = os.path.join(output_dir, "mllm_train_data.json")
    val_json_path = os.path.join(output_dir, "mllm_val_data.json")

    with open(train_json_path, "w", encoding="utf-8") as f:
    json.dump(all_train_data, f, ensure_ascii=False, indent=2)

    with open(val_json_path, "w", encoding="utf-8") as f:
    json.dump(all_val_data, f, ensure_ascii=False, indent=2)


    if __name__ == "__main__":
    # 加载数据集
    ds = datasets.load_dataset("parquet", data_files="/workspace/user-data/datasets/train-00000-of-00010.parquet")["train"]
    # 保存图像并构建多模态训练/验证集
    save_images_and_json(
    ds,
    ratio=0.2,
    output_dir="/workspace/user-data/datasets/mllm_data"
    )

    开始微调

    e. 在JupyterLab页面,新建一个终端,依次执行以下命令,进行数据格式转换(如图①和②)。

    conda activate /opt/conda/envs/lf
    python /workspace/user-data/datasets/Qwen3-vl.py
    提示

    Qwen3-vl.py为本示例新建的文件,请根据您的实际情况进行替换。

    回显信息如图③所示,说明数据格式转换成功,且转换后的数据存放在/datasets/mllm_data中,即原数据集文件train-00000-of-00010.parquet经格式转换后生成新的数据集文件mllm_data(如图④),其中包括mllm_train_data.json和mllm_val_data.json数据集文件。

    开始微调

  3. 数据集检测。

    a. 返回LLaMA-Factory Online控制台,单击左侧导航栏的“文件管理”。

    b. 单击目标数据集右侧“操作”列的"数据集检测",检测数据集。如下图所示,若“数据集格式检测”结果显示“符合”,则表示数据集符合格式要求。

    开始微调

步骤二:安装llamafactory

  1. 使用已注册的LLaMA Factory Online账号登录平台,选择[实例空间]菜单项,进入实例空间页面,如下图所示。

    SwanLab对比图

  2. 单击上图“开始微调”按钮,进入[配置资源]页面,选择GPU资源,卡数填写4,其他参数保持为默认值,然后单击“启动”按钮,启动实例。

    SwanLab对比图

    提示

    实例启动过程大约需要1~2min。

  3. 实例启动后,可启动VSCode或者JupyterLab专属数据处理,本次实践我们使用JupyterLab专属数据处理。

  4. 创建并配置用于数据处理的python环境。在JupyterLab中单击“Terminal”进入终端。

    a. 执行如下命令,创建一个虚拟环境,python版本选择3.10。

    conda create -n qwen3vl python=3.10 -y

    b. 执行如下命令,激活自定义的环境。

    conda activate qwen3vl
  5. 下载安装llamafactory。

    a. 执行如下命令,从GitHub仓库克隆LLaMA-Factory项目的源代码到本地。

    git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git

    b. 执行如下命令,进入项目目录。

    cd LLaMA-Factory

    c. 单击链接下载flash_attn,并上传至当前项目目录下,如下图所示。

    SwanLab对比图

    然后执行如下命令,安装flash_attn,用于加速Transformer模型(如大语言模型、多模态模型)的训练和推理。

    pip install flash_attn-2.8.2+cu12torch2.7cxx11abiFALSE-cp310-cp310-linux_x86_64.whl

    d. 执行如下命令,安装项目运行所需的所有Python依赖包。

    pip install -e ".[torch,metrics]"

    e. 执行如下命令,安装特定版本的DeepSpeed框架,为大模型训练提供分布式加速和显存优化支持。

    pip install deepspeed==0.16.9 -i https://pypi.tuna.tsinghua.edu.cn/simple

    f. 执行如下命令,安装ipykernel、openai,torch,为大模型开发环境配置基础依赖。

    pip install ipykernel -i https://pypi.tuna.tsinghua.edu.cn/simple
    pip install openai -i https://pypi.tuna.tsinghua.edu.cn/simple
    pip install torch==2.7.1 torchvision==0.22.1 torchaudio==2.7.1 --index-url https://download.pytorch.org/whl/cu128
  6. 启动llamafactory服务,可以通过6666端口号启动。

    GRADIO_SERVER_PORT=6666 llamafactory-cli webui
  7. 访问llamafactory服务。通过复制“对外服务”网址进行llamafactory的访问。

步骤三:模型训练

  1. 在微调页面,配置参数。其他参数保持不变,需要配置如下参数:

    • 语言:选择zh,如图①;
    • 模型:选择Qwen3-vl-30B-A3B-Instruct,如图②;
    • 模型路径:在预置路径前加上/shared-only/models/,如图③;
    • 对话模版:选择qwen3_vl,如图④;
    • 数据集路径:设置为/workspace/llamafactory/data,如图⑤;
    • 数据集:选择数据集mllm_train_data,如图⑥;
    • 批处理大小:设置为32,如图⑦;
    • “其他参数设置”中的“额外参数”:设置为模型微调日志文件的输出路径{"output_dir": "/workspace/user-data/datasets/ouptput/lora/train"},如图⑧,后续在模型对话和模型微调时,需要在检查点路径处使用该路径;
    • Deepspeed Stage:设置为3,适合训练超大模型的场景,如图⑨。
      提示

      Deepspeed Stage是DeepSpeed中ZeRO(Zero Redundancy Optimizer)优化技术的阶段参数,其范围是none、2、3。参数越大,意味着模型状态的分片程度越高,每个GPU的内存占用越少,但同时通信开销也可能越大。

    SwanLab对比图

  2. 单击“开始”,启动微调。

    提示

    启动微调后,您可以使用nvidia-smi命令实时查看GPU使用情况(包括占用率、显存使用、进程等)。

    训练完成后,页面底部将实时显示微调过程中的日志信息,同时展示当前微调进度及Loss变化曲线。经过多轮微调后,从图中可以看出Loss逐渐趋于收敛(如图①),微调完成后,系统提示“训练完毕”(如图②)。

    SwanLab对比图

步骤四:模型评估

  1. 切换至“Evaluate & Predict”页面,选择训练完成的检查点路径(如图①),然后选择测试数据集mllm_val_data(如图②),并根据实际需求配置评估参数,本实践的参数仅需设置"批处理大小"(如图③)和评估结果的“输出目录”(如图④)。

    训练前设置

  2. 参数配置完成后,单击“开始”按钮即可启动评估,页面底部将实时显示评估过程中的日志信息,评估完成后,记录评估结果,结果如下所示。

    {
    "predict_bleu-4": 35.18934065594059,
    "predict_model_preparation_time": 0.008,
    "predict_rouge-1": 33.03964625618812,
    "predict_rouge-2": 12.829063180693069,
    "predict_rouge-l": 22.233395915841587,
    "predict_runtime": 3580.8431,
    "predict_samples_per_second": 0.903,
    "predict_steps_per_second": 0.056
    }

    结果解读:微调后模型的各项指标均显著提升:BLEU-4从0.806升至35.189,ROUGE-1从2.778升至33.039,ROUGE-2从0.006升至12.829,ROUGE-L从2.013升至22.233,表明微调有效改善了生成文本与参考文本在n-gram匹配和整体结构上的一致性,生成质量和准确性有了实质性进步。

对比微调后与原生模型评估结果可以看出,二者在生成质量和运行效率上均存在显著差异,微调模型全方位超越原生模型:​ 原生模型生成质量指标极低(BLEU-4仅0.81、ROUGE-2接近0),内容与参考答案关联弱、逻辑差,且效率偏低(单样本速度0.773),无法满足基础需求。​微调模型实现质的飞跃:生成质量指标较原生提升43-2290倍,短语、词汇、句级匹配精度大幅提高;效率提升超16%,兼顾性能与速度。​

综上,微调后的模型解决了原生模型核心问题,应用潜力极高,可适配图文生成、文本理解等多模态场景。

步骤五:模型对话

  1. 切换至“chat”页面,选择训练完成的检查点路径(如图①),单击“加载模型”按钮(如图②)。

    训练前设置

  2. 微调的模型加载后,其余配置保持不变,进行模型对话。用户上传图片(如图①),然后输入提问(如图②),并单击“提交”(如图③),观察模型回答(如图④)。

    训练前设置

  3. 微调后模型对话结果的详情信息,如下图所示。

    训练前设置

观察微调后的模型与原生模型的对话结果,发现:微调后的模型在医学影像分析的 “精细化描述、专业解剖分析、严谨诊断推理” 三个方面均显著优于原始模型,体现了针对医疗场景微调后在专业领域的能力提升。

总结

综合来看,Qwen3-vl-30B-A3B-Instruct作为性能与效率均衡的新一代多模态模型,借助LLaMA Factory Online平台,通过MedTrinity-25M小数据集的LoRA微调,在医疗多模态场景中展现出显著提升 —— 微调后模型在图像描述精细度、解剖分析专业性及诊断推理严谨性上的进步,不仅验证了 “小数据 + 稀疏激活” 模式在医疗领域落地的可行性与高效性,更为大模型在专业医疗场景的精准应用提供了极具价值的实践范例,凸显了开源模型与轻量化微调方案在垂直领域快速赋能的潜力。