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

解决HuggingFace Pipeline模型类推断错误,自定义seq2seq模型Pipeline创建

解决HuggingFace Pipeline无法推断自定义seq2seq模型类的问题

这个错误是因为d_nikud23属于自定义seq2seq模型,不在HuggingFace Pipeline默认支持的任务类型范围内,需要创建自定义Pipeline类来适配模型的输入输出逻辑。以下是具体实现步骤:

1. 定义自定义Pipeline类

继承Pipeline基类,重写核心方法以适配模型的输入、前向传播和输出处理:

from transformers import Pipeline
import torch

class NikudPipeline(Pipeline):
    def _sanitize_parameters(self, **kwargs):
        # 提取并返回预处理所需的额外参数(如attention_mask)
        preprocess_params = {}
        if "attention_mask" in kwargs:
            preprocess_params["attention_mask"] = kwargs["attention_mask"]
        return preprocess_params, {}, {}

    def _preprocess(self, inputs, attention_mask=None):
        # 统一输入格式:支持单字符串或字符串列表
        if isinstance(inputs, str):
            inputs = [inputs]
        # 用tokenizer处理输入,生成模型所需的张量
        model_inputs = self.tokenizer(inputs, return_tensors="pt", padding=True, truncation=True)
        # 如果传入attention_mask,添加到模型输入中
        if attention_mask is not None:
            if isinstance(attention_mask, list):
                attention_mask = torch.tensor(attention_mask)
            model_inputs["attention_mask"] = attention_mask
        return model_inputs

    def _forward(self, model_inputs):
        # 执行模型前向传播,返回原始输出
        return self.model(**model_inputs)

    def _postprocess(self, model_outputs):
        # 将模型输出转换为每个字符的3种分类结果
        logits = model_outputs.logits
        # 获取每个token位置的top3分类索引
        top3_indices = torch.topk(logits, k=3, dim=-1).indices
        # 转换为numpy数组(自动适配GPU/CPU环境)
        top3_indices = top3_indices.cpu().numpy() if torch.cuda.is_available() else top3_indices.numpy()
        
        # 映射索引到具体标签(从模型配置中获取标签映射)
        label_map = self.model.config.id2label
        results = []
        for batch in top3_indices:
            token_labels = [[label_map[idx] for idx in token_top3] for token_top3 in batch]
            results.append(token_labels)
        return results

2. 加载模型、Tokenizer并初始化Pipeline

from transformers import AutoModelForSeq2SeqLM, AutoTokenizer

model_name = "NadavShaked/d_nikud23"
# 加载模型和对应的tokenizer
model = AutoModelForSeq2SeqLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)

# 初始化自定义Pipeline
nikud_pipeline = NikudPipeline(model=model, tokenizer=tokenizer)

3. 使用Pipeline进行推理

# 单句子推理
single_sentence_result = nikud_pipeline("My name is Sarah and I live in London")

# 带attention_mask的批量推理示例
input_sentences = ["My name is Sarah", "I live in London"]
attention_masks = [[1]*len(tokenizer.encode(sent)) for sent in input_sentences]
batch_result = nikud_pipeline(input_sentences, attention_mask=attention_masks)

注意事项

  • 如果模型输出格式与示例不同,需调整_postprocess方法的逻辑,匹配实际输出结构。
  • 确保tokenizer的padding、truncation等参数与模型训练时一致,避免推理误差。
  • 若需指定运行设备(如GPU),可在初始化Pipeline时添加device参数,例如NikudPipeline(model=model, tokenizer=tokenizer, device=0)(0代表第一块GPU)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 19:52:36