Files
MAGAIL4AutoDrive/Env/PERFORMANCE_OPTIMIZATION.md

3.9 KiB
Raw Blame History

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

config = {
    "use_render": False,  # 关闭渲染
    "render_pipeline": False,
    "image_observation": False,
    "interface_panel": [],
    "manual_control": False,
}

方案2降低物理计算频率

预期提升2-3倍

config = {
    "physics_world_step_size": 0.05,  # 默认0.02,增大步长
    "decision_repeat": 5,  # 每5个物理步执行一次决策
}

方案3优化激光雷达

预期提升1.5-2倍

修改 scenario_env.py 中的 _get_all_obs() 函数:

# 减少激光束数量
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间歇性渲染

适用场景:既需要可视化又想提升性能

# 每10步渲染一次而不是每步都渲染
if step % 10 == 0:
    env.render(mode="topdown")

方案5使用多进程并行高级

预期提升:接近线性(取决于进程数)

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主循环是单线程的

解决方法:关闭渲染 + 多进程并行