You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何基于进程的并行化无法有效提速Stable-Baselines3强化学习程序?

问题分析

多进程并行运行Stable-Baselines3/SBX的SAC训练时,迭代速度随进程数增加大幅下降,核心原因包括:

  1. 单GPU计算资源竞争:单张A100的计算核心是共享资源,每个RL训练任务的前向/反向传播、参数更新都会占用大量GPU算力,多任务并行时互相抢占资源,导致单任务速度骤降——这是最关键的瓶颈,与CPU核数充足无关。
  2. Joblib代码逻辑错误:当前代码中Parallel(n_jobs=10)(delayed(train)() for i in range(num_of_programs))的写法会提前串行执行所有train任务,生成器迭代时会先跑完所有train,再将结果传给Parallel,并未实现真正的并行。
  3. CPU进程调度冲突:Humanoid-v4环境的交互、数据预处理会占用CPU资源,Joblib默认调度未绑定CPU核时,进程间会抢占CPU资源,进一步拉低速度。
解决方案

1. 修正Joblib并行代码逻辑

将提前执行的任务改为延迟提交,确保Parallel真正调度并行任务:

if __name__ == '__main__':
    num_of_programs = 10
    # 正确写法:延迟任务提交,避免提前串行执行
    Parallel(n_jobs=num_of_programs)(delayed(train) for i in range(num_of_programs))
    # 或者用lambda包装无参调用(确保不提前执行)
    # Parallel(n_jobs=num_of_programs)(delayed(lambda: train())() for i in range(num_of_programs))

2. 单GPU场景下的资源优化

限制单进程显存占比

通过PyTorch的显存限制,让多任务合理共享GPU显存,缓解资源冲突:

def train():
    # 每个进程最多使用20%的GPU显存(根据进程数调整比例)
    torch.cuda.set_per_process_memory_fraction(0.2, device=0)
    env = gym.make("Humanoid-v4")
    model = SAC("MlpPolicy", env, verbose=1)
    model.learn(total_timesteps=7e5, progress_bar=True)

注:此方法仅缓解显存压力,无法解决计算核心竞争,速度下降仍会存在,但会有所改善。

改用CPU训练

利用16核CPU的优势,强制任务在CPU上运行,避免GPU竞争:

def train():
    env = gym.make("Humanoid-v4")
    # 指定训练设备为CPU
    model = SAC("MlpPolicy", env, verbose=1, device="cpu")
    model.learn(total_timesteps=7e5, progress_bar=True)

此场景下多CPU核可更好地并行任务,速度下降会更平缓。

3. 优化Joblib进程调度

指定后端为loky(默认),并明确使用进程模式(避免GIL限制),同时可绑定CPU核减少调度开销:

from joblib import Parallel, delayed, parallel_backend

if __name__ == '__main__':
    num_of_programs = 10
    with parallel_backend('loky', n_jobs=num_of_programs, prefer="processes"):
        Parallel()(delayed(train)() for i in range(num_of_programs))

4. 改用SB3内置并行环境(替代多独立进程)

若目标是加速单个任务训练而非同时训练多个独立任务,使用SB3的SubprocVecEnv创建并行环境,单进程多环境并行能更高效利用GPU资源:

from stable_baselines3.common.env_util import make_vec_env

def train():
    # 创建8个并行子进程环境
    env = make_vec_env("Humanoid-v4", n_envs=8, vec_env_cls="SubprocVecEnv")
    model = SAC("MlpPolicy", env, verbose=1)
    model.learn(total_timesteps=7e5, progress_bar=True)

内容的提问来源于stack exchange,提问作者desert_ranger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 22:28:11