0. 系列闭环

本篇位置 上游 本篇产出 下游
第 4/10 篇 第 03 篇原理 可运行的 GPU 环境 + 基座路径 第 05 篇 python train_lora_single.py

环境不对的表现不是「报错退出」,而是 bf16 不支持 silently 变慢模型路径软链接断裂训到一半才 fail。本篇按日志里真实成功的组合写。


1. 要解决的实际问题

LoRA 训练依赖:

  1. CUDA + bf16 可用的 PyTorch(V100 实测 2.5.1+cu124)
  2. 完整 Qwen3.5-4B 权重MODEL_PATH
  3. TRL / PEFT / bitsandbytes 版本与 Transformers 5.x 匹配
  4. JSONLDATA_PATH

验证与训练可以分机:训练在 AutoDL V100,验证在 Mac mini MPS(用户实测 verify_lora.py 通过)。vLLM 仅 Linux+CUDA(第 10 篇)。


2. 实现位置

路径 说明
LoRA_Demo/README.md 第 31–54 行 pip 依赖与 ModelScope 下载
LoRA_Demo/train_lora_single.py 第 49–51 行 MODEL_PATH / DATA_PATH / OUTPUT_DIR
LoRA_Demo/models/Qwen3.5-4B/ 基座目录(约 8.7 GB)
LoRA_Demo/.venv/ 本地 Python 3.11 虚拟环境(可选)

3. Python 依赖与版本锚点

1
pip install torch transformers peft trl datasets accelerate bitsandbytes tqdm

checkpoint-750 内嵌版本(训练落盘):

版本
PyTorch 2.5.1+cu124
transformers 5.9.0
trl 1.5.1
peft 0.19.1

不要用 TRL 0.7 老教程里的 TrainingArguments + 手写 formatting_func 来对照本项目——脚本用的是 **TRL 1.x 的 SFTConfig**,参数名 max_length 而非旧版 max_seq_length(Trainer 内部仍可能打印 max_seq_length=512,以脚本 MAX_SEQ_LEN 为准)。


4. 基座模型获取

4.1 ModelScope(国内)

1
2
3
4
5
pip install modelscope
modelscope download --model Qwen/Qwen3.5-4B

mkdir -p models
ln -sf ~/.cache/modelscope/hub/models/Qwen/Qwen3.5-4B ./models/Qwen3.5-4B

4.2 校验

1
2
3
4
5
6
test -f models/Qwen3.5-4B/config.json && echo OK
python -c "
from transformers import AutoConfig
c = AutoConfig.from_pretrained('./models/Qwen3.5-4B', trust_remote_code=True)
print(c.model_type, c.hidden_size)
"

train_lora_single.py 使用 trust_remote_code=True——Qwen3.5 需要仓库内自定义 modeling 代码,不能省略


5. 硬件与精度策略

5.1 训练(日志实测)

1
2
3
4
5
6
7
GPU 0: Tesla V100S-PCIE-32GB  |  显存: 31.7 GB
torch_dtype = bfloat16
bf16 = True
per_device_batch= 2
grad_accum = 2
有效 batch = 4
max_seq_length= 512

来源:all_logs.log 第 12–23 行。

V100 支持 bf16,故 train_lora_single.py 第 178、210 行 dtype=torch.bfloat16 + bf16=True 无需改。

5.2 验证(Mac MPS 实测)

verify_lora.py 第 101–107 行:

1
2
if torch.backends.mps.is_available():
return torch.device("mps"), torch.float16 # MPS 用 fp16,非 bf16

用户截图显示:推理设备: mps | 精度: torch.float16,LoRA 加载 426 个权重成功。说明 验证不必须回到 V100

5.3 部署

vLLM 要求 Linux + NVIDIA GPU,RTX 4090 / V100-32GB / A10-24GB 均可(README.md 硬件表)。


6. 开训前自检命令

1
2
3
4
5
6
7
cd LoRA_Demo
source .venv/bin/activate # 若使用 venv

python -c "import torch; print('CUDA', torch.cuda.is_available(), torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'N/A')"
wc -l data/elderly_chat.jsonl
ls -lh models/Qwen3.5-4B/*.safetensors 2>/dev/null | head -3
python -c "import trl, peft, transformers; print(trl.__version__, peft.__version__, transformers.__version__)"

期望:CUDA True、JSONL 约 1000 行、safetensors 存在、trl≥1.5。


7. 日志里两类警告的处理

7.1 flash-linear-attention 未安装

1
Falling back to torch implementation.

见第 09 篇。不阻断训练,仅速度略慢。41 分钟训完 750 步可接受。

7.2 tokenizer special token 对齐

1
Updated tokens: {'eos_token_id': 248046, 'pad_token_id': 248046}

脚本已 tokenizer.pad_token = tokenizer.eos_tokentrain_lora_single.py 第 164 行)。Trainer 自动对齐 config,可忽略


8. 踩坑

坑 1:软链接指向错误缓存路径
ModelScope 升级后 hub 路径变化,models/Qwen3.5-4B 悬空,from_pretrained 报 FileNotFound。用 ls -l models/Qwen3.5-4B 检查链接。

坑 2:云镜像自带 torch,pip 又装 CPU 版覆盖
torch.cuda.is_available() 变 False。开训前必打印 CUDA。

坑 3:Mac 上试图 pip install vllm 做部署
官方不支持 Mac CUDA。部署请用 Linux 云主机,本地只做 verify_lora.py

坑 4:磁盘空间
基座 8.7 GB + 15 个 checkpoint(各约 81 MB 含 optimizer)+ final_lora。output/ 预留 ≥2 GB;只有 final_lora 时约 50 MB。


9. 小结

  1. 依赖:torch 2.5 + transformers 5.9 + trl 1.5 + peft 0.19
  2. 基座:**ModelScope 下载 + 软链到 ./models/Qwen3.5-4B**。
  3. 训练:V100-32GB + bf16 + batch 2×2
  4. 验证:Mac MPS 可用 float16,与训练 bf16 略不同但实测可用。
  5. 部署:仅 Linux,见第 10 篇。

附录:路径常量

1
2
3
4
5
# LoRA_Demo/train_lora_single.py 第 49-51 行
MODEL_PATH = "./models/Qwen3.5-4B"
DATA_PATH = "./data/elderly_chat.jsonl"
OUTPUT_DIR = "./output/lora_elderly_single"
# 改路径只改这里;verify_lora.py 的 BASE_MODEL / LORA_PATH 需手动同步

系列导航

篇目 链接
上一篇 03 · LoRA 原理
下一篇 05 · SFT 实战(上)
索引 README

← 返回 LoRA 老年陪伴专题