资讯 社区 文档
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术

附录:自定义HF导入模型高级参数详细说明

1、会话模式相关

1.1 历史会话拼接说明

1.1.1 平台预置模式

配置字段说明

  • 当前问题拼接规范:按此处规范自动将当前用户问题拼接至Prompt中;为尽可能保证模型效果,此处拼接规范应与模型精调时的问答拼接方式一致。

    • {question}变量:对应用户最新一轮问题;必填
    • {round}变量:当前问题的轮次,从1开始;选填,如chatglm系列模型需要拼接轮次信息
  • 历史问答拼接规范:按此处规范自动将历史轮次问答拼接至Prompt中;为尽可能保证模型效果,此处拼接规范应与模型精调时的问答拼接方式一致。

    • {question}变量:对应历史用户问题;
    • {answer}变量:历史用户问题对应的模型回答;
    • {round}变量:当前问题的轮次,从1开始;选填,如chatglm系列模型需要拼接轮次信息
  • 外层Prompt模板:大模型指令精调时使用的Prompt模板,在模型调用时会将历史问答和当前问题拼接而成的字符串填充至prompt模板中;

上述配置在平台内部的使用逻辑
拼接逻辑代码样例如下,平台通过以下代码获得最终要输入给模型的完整prompt;可根据自身配置运行代码,对比拼接的字符串是否符合预期。

# concat_prompt
# 变量名含义
## latest_question_template:当前问题拼接规范
## history_qa_template:历史问答拼接规范
## prompt_template: 外层Prompt模板

final_prompt = ""

round = 1
need_history_round = "{round}" in latest_question_template

# 历史回话问答内容的拼接
for i in range(0, len(messages) - 1, 2):
    history_question = messages[i]["content"]
    history_answer = messages[i + 1]["content"]
    
    if need_history_round:
        final_prompt += history_qa_template.format(round=round, question=history_question, answer=history_answer)
    else:
        final_prompt += history_qa_template.format(question=history_question, answer=history_answer)
    round += 1

# 当前问题内的拼接
latest_question = messages[-1]["content"]
if need_history_round:
    final_prompt += latest_question_template.format(round=round, question=latest_question)
else:
    final_prompt += latest_question_template.format(question=latest_question)

# 外层Prompt模板拼接
final_prompt = prompt_template.format(input=final_prompt)

print("将要喂给模型的完整prompt如下:\n%s" % final_prompt)

# 进行模型推理
# inputs = tokenizer(final_prompt)
# result = model.generate(**inputs)

配置样例
以 chatglm2-6b 为例:

  • 配置:
当前问题拼接规范:[Round {round}]\n\n问:{question}\n\n答:
历史问答拼接规范:[Round {round}]\n\n问:{question}\n\n答:{answer}\n\n
外层Prompt模板:{input}

注:相关参考:https://huggingface.co/THUDM/chatglm2-6b/blob/main/tokenization_chatglm.py#L162

  • 样例:
# 请求:
{
    "messages": [
        {"role": "user", "content": "问题1"},
        {"role": "assistant", "content": "答案1"},
        {"role": "user", "content": "问题2"}
    ]
}

# 将要喂给模型的完整prompt如下:
[Round 1]

问:问题1

答:答案1

[Round 2]

问:问题2

答:

1.1.2 自定义模式

若平台预置的模板模式不能满足需求,可以通过更加灵活的自定义代码模式来实现token id的拼装,为实现此目标,需要按照平台规范实现以下函数:

def build_model_input(model_tokenizer, messages=None, prompt=None, **kwargs):
    """
    build model generate input with model tokenizer, input messages(对话模式)
    :param model_tokenizer: tokenizer loading from uploaded model
    :param messages: input messages whose structure is same with the `messages` param in qianfan chat api
    :param kwargs: other params for further future
    :return: 1-dim token id list
    """
    token_ids = []
    # convert input messages or prompt token ids
    return token_ids

函数详细说明

  • 函数名:build_model_input
  • 函数传入参数:

    • model_tokenizer:模型tokenizer,由平台从上传的模型中加载;
    • messages:用户调用会话模型服务时传入的会话信息,当为会话模式时生效;
    • kwargs:其他参数,目前未使用。当未来功能升级时,做向前兼容使用。
  • 函数输出结果:

    • token_ids: 转换后的一维token id数组,将用于喂入模型

样例:

  • chatglm3 6b:
# !/usr/bin/env python3
# -*- coding: utf-8 -*-


def build_model_input(model_tokenizer, messages=None, **kwargs):
    return model_tokenizer.build_chat_input(messages[-1]["content"], history=messages[:-1]).input_ids[0].tolist()
  • llama2 7b
# !/usr/bin/env python3
# -*- coding: utf-8 -*-
from transformers.pipelines.conversational import Conversation


def build_model_input(model_tokenizer, messages=None, **kwargs):
    past_user_inputs, generated_responses = [], []
    for i in range(0, len(messages) - 1, 2):
        past_user_inputs.append(messages[i]["content"])
        generated_responses.append(messages[i + 1]["content"])
    conv = Conversation(messages[-1]["content"], past_user_inputs=past_user_inputs, generated_responses=generated_responses)
    return model_tokenizer.apply_chat_template(conv)

1.2 自定义HF模型超参数使用说明

平台目前主要基于模型 generation_config.json 内容确认超参使用方式。用到的相关参数

  • max_length:用于限制模型输入tokens数量;超过max_length会自动截断左边部分token;
  • do_sample: 用于确定模型推理时的采样方式;取值为false时,将采用greedy search采样方式,生成结果固定,top_p、top_k、temperature、repetition_penalty超参数不生效;
  • top_p、top_k、temperature、repetition_penalty:当do_sample=true时,对应的取值将作为服务对应请求参数的默认取值,也可在调用时通过传参进行指定其他值;

超参数默认值:以用户上传generation_config.json配置为准

2 transformers推理框架相关

2.1 推理参数配置

  • load_model_class:模型加载类,用于加载transformers模型;默认值 AutoModelForCausalLM
  • load_tokenizer_class:tokenizer加载类,用于加载模型;默认值 AutoTokenizer
  • enable_auto_batch:处理请求时,是否支持auto batch;是否开启auto batch推理,增加服务吞吐;若模型batch推理不兼容,开启后可能导致效果有误;默认值:true;
  • custom_end_str:自定义生成结束字符串;防止模型不断生成;默认为空值,表示不设置;
  • token_decode_return_blank: 指定英文token解码后是否带有空格,设置为false时,平台会在英文单词间加入空格;默认值为true;
  • tokenizer_special_tokens:选填,需要添加到tokenizer的特殊token;例如 {"pad_token": "[PAD]"}

2.2 模型加载配置相关

2.2.1 模型加载说明

2.2.1.1 平台默认配置

推理参数配置可以配置load_model_class的类型,默认为AutoModelForCausalLM,平台通过以下代码加载模型:

try:
    try:
        model = load_model_class.from_pretrained(model_path, trust_remote_code=True,
                                               torch_dtype=infer_dtype, device_map="auto")
    except RuntimeError as e:
        model = load_model_class.from_pretrained(model_path, trust_remote_code=True,
                                               torch_dtype=infer_dtype, device="cuda")
except Exception as e:
    model = load_model_class.from_pretrained(model_path, trust_remote_code=True, device="cuda")
2.2.1.2 自定义配置

若平台默认配置不能满足需求,可以通过更加灵活的自定义配置来实现模型的载入,为实现此目标,需要按照平台规范实现以下函数:

def load_model(model_path, **kwargs):
    """
    load model with model path
    :param model_path: model path
    :param kwargs: other params for further future
    :return: instance of the model class
    """
    model = AutoModelForCausalLM.from_pretrained(model_path, trust_remote_code=True,
                                       torch_dtype=torch.float16, device_map="auto")
    return model

函数详细说明

  • 函数名:load_model
  • 函数传入参数:

    • model_path:平台上传模型的路径;
    • kwargs:其他参数,目前未使用。当未来功能升级时,做向前兼容使用。
  • 函数输出结果:

    • model:模型实例

样例

  • llama3-8b-instruct:
# !/usr/bin/env python3
# -*- coding: utf-8 -*-
from transformers import AutoModelForCausalLM
import torch

def load_model(model_path, **kwargs):
    model = AutoModelForCausalLM.from_pretrained(model_path, trust_remote_code=True,
                                       torch_dtype=torch.float16, device_map="auto")
    return model
  • deepseek v2
# !/usr/bin/env python3
# -*- coding: utf-8 -*-
from transformers import AutoModelForCausalLM, GenerationConfig
import torch

def load_model(model_path, **kwargs):
    max_memory = {i: "75GB" for i in range(8)}
    model = AutoModelForCausalLM.from_pretrained(model_path, trust_remote_code=True, device_map="sequential", torch_dtype=torch.bfloat16, max_memory=max_memory, attn_implementation="eager")
    model.generation_config = GenerationConfig.from_pretrained(model_path)
    model.generation_config.pad_token_id = model.generation_config.eos_token_id
    return model

3 vllm推理框架

3.1 推理参数配置

  • load_tokenizer_class:tokenizer加载类,用于encode输入;默认值 AutoTokenizer
  • custom_end_str:自定义生成结束字符串;防止模型不断生成;默认为空值,表示不设置;
  • tokenizer_special_tokens:选填,需要添加到tokenizer的特殊token;例如 {"pad_token": "[PAD]"}
  • vllm_engine_args:选填,vllm engine加载参数,用于更改vllm engine加载的配置,详见https://github.com/vllm-project/vllm/blob/main/vllm/engine/arg_utils.py。 其中"model", "served_model_name", "tokenizer", "download_dir", "trust_remote_code", "tensor_parallel_size"这些参数固定为平台默认配置
上一篇
查看与管理我的模型
下一篇
数据管理