在Python Ray Serve中是否需使用对象存储?如何实现?
在Ray Serve中使用对象存储共享大型对象的方法与必要性
能不能用对象存储?
可以,但你当前的写法存在问题:Ray Serve部署的初始化参数如果是对象ID,不会自动解析为实际对象,需要手动调用ray.get()来获取真实数据。
正确实现方式
修改初始化逻辑,在部署实例启动时解析对象ID,就能正常使用共享的大型对象:
import ray from ray import serve from fastapi import FastAPI import numpy as np fast_app = FastAPI() # 将大型对象存入Ray对象存储 large_array = np.zeros((5000, 5000)) array_id = ray.put(large_array) @serve.deployment() @serve.ingress(fast_app) class ModelDeployment: def __init__(self, obj_id): # 解析对象ID,获取实际数组 self.large_obj = ray.get(obj_id) @fast_app.get("/check-shape") def get_shape(self): # 正常使用共享的大型对象 return {"shape": self.large_obj.shape} # 绑定对象ID到部署实例 app = ModelDeployment.bind(array_id)
如果你的部署需要多个副本(比如通过num_replicas参数设置),所有副本都会通过同一个对象ID读取对象存储中的数据,无需重复传输整个大数组,这正是对象存储的核心价值。
是否有必要使用?
分场景判断:
- 非常有必要的场景:对象体积大(如你的5000×5000数组)、需要被多个Ray Serve副本或其他Ray Actor共享。直接传递对象会导致每个副本都复制一份,浪费内存和跨节点带宽;用对象存储后,集群内仅保留一份数据,所有实例共享引用,大幅节省资源。
- 必要性低的场景:对象体积小、仅单个部署副本使用。这种情况下直接传递对象更简单,额外的对象存储操作反而增加复杂度。
内容的提问来源于stack exchange,提问作者user60150
相关产品推荐
相关产品推荐

