如何让RAY Tune并行运行多个试验 解决单CPU资源配置报错问题
问题原因
你使用的是RLLib内置的A2C训练器,这类封装好的训练器会自动根据自身配置(比如num_workers、GPU配置等)计算所需资源,因此不支持直接向tune.run()传入resources_per_trial参数,否则就会触发你遇到的冲突错误。
同时你当前配置里的num_workers:19代表每个A2C试验会启动19个额外的采样worker进程,每个worker默认占1个CPU,再加上训练器主进程本身占的CPU,单个试验就要占至少20个CPU,这也是你之前只能同时跑1个试验的核心原因。
正确配置步骤
- 调整训练器自身的CPU配置
如果你希望每个试验总共只占用1个CPU,直接把num_workers设为0即可,此时所有计算都在训练器主进程内完成,不需要额外worker,总共仅占用1个CPU:
config = { "num_workers" : 0, # 去掉额外采样worker,仅主进程占用1个CPU #"num_gpus": 1, "gamma" : tune.grid_search([0, 0.2, 0.4, 0.6, 0.8, 1]), "lr" : tune.grid_search([1, 0.1, 0.01, 0.001, 0.0001, 0.00001, 0.000001]) }
如果你需要保留采样worker,也可以通过num_cpus_for_driver和num_cpus_per_worker调整单试验的CPU占用:
config = { "num_workers" : 2, # 2个采样worker "num_cpus_for_driver": 1, # 主进程占1个CPU "num_cpus_per_worker": 0.5, # 每个worker占0.5个CPU # 其余配置保持不变 }
上面的配置单个试验总CPU占用为1 + 2*0.5 = 2个。
- 调整
tune.run调用逻辑
调整完config内的资源配置后,直接调用tune.run即可,不需要额外传资源参数:
analysis = tune.run(config=config)
如果确实需要自定义资源覆盖训练器的默认计算值,可以用tune.with_resources包装训练器:
from ray import tune from ray.rllib.agents.a2c import A2CTrainer # 自定义每个试验的资源占用 wrapped_trainer = tune.with_resources(A2CTrainer, {"cpu": 1, "gpu": 0}) analysis = tune.run( wrapped_trainer, config=config )
- 确认并行上限
并行试验的最大数量由Ray集群的总可用CPU数除以单个试验的CPU占用决定,比如你有20个可用CPU,每个试验占1个CPU,就能同时跑20个试验。如果是本地启动的Ray,默认会占用当前机器的所有CPU核心,不需要额外配置。
内容的提问来源于stack exchange,提问作者Tomasz
相关产品推荐
相关产品推荐

