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

Ray内存不足错误:已添加节点但资源未被利用

问题排查与解决方法

1. 确认新节点资源是否被Ray正确识别

先执行ray status命令,查看新节点的Resources字段:

  • 检查CPU数量是否和VM配置一致(16核应显示16 CPU)
  • 检查内存数值是否匹配(112GB内存约为114688 MiB或117440512000 bytes)
    如果资源显示异常,启动新节点时需显式指定资源参数:
ray start --address=头节点IP:6379 --num-cpus=16 --memory=117440512000 --object-store-memory=32212254720

(object-store-memory设置对象存储可用内存,建议设为节点内存的20%-30%)

2. 检查任务的资源请求配置

Ray默认每个任务仅请求1核CPU和少量内存,若你的数据转换任务实际占用大量内存,需显式声明资源需求:

@ray.remote(memory=1073741824)  # 每个任务请求1GB内存
def core(data):
    # 数据转换逻辑
    ...

如果任务请求的内存超过新节点的可用内存,Ray会跳过该节点,仅调度到头节点。

3. 调整调度策略,避免优先本地调度

Ray默认采用本地优先调度(为减少数据传输开销),即使有其他节点可用,也会先把任务塞到头节点。可通过两种方式调整:

  • 全局设置:启动Ray时添加环境变量
    export RAY_SCHEDULER_SPREAD_THRESHOLD=0
    ray start --head ...  # 头节点启动命令
    
  • 任务级设置:给任务指定分散调度策略
    @ray.remote(scheduling_strategy="SPREAD")
    def core(data):
        ...
    

SPREAD策略会将任务调度到当前负载最低的节点,强制分散到新节点。

4. 优化数据存储与加载方式

如果数据集先加载到头节点内存再传递给任务,Ray会将数据存在头节点的对象存储,任务为了数据本地性会优先调度到头节点。解决方法:

  • 用Ray Data分布式加载数据:
    import ray.data
    ds = ray.data.read_csv("s3://your-bucket/datasets/*.csv")  # 或本地路径
    ds.map(core).show()
    
    Ray Data会自动将数据分片存储到所有节点的对象存储,任务也会调度到数据所在节点。
  • 让任务直接从外部存储读取数据,避免在头节点创建大对象后传递。

5. 清理头节点的冗余内存占用

执行ray memory命令,查看头节点的对象存储占用情况:

  • 若存在未被释放的大对象,可在代码中及时删除不再需要的对象引用,或使用ray.put(data, lifetime="detached")控制对象生命周期。
  • 若头节点的对象存储占满,可重启头节点时调大object-store-memory参数。

验证任务调度情况

通过Ray Dashboard(访问http://头节点IP:8265)或ray tasks list命令,查看任务的执行节点,确认是否有任务运行在新节点上。

你可能误解的Ray工作逻辑

Ray不会自动平均分配任务到所有节点,而是根据资源匹配度、数据本地性、调度策略进行调度。如果任务未声明资源需求、数据集中在头节点,或采用本地优先策略,就会出现新节点闲置、头节点OOM的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:20:30