这是一个迷你复现:50 条样本、AI 辅助完成,目的是验证技术路线可行,不代表产品级能力。
我最近在入门具身智能和智能驾驶方向,这是我在这个方向上动手做的第一个小复现。目标不是做出能用的驾驶模型,而是把”数据生成 → VLM 微调 → 可解释决策”这条完整路线跑通一遍,搞清楚每一步的工程细节。
它做什么
用 QLoRA 微调 Qwen2-VL-2B-Instruct,让它对一张驾驶场景图,输出固定三段式的结构化决策:
【场景描述】车辆在夜间行驶,前方无其他车辆,路面清晰,视线良好。【驾驶决策】保持车速平稳,适当使用远光灯辅助视线,注意观察周围环境。【原因分析】夜间视线受限……保持车速平稳有助于维持安全距离,避免紧急制动引发追尾。对比微调前的 base 模型——它只会泛泛地描述”这是一条公路、注意安全”,没有固定结构、也没有可追溯的推理链。微调后每条决策都带【原因分析】,这是”可解释驾驶决策”的核心。
整条流水线
- 数据生成:驾驶场景图用 PIL 合成(含道路、信号灯、行人、前车等元素),再用 Azure GPT-4.1-mini 的视觉接口对每张图自动生成【场景描述+决策+原因】标注。50 条,零人工标注。
- 微调:QLoRA(4bit NF4 量化 + LoRA rank=16)微调 Qwen2-VL-2B。可训练参数 18.5M / 2227M,只占 0.83%。
- 部署:LoRA adapter 合并成独立模型,可进一步量化压缩。
真实训练结果
| 指标 | 训练前 | 训练后 |
|---|---|---|
| Loss | 2.087 | 1.428(↓31%) |
| Token 准确率 | 52.4% | 63.3%(+10.9pp) |
| 可训练参数 | — | 18.5M / 2227M(0.83%) |
| 显存峰值 | — | 7.28 GB(24G RTX 4090) |
| 训练时间 | — | 33 秒 / 15 步 |
样本量很小(50 条 / 15 步),所以这些数字证明的是”路线跑通了、方向对了”,不是模型有多强。我没有把它包装成产品级效果——这点在项目 README 里也写明了。
几个真实的坑
- 外部数据源是脆弱依赖:原本想用 comma10k 的真实驾驶图,结果它的 GitHub 索引文件 404 了(仓库结构变过)。我没有死磕,触发了 fallback:改用 PIL 合成图 + LLM 高质量标注。对这种验证性复现,“小而有语义 + 高质量标注”比”大而无标注”更有用。
- 跨机器的绝对路径:本地生成的 JSONL 里图片是本机绝对路径,传到 GPU 服务器后
os.path.exists全 False。批量替换路径才修好。教训是数据集里该存相对路径,或生成时就用目标机的路径。 - 框架版本地狱:ms-swift 4.2.3 和 PyTorch 2.5.1 的 FSDP2 接口对不上(
ImportError: cannot import name FSDPModule)。VLM 微调的工具链还在快速变动,版本要对齐着钉死。
为什么记这个
它本身很小,但对我有意义:这是我在具身智能/驾驶方向上,第一次把多模态数据生成、PEFT 微调、可解释输出这三件事串成一条能跑的流水线。再往前走的很多东西(真实数据集、端到端 VLA、仿真环境),都建立在先把这条小路线吃透的基础上。