5.5 KiB
5.5 KiB
快速使用指南
🚀 已实现的性能优化
根据您的测试结果,原始版本FPS只有15左右,现已进行了全面优化。
📊 性能瓶颈分析
您的CPU是12600KF(10核20线程),但利用率不到20%,原因是:
- 激光雷达计算瓶颈:51辆车 × 100个激光束 = 每帧5100次射线检测
- 红绿灯检测低效:遍历所有车道进行几何计算
- Python GIL限制:单线程执行,无法利用多核
- 计算串行化:所有车辆依次处理,没有并行
🎯 推荐使用方案
方案1:极速单环境(推荐新手)⭐
python Env/run_multiagent_env_fast.py
优化内容:
- ✅ 激光束:100束 → 52束(减少48%计算量)
- ✅ 激光雷达缓存:每3帧才重新计算
- ✅ 红绿灯检测优化:避免遍历所有车道
- ✅ 关闭所有渲染和调试
预期性能: 30-60 FPS(2-4倍提升)
方案2:多进程并行(推荐训练)⭐⭐
python Env/run_multiagent_env_parallel.py
优化内容:
- ✅ 同时运行10个独立环境(充分利用10核CPU)
- ✅ 每个环境应用所有单环境优化
- ✅ CPU利用率可达90-100%
预期性能: 300-600 steps/s(20-40倍总吞吐量)
方案3:可视化调试
python Env/run_multiagent_env_visual.py
说明: 保留渲染功能,FPS约15,仅用于调试
🔧 关于GPU加速
GPU能否加速MetaDrive?
简短回答:有限支持,主要瓶颈不在GPU
详细说明:
-
物理计算(主要瓶颈) ❌ 不支持GPU
- MetaDrive使用Bullet物理引擎,只在CPU运行
- 激光雷达射线检测也在CPU
- 这是FPS低的主要原因
-
图形渲染 ✅ 支持GPU
- Panda3D会自动使用GPU渲染
- 但我们训练时关闭了渲染,所以GPU无用武之地
-
策略网络 ✅ 支持GPU
- 可以把Policy模型放到GPU上
- 但环境本身仍在CPU
GPU渲染配置(可选)
config = {
"use_render": True,
# GPU会自动用于渲染
}
策略网络GPU加速(推荐)
import torch
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
policy_model = PolicyNet().to(device)
# 批量推理
obs_tensor = torch.tensor(obs_list).to(device)
actions = policy_model(obs_tensor)
详细说明请看: GPU_ACCELERATION.md
📈 性能对比
| 版本 | FPS | CPU利用率 | 改进 |
|---|---|---|---|
| 原始版本 | 15 | 20% | - |
| 极速版本 | 30-60 | 30-50% | 2-4x |
| 并行版本 | 30-60/env | 90-100% | 总吞吐20-40x |
💡 使用建议
场景1:快速测试环境
python Env/run_multiagent_env_fast.py
单环境,快速验证功能
场景2:大规模数据收集
python Env/run_multiagent_env_parallel.py
多进程,最大化数据收集速度
场景3:RL训练
# 推荐使用Ray RLlib等框架,它们内置了并行环境管理
# 或者修改parallel版本,保存经验到replay buffer
场景4:调试/可视化
python Env/run_multiagent_env_visual.py
带渲染,可以看到车辆运行
🔍 性能监控
所有版本都内置了性能统计,运行时会显示:
Step 100: FPS = 45.23, 车辆数 = 51, 平均步时间 = 22.10ms
⚙️ 高级优化选项
调整激光雷达缓存频率
编辑 run_multiagent_env_fast.py:
env.lidar_cache_interval = 3 # 改为5可进一步提速(但观测会更旧)
调整并行进程数
编辑 run_multiagent_env_parallel.py:
num_workers = 10 # 改为更少的进程数(如果内存不足)
进一步减少激光束
编辑 scenario_env.py 的 _get_all_obs() 函数:
lidar = self.engine.get_sensor("lidar").perceive(
num_lasers=20, # 从40进一步减少到20
distance=20, # 从30减少到20米
...
)
🎓 为什么CPU利用率低?
原因分析:
-
单线程瓶颈
- Python GIL限制
- MetaDrive主循环是单线程的
- 即使有10个核心,也只用1个
-
I/O等待
- 等待渲染完成(如果开启)
- 等待磁盘读取数据
-
计算不均衡
- 某些计算很重(激光雷达),某些很轻
- CPU在重计算之间有空闲
解决方案:
✅ 已实现: 多进程并行(run_multiagent_env_parallel.py)
- 每个进程占用1个核心
- 10个进程可充分利用10核CPU
- CPU利用率可达90-100%
📚 相关文档
PERFORMANCE_OPTIMIZATION.md- 详细的性能优化指南GPU_ACCELERATION.md- GPU加速的完整说明
❓ 常见问题
Q: 为什么关闭渲染后FPS还是只有20?
A: 主要瓶颈是激光雷达计算,不是渲染。请使用 run_multiagent_env_fast.py。
Q: GPU能加速训练吗?
A: 环境模拟在CPU,但策略网络可以在GPU上训练。
Q: 如何最大化CPU利用率?
A: 使用 run_multiagent_env_parallel.py 多进程版本。
Q: 会影响观测精度吗?
A: 激光束减少会略微降低精度,但实践中影响很小。缓存会让观测滞后1-2帧。
Q: 如何恢复原始配置?
A: 使用 run_multiagent_env_visual.py 或修改配置文件中的参数。
🚦 下一步
- 先测试
run_multiagent_env_fast.py,验证性能提升 - 如果满意,用于日常训练
- 需要大规模训练时,使用
run_multiagent_env_parallel.py - 考虑将策略网络迁移到GPU
祝训练顺利!🎉