在⼤语⾔模型的实际部署中,推理阶段通常需要在保证稳定性、时延与显存效率之间取得平衡。常⻅策略包括:
• 将模型切换⾄推理模式以禁⽤ Dropout;
• 在推理时关闭梯度计算以减少显存占⽤;
• 通过温度采样(Temperature Sampling)或核采样(Top-p Sampling)控制⽣成的多样性。
以下⽰例基于 Qwen2.5-7B 模型,实现了推理函数 deploy_generate ,演⽰如何完成多轮增量⽂ 本⽣成与结果解码。请阅读以下代码,并在 [1] ⾄ [5] 处选择合适选项填⼊。
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
# === 模型路径 ===
model_name = "Qwen/Qwen2.5-7B"
# === 准备模型与分词器 ===
tokenizer = ____[1]____
model = ____[2]____
# === 推理函数(deploy_generate) ===
def deploy_generate(model, tokenizer, prompts, max_new_tokens=64,
temperature=0.8, eos_id=None, device="cuda"):
# 0) 模型切换为推理模式
model = ____[3]____
# 1) Tokenize 输⼊
inputs = tokenizer(prompts, return_tensors="pt", padding=True)
tokens = inputs["input_ids"].to(device)
batch_size = tokens.size(0)
# 2) 预热:完整提⽰构建 KV 缓存并得到⾸个 logits
with torch.inference_mode():
prime_logits = model(tokens).logits[:, -1, :] # 取最后⼀步的 logits
start_pos = tokens.size(1)
generated = []
finished = torch.zeros(batch_size, dtype=torch.bool, device=device)
# 3) 增量⽣成循环
with torch.inference_mode():
logits = prime_logits
for step in range(max_new_tokens):
# 温度缩放与 softmax
probs = ____[4]____
next_token = torch.multinomial(probs, num_samples=1) # 采样⼀个
token
# 拼接⽣成序列
tokens = torch.cat([tokens, next_token], dim=1)
generated.append(next_token)
# 判断是否结束
if eos_id is not None:
finished |= (next_token.squeeze(1) == eos_id)
if torch.all(finished):
break
# 增量步(此处使⽤简化形式重新计算 logits)
logits = model(tokens).logits[:, -1, :]
start_pos += 1
# 4) 拼接新增 tokens 并解码
if len(generated) > 0:
new_tokens = torch.cat(generated, dim=1)
else:
new_tokens = torch.empty(batch_size, 0, dtype=torch.long,
device=device)
texts = []
for i in range(batch_size):
texts.append(____[5]____)
return texts
if __name__ == "__main__":
prompts = [
"介绍⼀下西安的特⾊美⻝。",
"请写⼀⾸关于秋天的短诗。"
]
results = deploy_generate(model, tokenizer, prompts, max_new_tokens=50)
for i, res in enumerate(results):
print(f"\nPrompt {i+1}: {prompts[i]}")
print("Model output:", res)