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

如何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:27:37