pipeline 背后做了什么?

360影视 动漫周边 2025-04-07 02:59 3

摘要:有没有想过,只需要引入from transformers import pipeline,然后通过pipeline调用不同的参数,为什么可以直接通用大模型呢?!接下来看下调用Qwen2.5.0模型,进行推理的一个案例进行分析,这个过程需要了解另一个知识点Aut

有没有想过,只需要引入from transformers import pipeline,然后通过pipeline调用不同的参数,为什么可以直接通用大模型呢?!接下来看下调用Qwen2.5.0模型,进行推理的一个案例进行分析,这个过程需要了解另一个知识点AutoTokenizer分词器和AutoModelForCausaLLm模型。

from transformers import AutoTokenizer, AutoModelForCausalLMimport torchtokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-0.5B-Instruct") # 加载分词器model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-0.5B-Instruct") # 加载模型inputs = tokenizer.encode("你是谁?",return_tensors="pt") # 编码器进行编码# 确保模型在适当的设备上(CPU或GPU)device = torch.device("cuda" if torch.cuda.is_available else "cpu")model.to(device)inputs = inputs.to(device) # 生成对应的结果outputs = model.generate(inputs,max_length=90, # 最大生成长度num_beams=5, # 束搜索的宽度no_repeat_ngram_size=2, # 防止重复的n-gram大小repetition_penalty=1.5, # 重复惩罚length_penalty=1.0, # 长度惩罚early_stopping=True, # 达到最大长度时提前停止)answer = tokenizer.decode(outputs[0],skip_special_tokens=True) # 解码器进行解码print(answer)

就会得到结果:

实际上它的背后经过了三个步骤:

预处理 (preprocessing),将原始文本转换为模型可以接受的输入格式;将处理好的输入送入模型;对模型的输出进行后处理 (postprocessing),将其转换为人类方便阅读的格式。

因为神经网络模型无法直接处理文本,因此首先需要通过预处理环节将文本转换为模型可以理解的数字。具体地,我们会使用每个模型对应的分词器 (tokenizer) 来进行:

将输入切分为词语、子词或者符号(例如标点符号),统称为 tokens;根据模型的词表将每个 token 映射到对应的 token 编号(就是一个数字);根据模型的需要,添加一些额外的输入。

我们对输入文本的预处理需要与模型自身预训练时的操作完全一致,只有这样模型才可以正常地工作。使用 AutoTokenizer 类和它的 from_pretrained 函数,它可以自动根据模型 checkpoint 名称来获取对应的分词器。

以上的案例分析就是pipelines背后的执行操作,pipelines组件就是为了更加便捷的推理模型,如果要是训练模型和微调模型的话,就要使用分词器和模型了。接下来就是回顾下pipelines组件基于Qwen2.5.0模型进行推理的过程。

from transformers import pipelinemessages = [{"role": "user", "content": "你是谁?"},]generator = pipeline("text-generation",model="Qwen/Qwen2.5-0.5B-Instruct") # 文本生成print(generator(messages,max_length=500))

了解了它的运行原理,在下一章节就要去讲解分词器和模型相关的内容,因为只有学习了这些知识,才能更好的去讲解模型微调、模型预训练以及模型训练相关的知识PRFT。

来源:小顾论科技

相关推荐