代码细节-transformers加载大模型方法中参数解析及批量input处理方法

import torch
from modelscope import AutoModelForCausalLM, AutoTokenizer

device = "cuda"

tokenizer = AutoTokenizer.from_pretrained("/home/01_llm/GLM-4/basic_demo/ZhipuAI/glm-4-9b-chat",trust_remote_code=True)

query = "你好"

inputs = tokenizer.apply_chat_template([{"role": "user", "content": query}],
                                       add_generation_prompt=True,
                                       tokenize=True,
                                       return_tensors="pt",
                                       return_dict=True
                                       )

inputs = inputs.to(device)
model = AutoModelForCausalLM.from_pretrained(
    "/home/01_llm/GLM-4/basic_demo/ZhipuAI/glm-4-9b-chat",
    torch_dtype=torch.bfloat16,
    low_cpu_mem_usage=True,
    trust_remote_code=True
).to(device).eval()

gen_kwargs = {"max_length": 2500, "do_sample": True, "top_k": 1}
with torch.no_grad():
    outputs = model.generate(**inputs, **gen_kwargs)
    outputs = outputs[:, inputs['input_ids'].shape[1]:]
    print(tokenizer.decode(outputs[0], skip_special_tokens=True))

代码中 tokenizer.apply_chat_template 各参数的含义详解:

  1. [{"role": "user", "content": query}]
    • 含义:传入一个消息列表(List of message dictionaries),每个消息包含角色(role)和内容(content)。
    • 说明
  • role 指定消息发送者(如 "user" 表示用户输入,"system" 表示系统提示)。
  • content 是消息的文本内容(如用户的问题 query)。
  • 消息列表需按对话顺序排列(如先系统提示后用户输入)。
  1. add_generation_prompt=True
    • 含义:在消息末尾添加模型生成回复的提示符(如 <|assistant|>),以明确模型需要开始生成回复的位置。
    • 说明
  • 若设为 False,则仅拼接输入消息,不添加生成提示。
  • 必须设置为 True,否则模型无法区分输入和待生成内容。
  1. tokenize=True
    • 含义:将拼接后的文本转换为 Token ID 序列(数值化表示)。
    • 说明
  • 若设为 False(如 ),则返回原始字符串,需额外调用 tokenizer() 进行数值化。
  • 设为 True 可直接获得模型可处理的数值输入。
  1. return_tensors="pt"
    • 含义:指定返回张量的框架类型为 PyTorch 张量
    • 说明
  • 可选值包括 "pt"(PyTorch)、"tf"(TensorFlow)、"np"(NumPy)。
  • "pt" 是 PyTorch 模型的通用格式。
  1. return_dict=True
    • 含义:以字典形式返回 Tokenization 结果(如包含 input_idsattention_mask 等键)。
    • 说明
  • 若设为 False,则仅返回 Token ID 张量(不包含掩码等信息)。
  • 必须设置为 True,否则后续 model.generate(**inputs) 会因缺少字典解包所需的键而报错。

参数组合的作用总结

  • 输入处理流程

    1. 按角色和内容拼接消息列表(如 [用户: query])。
    2. 末尾添加生成提示符(如 <|assistant|>)。
    3. 将拼接后的文本转换为 Token ID 序列(数值化)。
    4. 返回 PyTorch 张量格式的字典(含 input_ids 等键)。
  • 输出示例

    inputs = {
        "input_ids": tensor([[ 100, 2034, ... ]]),  # Token ID 序列
        "attention_mask": tensor([[1, 1, ... ]])    # 掩码标识有效部分
    }
    

    此输出可直接用于 model.generate(**inputs) 进行推理。

注意事项

  • return_dict=True 的必要性: 显示,若未设置此参数,model.generate() 无法正确接收输入。
  • 设备转移:代码中后续的 .to(device) 将张量移至指定设备(如 GPU),但非 apply_chat_template 的参数。

综上,这些参数共同完成了对话输入的标准化、数值化和结构化处理,确保模型能正确理解并生成回复。

如果以上输入的query是字符串列表,代码应该:

def format_queries(queries: List[str], system_prompt: str = None):
    messages_list = []
    for query in queries:
        messages = []
        if system_prompt:
            messages.append({"role": "system", "content": system_prompt})
        messages.append({"role": "user", "content": query})  # 用户输入
        messages_list.append(messages)
    return messages_list

# 批量生成模型输入
messages_list = format_queries(queries, system_prompt="You are an AI expert.")
inputs_list = [
    tokenizer.apply_chat_template(
        messages,
        add_generation_prompt=True,
        tokenize=True,  # 直接返回 Token ID
        return_tensors="pt",
        return_dict=True
    )
    for messages in messages_list
]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值