LLaMA 模型量化与部署(二)
三、LLaMA 模型微调实践3.1 Huatuo让 LLaMA 学习中文医学知识前面我们已经完成了 LLaMA 的运行、量化和部署。但通用语言模型并不一定擅长专业领域的问题例如医学知识问答。如果希望模型能够回答更专业的问题就需要在基础模型上进行进一步训练这便引出了领域微调Domain Fine-tuning。3.1.1 什么是 HuatuoHuatuo华驼后更名为本草是一个面向中文医学知识的大语言模型项目。项目通过医学知识图谱、医学文献以及构建的中文医学指令数据对 LLaMA 等基础模型进行指令微调以增强模型的医学知识问答能力。项目地址https://github.com/SCIR-HI/Huatuo-Llama-Med-Chinese3.1.2 Huatuo 是如何增强模型能力的其核心思路可以概括为基础 LLaMA → 构建中文医学指令数据 → LoRA 微调 → 医学问答模型组成部分主要作用基础 LLaMA提供通用语言理解与生成能力医学知识图谱提供结构化医学知识医学文献提供专业领域知识来源中文医学指令数据让模型学习医学问题与回答的对应关系LoRA以较少的可训练参数适配医学任务这里使用的 LoRALow-Rank Adaptation是一种参数高效微调方法。它不需要更新基础模型的全部权重而是训练一组相对较小的附加参数从而降低微调所需的计算和显存成本。3.1.3 医学指令微调有什么意义通用模型虽然具备一定的医学知识但未必能够按照专业问答的形式组织回答。通过医学指令数据进行微调可以让模型进一步学习医学术语、专业问题的表达方式以及医学知识问答的任务格式。需要注意领域微调可以增强专业任务的适应能力但不能保证回答一定准确也不能代替专业医生的临床判断。3.1.4 小结Huatuo 展示了一条将通用大语言模型应用到专业领域的技术路线利用已有基础模型通过专业数据和 LoRA 微调构建面向特定领域的语言模型。接下来我们将以 Huatuo 为例介绍 LoRA 权重的加载、模型推理以及实际微调过程。3.2 Huatuo 医学模型的 LoRA 权重加载与推理了解 Huatuo 的基本思路后我们进一步看看如何加载已经微调好的医学模型。这里不需要重新训练 LLaMA而是使用原版 LLaMA-7B 和医学 LoRA 权重让模型执行中文医学问答任务。3.2.1 下载项目与 LoRA 权重首先获取 Huatuo 项目git clone https://github.com/SCIR-HI/Huatuo-Llama-Med-Chinese.git cd Huatuo-Llama-Med-Chinese随后下载医学 LoRA 权重git clone https://huggingface.co/thinksoso/lora-llama-med下载完成后主要包含以下文件文件作用adapter_model.bin保存医学微调得到的 LoRA 参数adapter_config.json保存 LoRA 的结构与配置信息LoRA 权重并不是完整的大模型需要与对应的基础模型一起使用。3.2.2 加载模型并执行推理准备好 Hugging Face 格式的原版 LLaMA-7B 后可以使用infer.py进行推理python infer.py \ --base_model /home/models/llama-7b-hf \ --lora_weights ./lora-llama-med \ --use_lora True \ --instruct_dir ./data/infer.json \ --prompt_template med_template主要参数如下参数作用–base_model指定基础模型路径–lora_weights指定医学 LoRA 权重路径–use_lora启用 LoRA 权重–instruct_dir指定测试数据文件–prompt_template指定医学问答的 Prompt 模板以上命令对应项目的早期版本实际复现时应确保代码、模型和依赖版本兼容。3.2.3 医学问答数据是什么样的项目使用的测试数据主要包含三个字段{ instruction: 请解释什么是心肌炎。, input: , output: 这里填写参考回答 }其中instruction表示用户提出的问题input表示额外输入信息output表示参考回答。模型会根据医学问题生成文本我们可以通过参考回答和实际输出观察它是否掌握了相关知识以及能否按照要求组织答案。3.2.4 小结Huatuo 的推理流程可以概括为加载 LLaMA-7B → 加载医学 LoRA 权重 → 输入医学问题 → 生成回答。这说明通过 LoRA我们可以在保留基础模型通用能力的同时让模型进一步适应特定领域的任务。接下来我们将进入 Huatuo 的实际微调过程了解如何准备医学指令数据并训练属于自己的 LoRA 参数。3.3 Huatuo 医学模型的微调数据与训练准备前面我们已经可以加载 Huatuo 的医学 LoRA 权重进行推理。接下来进一步看看如果想训练自己的医学 LoRA 模型需要准备哪些内容。整体流程可以概括为准备基础模型 → 准备医学数据 → 安装训练依赖 → 设置训练参数 → 启动 LoRA 微调。3.3.1 医学指令数据长什么样Huatuo 使用的是中文医学指令数据常见格式如下{instruction:请解释什么是心肌炎。,input:,output:这里填写参考回答}3.4 LoRA 微调中的显存不足与参数调整准备好医学指令数据和训练环境后就可以正式启动 Huatuo 的 LoRA 微调。不过第一次训练并没有顺利完成而是遇到了一个常见问题CUDA Out of MemoryGPU 显存不足。3.4.1 为什么 LoRA 微调还会显存不足第一次训练使用了以下参数--micro_batch_size 128 --batch_size 128虽然 LoRA 只训练少量附加参数但训练时仍然需要加载完整的基础模型并保存中间激活值、梯度等数据。因此LoRA 减少的是可训练参数量并不意味着训练时只需要存储 LoRA 参数。第一次运行时显卡的显存已经接近耗尽最终出现了以下错误torch.cuda.OutOfMemoryError: CUDA out of memory这说明当前训练配置超过了 GPU 能够承受的显存范围。3.4.2 如何解决显存不足最直接的方法是减小micro_batch_size降低每次前向和反向计算需要同时处理的样本数量。第二次实验将参数从 128 调整为 64python finetune.py \ --base_model /home/models/llama-7b-hf \ --data_path ./data/llama_data.json \ --output_dir ./lora-llama-med-e2 \ --prompt_template_name med_template \ --micro_batch_size 64 \ --batch_size 64 \ --wandb_run_name e2调整后训练可以正常开始运行。参数第一次训练第二次训练micro_batch_size12864batch_size12864训练情况显存不足正常开始运行如果显存仍然不足可以继续尝试将micro_batch_size降低为 32、16 或 8具体取决于显卡显存和训练配置。3.4.3 micro_batch_size 和 batch_size 有什么区别这两个参数虽然名字相似但含义不同参数作用micro_batch_size每次前向和反向计算实际处理的样本数量batch_size希望一次参数更新对应的有效样本数量例如假设micro_batch_size 8 batch_size 64在单 GPU、支持梯度累积的训练设置下可以先处理 8 组小批次累积梯度后再进行一次参数更新。这样可以降低单次计算的显存压力同时保留较大的有效批次大小。不过本次实验直接将两个参数都调整为 64没有利用梯度累积来保持原来的有效批次大小。3.4.4 小结LoRA 虽然能够大幅减少可训练参数但基础模型权重和训练过程中的中间数据仍然会占用大量显存。当训练出现 CUDA Out of Memory 时可以优先减小 micro_batch_size再根据实际显存占用逐步调整 batch_size 和其他训练参数。理解这一点能够帮助我们在有限的 GPU 资源下更合理地开展大语言模型微调。3.5 使用 WandB 监控 LoRA 微调并查看训练结果调整 Batch Size 后Huatuo 的 LoRA 微调能够正常运行。接下来我们需要关注训练是否顺利进行以及模型是否逐渐学会医学指令数据中的知识和回答方式。这里使用Weights BiasesWandB记录训练过程并通过 Loss 曲线观察模型的学习情况。3.5.1 WandB 是什么WandB 是一个机器学习实验管理与可视化工具可以记录训练损失、学习率、训练步数等信息。安装并登录pip install wandb wandb login在训练命令中指定实验名称--wandb_run_name e2随后便可以在 WandB 页面查看训练记录。3.5.2 训练过程中需要关注什么指标作用train/loss观察训练数据上的损失变化eval/loss观察验证数据上的损失变化train/epoch查看已经完成的训练轮数train/global_step查看参数更新步数train/learning_rate查看学习率变化其中Loss 是衡量模型预测结果与训练目标之间差异的指标通常越低表示模型对相应数据的拟合越好。如果训练 Loss 逐渐下降说明模型正在学习训练数据如果验证 Loss 持续上升则需要警惕过拟合。3.5.3 Huatuo 的实际训练结果本次微调完成了 10 个 Epoch也就是将训练数据完整学习了 10 轮。最终训练日志中的主要结果如下指标结果Epoch10Global Step1280训练总耗时约 7 小时 37 分钟train_loss全程平均0.8467最终记录的 train/loss0.5994最终 eval/loss0.8584这里需要注意train_loss是训练结束时统计的全程平均损失而train/loss是 WandB 最后记录的训练损失两者含义不同。从训练记录可以看到模型完成了预定的训练轮数训练损失也呈现下降趋势。3.5.4 Loss 下降就代表模型变强了吗不一定。Loss 下降只能说明模型在相应数据上的预测表现有所改善并不能直接证明医学回答更加准确。因此训练完成后还需要使用没有参与训练的医学问答数据对模型的回答质量进行评估重点关注事实准确性、专业术语使用以及是否生成不可靠的医学建议。3.5.5 小结WandB 帮助我们观察模型如何学习Loss 帮助我们判断训练是否在正常优化而独立测试才能进一步评估模型的实际应用能力。至此我们完成了从医学指令数据准备、LoRA 微调、显存问题处理到训练过程监控与结果分析的完整实践流程。3.6 本章小结从 LLaMA 到中文医学模型至此我们已经完成了 Huatuo 医学模型的 LoRA 微调实践也走完了从基础模型到领域模型的完整流程。这一过程展示了一个重要思路不必从零训练大语言模型也可以利用已有模型和专业数据让模型适应特定领域的任务。3.6.1 医学模型的完整微调流程Huatuo 的微调过程可以概括为准备 LLaMA-7B → 构建医学指令数据 → 配置 LoRA → 启动训练 → 调整显存参数 → 使用 WandB 监控训练。各个环节的作用如下环节核心作用基础模型提供通用语言理解与生成能力医学指令数据让模型学习医学知识与问答形式LoRA 微调以较少的可训练参数适配医学任务Batch Size 调整控制训练过程中的显存占用WandB记录训练过程观察 Loss 等指标3.6.2 从实际训练中学到了什么本次实践有三个值得记住的经验。第一LoRA 能降低微调成本但不代表训练完全不占显存。基础模型权重、中间激活值和梯度仍然需要占用计算资源。第二训练参数需要根据硬件条件调整。首次使用较大的 Micro Batch Size 导致显存不足减小批次后才得以继续训练。第三训练完成不等于模型已经具备可靠的专业能力。Loss 下降说明模型对相应数据的预测有所改善真正的医学问答能力还需要通过独立测试进一步验证。3.6.3 最终总结通过 Huatuo我们了解了如何将通用语言模型转变为面向专业领域的模型。基础模型提供通用能力专业数据提供领域知识LoRA 提供低成本的适配方式而训练监控帮助我们观察和改进整个过程。这套思路不仅适用于中文医学问答也可以作为理解其他专业领域大模型开发流程的基础。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →