Transformers调用大模型对话示例
目前大模型的使用过程中一般都采用专门的部署工具vLLM、Ollama等,调用方通过Rest API进行调用。本文介绍一个使用底层库Transformers进行调用的示例,来帮助您理解大模型的运行原理。
添加模型依赖
需要安装的依赖:pip install modelscope transformers torch
from modelscope import AutoConfig, AutoModelForCausalLM, AutoTokenizer
model_name = "/root/autodl-tmp/models/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B"
配置和初始化
- 当前版本不支持滑动窗口,通过
config.sliding_window = None
禁用 - model根据模型配置文件
config.json
配置进行实现类加载和初始化 - tokenizer根据模型配置文件
tokenizer_config.json
配置进行实现类加载和初始化
config = AutoConfig.from_pretrained(model_name)
config.sliding_window = None
model = AutoModelForCausalLM.from_pretrained(model_name,
torch_dtype="auto",
config=config)
tokenizer = AutoTokenizer.from_pretrained(model_name)
计算问题张量
-
apply_chat_template
会根据模板配置生成聊天问题,例如:<|begin▁of▁sentence|><|User|>请介绍下自己,200字左右<|Assistant|><think>
-
tokenizer
: 将文本分割成token(如单词或子词),转换为对应的ID,并添加模型所需的特殊token(如[CLS]、[SEP]) -
return_tensors="pt"
:指定返回PyTorch张量(torch.Tensor)。若为"tf"则返回TensorFlow张量 -
.to(model.device)
:将张量移动到模型所在的设备(如GPU)。确保输入数据与模型在同一设备,避免计算错误。
messages = [
{"role": "user", "content": "请介绍下自己,200字左右"}
]
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
# <|begin▁of▁sentence|><|User|>请介绍下自己,200字左右<|Assistant|><think>
model_inputs = tokenizer([text], return_tensors="pt").to(model.device) # 返回PyTorch张量并将张量移动到模型所在的设备
进行问题推理
-
max_new_tokens
:设置为模型最大值减去输入长度,防止超过模型处理长度 -
model.generate
:生成数据包含问题和答案的所有张量 -
response_ids
:是将生成的数据截断去掉了问题部分。为了保留标签,删除时少删了2个token
generated_ids = model.generate(
**model_inputs,
max_new_tokens=config.max_position_embeddings - model_inputs.input_ids.shape[1], # 模型最大长度减去输入长度
pad_token_id=tokenizer.eos_token_id
)
# 删除输入部分token
response_ids = [
# 多保留2个token “<think>\n”
output_id[len(input_id) - 2:] for input_id, output_id in zip(model_inputs.input_ids, generated_ids)
]
返回推理结果
response = tokenizer.batch_decode(response_ids, skip_special_tokens=True)
print(response[0])