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

启用RL模块的BC离线训练Ray资源调度失败问题排查求助

问题背景

我尝试用离线数据训练BC算法,同时在配置中启用了RL模块。在只有2个CPU的Google Colab上运行代码时,遇到如下错误:

当前无法调度以下资源请求:{'CPU': 1.0}。这可能是由于所有集群资源已被Actor占用。

禁用RL模块时BC能正常运行,但启用后就会因为上述CPU调度错误卡住。

我的问题:

  1. 如何查看当前已调度/正在使用的资源(CPU、Actor等)?
  2. 如何定位代码中导致调度问题的原因?

环境信息

  • 平台:Google Colab(2个CPU)
  • Ray版本:3.0.0.dev0
  • Python版本:3.10

代码示例

import gymnasium as gym

from ray.rllib.algorithms.bc import BCConfig
from ray.rllib.core.rl_module.rl_module import RLModule, RLModuleSpec
from ray.rllib.core.testing.torch.bc_module import DiscreteBCTorchModule

config = (
    BCConfig()
    .api_stack(
        enable_rl_module_and_learner=True,
        enable_env_runner_and_connector_v2=True,
    )
    .environment("CartPole-v1")
    .learners(num_learners=0)
    .offline_data(
        input_ = "/content/cartpole/large.json",
        input_read_method = "read_json",
        dataset_num_iters_per_learner=1,
    )
    .training(lr=0.00001, gamma=0.99, beta=0.0)
    .rl_module(rl_module_spec=RLModuleSpec(module_class=DiscreteBCTorchModule))
    .evaluation(
        evaluation_interval=1,
        evaluation_num_env_runners=1,
        evaluation_duration=1,
    )
)


algo = config.build()
result = algo.train()

输出信息

2025-10-17 07:46:34,505 INFO worker.py:1783 -- Started a local Ray instance.
<trimmed unrelated content>

(autoscaler +52s) Warning: The following resource request cannot be scheduled right now: {'CPU': 1.0}. This is likely due to all cluster resources being claimed by actors. Consider creating fewer actors or adding more nodes to this Ray cluster.
(autoscaler +1m27s) Warning: The following resource request cannot be scheduled right now: {'CPU': 1.0}. This is likely due to all cluster resources being claimed by actors. Consider creating fewer actors or adding more nodes to this Ray cluster.
....

解决方案与调试技巧

1. 查看已调度/使用的资源

  • Ray Dashboard:启动Ray后,在Colab中运行from google.colab.output import eval_js; print(eval_js("google.colab.kernel.proxyPort(8265)"))获取可访问的Dashboard链接,直观查看CPU、Actor等资源的实时占用和分配情况。
  • 命令行工具:
    • 运行ray status:输出集群总资源、已分配资源、空闲资源的概况。
    • 运行ray list actors:列出所有活跃Actor及其资源占用、状态信息。
  • Python API:在代码中添加以下片段打印资源详情:
    import ray
    ray.init()
    print("集群总资源:", ray.cluster_resources())
    print("可用资源:", ray.available_resources())
    actors = ray.state.actors()
    print(f"活跃Actor数量: {len(actors)}")
    for actor_id, info in actors.items():
        print(f"Actor {actor_id}: 资源占用 {info['resource_requirements']}")
    

2. 定位调度问题的原因

从配置入手排查

  • 评估模块资源占用:配置中evaluation_num_env_runners=1会启动一个评估环境运行器,启用RL模块后,训练进程、RL组件、评估进程的CPU占用总和会耗尽2个CPU的配额。可以先将evaluation_num_env_runners设为0或关闭评估模块,验证是否解决问题。
  • RL模块默认资源配置:启用enable_env_runner_and_connector_v2=True后,Ray会自动创建EnvRunner等后台Actor,即使num_learners=0,这些组件仍会申请CPU资源。可以通过env_runners(num_cpus_per_env_runner=0.5)降低单个EnvRunner的CPU占用,或减少EnvRunner数量。
  • 离线数据加载消耗:大离线数据集的读取和处理可能创建额外任务/Actor,可尝试减少dataset_num_iters_per_learner或调整input_shuffle_buffer_size降低资源消耗。

逐步调试验证

  • 逐步禁用组件:先关闭评估模块(注释.evaluation(...)部分),运行代码看是否报错;再逐步开启评估、调整RL模块配置(比如先关闭enable_env_runner_and_connector_v2),定位到具体触发问题的组件。
  • 实时监控资源:通过Ray Dashboard观察资源占用,当出现调度错误时,查看哪个Actor/任务在申请额外CPU,直接定位到对应组件。

针对当前代码的具体调整建议

修改配置减少资源占用,验证是否解决问题:

config = (
    BCConfig()
    .api_stack(
        enable_rl_module_and_learner=True,
        enable_env_runner_and_connector_v2=True,
    )
    .environment("CartPole-v1")
    .learners(num_learners=0)
    .offline_data(
        input_ = "/content/cartpole/large.json",
        input_read_method = "read_json",
        dataset_num_iters_per_learner=1,
    )
    .training(lr=0.00001, gamma=0.99, beta=0.0)
    .rl_module(rl_module_spec=RLModuleSpec(module_class=DiscreteBCTorchModule))
    # 先关闭评估模块
    .evaluation(
        evaluation_interval=0,
    )
    # 降低EnvRunner的CPU占用
    .env_runners(num_cpus_per_env_runner=0.5)
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 03:43:12