优化车辆生成位置偏差问题,新增红绿灯信息采集方法

This commit is contained in:
2025-10-21 13:31:18 +08:00
parent 1974aaee03
commit 22ce995916
23 changed files with 2712 additions and 23 deletions

221
Env/GPU_ACCELERATION.md Normal file
View File

@@ -0,0 +1,221 @@
# GPU加速指南
## 当前性能瓶颈分析
从测试结果看即使关闭渲染FPS仍然只有15-20左右主要瓶颈是
### 计算量分析51辆车
```
激光雷达计算:
- 前向雷达80束 × 51车 = 4,080次射线检测
- 侧向雷达10束 × 51车 = 510次射线检测
- 车道线雷达10束 × 51车 = 510次射线检测
合计5,100次射线检测/帧
红绿灯检测:
- 遍历所有车道 × 51车 = 数千次几何计算
```
**关键问题**这些计算都是CPU单线程串行的无法利用多核和GPU
---
## GPU加速方案
### 方案1优化激光雷达计算已实现
**优化内容:**
1. 减少激光束数量100束 → 52束减少48%
2. 优化红绿灯检测:避免遍历所有车道
3. 激光雷达缓存每N帧才重新计算一次
**预期提升:** 2-4倍30-60 FPS
**使用方法:**
```bash
python Env/run_multiagent_env_fast.py
```
---
### 方案2MetaDrive GPU渲染有限支持
**说明:**
MetaDrive基于Panda3D引擎理论上支持GPU渲染
- GPU主要用于**图形渲染**,不是物理计算
- 激光雷达的射线检测仍在CPU上
- GPU渲染主要加速可视化不加速训练
**启用方法:**
```python
config = {
"use_render": True,
"render_mode": "onscreen", # 或 "offscreen"
# Panda3D会自动尝试使用GPU
}
```
**限制:**
- 需要显示器或虚拟显示Xvfb
- WSL2环境需要配置X11转发
- 对无渲染训练无帮助
---
### 方案3使用GPU加速的物理引擎推荐但需要迁移
**选项AIsaac Gym (NVIDIA)**
- 完全在GPU上运行物理模拟和渲染
- 可同时模拟数千个环境
- **缺点**:需要完全重写环境代码,迁移成本高
**选项BIsaacSim/Omniverse**
- NVIDIA的高级仿真平台
- 支持GPU加速的激光雷达
- **缺点**:学习曲线陡峭,环境配置复杂
**选项CBrax (Google)**
- JAX驱动完全在GPU/TPU上运行
- **缺点**:功能有限,不支持复杂场景
---
### 方案4策略网络GPU加速推荐
虽然环境仿真在CPU但可以让**策略网络在GPU上运行**
```python
import torch
# 创建GPU上的策略模型
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
policy = PolicyNetwork().to(device)
# 批量处理观测
obs_batch = torch.tensor(obs_list).to(device)
with torch.no_grad():
actions = policy(obs_batch)
actions = actions.cpu().numpy()
```
**优势:**
- 51辆车的推理可以并行
- 如果使用RL训练GPU加速训练过程
- 不需要修改环境代码
---
### 方案5多进程并行最实用
既然单个环境受限于CPU单线程可以**并行运行多个环境**
```python
from multiprocessing import Pool
import os
def run_single_env(seed):
"""运行单个环境实例"""
env = MultiAgentScenarioEnv(config=...)
obs = env.reset(seed)
for step in range(1000):
actions = {...}
obs, rewards, dones, infos = env.step(actions)
if dones["__all__"]:
break
env.close()
return results
# 使用进程池并行运行
if __name__ == "__main__":
num_processes = os.cpu_count() # 12600KF有10核20线程
seeds = list(range(num_processes))
with Pool(processes=num_processes) as pool:
results = pool.map(run_single_env, seeds)
```
**预期提升:** 接近线性10核 ≈ 10倍吞吐量
**CPU利用率** 可达80-100%
---
## 推荐的完整优化方案
### 1. 立即可用(已实现)
```bash
# 使用优化版本,激光束减少+缓存
python Env/run_multiagent_env_fast.py
```
**预期:** 30-60 FPS2-4倍提升
### 2. 短期优化1-2小时
- 实现多进程并行
- 策略网络迁移到GPU
**预期:** 300-600 FPS总吞吐量
### 3. 中期优化1-2天
- 使用NumPy矢量化批量处理观测
- 优化Python代码热点用Cython/Numba
**预期:** 额外20-30%提升
### 4. 长期方案1-2周
- 迁移到Isaac Gym等GPU加速仿真器
- 或使用分布式训练框架Ray/RLlib
**预期:** 10-100倍提升
---
## 为什么MetaDrive无法直接使用GPU
### 架构限制:
1. **物理引擎**使用Bullet/Panda3D的CPU物理引擎
2. **射线检测**串行CPU计算无法并行
3. **Python GIL**:全局解释器锁限制多线程
4. **设计目标**MetaDrive设计时主要考虑灵活性而非极致性能
### GPU在仿真中的作用
-**图形渲染**:绘制画面(但我们训练时不需要)
-**神经网络推理/训练**:策略模型计算
-**物理计算**MetaDrive的物理引擎在CPU
-**传感器模拟**激光雷达等在CPU
---
## 检查GPU是否可用
```bash
# 检查NVIDIA GPU
nvidia-smi
# 检查PyTorch GPU支持
python -c "import torch; print(f'CUDA available: {torch.cuda.is_available()}')"
# 检查MetaDrive渲染设备
python -c "from panda3d.core import GraphicsPipeSelection; print(GraphicsPipeSelection.get_global_ptr().get_default_pipe())"
```
---
## 总结
| 方案 | 实现难度 | 性能提升 | GPU使用 | 推荐度 |
|------|----------|----------|---------|--------|
| 减少激光束 | ⭐ | 2-4x | ❌ | ⭐⭐⭐⭐⭐ |
| 激光雷达缓存 | ⭐ | 1.5-3x | ❌ | ⭐⭐⭐⭐⭐ |
| 多进程并行 | ⭐⭐ | 5-10x | ❌ | ⭐⭐⭐⭐⭐ |
| 策略GPU加速 | ⭐⭐ | 2-5x | ✅ | ⭐⭐⭐⭐ |
| GPU渲染 | ⭐⭐⭐ | 1.2x | ✅ | ⭐⭐ |
| 迁移Isaac Gym | ⭐⭐⭐⭐⭐ | 10-100x | ✅ | ⭐⭐⭐ |
**结论:**
1. 先用已实现的优化(减少激光束+缓存)
2. 再实现多进程并行
3. 策略网络用GPU训练
4. 如果还不够考虑迁移到GPU仿真器