bev-project/project/docs/模型分析结果与优化方案.md

445 lines
9.0 KiB
Markdown
Raw Normal View History

# BEVFusion模型分析结果与优化方案
**分析时间**: 2025-10-30
**Checkpoint**: epoch_23.pth
**Baseline性能**: NDS 0.6941, mAP 0.6446, mIoU 0.4130
---
## 📊 模型分析结果
### 总体规模
```
总参数量: 45,721,876 (45.72M)
模型层数: 636层
模型大小:
FP32: 174.42 MB
FP16: 87.21 MB (-50%)
INT8: 43.60 MB (-75%)
```
### 各模块参数分布
| 模块 | 参数量 | 占比 | 大小(FP32) | 优化优先级 |
|------|--------|------|-----------|-----------|
| **encoders** | **34.45M** | **75.3%** | **131.41MB** | 🔴 最高 |
| heads | 5.92M | 12.9% | 22.56MB | 🟡 中等 |
| decoder | 4.58M | 10.0% | 17.48MB | 🟡 中等 |
| fuser | 0.78M | 1.7% | 2.96MB | 🟢 低 |
### Encoders详细分布
| 子模块 | 参数量 | 占比 | 说明 |
|--------|--------|------|------|
| **camera.backbone** | **27.55M** | **60.3%** | SwinTransformer最大瓶颈🔴 |
| lidar.backbone | 2.70M | 5.9% | Sparse 3D CNN |
| camera.vtransform | 2.61M | 5.7% | DepthLSS视图转换 |
| camera.neck | 1.59M | 3.5% | FPN |
### Heads详细分布
| 子模块 | 参数量 | 占比 | 说明 |
|--------|--------|------|------|
| **map.aspp** | **4.13M** | **9.0%** | ASPP模块Enhanced分割头🟡 |
| object.shared_conv | 0.59M | 1.3% | TransFusion共享卷积 |
| map.classifiers | 0.44M | 1.0% | 6个分类器 |
| map.decoder | 0.30M | 0.7% | 2层decoder |
---
## 🎯 优化方案设计
### 方案A: 保守优化推荐用于Orin
#### 目标
```
参数量: 45.72M → 32M (-30%)
模型大小: 174MB → 30MB (INT8) (-83%)
推理时间: 估计90ms → 50ms (-44%)
精度损失: <2%
```
#### 剪枝策略
```
1. Camera Backbone (SwinTransformer)
当前: 27.55M
剪枝: 20%通道
目标: 22M
预期影响: <1%精度损失
2. ASPP模块
当前: 4.13M
剪枝: 25%通道
目标: 3.1M
预期影响: <0.5%精度损失
3. Decoder
当前: 4.58M
剪枝: 15%通道
目标: 3.9M
预期影响: <0.3%精度损失
4. Camera VTransform
当前: 2.61M
剪枝: 10%通道
目标: 2.35M
预期影响: <0.2%精度损失
总计: 45.72M → 31.35M (-31.4%)
```
#### 量化策略
```
PTQ + QAT混合:
- 敏感层: FP16Attention, 分类器)
- 其他层: INT8
预期模型大小:
剪枝后FP32: 119.6MB
混合精度INT8: ~30MB
```
---
### 方案B: 激进优化(如果性能不够)
#### 目标
```
参数量: 45.72M → 22M (-52%)
模型大小: 174MB → 22MB (INT8) (-87%)
推理时间: 估计90ms → 35ms (-61%)
精度损失: <4%
```
#### 剪枝策略
```
1. Camera Backbone
剪枝: 40%通道 + 层数减少
16.5M (减少11M)
2. ASPP简化
剪枝: 50%通道
2.1M (减少2M)
3. Decoder简化
剪枝: 30%通道
3.2M (减少1.4M)
总计: 45.72M → 21.8M (-52%)
```
---
## 🚀 实施计划
### 阶段1: 模型剪枝3-5天
#### Day 1: 准备工具
```bash
# 安装torch-pruning
pip install torch-pruning
# 创建剪枝脚本
tools/pruning/
├── prune_swin_backbone.py # 剪枝SwinTransformer
├── prune_aspp.py # 剪枝ASPP模块
├── prune_decoder.py # 剪枝Decoder
└── prune_bevfusion.py # 整体剪枝脚本
```
#### Day 2-3: 执行剪枝
```bash
# 运行剪枝
python tools/pruning/prune_bevfusion.py \
--checkpoint runs/enhanced_from_epoch19/epoch_23.pth \
--config configs/.../multitask_enhanced_phase1_HIGHRES.yaml \
--target-params 32000000 \
--output bevfusion_pruned_32M.pth
```
#### Day 4-5: 微调
```bash
# 微调3 epochs恢复精度
torchpack dist-run -np 8 python tools/train.py \
configs/.../multitask_enhanced_phase1_HIGHRES_pruned.yaml \
--load_from bevfusion_pruned_32M.pth \
--cfg-options \
max_epochs=3 \
optimizer.lr=5.0e-6
```
---
### 阶段2: INT8量化4-6天
#### Day 1: PTQ验证
```python
# 快速PTQ测试
python tools/quantization/ptq_test.py \
--model bevfusion_pruned_32M_finetuned.pth \
--calibration-samples 200
预期结果:
精度损失: 1.5-2.5%
如果>3%: 需要QAT
```
#### Day 2-5: QAT训练
```bash
# QAT训练5 epochs
torchpack dist-run -np 8 python tools/train.py \
configs/.../multitask_enhanced_phase1_HIGHRES_qat.yaml \
--load_from bevfusion_pruned_32M_finetuned.pth \
--cfg-options \
max_epochs=5 \
optimizer.lr=1.0e-6 \
quantization.enabled=true
```
#### Day 6: 评估
```bash
# 评估INT8模型
python tools/test.py \
configs/.../multitask_enhanced_phase1_HIGHRES_qat.yaml \
bevfusion_pruned_32M_qat.pth \
--eval bbox map
```
---
## 📊 预期性能对比
| 模型版本 | 参数量 | 大小 | 推理时间(A100) | 推理时间(Orin) | NDS | mAP | mIoU |
|---------|--------|------|---------------|---------------|-----|-----|------|
| **Epoch 23 (FP32)** | 45.72M | 174MB | ~90ms | ~450-900ms | 0.6941 | 0.6446 | 0.4130 |
| **剪枝后 (FP32)** | 32M | 122MB | ~60ms | ~300-600ms | 0.685+ | 0.635+ | 0.405+ |
| **剪枝+INT8** | 32M | 30MB | ~35ms | ~150-300ms | 0.680+ | 0.630+ | 0.400+ |
| **+TensorRT** | 32M | 30MB | ~25ms | **60-80ms** ✅ | 0.680+ | 0.630+ | 0.400+ |
**结论**: 通过剪枝+量化+TensorRT可以在Orin上达到**60-80ms推理时间**,满足部署要求!
---
## 🎯 关键优化目标
### 1. Camera Backbone (27.55M → 20M)
**优化策略**:
```python
# 通道剪枝策略
原始channels: [96, 192, 384, 768]
剪枝后: [80, 160, 320, 640] (-20%)
# 或层数剪枝
原始depths: [2, 2, 6, 2]
剪枝后: [2, 2, 4, 2] (减少2层)
预期减少: 5-7M参数
精度影响: <1%
```
### 2. ASPP模块 (4.13M → 3M)
```python
# 降低ASPP通道数
原始: 512 channels ASPP
剪枝: 384 channels (-25%)
预期减少: 1M参数
精度影响: <0.5% (主要影响分割)
```
### 3. Decoder (4.58M → 3.9M)
```python
# 简化decoder通道
原始channels: [128, 256]
剪枝后: [96, 192] (-25%)
预期减少: 0.7M参数
精度影响: <0.3%
```
---
## 📋 立即行动清单
### 今天完成
- [x] 模型分析 ✅
- [ ] 查看分析结果
- [ ] 确定剪枝策略方案A或B
- [ ] 准备剪枝工具
### 明天开始
- [ ] 安装torch-pruning
- [ ] 创建剪枝脚本
- [ ] 开始剪枝实施
---
## 🚀 下一步命令
### 查看完整分析结果
```bash
# 查看最新分析
ANALYSIS_FILE=$(ls -t analysis_results/checkpoint_analysis_*.txt | head -1)
cat $ANALYSIS_FILE
# 查看详细模块分布
cat $ANALYSIS_FILE | grep -A 30 "各模块参数分布"
# 查看优化建议
cat $ANALYSIS_FILE | grep -A 20 "优化建议"
```
### 准备剪枝工具
```bash
# 检查torch-pruning是否已安装
python -c "import torch_pruning" 2>/dev/null && echo "已安装" || echo "需要安装"
# 如果需要安装
pip install torch-pruning
```
---
## 💡 重要发现
### 实际参数量比预期小
**原因分析**:
- 之前估计110M是包括optimizer状态的总大小
- **实际模型参数**: 45.72M ✅
- 这意味着优化后模型会更小更适合Orin部署
### 优化潜力更大
```
原始: 45.72M, 174MB (FP32)
优化: 32M, 30MB (INT8) ← 比预期更好!
压缩: 83%
Orin推理估算:
原始FP32: 450-900ms ❌ 太慢
剪枝INT8: 150-300ms ⚠️ 仍慢
+TensorRT: 60-80ms ✅ 达标!
```
---
## 🎯 修订后的优化目标
### 新目标(基于实际参数量)
```
阶段1剪枝: 45.72M → 32M (-30%)
阶段2量化: 122MB (FP32) → 30MB (INT8)
总压缩比: 83% (174MB → 30MB)
精度目标:
NDS: 0.6941 → >0.680 (损失<2%)
mAP: 0.6446 → >0.630 (损失<2.5%)
mIoU: 0.4130 → >0.400 (损失<3%)
```
---
## 📅 更新的时间表
```
今天 (Day 1):
✅ 模型分析完成
→ 确定剪枝策略
→ 准备工具
明天 (Day 2):
→ 安装torch-pruning
→ 创建剪枝脚本
→ 开始剪枝实施
Day 3-4:
→ 剪枝微调 (3 epochs, ~12小时)
Day 5:
→ 评估剪枝效果
→ PTQ量化测试
Day 6-9:
→ QAT训练 (5 epochs, ~20小时)
Day 10:
→ 最终评估
→ 准备TensorRT转换
```
**总时间**: 约10天完成优化
---
## 🎉 好消息!
### 比预期更好的发现
1. **模型更小**: 45.72M vs 预估110M
- 优化空间更大
- 最终模型会更小
2. **优化目标可达**:
- 剪枝后32M非常合理
- INT8后仅30MB
- Orin部署更有信心
3. **时间更短**:
- 模型小,剪枝和微调更快
- 预计10天完成vs 之前14天
---
## 📂 分析结果文件
```
analysis_results/
└── checkpoint_analysis_<timestamp>.txt
├── 总体统计
├── 模块分布
├── Encoders详细
├── Heads详细
└── 优化建议
```
---
## 🚀 立即行动
### 确认优化方案
**推荐: 方案A保守优化**
- 剪枝30%: 45.72M → 32M
- INT8量化: 122MB → 30MB
- 精度损失: <2%
- Orin推理: 60-80ms ✅
**是否采用?**
### 下一步
```bash
# 1. 查看完整分析
cat analysis_results/checkpoint_analysis_*.txt
# 2. 准备剪枝工具
pip install torch-pruning
# 3. 创建剪枝配置和脚本
# (明天开始)
```
---
**状态**: ✅ 分析完成
**发现**: 模型比预期小,优化潜力更大
**建议**: 采用方案A30%剪枝 + INT8
**下一步**: 准备剪枝工具