环境与依赖整理
在 Ubuntu 20.04 中创建 Python 3.9 虚拟环境,排查 requirements.txt 混入 ROS、Gazebo、无人机等无关依赖的问题,保留 torch、transformers、peft、datasets 等核心库。
Course Project · Human-Computer Interaction
在机器人感知与人机交互课程项目中复现 Huatuo-Llama-Med-Chinese,基于 TinyLlama 与 LoRA 完成中文医疗问答数据的微调、推理与效果复盘,并整理环境配置、GPU 支持、路径硬编码和依赖冲突等调试过程。
Overview
项目以现有开源代码为基础,完成从环境准备、模型下载、数据加载、LoRA 微调、推理测试到实验报告整理的完整课程复现流程。页面内容来自当前项目文件夹中的源码、实验报告和课程展示材料,重点展示已经跑通的技术链路与遇到的问题,而不是夸大为医疗模型生产系统。
Pipeline
在 Ubuntu 20.04 中创建 Python 3.9 虚拟环境,排查 requirements.txt 混入 ROS、Gazebo、无人机等无关依赖的问题,保留 torch、transformers、peft、datasets 等核心库。
使用 TinyLlama 作为基座模型,并处理 model_download.py 中默认写入 /home/ubuntu 的路径权限问题,将缓存和模型目录调整到可写位置。
训练数据来自 data/llama_data.json,共 8658 条中文医疗问答样本;训练阶段使用 med_template.json 将问题拼接为“问题 / 回答”格式。
finetune.py 加载 Llama 模型和 tokenizer 后,对 q_proj、v_proj 注入 LoRA 适配器,使用较小可训练参数完成课程实验级微调。
第一次训练因 PyTorch 和 bitsandbytes 缺少 GPU 支持而退回 CPU,训练进度极慢;安装 NVIDIA 驱动和 CUDA 对应 PyTorch 后,torch.cuda.is_available() 正常返回。
使用 infer.py 加载基座模型和 LoRA 权重,对感冒、肝衰竭、阑尾炎与心动过速等测试问题生成回答,并对重复输出和医学准确性不足进行复盘。
Modules
finetune.py 负责参数解析、模型加载、tokenizer 配置、LoRA 注入、数据集划分、Trainer 配置和适配器保存。
utils/prompter.py 读取 templates/med_template.json,生成训练 prompt;generate.py 也可复用模板系统截取回答。
样本字段包含 instruction、input、output,多数输入为空,任务形式接近中文医疗问答指令微调。
infer.py 使用 PeftModel.from_pretrained 加载 LoRA 权重,并通过 GenerationConfig 控制采样温度、top-p、top-k 和输出长度。
export_hf_checkpoint.py 与 export_state_dict_checkpoint.py 为后续导出 Hugging Face 格式或 state_dict 权重预留工具链。
复现过程中处理了依赖污染、GPU 驱动、数据集版本兼容、模型下载权限和 LoRA 权重路径硬编码等问题。
Code Highlights
这一部分从 huatuo-llama-med-chinese 源码中提炼,展示训练、prompt、LoRA 配置和推理阶段的具体实现细节。
文件:finetune.py 入口函数:train(...) 基座模型:TinyLlama-1.1B-Chat-v1.0 数据路径:data/llama_data.json 输出目录:./my-lora-model 核心加载: LlamaForCausalLM.from_pretrained() LlamaTokenizer.from_pretrained() get_peft_model(model, LoraConfig)
模板:templates/med_template.json prompt_input / prompt_no_input: 下面是一个问题,运用医学知识来正确回答提问. ### 问题:{instruction} ### 回答: 数据字段: instruction 问题或指令 input 可选补充输入 output 期望回答 样本数量:8658
LoRA:r=8, alpha=16, dropout=0.05 目标模块:q_proj, v_proj 学习率:2e-4 训练轮数:3 最大长度:cutoff_len=256 微批大小:micro_batch_size=2 当 train_on_inputs=False: 用户 prompt 部分标签写为 -100 只让模型学习回答段。
文件:infer.py LoRA 加载:PeftModel.from_pretrained() 回答函数:evaluate(instruction, input_text='') GenerationConfig: temperature=0.7 top_p=0.9 top_k=40 num_beams=1 max_new_tokens=256 输出截取:按 ### Response: 分离回答。
Implementation
q_proj 和 v_proj 上训练低秩适配器,不直接更新全部基座模型参数,更适合课程实验环境。
infer.py 使用手写 Instruction/Response prompt,后续可统一到同一套模板。
train_on_inputs=False 时将用户问题部分 label 置为 -100,让损失主要集中在模型需要生成的回答文本。
bitsandbytes、PyTorch CUDA 支持和驱动状态,解决训练进度过慢的问题,GPU 训练后单轮实验可在较短时间内完成。
Result
第一次训练使用较短轮数跑通流程后,模型输出存在重复文本、语义不稳和医学知识不准确的问题。随后将训练轮数调整为 3 个 epoch,并把学习率从 3e-4 降到 2e-4,模型回答的流畅度和结构完整性有所提升,重复输出明显减少。
测试问题覆盖感冒治疗、肝衰竭综合征体征、急性阑尾炎与缺血性心脏病人群差异、心动过速伴心电异常等场景。第二轮训练后,回答的表达更清楚,但仍出现医学概念混淆、过度泛化和事实错误,说明小参数基座模型与有限训练数据难以支撑可靠医疗问答。
这个项目的价值主要在于完整走通大语言模型微调实验链路:从依赖环境、模型下载、数据格式、LoRA 参数、训练脚本到推理测试和错误分析。页面展示的是课程项目实践经验,不作为医疗建议或真实医疗问答系统使用。
huatuo-llama-med-chinese。页面内容已从上传的实验材料和源码中提炼为项目级描述,不依赖 Word 或 PPT 文件。