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

使用Ray并行训练时Protobuf对象无法Pickle序列化的问题求助

解决方案与思路

核心问题原因

Ray的远程任务依赖对象序列化来跨进程传递数据,但Protobuf默认的C扩展实现(google.protobuf.pyext._message.MessageDescriptor)包含底层C指针等无法被pickle序列化的结构,因此触发报错。

可行解决方案

1. 强制使用Protobuf纯Python实现

在Python代码最开头添加环境变量配置,让Protobuf放弃C扩展,改用纯Python版本运行,从根源避免不可序列化的C层对象:

import os
os.environ["PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION"] = "python"

注意:纯Python版本的Protobuf性能会略降,但对多数强化学习场景来说影响可控,优先尝试这个方案。

2. 传递序列化后的字节串而非Protobuf对象

不要直接在Ray任务间传递Protobuf实例,而是先将对象序列化为普通字节串,在远程任务内部再反序列化为Protobuf对象:

  • 发送端:serialized_data = proto_obj.SerializeToString()
  • 远程任务内部:proto_obj = YourProtobufMessageType().FromString(serialized_data)
    字节串是Python原生可序列化类型,完全不会触发pickle报错。

3. 把gRPC客户端封装为Ray Actor

如果gRPC客户端实例被意外传入Ray远程任务,也会引发序列化问题。可以将gRPC客户端封装成Ray Actor,让每个Actor持有独立的连接,远程任务通过调用Actor的方法完成通信,而非传递客户端对象:

import ray
import grpc
from your_proto_module import YourServiceStub, YourRequestProto

@ray.remote
class GRPCClientActor:
    def __init__(self, server_addr):
        # 在Actor内部初始化gRPC客户端,避免跨进程传递
        self.channel = grpc.insecure_channel(server_addr)
        self.stub = YourServiceStub(self.channel)
    
    def send_request(self, serialized_req):
        # 反序列化字节串为请求对象,调用gRPC接口后返回序列化的响应
        req = YourRequestProto().FromString(serialized_req)
        resp = self.stub.YourRPCMethod(req)
        return resp.SerializeToString()

使用时创建Actor实例,通过actor.send_request.remote(serialized_data)的方式调用,全程只传递字节串。

4. 给Protobuf对象自定义pickle逻辑

如果以上方案不适用,可以给Protobuf的Message类添加自定义的序列化/反序列化逻辑,让pickle只处理必要的数据:

from google.protobuf.message import Message

def proto_pickle(self):
    # 返回类和序列化后的字节串,用于反序列化
    return (self.__class__, (self.SerializeToString(),))

def proto_unpickle(cls, serialized_data):
    obj = cls()
    obj.ParseFromString(serialized_data)
    return obj

# 给所有Protobuf Message类注册pickle方法
Message.__reduce__ = proto_pickle
Message.__setstate__ = lambda self, state: None

注意:需要测试该方法对项目中所有Protobuf对象的兼容性,避免出现解析错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:03:36