本文档提供详细的 MedicalGPT 项目复现步骤,帮助您从零开始完成环境搭建、数据准备、模型训练和推理部署的全流程。
# 克隆仓库
git clone https://github.com/shibing624/MedicalGPT.git
cd MedicalGPT
# 创建虚拟环境(推荐)
python -m venv venv
source venv/bin/activate # Linux/Mac
# 或
# venv\Scripts\activate # Windows
# 安装 PyTorch(根据您的 CUDA 版本选择)
# CUDA 11.8
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
# CUDA 12.1
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
# 安装项目依赖
pip install -r requirements.txt --upgrade
# 验证关键库是否正确安装
python -c "import torch; print(f'PyTorch版本: {torch.__version__}')"
python -c "import transformers; print(f'Transformers版本: {transformers.__version__}')"
python -c "import peft; print(f'PEFT版本: {peft.__version__}')"
python -c "import trl; print(f'TRL版本: {trl.__version__}')"
创建数据目录并准备数据文件:
mkdir -p data/pretrain # 预训练数据
mkdir -p data/finetune # 微调数据
mkdir -p data/reward # 奖励模型数据(偏好数据)
预训练数据应为纯文本文件,每行一个文档。示例:
这是第一个医疗文档的内容...
这是第二个医疗文档的内容...
微调数据支持多种格式,推荐使用 JSONL 格式(ShareGPT 格式):
单轮对话格式 (alpaca 模板):
{"instruction": "小孩发烧怎么办", "input": "", "output": "发烧是身体对感染的反应..."}
{"instruction": "如何预防感冒", "input": "", "output": "预防感冒的方法包括..."}
多轮对话格式 (sharegpt/vicuna 模板):
{"conversations": [{"from": "human", "value": "你好"}, {"from": "gpt", "value": "你好!有什么可以帮助你的吗?"}]}
{"conversations": [{"from": "human", "value": "感冒了怎么办"}, {"from": "gpt", "value": "感冒时应该..."}]}
DPO/RM 训练需要偏好数据,格式如下:
{"prompt": "小孩发烧怎么办", "chosen": "正确的回答...", "rejected": "不正确的回答..."}
{"prompt": "如何预防感冒", "chosen": "好的回答...", "rejected": "不好的回答..."}
使用 Hugging Face datasets 下载:
from datasets import load_dataset
# 下载医疗数据集
dataset = load_dataset("shibing624/medical")
dataset.save_to_disk("./data/medical")
# 下载偏好数据集
pref_dataset = load_dataset("shibing624/DPO-En-Zh-20k-Preference")
pref_dataset.save_to_disk("./data/reward")
根据硬件资源选择合适的模型:
| 模型系列 | 推荐模型 | 显存需求 (QLoRA 4bit) | 说明 |
|---|---|---|---|
| Qwen2.5 | Qwen2.5-0.5B/1.5B/7B | 6GB/8GB/16GB | 推荐,中文支持好 |
| Qwen2 | Qwen2-7B | 16GB | 性能优秀 |
| LLaMA3 | Llama-3-8B | 20GB | 开源社区广泛使用 |
| LLaMA2 | Llama-2-7B-chat | 16GB | 经典选择 |
使用 Hugging Face Hub 下载模型:
from transformers import AutoTokenizer, AutoModelForCausalLM
model_name = "Qwen/Qwen2.5-0.5B-Instruct" # 示例,根据需求选择
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
# 或使用命令行
huggingface-cli download Qwen/Qwen2.5-0.5B-Instruct --local-dir ./models/Qwen2.5-0.5B-Instruct
在训练脚本中,将模型路径设置为:
--model_name_or_path Qwen/Qwen2.5-0.5B-Instruct # 使用 Hugging Face Hub 名称
# 或
--model_name_or_path ./models/Qwen2.5-0.5B-Instruct # 使用本地路径
MedicalGPT 提供完整的训练流程,可以根据需求选择不同的阶段组合。
目的: 在领域文档上继续预训练,注入领域知识(可选,但推荐)
数据: ./data/pretrain 目录下的纯文本文件
训练命令:
CUDA_VISIBLE_DEVICES=0,1 torchrun --nproc_per_node 2 pretraining.py \
--model_name_or_path Qwen/Qwen2.5-0.5B \
--train_file_dir ./data/pretrain \
--validation_file_dir ./data/pretrain \
--per_device_train_batch_size 4 \
--per_device_eval_batch_size 4 \
--do_train \
--do_eval \
--use_peft True \
--seed 42 \
--max_train_samples 10000 \
--max_eval_samples 10 \
--num_train_epochs 0.5 \
--learning_rate 2e-4 \
--warmup_ratio 0.05 \
--weight_decay 0.01 \
--logging_strategy steps \
--logging_steps 10 \
--eval_steps 50 \
--eval_strategy steps \
--save_steps 500 \
--save_strategy steps \
--save_total_limit 13 \
--gradient_accumulation_steps 8 \
--preprocessing_num_workers 10 \
--block_size 512 \
--group_by_length True \
--output_dir outputs-pt-qwen-v1 \
--overwrite_output_dir \
--ddp_timeout 30000 \
--logging_first_step True \
--target_modules all \
--lora_rank 8 \
--lora_alpha 16 \
--lora_dropout 0.05 \
--torch_dtype bfloat16 \
--bf16 \
--device_map auto \
--report_to tensorboard \
--ddp_find_unused_parameters False \
--gradient_checkpointing True \
--cache_dir ./cache
关键参数说明:
--model_name_or_path: 基础模型路径--train_file_dir: 训练数据目录--use_peft True: 使用 LoRA 微调(节省显存)--lora_rank 8: LoRA 秩大小--output_dir: 模型输出目录输出: outputs-pt-qwen-v1 目录下的 LoRA 权重
显存需求:
目的: 在指令数据上微调,对齐指令意图(必需)
数据: ./data/finetune 目录下的 JSONL 格式文件
训练命令:
CUDA_VISIBLE_DEVICES=0,1 torchrun --nproc_per_node 2 supervised_finetuning.py \
--model_name_or_path Qwen/Qwen2.5-0.5B-Instruct \
--train_file_dir ./data/finetune \
--validation_file_dir ./data/finetune \
--per_device_train_batch_size 4 \
--per_device_eval_batch_size 4 \
--do_train \
--do_eval \
--template_name qwen \
--use_peft True \
--max_train_samples 1000 \
--max_eval_samples 10 \
--model_max_length 4096 \
--num_train_epochs 1 \
--learning_rate 2e-5 \
--warmup_ratio 0.05 \
--weight_decay 0.05 \
--logging_strategy steps \
--logging_steps 10 \
--eval_steps 50 \
--eval_strategy steps \
--save_steps 500 \
--save_strategy steps \
--save_total_limit 13 \
--gradient_accumulation_steps 8 \
--preprocessing_num_workers 4 \
--output_dir outputs-sft-qwen-v1 \
--overwrite_output_dir \
--ddp_timeout 30000 \
--logging_first_step True \
--target_modules all \
--lora_rank 8 \
--lora_alpha 16 \
--lora_dropout 0.05 \
--torch_dtype bfloat16 \
--bf16 \
--device_map auto \
--report_to tensorboard \
--ddp_find_unused_parameters False \
--gradient_checkpointing True \
--cache_dir ./cache \
--flash_attn True
关键参数说明:
--template_name: 对话模板名称(如 qwen, vicuna, alpaca)--model_max_length: 最大序列长度--flash_attn: 是否使用 Flash Attention(加速训练)如果使用 PT 阶段的输出:
# 需要先合并 PT 阶段的 LoRA 权重
python merge_peft_adapter.py \
--base_model_name_or_path Qwen/Qwen2.5-0.5B \
--peft_model_path outputs-pt-qwen-v1/checkpoint-500 \
--output_dir merged-pt-qwen-v1
# 然后在 SFT 时使用合并后的模型
--model_name_or_path merged-pt-qwen-v1
输出: outputs-sft-qwen-v1 目录下的 LoRA 权重
目的: 训练奖励模型,建模人类偏好(RLHF 流程必需)
数据: ./data/reward 目录下的偏好数据(chosen/rejected 格式)
训练命令:
# 注意:reward model 训练暂不支持 torchrun 多卡训练
CUDA_VISIBLE_DEVICES=0,1 python reward_modeling.py \
--model_name_or_path Qwen/Qwen2.5-0.5B-Instruct \
--train_file_dir ./data/reward \
--validation_file_dir ./data/reward \
--per_device_train_batch_size 4 \
--gradient_accumulation_steps 8 \
--per_device_eval_batch_size 4 \
--do_train \
--use_peft True \
--seed 42 \
--max_train_samples 1000 \
--max_eval_samples 10 \
--num_train_epochs 1 \
--learning_rate 2e-5 \
--warmup_ratio 0.05 \
--weight_decay 0.001 \
--logging_strategy steps \
--logging_steps 10 \
--eval_steps 50 \
--eval_strategy steps \
--save_steps 500 \
--save_strategy steps \
--save_total_limit 3 \
--max_source_length 1024 \
--max_target_length 256 \
--output_dir outputs-rm-qwen-v1 \
--overwrite_output_dir \
--ddp_timeout 30000 \
--logging_first_step True \
--target_modules all \
--lora_rank 8 \
--lora_alpha 16 \
--lora_dropout 0.05 \
--bf16 \
--torch_dtype bfloat16 \
--device_map auto \
--report_to tensorboard \
--ddp_find_unused_parameters False \
--remove_unused_columns False \
--gradient_checkpointing True
输出: outputs-rm-qwen-v1 目录下的奖励模型权重
目的: 使用奖励模型优化生成策略(RLHF 流程的最后一步)
训练命令:
CUDA_VISIBLE_DEVICES=0,1 python ppo_training.py \
--sft_model_path outputs-sft-qwen-v1/checkpoint-500 \
--reward_model_path outputs-rm-qwen-v1/checkpoint-500 \
--template_name qwen \
--torch_dtype bfloat16 \
--train_file_dir ./data/finetune \
--validation_file_dir ./data/finetune \
--max_source_length 1024 \
--response_length 1000 \
--per_device_train_batch_size 1 \
--gradient_accumulation_steps 4 \
--gradient_checkpointing True \
--do_train \
--total_episodes 30000 \
--output_dir outputs-ppo-qwen-v1 \
--missing_eos_penalty 1.0 \
--eval_strategy steps \
--eval_steps 100 \
--num_train_epochs 3 \
--report_to tensorboard
关键参数说明:
--sft_model_path: SFT 阶段训练好的模型路径--reward_model_path: RM 阶段训练好的奖励模型路径--total_episodes: PPO 训练的总回合数输出: outputs-ppo-qwen-v1 目录下的最终模型
目的: 直接偏好优化,无需奖励模型(推荐,更简单高效)
数据: 同 RM 阶段,需要偏好数据
训练命令:
CUDA_VISIBLE_DEVICES=0,1 python dpo_training.py \
--model_name_or_path outputs-sft-qwen-v1/checkpoint-500 \
--template_name qwen \
--train_file_dir ./data/reward \
--validation_file_dir ./data/reward \
--per_device_train_batch_size 4 \
--gradient_accumulation_steps 8 \
--per_device_eval_batch_size 1 \
--do_train \
--do_eval \
--use_peft True \
--max_train_samples 1000 \
--max_eval_samples 10 \
--max_steps 100 \
--eval_steps 20 \
--save_steps 50 \
--max_source_length 1024 \
--max_target_length 512 \
--output_dir outputs-dpo-qwen-v1 \
--target_modules all \
--lora_rank 8 \
--lora_alpha 16 \
--lora_dropout 0.05 \
--torch_dtype bfloat16 \
--bf16 True \
--fp16 False \
--device_map auto \
--report_to tensorboard \
--remove_unused_columns False \
--gradient_checkpointing True \
--cache_dir ./cache
关键参数说明:
--model_name_or_path: 使用 SFT 阶段训练好的模型输出: outputs-dpo-qwen-v1 目录下的 DPO 模型
优势:
目的: 比值比偏好优化,不需要参考模型(最新方法)
训练命令:
# 参考 run_orpo.sh
CUDA_VISIBLE_DEVICES=0,1 python orpo_training.py \
--model_name_or_path Qwen/Qwen2.5-0.5B-Instruct \
--template_name qwen \
--train_file_dir ./data/reward \
--validation_file_dir ./data/reward \
--per_device_train_batch_size 4 \
--gradient_accumulation_steps 8 \
--per_device_eval_batch_size 1 \
--do_train \
--do_eval \
--use_peft True \
--max_train_samples 1000 \
--max_eval_samples 10 \
--max_steps 100 \
--eval_steps 20 \
--save_steps 50 \
--max_source_length 1024 \
--max_target_length 512 \
--output_dir outputs-orpo-qwen-v1 \
--target_modules all \
--lora_rank 8 \
--lora_alpha 16 \
--lora_dropout 0.05 \
--torch_dtype bfloat16 \
--bf16 True \
--device_map auto \
--report_to tensorboard \
--gradient_checkpointing True \
--cache_dir ./cache
优势:
使用训练好的模型进行推理:
CUDA_VISIBLE_DEVICES=0 python inference.py \
--base_model Qwen/Qwen2.5-0.5B-Instruct \
--lora_model outputs-sft-qwen-v1/checkpoint-500 \
--interactive
参数说明:
--base_model: 基础模型路径--lora_model: LoRA 权重路径(如果已合并,可不指定)--interactive: 交互式对话模式--template_name: 对话模板名称CUDA_VISIBLE_DEVICES=0 python inference.py \
--base_model Qwen/Qwen2.5-0.5B-Instruct \
--lora_model outputs-sft-qwen-v1/checkpoint-500 \
--data_file input.jsonl \
--output_file output.jsonl \
--template_name qwen
如果希望部署合并后的模型:
python merge_peft_adapter.py \
--base_model_name_or_path Qwen/Qwen2.5-0.5B-Instruct \
--peft_model_path outputs-sft-qwen-v1/checkpoint-500 \
--output_dir merged-sft-qwen-v1
合并后可直接使用合并后的模型路径,无需指定 --lora_model。
启动 Web 界面进行交互式对话:
CUDA_VISIBLE_DEVICES=0 python gradio_demo.py \
--base_model Qwen/Qwen2.5-0.5B-Instruct \
--lora_model outputs-sft-qwen-v1/checkpoint-500 \
--template_name qwen
访问 http://localhost:7860 即可使用 Web 界面。
启动 API 服务:
CUDA_VISIBLE_DEVICES=0 python fastapi_server_demo.py \
--base_model Qwen/Qwen2.5-0.5B-Instruct \
--lora_model outputs-sft-qwen-v1/checkpoint-500 \
--template_name qwen
使用 vLLM 进行高性能部署:
sh vllm_deployment.sh
或手动配置:
python -m vllm.entrypoints.openai.api_server \
--model merged-sft-qwen-v1 \
--tensor-parallel-size 1 \
--port 8000
问题: CUDA out of memory
解决方案:
--per_device_train_batch_size--gradient_accumulation_steps(保持有效 batch size 不变)pip install bitsandbytes
# 在脚本中添加量化配置
--gradient_checkpointing(已默认启用)--model_max_length 或 --block_size解决方案:
--flash_attn True--bf16 --torch_dtype bfloat16--preprocessing_num_workers问题: KeyError 或数据加载失败
解决方案:
python validate_jsonl.py your_data.jsonl
--template_name 与数据格式匹配解决方案:
问题: DDP 训练报错
解决方案:
torchrun 而不是 pythonCUDA_VISIBLE_DEVICES 设置--ddp_timeout 值| 训练方法 | 精度 | 7B模型 | 13B模型 | 70B模型 |
|---|---|---|---|---|
| 全参数 | AMP | 120GB | 240GB | 1200GB |
| 全参数 | 16bit | 60GB | 120GB | 600GB |
| LoRA | 16bit | 16GB | 32GB | 160GB |
| QLoRA | 8bit | 10GB | 20GB | 80GB |
| QLoRA | 4bit | 6GB | 12GB | 48GB |
以 Qwen2.5-7B 模型,1000 条数据为例:
实际时间取决于数据量、模型大小和硬件配置。
# 1. 增量预训练
sh run_pt.sh
# 2. 合并 PT 权重(可选)
python merge_peft_adapter.py \
--base_model_name_or_path Qwen/Qwen2.5-0.5B \
--peft_model_path outputs-pt-qwen-v1/checkpoint-500 \
--output_dir merged-pt-qwen-v1
# 3. 有监督微调
# 修改 run_sft.sh 中的 model_name_or_path 为 merged-pt-qwen-v1
sh run_sft.sh
# 4. DPO 训练
sh run_dpo.sh
# 5. 合并最终模型
python merge_peft_adapter.py \
--base_model_name_or_path Qwen/Qwen2.5-0.5B-Instruct \
--peft_model_path outputs-dpo-qwen-v1/checkpoint-100 \
--output_dir merged-final-qwen-v1
# 6. 推理测试
CUDA_VISIBLE_DEVICES=0 python inference.py \
--base_model merged-final-qwen-v1 \
--interactive
# 1. 有监督微调
sh run_sft.sh
# 2. DPO 训练
sh run_dpo.sh
# 3. 推理测试
CUDA_VISIBLE_DEVICES=0 python inference.py \
--base_model Qwen/Qwen2.5-0.5B-Instruct \
--lora_model outputs-dpo-qwen-v1/checkpoint-100 \
--interactive
# 启动 TensorBoard
tensorboard --logdir outputs-sft-qwen-v1/runs
# 访问 http://localhost:6006 查看训练曲线
如果有特殊领域的词汇,可以扩充词表:
python build_domain_tokenizer.py \
--base_tokenizer_path Qwen/Qwen2.5-0.5B-Instruct \
--domain_file_path ./data/vocab/medical_vocab.txt \
--output_dir ./tokenizer-extended
如果需要转换数据格式:
python convert_dataset.py \
--input_file your_data.json \
--output_file converted_data.jsonl \
--template_name qwen
# 环境安装
pip install -r requirements.txt --upgrade
# 训练
sh run_sft.sh # 有监督微调
sh run_dpo.sh # DPO 训练
sh run_orpo.sh # ORPO 训练
sh run_pt.sh # 增量预训练
sh run_rm.sh # 奖励建模
sh run_ppo.sh # PPO 强化学习
# 推理
python inference.py --base_model MODEL --lora_model LORA --interactive
python gradio_demo.py --base_model MODEL --lora_model LORA
# 工具
python merge_peft_adapter.py # 合并 LoRA 权重
python validate_jsonl.py # 验证数据格式
python convert_dataset.py # 转换数据格式
祝您训练顺利!如有问题,欢迎提交 Issue 或查阅项目 Wiki。
本文档提供详细的 MedicalGPT 项目复现步骤,帮助您从零开始完成环境搭建、数据准备、模型训练和推理部署的全流程。
# 克隆仓库
git clone https://github.com/shibing624/MedicalGPT.git
cd MedicalGPT
# 创建虚拟环境(推荐)
python -m venv venv
source venv/bin/activate # Linux/Mac
# 或
# venv\Scripts\activate # Windows
# 安装 PyTorch(根据您的 CUDA 版本选择)
# CUDA 11.8
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
# CUDA 12.1
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
# 安装项目依赖
pip install -r requirements.txt --upgrade
# 验证关键库是否正确安装
python -c "import torch; print(f'PyTorch版本: {torch.__version__}')"
python -c "import transformers; print(f'Transformers版本: {transformers.__version__}')"
python -c "import peft; print(f'PEFT版本: {peft.__version__}')"
python -c "import trl; print(f'TRL版本: {trl.__version__}')"
创建数据目录并准备数据文件:
mkdir -p data/pretrain # 预训练数据
mkdir -p data/finetune # 微调数据
mkdir -p data/reward # 奖励模型数据(偏好数据)
预训练数据应为纯文本文件,每行一个文档。示例:
这是第一个医疗文档的内容...
这是第二个医疗文档的内容...
微调数据支持多种格式,推荐使用 JSONL 格式(ShareGPT 格式):
单轮对话格式 (alpaca 模板):
{"instruction": "小孩发烧怎么办", "input": "", "output": "发烧是身体对感染的反应..."}
{"instruction": "如何预防感冒", "input": "", "output": "预防感冒的方法包括..."}
多轮对话格式 (sharegpt/vicuna 模板):
{"conversations": [{"from": "human", "value": "你好"}, {"from": "gpt", "value": "你好!有什么可以帮助你的吗?"}]}
{"conversations": [{"from": "human", "value": "感冒了怎么办"}, {"from": "gpt", "value": "感冒时应该..."}]}
DPO/RM 训练需要偏好数据,格式如下:
{"prompt": "小孩发烧怎么办", "chosen": "正确的回答...", "rejected": "不正确的回答..."}
{"prompt": "如何预防感冒", "chosen": "好的回答...", "rejected": "不好的回答..."}
使用 Hugging Face datasets 下载:
from datasets import load_dataset
# 下载医疗数据集
dataset = load_dataset("shibing624/medical")
dataset.save_to_disk("./data/medical")
# 下载偏好数据集
pref_dataset = load_dataset("shibing624/DPO-En-Zh-20k-Preference")
pref_dataset.save_to_disk("./data/reward")
根据硬件资源选择合适的模型:
| 模型系列 | 推荐模型 | 显存需求 (QLoRA 4bit) | 说明 |
|---|---|---|---|
| Qwen2.5 | Qwen2.5-0.5B/1.5B/7B | 6GB/8GB/16GB | 推荐,中文支持好 |
| Qwen2 | Qwen2-7B | 16GB | 性能优秀 |
| LLaMA3 | Llama-3-8B | 20GB | 开源社区广泛使用 |
| LLaMA2 | Llama-2-7B-chat | 16GB | 经典选择 |
使用 Hugging Face Hub 下载模型:
from transformers import AutoTokenizer, AutoModelForCausalLM
model_name = "Qwen/Qwen2.5-0.5B-Instruct" # 示例,根据需求选择
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
# 或使用命令行
huggingface-cli download Qwen/Qwen2.5-0.5B-Instruct --local-dir ./models/Qwen2.5-0.5B-Instruct
在训练脚本中,将模型路径设置为:
--model_name_or_path Qwen/Qwen2.5-0.5B-Instruct # 使用 Hugging Face Hub 名称
# 或
--model_name_or_path ./models/Qwen2.5-0.5B-Instruct # 使用本地路径
MedicalGPT 提供完整的训练流程,可以根据需求选择不同的阶段组合。
目的: 在领域文档上继续预训练,注入领域知识(可选,但推荐)
数据: ./data/pretrain 目录下的纯文本文件
训练命令:
CUDA_VISIBLE_DEVICES=0,1 torchrun --nproc_per_node 2 pretraining.py \
--model_name_or_path Qwen/Qwen2.5-0.5B \
--train_file_dir ./data/pretrain \
--validation_file_dir ./data/pretrain \
--per_device_train_batch_size 4 \
--per_device_eval_batch_size 4 \
--do_train \
--do_eval \
--use_peft True \
--seed 42 \
--max_train_samples 10000 \
--max_eval_samples 10 \
--num_train_epochs 0.5 \
--learning_rate 2e-4 \
--warmup_ratio 0.05 \
--weight_decay 0.01 \
--logging_strategy steps \
--logging_steps 10 \
--eval_steps 50 \
--eval_strategy steps \
--save_steps 500 \
--save_strategy steps \
--save_total_limit 13 \
--gradient_accumulation_steps 8 \
--preprocessing_num_workers 10 \
--block_size 512 \
--group_by_length True \
--output_dir outputs-pt-qwen-v1 \
--overwrite_output_dir \
--ddp_timeout 30000 \
--logging_first_step True \
--target_modules all \
--lora_rank 8 \
--lora_alpha 16 \
--lora_dropout 0.05 \
--torch_dtype bfloat16 \
--bf16 \
--device_map auto \
--report_to tensorboard \
--ddp_find_unused_parameters False \
--gradient_checkpointing True \
--cache_dir ./cache
关键参数说明:
--model_name_or_path: 基础模型路径--train_file_dir: 训练数据目录--use_peft True: 使用 LoRA 微调(节省显存)--lora_rank 8: LoRA 秩大小--output_dir: 模型输出目录输出: outputs-pt-qwen-v1 目录下的 LoRA 权重
显存需求:
目的: 在指令数据上微调,对齐指令意图(必需)
数据: ./data/finetune 目录下的 JSONL 格式文件
训练命令:
CUDA_VISIBLE_DEVICES=0,1 torchrun --nproc_per_node 2 supervised_finetuning.py \
--model_name_or_path Qwen/Qwen2.5-0.5B-Instruct \
--train_file_dir ./data/finetune \
--validation_file_dir ./data/finetune \
--per_device_train_batch_size 4 \
--per_device_eval_batch_size 4 \
--do_train \
--do_eval \
--template_name qwen \
--use_peft True \
--max_train_samples 1000 \
--max_eval_samples 10 \
--model_max_length 4096 \
--num_train_epochs 1 \
--learning_rate 2e-5 \
--warmup_ratio 0.05 \
--weight_decay 0.05 \
--logging_strategy steps \
--logging_steps 10 \
--eval_steps 50 \
--eval_strategy steps \
--save_steps 500 \
--save_strategy steps \
--save_total_limit 13 \
--gradient_accumulation_steps 8 \
--preprocessing_num_workers 4 \
--output_dir outputs-sft-qwen-v1 \
--overwrite_output_dir \
--ddp_timeout 30000 \
--logging_first_step True \
--target_modules all \
--lora_rank 8 \
--lora_alpha 16 \
--lora_dropout 0.05 \
--torch_dtype bfloat16 \
--bf16 \
--device_map auto \
--report_to tensorboard \
--ddp_find_unused_parameters False \
--gradient_checkpointing True \
--cache_dir ./cache \
--flash_attn True
关键参数说明:
--template_name: 对话模板名称(如 qwen, vicuna, alpaca)--model_max_length: 最大序列长度--flash_attn: 是否使用 Flash Attention(加速训练)如果使用 PT 阶段的输出:
# 需要先合并 PT 阶段的 LoRA 权重
python merge_peft_adapter.py \
--base_model_name_or_path Qwen/Qwen2.5-0.5B \
--peft_model_path outputs-pt-qwen-v1/checkpoint-500 \
--output_dir merged-pt-qwen-v1
# 然后在 SFT 时使用合并后的模型
--model_name_or_path merged-pt-qwen-v1
输出: outputs-sft-qwen-v1 目录下的 LoRA 权重
目的: 训练奖励模型,建模人类偏好(RLHF 流程必需)
数据: ./data/reward 目录下的偏好数据(chosen/rejected 格式)
训练命令:
# 注意:reward model 训练暂不支持 torchrun 多卡训练
CUDA_VISIBLE_DEVICES=0,1 python reward_modeling.py \
--model_name_or_path Qwen/Qwen2.5-0.5B-Instruct \
--train_file_dir ./data/reward \
--validation_file_dir ./data/reward \
--per_device_train_batch_size 4 \
--gradient_accumulation_steps 8 \
--per_device_eval_batch_size 4 \
--do_train \
--use_peft True \
--seed 42 \
--max_train_samples 1000 \
--max_eval_samples 10 \
--num_train_epochs 1 \
--learning_rate 2e-5 \
--warmup_ratio 0.05 \
--weight_decay 0.001 \
--logging_strategy steps \
--logging_steps 10 \
--eval_steps 50 \
--eval_strategy steps \
--save_steps 500 \
--save_strategy steps \
--save_total_limit 3 \
--max_source_length 1024 \
--max_target_length 256 \
--output_dir outputs-rm-qwen-v1 \
--overwrite_output_dir \
--ddp_timeout 30000 \
--logging_first_step True \
--target_modules all \
--lora_rank 8 \
--lora_alpha 16 \
--lora_dropout 0.05 \
--bf16 \
--torch_dtype bfloat16 \
--device_map auto \
--report_to tensorboard \
--ddp_find_unused_parameters False \
--remove_unused_columns False \
--gradient_checkpointing True
输出: outputs-rm-qwen-v1 目录下的奖励模型权重
目的: 使用奖励模型优化生成策略(RLHF 流程的最后一步)
训练命令:
CUDA_VISIBLE_DEVICES=0,1 python ppo_training.py \
--sft_model_path outputs-sft-qwen-v1/checkpoint-500 \
--reward_model_path outputs-rm-qwen-v1/checkpoint-500 \
--template_name qwen \
--torch_dtype bfloat16 \
--train_file_dir ./data/finetune \
--validation_file_dir ./data/finetune \
--max_source_length 1024 \
--response_length 1000 \
--per_device_train_batch_size 1 \
--gradient_accumulation_steps 4 \
--gradient_checkpointing True \
--do_train \
--total_episodes 30000 \
--output_dir outputs-ppo-qwen-v1 \
--missing_eos_penalty 1.0 \
--eval_strategy steps \
--eval_steps 100 \
--num_train_epochs 3 \
--report_to tensorboard
关键参数说明:
--sft_model_path: SFT 阶段训练好的模型路径--reward_model_path: RM 阶段训练好的奖励模型路径--total_episodes: PPO 训练的总回合数输出: outputs-ppo-qwen-v1 目录下的最终模型
目的: 直接偏好优化,无需奖励模型(推荐,更简单高效)
数据: 同 RM 阶段,需要偏好数据
训练命令:
CUDA_VISIBLE_DEVICES=0,1 python dpo_training.py \
--model_name_or_path outputs-sft-qwen-v1/checkpoint-500 \
--template_name qwen \
--train_file_dir ./data/reward \
--validation_file_dir ./data/reward \
--per_device_train_batch_size 4 \
--gradient_accumulation_steps 8 \
--per_device_eval_batch_size 1 \
--do_train \
--do_eval \
--use_peft True \
--max_train_samples 1000 \
--max_eval_samples 10 \
--max_steps 100 \
--eval_steps 20 \
--save_steps 50 \
--max_source_length 1024 \
--max_target_length 512 \
--output_dir outputs-dpo-qwen-v1 \
--target_modules all \
--lora_rank 8 \
--lora_alpha 16 \
--lora_dropout 0.05 \
--torch_dtype bfloat16 \
--bf16 True \
--fp16 False \
--device_map auto \
--report_to tensorboard \
--remove_unused_columns False \
--gradient_checkpointing True \
--cache_dir ./cache
关键参数说明:
--model_name_or_path: 使用 SFT 阶段训练好的模型输出: outputs-dpo-qwen-v1 目录下的 DPO 模型
优势:
目的: 比值比偏好优化,不需要参考模型(最新方法)
训练命令:
# 参考 run_orpo.sh
CUDA_VISIBLE_DEVICES=0,1 python orpo_training.py \
--model_name_or_path Qwen/Qwen2.5-0.5B-Instruct \
--template_name qwen \
--train_file_dir ./data/reward \
--validation_file_dir ./data/reward \
--per_device_train_batch_size 4 \
--gradient_accumulation_steps 8 \
--per_device_eval_batch_size 1 \
--do_train \
--do_eval \
--use_peft True \
--max_train_samples 1000 \
--max_eval_samples 10 \
--max_steps 100 \
--eval_steps 20 \
--save_steps 50 \
--max_source_length 1024 \
--max_target_length 512 \
--output_dir outputs-orpo-qwen-v1 \
--target_modules all \
--lora_rank 8 \
--lora_alpha 16 \
--lora_dropout 0.05 \
--torch_dtype bfloat16 \
--bf16 True \
--device_map auto \
--report_to tensorboard \
--gradient_checkpointing True \
--cache_dir ./cache
优势:
使用训练好的模型进行推理:
CUDA_VISIBLE_DEVICES=0 python inference.py \
--base_model Qwen/Qwen2.5-0.5B-Instruct \
--lora_model outputs-sft-qwen-v1/checkpoint-500 \
--interactive
参数说明:
--base_model: 基础模型路径--lora_model: LoRA 权重路径(如果已合并,可不指定)--interactive: 交互式对话模式--template_name: 对话模板名称CUDA_VISIBLE_DEVICES=0 python inference.py \
--base_model Qwen/Qwen2.5-0.5B-Instruct \
--lora_model outputs-sft-qwen-v1/checkpoint-500 \
--data_file input.jsonl \
--output_file output.jsonl \
--template_name qwen
如果希望部署合并后的模型:
python merge_peft_adapter.py \
--base_model_name_or_path Qwen/Qwen2.5-0.5B-Instruct \
--peft_model_path outputs-sft-qwen-v1/checkpoint-500 \
--output_dir merged-sft-qwen-v1
合并后可直接使用合并后的模型路径,无需指定 --lora_model。
启动 Web 界面进行交互式对话:
CUDA_VISIBLE_DEVICES=0 python gradio_demo.py \
--base_model Qwen/Qwen2.5-0.5B-Instruct \
--lora_model outputs-sft-qwen-v1/checkpoint-500 \
--template_name qwen
访问 http://localhost:7860 即可使用 Web 界面。
启动 API 服务:
CUDA_VISIBLE_DEVICES=0 python fastapi_server_demo.py \
--base_model Qwen/Qwen2.5-0.5B-Instruct \
--lora_model outputs-sft-qwen-v1/checkpoint-500 \
--template_name qwen
使用 vLLM 进行高性能部署:
sh vllm_deployment.sh
或手动配置:
python -m vllm.entrypoints.openai.api_server \
--model merged-sft-qwen-v1 \
--tensor-parallel-size 1 \
--port 8000
问题: CUDA out of memory
解决方案:
--per_device_train_batch_size--gradient_accumulation_steps(保持有效 batch size 不变)pip install bitsandbytes
# 在脚本中添加量化配置
--gradient_checkpointing(已默认启用)--model_max_length 或 --block_size解决方案:
--flash_attn True--bf16 --torch_dtype bfloat16--preprocessing_num_workers问题: KeyError 或数据加载失败
解决方案:
python validate_jsonl.py your_data.jsonl
--template_name 与数据格式匹配解决方案:
问题: DDP 训练报错
解决方案:
torchrun 而不是 pythonCUDA_VISIBLE_DEVICES 设置--ddp_timeout 值| 训练方法 | 精度 | 7B模型 | 13B模型 | 70B模型 |
|---|---|---|---|---|
| 全参数 | AMP | 120GB | 240GB | 1200GB |
| 全参数 | 16bit | 60GB | 120GB | 600GB |
| LoRA | 16bit | 16GB | 32GB | 160GB |
| QLoRA | 8bit | 10GB | 20GB | 80GB |
| QLoRA | 4bit | 6GB | 12GB | 48GB |
以 Qwen2.5-7B 模型,1000 条数据为例:
实际时间取决于数据量、模型大小和硬件配置。
# 1. 增量预训练
sh run_pt.sh
# 2. 合并 PT 权重(可选)
python merge_peft_adapter.py \
--base_model_name_or_path Qwen/Qwen2.5-0.5B \
--peft_model_path outputs-pt-qwen-v1/checkpoint-500 \
--output_dir merged-pt-qwen-v1
# 3. 有监督微调
# 修改 run_sft.sh 中的 model_name_or_path 为 merged-pt-qwen-v1
sh run_sft.sh
# 4. DPO 训练
sh run_dpo.sh
# 5. 合并最终模型
python merge_peft_adapter.py \
--base_model_name_or_path Qwen/Qwen2.5-0.5B-Instruct \
--peft_model_path outputs-dpo-qwen-v1/checkpoint-100 \
--output_dir merged-final-qwen-v1
# 6. 推理测试
CUDA_VISIBLE_DEVICES=0 python inference.py \
--base_model merged-final-qwen-v1 \
--interactive
# 1. 有监督微调
sh run_sft.sh
# 2. DPO 训练
sh run_dpo.sh
# 3. 推理测试
CUDA_VISIBLE_DEVICES=0 python inference.py \
--base_model Qwen/Qwen2.5-0.5B-Instruct \
--lora_model outputs-dpo-qwen-v1/checkpoint-100 \
--interactive
# 启动 TensorBoard
tensorboard --logdir outputs-sft-qwen-v1/runs
# 访问 http://localhost:6006 查看训练曲线
如果有特殊领域的词汇,可以扩充词表:
python build_domain_tokenizer.py \
--base_tokenizer_path Qwen/Qwen2.5-0.5B-Instruct \
--domain_file_path ./data/vocab/medical_vocab.txt \
--output_dir ./tokenizer-extended
如果需要转换数据格式:
python convert_dataset.py \
--input_file your_data.json \
--output_file converted_data.jsonl \
--template_name qwen
# 环境安装
pip install -r requirements.txt --upgrade
# 训练
sh run_sft.sh # 有监督微调
sh run_dpo.sh # DPO 训练
sh run_orpo.sh # ORPO 训练
sh run_pt.sh # 增量预训练
sh run_rm.sh # 奖励建模
sh run_ppo.sh # PPO 强化学习
# 推理
python inference.py --base_model MODEL --lora_model LORA --interactive
python gradio_demo.py --base_model MODEL --lora_model LORA
# 工具
python merge_peft_adapter.py # 合并 LoRA 权重
python validate_jsonl.py # 验证数据格式
python convert_dataset.py # 转换数据格式
祝您训练顺利!如有问题,欢迎提交 Issue 或查阅项目 Wiki。