题库练习 在⼤语⾔模型的实际部署中,推理阶段通常需要在保证稳定性、时延与显存效率之间取得平衡。常⻅策略包括: • 将模型切换⾄推理模式以禁⽤ Dropout; • 在推理时关闭梯度计算以减少显存占⽤; • 通过温度采样(Temperature Sampling)或核采样(Top-p Sampling)控制⽣成的多样性。 以下⽰例基于 Qwen2.5-7B 模型,实现了推理函数 deploy_generat…

A53071 | 在⼤语⾔模型的实际部署中,推理阶段通常需要在保证稳定性、时延与显存效率之间取得平衡。常⻅策略包括: • 将模型切换⾄推理模式以禁⽤ Dropout; • 在推理时关闭梯度计算以减少显存占⽤; • 通过温度采样(Temperature Sampling)或核采样(Top-p Sampling)控制⽣成的多样性。 以下⽰例基于 Qwen2.5-7B 模型,实现了推理函数 deploy_generat…

来源2025年
时间限制1s
内存限制256MB
通过 / 提交0/0

题目描述

在⼤语⾔模型的实际部署中,推理阶段通常需要在保证稳定性、时延与显存效率之间取得平衡。常⻅策略包括: 

• 将模型切换⾄推理模式以禁⽤ 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)
C++ 编辑器
输入
输出