Python 光线对象存储正在使用out of core耗尽内存。如何配置像s3 bucket这样的外部对象存储?

Python 光线对象存储正在使用out of core耗尽内存。如何配置像s3 bucket这样的外部对象存储?,python,ray,modin,Python,Ray,Modin,通常,当对象存储区填满时,它开始逐出未使用的对象(以最近最少使用的方式)。但是,由于所有对象都是结果列表中保存的numpy数组,因此它们仍在使用中,并且这些numpy数组所在的内存实际上在对象存储中,因此它们占用了对象存储中的空间。在这些对象超出范围之前,对象存储无法逐出它们 问:我如何指定一个像redis这样的外部对象存储而不在一台机器上超过内存?我不想使用/dev/shm或/tmp作为对象存储,因为只有有限的内存可用,而且它会很快填满从ray 1.2.0开始,支持对象溢出以支持核心外数据处理

通常,当对象存储区填满时,它开始逐出未使用的对象(以最近最少使用的方式)。但是,由于所有对象都是结果列表中保存的numpy数组,因此它们仍在使用中,并且这些numpy数组所在的内存实际上在对象存储中,因此它们占用了对象存储中的空间。在这些对象超出范围之前,对象存储无法逐出它们


问:我如何指定一个像redis这样的外部对象存储而不在一台机器上超过内存?我不想使用/dev/shm或/tmp作为对象存储,因为只有有限的内存可用,而且它会很快填满

从ray 1.2.0开始,支持对象溢出以支持核心外数据处理。从1.3+(将在3周后发布)开始,此功能将默认打开

但您的示例无法使用此功能。让我在这里解释一下原因

有两件事你需要知道

  • 调用ray任务(f.remote)或ray.put时,它将返回一个对象引用。试一试
  • ref=f.remote()
    打印(参考)
    
  • 在该引用上运行
    ray.get
    时,现在python变量直接访问内存(在ray中,它将位于共享内存中,如果对象大小大于等于100KB,则由一个名为plasma store的分布式对象存储管理)。所以
  • obj=ray.get(ref)#现在,obj直接指向共享内存。
    
    目前,对象溢出特性支持1种情况下的磁盘溢出,但不支持2种情况下的磁盘溢出(如果您认为2更难支持)

    这里有两种解决方案

  • 使用plasma商店的文件目录。例如,使用“开始光线”
  • ray.init(_plasma_directory=“/tmp”)
    
    这将允许您将
    tmp
    文件夹用作plasma存储(意味着光线对象存储在tmp文件系统中)。注意:使用此选项时,可能会看到性能下降

  • 使用带有背压的溢出物。不要使用
    ray.get
    获取所有光线对象,而是使用
    ray.wait
  • 导入光线
    将numpy作为np导入
    #注意:如果使用最新的主控形状,则无需指定此项。
    雷·伊尼特(
    _系统配置={
    “自动对象溢出启用”:True,
    “对象溢出配置”:json.dumps(
    {“type”:“filesystem”,“params”:{“directory_path”:“/tmp/spill”},
    )
    },
    )
    @雷,遥控器
    def():
    返回np.零(10000000)
    结果_refs=[]
    对于范围(100)内的i:
    印刷品(一)
    结果_refs+=[f.remote()表示范围内的u(50)]
    而结果参考:
    [准备就绪],结果参考=光线。等待(结果参考)
    结果=ray.get(准备就绪)
    
    可能不是最好的解决方案,但是如果在调用
    ray.get
    之后复制numpy数组,并在将它们附加到
    结果之前,它们将不再位于对象存储中。例如,<代码>结果+= [x.Copy](x).x中的x([f.Read())(范围为(50))] /<代码>。当然,在Python进程中,NUMPY数组仍然在内存中,因此在某个时间点内存会用完。请考虑重新发布。
    
    import ray
    import numpy as np
    
    
    
    ray.init()
    
    @ray.remote
    def f():
      return np.zeros(10000000)
    
    results = []
    for i in range(100):
      print(i)
      results += ray.get([f.remote() for _ in range(50)])