医疗场景精炼数据 qwen3 微调实践记录

34 阅读8分钟

医疗场景精炼数据 qwen3 微调实践记录

偶然刷到基于modelscope上一个精炼医疗数据集,刚好下半年一直在做医疗风险防控,随即试了下医疗数据集的qwen3模型微调。显卡显存的问题虽然都没有走完训练集合上的one epoch,基本上算完成了SFT、LoRA的训练流程。【AI大模型教程】

      qwen3对于transformers有版本要求,modelscope下载、加载数据与依赖库的API适配也不是很好,趟了一圈版本的坑,列下 run 起来主要依赖的版本信息,python==3.11.4

packageversion
modelscope1.28.0
transformers4.56.2
datasets2.21.0
numpy1.24.3
pandas2.0.3

      数据集合用多智能体 + 数据进化 + 推理过程生成 + 推理过程验证过滤提升QA的质量,作者在数据生成上做了很大的功夫,抽取一条数据样例如下:

{
"instruction": "先天性耳聋的患儿为什么常表现为聋哑?",
"question": "为什么患有先天性耳聋的孩子通常也会有语言障碍,表现为聋哑?",
"think": "嗯,用户问为什么先天性耳聋的患儿常表现为聋哑,还有为什么他们会有语言障碍。首先,我需要理解这两个问题其实是在问同一个现象的不同方面,可能用户想从不同角度得到解释。我得先回忆一下先天性耳聋的相关知识。\n\n首先,先天性耳聋是指出生时就存在的听力损失,可能由遗传因素、孕期感染、早产或其他原因引起。听力受损的话,孩子无法正常接收声音信号。而语言学习,尤其是口语,很大程度上依赖于听觉反馈。比如,婴儿通过听到自己的声音和周围人的声音来学习发音。如果听不到,他们就无法模仿,导致发音不准或者无法说话,进而出现语言障碍。\n\n接下来要考虑的是语言发展的关键期。通常,儿童在0到3岁是语言发展的关键时期,如果在这个阶段听力受损没有得到及时干预,大脑的语言中枢可能无法正常发育,导致语言能力滞后。所以先天性耳聋的孩子因为错过了这个关键期,即使之后使用助听设备,语言恢复也可能不完全。\n\n另外,聋哑通常指又聋又哑,但其实哑是聋导致的后果。因为听不到,所以无法通过听觉学习说话,所以表现为不会说话,即哑。但严格来说,聋哑可能更多指听觉和语言能力的双重缺失,但需要确认术语的准确性。\n\n可能用户还想知道为什么不是所有先天性耳聋的孩子都哑,或者是否有其他因素影响。不过根据问题,重点在于解释两者之间的因果关系。需要强调听力对语言学习的基础作用,以及早期干预的重要性,比如助听器、人工耳蜗和语言训练,这些在答案中已经提到。\n\n还要考虑是否有其他原因导致语言障碍,比如伴随的其他发育问题,但先天性耳聋本身的主要机制是听觉缺失导致语言学习障碍。可能需要排除其他因素,专注于听力损失的影响。\n\n总结的话,应该分步骤说明:听力受损→无法接收语言声音→无法模仿和学习发音→语言能力发展受阻→导致聋哑。同时强调关键期和早期干预的作用。这样逻辑清晰,覆盖了问题的各个方面。\n",
"answer": "这是因为先天性耳聋的孩子由于听力受损,无法听到外界的声音,特别是语言的声音。听不到语言,他们就无法模仿和学习正确的发音,进而影响语言能力的发展。因此,这些孩子往往不能进行有效的语言交流,表现为聋哑。为了帮助他们,早期的听力评估和干预非常重要,比如使用助听器或人工耳蜗,以及进行语言康复训练。",
"metrics": {
"quality_f1": 1.0
}
}

转换后用于模型训练的格式如下:

{
"instruction": "你是一个医学专家,你需要根据用户的问题,给出带有思考的回答。",
"input": "为什么患有先天性耳聋的孩子通常也会有语言障碍,表现为聋哑?",
"output": "<|FunctionCallBegin|>嗯,用户问为什么先天性耳聋的患儿常表现为聋哑,还有为什么他们会有语言障碍。首先,我需要理解这两个问题其实是在问同一个现象的不同方面,可能用户想从不同角度得到解释。我得先回忆一下先天性耳聋的相关知识。\n\n首先,先天性耳聋是指出生时就存在的听力损失,可能由遗传因素、孕期感染、早产或其他原因引起。听力受损的话,孩子无法正常接收声音信号。而语言学习,尤其是口语,很大程度上依赖于听觉反馈。比如,婴儿通过听到自己的声音和周围人的声音来学习发音。如果听不到,他们就无法模仿,导致发音不准或者无法说话,进而出现语言障碍。\n\n接下来要考虑的是语言发展的关键期。通常,儿童在0到3岁是语言发展的关键时期,如果在这个阶段听力受损没有得到及时干预,大脑的语言中枢可能无法正常发育,导致语言能力滞后。所以先天性耳聋的孩子因为错过了这个关键期,即使之后使用助听设备,语言恢复也可能不完全。\n\n另外,聋哑通常指又聋又哑,但其实哑是聋导致的后果。因为听不到,所以无法通过听觉学习说话,所以表现为不会说话,即哑。但严格来说,聋哑可能更多指听觉和语言能力的双重缺失,但需要确认术语的准确性。\n\n可能用户还想知道为什么不是所有先天性耳聋的孩子都哑,或者是否有其他因素影响。不过根据问题,重点在于解释两者之间的因果关系。需要强调听力对语言学习的基础作用,以及早期干预的重要性,比如助听器、人工耳蜗和语言训练,这些在答案中已经提到。\n\n还要考虑是否有其他原因导致语言障碍,比如伴随的其他发育问题,但先天性耳聋本身的主要机制是听觉缺失导致语言学习障碍。可能需要排除其他因素,专注于听力损失的影响。\n\n总结的话,应该分步骤说明:听力受损→无法接收语言声音→无法模仿和学习发音→语言能力发展受阻→导致聋哑。同时强调关键期和早期干预的作用。这样逻辑清晰,覆盖了问题的各个方面。\n<|FunctionCallEnd|> \n这是因为先天性耳聋的孩子由于听力受损,无法听到外界的声音,特别是语言的声音。听不到语言,他们就无法模仿和学习正确的发音,进而影响语言能力的发展。因此,这些孩子往往不能进行有效的语言交流,表现为聋哑。为了帮助他们,早期的听力评估和干预非常重要,比如使用助听器或人工耳蜗,以及进行语言康复训练。"
}

其中"think"通过<|FunctionCallBegin|>加工到"output"中。

用于trainer的udf如下:

开始的用qwen3-1.7B显存溢出,切换到qwen3-0.6B迭代了3个step,依旧显存溢出,11G的显存真是干啥啥不行啊。

因为训练几个step后中断,还未上报 metrics ,swanlab的图表就不展示了,看下GPU监控情况

最终截止的swanlab memory allocated是88.8%,有一定的上报间隔影响不大。

      对于训练方式选择LoRA还是SFT,考虑的点可能在具体模型的应用场景上,LoRA更适合在一些不常见的 query 给出指定明确的 response,而且不想因为特例 case 影响整个模型的指标;SFT很好理解,通过学习监督样本增强LLM/VLM的识别能力,从而提高在某一分布数据泛化识别。

      LoRA虽然是一种训练方式,但是目前大模型的 base 很高,实际中生产中优化更多是围绕 prompt 来提升识别效果,基于 context 工程 + RAG 可以覆盖掉 LoRA 的适用场景。

      下半年在做医疗场景 RAG ,花了一点时间把 RAG + MCP 工程完成了七七八八,提前来个下一篇预告吧。十一在家继续 working,提前祝大家十一快乐🎉