附录:自定义HF导入模型高级参数详细说明
更新时间:2024-08-26
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"这些参数固定为平台默认配置