如何高效序列化/反序列化Keras子类模型以适配Dask并行处理?
Keras自定义模型在Dask中的序列化/反序列化优化方案
一、核心优化方向
针对自定义Keras子类模型在Dask中反序列化耗时久的问题,核心优化思路有两个:
- 替换Keras默认的序列化逻辑,用更轻量的方式序列化模型
- 避免直接传递序列化后的模型对象,改为在Worker端动态构建模型
二、子问题1:实现专属序列化/反序列化器并让Dask强制使用
完全可以实现,且不需要修改Dask的默认配置,只需重写自定义模型类的__reduce__方法(你已经注意到Keras通过这个方法实现pickle逻辑),替换为更高效的序列化逻辑:
具体实现步骤
- 编写自定义的序列化/反序列化函数:
相比Keras默认的serialize_model_as_bytecode,可以用model.get_config()+权重分离的方式,序列化后的数据量更小,反序列化更快 - 重写自定义模型类的
__reduce__方法,指定使用自定义逻辑
代码示例
import keras def custom_serialize(model): # 仅序列化模型配置和权重,而非整个字节码 model_config = model.get_config() model_weights = model.get_weights() # 返回反序列化函数+所需参数 return (custom_deserialize, (model_config, model_weights)) def custom_deserialize(config, weights): # 反序列化时重建模型并加载权重 from your_module import CustomModel # 确保Worker能导入这个类 model = CustomModel.from_config(config) model.set_weights(weights) return model # 你的自定义Keras模型类 class CustomModel(keras.Model): def __init__(self, ...): super().__init__(...) # 模型层定义(无自定义层) def __reduce__(self): # 替换默认的reduce逻辑 return custom_serialize(self)
Dask默认使用pickle序列化对象,重写__reduce__后,Dask会自动调用你的自定义序列化逻辑,无需额外配置。
三、子问题2:Worker预加载类+传递构建参数替代序列化对象
这是更高效的方案,完全可行,核心是让Worker提前加载模型类,只传递构建参数和权重,而非整个序列化后的模型:
具体实现步骤
Worker预加载自定义模型类:
启动Dask Worker时,通过--preload参数指定包含自定义模型类的模块,比如:dask-worker tcp://your-scheduler-ip:8786 --preload path/to/your_module.py这样Worker启动时就会加载
CustomModel类,无需在任务中重复导入或序列化类定义。客户端传递构建参数与权重:
在客户端只传递模型的配置信息和权重,Worker端动态构建模型:# 客户端代码 def run_training(model_config, model_weights, train_data): # Worker已预加载CustomModel,直接使用 model = CustomModel.from_config(model_config) model.set_weights(model_weights) # 执行训练逻辑 model.fit(train_data) return model.get_weights() # 从本地模型获取配置和权重 local_model = CustomModel(...) model_config = local_model.get_config() model_weights = local_model.get_weights() # 提交任务到Dask集群 future = client.submit(run_training, model_config, model_weights, train_data)
优势
这种方式完全避免了序列化整个模型对象,只传递轻量的配置字典和权重数组,反序列化耗时会大幅降低(甚至可以忽略不计)。
最佳实践
将两种方案结合:Worker预加载模型类,同时重写模型的__reduce__方法让序列化只传递配置和权重。这样无论是直接传递模型对象给Dask任务,还是用client.submit传递参数,都能获得最优的序列化性能。
内容的提问来源于stack exchange,提问作者Marx
相关产品推荐
相关产品推荐

