PL
返回项目列表
LLM
PyTorch
FSDP
DeepSpeed
QLoRA
Qwen3
MLflow
Streamlit
MLOps
Apple Silicon

4-bit QLoRA Post-Training

跨平台 LLM 后训练平台:FSDP/DeepSpeed 多卡分布式训练 + MLflow Model Registry 模型生命周期管理。支持 SFT/DPO/领域适配 + Streamlit 全生命周期面板 — NVIDIA GPU + Apple Silicon

FSDP + DeepSpeed + DDP
分布式策略
0.6B - 14B
模型支持
Registry 血缘闭环
生命周期
NVIDIA + Apple Silicon + CPU
平台

概述

面向消费级到多卡集群的 LLM 后训练平台,覆盖模型全生命周期。 分布式训练(业界标准 2026 方案):FSDP(PyTorch 原生)为主、DeepSpeed ZeRO 为 scale-beyond、DDP 为基线。配置驱动,零训练循环改动,通过 torchrun 一键启动多卡。 模型生命周期闭环:微调 → 评测 → merge → 注册(Staging/Production)→ 血缘追溯。基于 MLflow Model Registry,每个版本可追溯回训练 run(参数 + 指标)。 跨平台训练引擎:NVIDIA(4-bit QLoRA)、Apple Silicon(bf16 MPS)、CPU,自动平台检测。SFT/DPO/领域适配三种后训练技术,配套 MLflow 追踪 + Streamlit 可视化。 内置医疗实体匹配领域示范:微调 Qwen3(0.6B-14B)实现药品/医院名归一化匹配。

什么是 QLoRA?

QLoRA(量化低秩适配)将 4-bit 量化与低秩适配器结合,在消费级 GPU 上微调大语言模型,显存占用降低约 84%。

全参数微调(FP16)
~14GB
QLoRA(4-bit NF4)
~3-4GB

核心特性

ML Platform Dashboard

Streamlit + MLflow:配置 → 训练 → 监控 → 评估 → 对比

Platform Abstraction

CUDA(4-bit QLoRA)/ MPS(bf16)/ CPU — 统一加载接口

Layered Config System

Dataclass 校验、YAML I/O、领域预设、CLI 覆盖

Passive Tracking

MLflow 回调不修改训练逻辑;不可用时不报错

Domain Adapter Pattern

ABC + 注册表,支持可扩展的评估可视化

Subprocess Launcher

JSON 持久化的 TrainingRunner,UI 驱动启动与监控

Dashboard

Training Lab

预设按钮 → 表单 → YAML 预览 → 子进程启动 → 实时 loss 曲线

Experiment Management

MLflow 运行列表、筛选、指标柱状图、参数差异、逐条删除

Evaluation

领域图表:按难度准确率、实体类型拆解、校准曲线

Model Comparison

并排指标卡片含差值、执行摘要、成本估算

Architecture

Streamlit UI          MLflow Layer              Training Scripts
├─ 训练实验室  ──→  ├─ MLflowTracker        ←──  ├─ train_sft.py
├─ 实验管理    ──→  ├─ MLflowTrainCallback      ├─ train_dpo.py
├─ 评估        ──→  ├─ TrainingRunner           └─ train_medical_entity.py
└─ 模型对比    ──→  └─ EvalLogger

System Design

Platform Abstraction

PlatformInfo 单例封装硬件检测。模型加载按 is_cuda / is_mps 分支:

CUDA:  device_map="auto" + BitsAndBytesConfig(4-bit NF4)
MPS:   无 device_map,加载后 .to("mps"),无量化
CPU:   float32,无 device_map

Flash Attention 2: 仅 CUDA(平台检查开关)
Trust remote code: True(Qwen3 必需)

Configuration System

分层 dataclass,__post_init__ 中校验。每种技术对应一个组合配置:

ModelConfig      → 名称、量化位数、torch_dtype、flash_attention
TrainingConfig   → 轮数、批次、梯度累积、学习率、effective_batch_size 属性
LoRAConfig       → r、alpha、dropout、target_modules
SFTConfig        → 组合:模型 + 训练 + LoRA + 数据 + 日志
DPOTrainingConfig → 继承 SFTConfig,增加 beta、loss_type

MLflow Integration

被动集成:回调转发 HF Trainer 事件,不修改 control。_NoOpTracker 保证 MLflow 不可用时零影响。

MLflowTrainCallback(TrainerCallback)
  ├─ on_train_begin() → 记录可训练/总参数量
  ├─ on_log()         → 转发 loss、lr 到 mlflow.log_metrics()
  └─ on_evaluate()    → 转发评估指标,前缀 "eval/"

配置自动扁平化:{"model": {"name": "Qwen"}} → "model.name": "Qwen"

Pipeline

5 阶段流程

prepare_model()  → 加载 + 量化(CUDA)/ bf16(MPS)+ PEFT 应用 LoRA
prepare_data()   → AlpacaDataset / FinanceDataset / MedicalEntityDataset
setup_trainer()  → HF Trainer + DataCollator + 回调(进度、内存、检查点、MLflow)
train()          → tracker.start_run() → trainer.train() → tracker.end_run()
evaluate()       → 困惑度 + 准确率 + 定性生成

关键决策

动态 report_to

根据配置标志计算 report_to。无后端时返回 ["none"],避免 TensorBoard 导入崩溃。

quantization_bits=None

MPS/CPU 使用 None(非 0)禁用量化。配置校验拒绝无效值。

TrainingRunner Persistence

JSON 文件存储运行元数据,子进程状态在 Streamlit 页面刷新后仍存活。

DomainChartAdapter ABC

注册表模式:register_adapter() / get_adapter()。MedicalEntityAdapter 实现摘要、详情、错误分析。

Domain

医疗实体匹配

中文医疗实体归一化:将变体名称(错别字、品牌名、缩写)映射到标准编码。

阿莫仙阿莫西林胶囊 (H44023614)
北医三院北京大学第三医院 (H110108001)

训练预设

预设模型硬件量化LoRA r
macQwen3-14BMac 64GBbf1664
pocQwen3-4B8GB GPU4-bit32
fullQwen3-8B24GB GPU4-bit64

Code

Core Pipeline

bnb = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.float16,
    bnb_4bit_use_double_quant=True,
)

model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen3-4B-Instruct-2507",
    quantization_config=bnb,
    device_map="auto",
    trust_remote_code=True,
)
model = prepare_model_for_kbit_training(model)

lora = LoraConfig(
    r=32, lora_alpha=64,
    target_modules=["q_proj", "v_proj", "k_proj", "o_proj",
                    "gate_proj", "up_proj", "down_proj"],
    lora_dropout=0.05, bias="none",
)
model = get_peft_model(model, lora)  # ~40M 可训练 / 7B 总量

快速开始

python scripts/train_medical_entity.py --poc8GB GPU,Qwen3-4B 4-bit
streamlit run ui/app.py启动面板

技术栈

PythonPyTorchHugging Face TransformersPEFT (LoRA)bitsandbytesFSDPDeepSpeedTRLQwen3MLflowStreamlitPlotly

核心特性

分布式训练:FSDP full_shard(PyTorch 原生,Meta Llama 同方案)+ DeepSpeed ZeRO-1/2/3 + DDP,配置驱动零循环改动
torchrun 一键启动:train_fsdp.sh / train_ddp.sh / train_deepspeed_z2.sh,自动检测 GPU 数量
模型生命周期闭环:merge → 注册 → Staging/Production 流转 → 血缘追溯(版本 → run → 参数+指标)
MLflow Model Registry:自动/手动注册,版本管理,阶段流转,registry_cli 管理工具
独立 merge 工具:AutoPeftModelForCausalLM 磁盘版 LoRA merge,支持显式基座覆盖
Streamlit 面板:训练实验室、实验管理、评估、模型对比(4 页面)
MLflow 追踪:自动实验记录、指标历史、参数对比(已修复 DPO callback + 双写 bug)
监督微调(SFT)+ 直接偏好优化(DPO)+ 领域适配
医疗实体匹配领域适配(药品名 + 医疗机构名归一化)+ 按难度分层评测
跨平台训练:NVIDIA 4-bit QLoRA + Apple Silicon bf16 + CPU,自动平台检测
Qwen3 全系列支持(0.6B, 1.7B, 4B, 8B, 14B),LoRA r=16-64
8GB VRAM 兼容(Qwen3-4B 4-bit QLoRA)