解决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
相关产品推荐
相关产品推荐

