Files
MAGAIL4AutoDrive/Env/PERFORMANCE_OPTIMIZATION.md

132 lines
3.9 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.

# MetaDrive 性能优化指南
## 为什么帧率只有15FPS且CPU利用率不高
### 主要原因:
1. **渲染瓶颈(最主要)**
- `use_render: True` + 每帧调用 `env.render()` 会严重限制帧率
- MetaDrive 使用 Panda3D 渲染引擎,渲染是**同步阻塞**的
- 即使CPU有余力也要等待渲染完成才能继续下一步
- 这就是为什么CPU利用率低但帧率也低的原因
2. **激光雷达计算开销**
- 每帧对每辆车进行3次激光雷达扫描100个激光束
- 需要进行物理射线检测,计算量较大
3. **物理引擎同步**
- 默认物理步长很小0.02s),需要频繁计算
4. **Python GIL限制**
- Python全局解释器锁限制了多核并行
- 即使是多核CPUPython单线程性能才是瓶颈
## 性能优化方案
### 方案1关闭渲染推荐用于训练
**预期提升10-20倍150-300+ FPS**
```python
config = {
"use_render": False, # 关闭渲染
"render_pipeline": False,
"image_observation": False,
"interface_panel": [],
"manual_control": False,
}
```
### 方案2降低物理计算频率
**预期提升2-3倍**
```python
config = {
"physics_world_step_size": 0.05, # 默认0.02,增大步长
"decision_repeat": 5, # 每5个物理步执行一次决策
}
```
### 方案3优化激光雷达
**预期提升1.5-2倍**
修改 `scenario_env.py` 中的 `_get_all_obs()` 函数:
```python
# 减少激光束数量
lidar = self.engine.get_sensor("lidar").perceive(
num_lasers=40, # 从80减到40
distance=30,
base_vehicle=vehicle,
physics_world=self.engine.physics_world.dynamic_world
)
# 或者降低扫描频率每N步才扫描一次
if self.round % 5 == 0:
lidar = self.engine.get_sensor("lidar").perceive(...)
else:
lidar = self.last_lidar[agent_id] # 使用缓存
```
### 方案4间歇性渲染
**适用场景:既需要可视化又想提升性能**
```python
# 每10步渲染一次而不是每步都渲染
if step % 10 == 0:
env.render(mode="topdown")
```
### 方案5使用多进程并行高级
**预期提升:接近线性(取决于进程数)**
```python
from multiprocessing import Pool
def run_env(seed):
env = MultiAgentScenarioEnv(config=...)
# 运行仿真
return results
# 使用进程池并行运行多个环境
with Pool(processes=8) as pool:
results = pool.map(run_env, range(8))
```
## 文件说明
- `run_multiagent_env.py` - **标准版本**(无渲染,基础优化)
- `run_multiagent_env_fast.py` - **极速版本**(激光雷达优化+缓存)⭐推荐
- `run_multiagent_env_parallel.py` - **并行版本**(多进程,最高吞吐量)⭐⭐推荐
- `run_multiagent_env_visual.py` - **可视化版本**(有渲染,适合调试)
## 性能对比
| 配置 | 单环境FPS | 总吞吐量 | CPU利用率 | 文件 | 适用场景 |
|------|-----------|----------|-----------|------|----------|
| 原始配置(有渲染) | 15-20 | 15-20 | 15-20% | visual | 实时可视化调试 |
| 关闭渲染 | 20-25 | 20-25 | 20-30% | 标准版 | 基础训练 |
| 激光雷达优化+缓存 | 30-60 | 30-60 | 30-50% | fast | 快速训练⭐ |
| 多进程并行10核 | 30-60 | 300-600 | 90-100% | parallel | 大规模训练⭐⭐ |
**说明:**
- **单环境FPS**:单个环境实例的帧率
- **总吞吐量**:所有进程合计的 steps/second
- 12600KF10核20线程推荐使用并行版本
## 建议
1. **训练时**:使用高性能版本(关闭渲染)
2. **调试时**:使用可视化版本,或间歇性渲染
3. **大规模实验**:使用多进程并行
4. **如果需要GPU加速**考虑使用GPU渲染或将策略网络部署到GPU上
## 为什么CPU利用率低
- **渲染阻塞**CPU在等待渲染完成
- **Python GIL**:限制了多核利用
- **I/O等待**:可能在等待磁盘读取数据
- **单线程瓶颈**MetaDrive主循环是单线程的
解决方法:关闭渲染 + 多进程并行