为何基于进程的并行化无法有效提速Stable-Baselines3强化学习程序?
问题分析
多进程并行运行Stable-Baselines3/SBX的SAC训练时,迭代速度随进程数增加大幅下降,核心原因包括:
- 单GPU计算资源竞争:单张A100的计算核心是共享资源,每个RL训练任务的前向/反向传播、参数更新都会占用大量GPU算力,多任务并行时互相抢占资源,导致单任务速度骤降——这是最关键的瓶颈,与CPU核数充足无关。
- Joblib代码逻辑错误:当前代码中
Parallel(n_jobs=10)(delayed(train)() for i in range(num_of_programs))的写法会提前串行执行所有train任务,生成器迭代时会先跑完所有train,再将结果传给Parallel,并未实现真正的并行。 - 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
相关产品推荐
相关产品推荐

