附录:自定义HF导入模型高级参数详细说明
更新时间:2024-12-12
1、会话模式相关
1.1 历史会话拼接说明
1.1.1 平台预置模式
配置字段说明
-
当前问题拼接规范:按此处规范自动将当前用户问题拼接至Prompt中;为尽可能保证模型效果,此处拼接规范应与模型精调时的问答拼接方式一致。
- {question}变量:对应用户最新一轮问题;必填
- {round}变量:当前问题的轮次,从1开始;选填,如chatglm系列模型需要拼接轮次信息
-
历史问答拼接规范:按此处规范自动将历史轮次问答拼接至Prompt中;为尽可能保证模型效果,此处拼接规范应与模型精调时的问答拼接方式一致。
- {question}变量:对应历史用户问题;
- {answer}变量:历史用户问题对应的模型回答;
- {round}变量:当前问题的轮次,从1开始;选填,如chatglm系列模型需要拼接轮次信息
- 外层Prompt模板:大模型指令精调时使用的Prompt模板,在模型调用时会将历史问答和当前问题拼接而成的字符串填充至prompt模板中;
上述配置在平台内部的使用逻辑
拼接逻辑代码样例如下,平台通过以下代码获得最终要输入给模型的完整prompt;可根据自身配置运行代码,对比拼接的字符串是否符合预期。
Python
1# concat_prompt
2# 变量名含义
3## latest_question_template:当前问题拼接规范
4## history_qa_template:历史问答拼接规范
5## prompt_template: 外层Prompt模板
6
7final_prompt = ""
8
9round = 1
10need_history_round = "{round}" in latest_question_template
11
12# 历史回话问答内容的拼接
13for i in range(0, len(messages) - 1, 2):
14 history_question = messages[i]["content"]
15 history_answer = messages[i + 1]["content"]
16
17 if need_history_round:
18 final_prompt += history_qa_template.format(round=round, question=history_question, answer=history_answer)
19 else:
20 final_prompt += history_qa_template.format(question=history_question, answer=history_answer)
21 round += 1
22
23# 当前问题内的拼接
24latest_question = messages[-1]["content"]
25if need_history_round:
26 final_prompt += latest_question_template.format(round=round, question=latest_question)
27else:
28 final_prompt += latest_question_template.format(question=latest_question)
29
30# 外层Prompt模板拼接
31final_prompt = prompt_template.format(input=final_prompt)
32
33print("将要喂给模型的完整prompt如下:\n%s" % final_prompt)
34
35# 进行模型推理
36# inputs = tokenizer(final_prompt)
37# result = model.generate(**inputs)
配置样例
以 chatglm2-6b 为例:
- 配置:
Python
1当前问题拼接规范:[Round {round}]\n\n问:{question}\n\n答:
2历史问答拼接规范:[Round {round}]\n\n问:{question}\n\n答:{answer}\n\n
3外层Prompt模板:{input}
注:相关参考:https://huggingface.co/THUDM/chatglm2-6b/blob/main/tokenization_chatglm.py#L162
- 样例:
Python
1# 请求:
2{
3 "messages": [
4 {"role": "user", "content": "问题1"},
5 {"role": "assistant", "content": "答案1"},
6 {"role": "user", "content": "问题2"}
7 ]
8}
9
10# 将要喂给模型的完整prompt如下:
11[Round 1]
12
13问:问题1
14
15答:答案1
16
17[Round 2]
18
19问:问题2
20
21答:
1.1.2 自定义模式
若平台预置的模板模式不能满足需求,可以通过更加灵活的自定义代码模式来实现token id的拼装,为实现此目标,需要按照平台规范实现以下函数:
Python
1def build_model_input(model_tokenizer, messages=None, prompt=None, **kwargs):
2 """
3 build model generate input with model tokenizer, input messages(对话模式)
4 :param model_tokenizer: tokenizer loading from uploaded model
5 :param messages: input messages whose structure is same with the `messages` param in qianfan chat api
6 :param kwargs: other params for further future
7 :return: 1-dim token id list
8 """
9 token_ids = []
10 # convert input messages or prompt token ids
11 return token_ids
函数详细说明
- 函数名:build_model_input
-
函数传入参数:
- model_tokenizer:模型tokenizer,由平台从上传的模型中加载;
- messages:用户调用会话模型服务时传入的会话信息,当为会话模式时生效;
- kwargs:其他参数,目前未使用。当未来功能升级时,做向前兼容使用。
-
函数输出结果:
- token_ids: 转换后的一维token id数组,将用于喂入模型
样例:
- chatglm3 6b:
Python
1# !/usr/bin/env python3
2# -*- coding: utf-8 -*-
3
4
5def build_model_input(model_tokenizer, messages=None, **kwargs):
6 return model_tokenizer.build_chat_input(messages[-1]["content"], history=messages[:-1]).input_ids[0].tolist()
- llama2 7b
Python
1# !/usr/bin/env python3
2# -*- coding: utf-8 -*-
3from transformers.pipelines.conversational import Conversation
4
5
6def build_model_input(model_tokenizer, messages=None, **kwargs):
7 past_user_inputs, generated_responses = [], []
8 for i in range(0, len(messages) - 1, 2):
9 past_user_inputs.append(messages[i]["content"])
10 generated_responses.append(messages[i + 1]["content"])
11 conv = Conversation(messages[-1]["content"], past_user_inputs=past_user_inputs, generated_responses=generated_responses)
12 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,平台通过以下代码加载模型:
Python
1try:
2 try:
3 model = load_model_class.from_pretrained(model_path, trust_remote_code=True,
4 torch_dtype=infer_dtype, device_map="auto")
5 except RuntimeError as e:
6 model = load_model_class.from_pretrained(model_path, trust_remote_code=True,
7 torch_dtype=infer_dtype, device="cuda")
8except Exception as e:
9 model = load_model_class.from_pretrained(model_path, trust_remote_code=True, device="cuda")
2.2.1.2 自定义配置
若平台默认配置不能满足需求,可以通过更加灵活的自定义配置来实现模型的载入,为实现此目标,需要按照平台规范实现以下函数:
Python
1def load_model(model_path, **kwargs):
2 """
3 load model with model path
4 :param model_path: model path
5 :param kwargs: other params for further future
6 :return: instance of the model class
7 """
8 model = AutoModelForCausalLM.from_pretrained(model_path, trust_remote_code=True,
9 torch_dtype=torch.float16, device_map="auto")
10 return model
函数详细说明
- 函数名:load_model
-
函数传入参数:
- model_path:平台上传模型的路径;
- kwargs:其他参数,目前未使用。当未来功能升级时,做向前兼容使用。
-
函数输出结果:
- model:模型实例
样例:
- llama3-8b-instruct:
Python
1# !/usr/bin/env python3
2# -*- coding: utf-8 -*-
3from transformers import AutoModelForCausalLM
4import torch
5
6def load_model(model_path, **kwargs):
7 model = AutoModelForCausalLM.from_pretrained(model_path, trust_remote_code=True,
8 torch_dtype=torch.float16, device_map="auto")
9 return model
- deepseek v2
Python
1# !/usr/bin/env python3
2# -*- coding: utf-8 -*-
3from transformers import AutoModelForCausalLM, GenerationConfig
4import torch
5
6def load_model(model_path, **kwargs):
7 max_memory = {i: "75GB" for i in range(8)}
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")
9 model.generation_config = GenerationConfig.from_pretrained(model_path)
10 model.generation_config.pad_token_id = model.generation_config.eos_token_id
11 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"这些参数固定为平台默认配置