如何pickle fasttext模型?使用pins与vetiver遇序列化报错
解决方法
针对pins的解决方案
fasttext的C绑定模型对象无法被pickle序列化,因此不能直接用joblib类型存储。需要利用fasttext原生的模型保存/加载机制,将模型存为二进制文件后再用pins管理:
import pins import fasttext import tempfile import os # 1. 将fasttext模型保存为临时.bin文件 with tempfile.NamedTemporaryFile(suffix=".bin", delete=False) as tmp: ft_model.save_model(tmp.name) tmp_path = tmp.name # 2. 用pins存储这个二进制文件 board = pins.board_temp(allow_pickle_read=True) board.pin_write( path=tmp_path, name="ft_model", type="file", description="FastText binary model file" ) # 清理临时文件 os.unlink(tmp_path) # 加载模型的代码 loaded_bin_path = board.pin_read("ft_model") loaded_ft_model = fasttext.load_model(loaded_bin_path)
针对vetiver的解决方案
自定义Handler时需要绕过pickle逻辑,直接基于fasttext的二进制文件实现加载和预测:
import vetiver import fasttext import pins import tempfile import os from vetiver.handlers import BaseHandler class FasttextHandler(BaseHandler): def __init__(self, model=None, model_path=None, ptype_data=None): # 初始化时将模型转为二进制文件路径 if model: with tempfile.NamedTemporaryFile(suffix=".bin", delete=False) as tmp: model.save_model(tmp.name) self.model_path = tmp.name else: self.model_path = model_path super().__init__(model=None, ptype_data=ptype_data) def load(self, path): # 加载时调用fasttext原生方法读取二进制文件 self.model = fasttext.load_model(path) return self def predict(self, input_data, **kwargs): # 根据模型任务实现预测逻辑(示例为文本分类) if isinstance(input_data, str): return self.model.predict(input_data) elif isinstance(input_data, list): return [self.model.predict(text) for text in input_data] raise ValueError("输入必须是字符串或字符串列表") # 创建并存储Vetiver模型 handled_model = FasttextHandler(model=ft_model, ptype_data=None) vetiver_fasttext_model = vetiver.VetiverModel(model=handled_model, model_name="fasttext_model") ft_board = pins.board_temp(allow_pickle_read=True) vetiver.vetiver_pin_write( ft_board, vetiver_fasttext_model, type="file" ) # 加载并测试模型 loaded_vetiver_model = vetiver.vetiver_pin_read(ft_board, "fasttext_model") loaded_vetiver_model.predict("测试文本")
核心说明
fasttext_pybind.fasttext对象是C语言绑定实现,本身不支持pickle序列化,必须使用fasttext原生的save_model/load_model方法处理二进制文件。- pins存储时指定
type="file",直接管理模型的二进制文件而非序列化对象。 - Vetiver自定义Handler需要重写
load方法,替换默认的pickle加载逻辑,改用fasttext的模型加载方式。
内容的提问来源于stack exchange,提问作者Jamal Rnjbal
相关产品推荐
相关产品推荐

