Files
MAGAIL4AutoDrive/Env/GPU_ACCELERATION.md

222 lines
5.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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仿真器