mindformers.generation.GenerationMixin
- class mindformers.generation.GenerationMixin[源代码]
一个提供自回归文本生成的所有函数的类,作为PreTrainedModel的织入(mixin)使用。
- chat(tokenizer: PreTrainedTokenizer, query: str, history: Optional[List[Dict[str, str]]] = None, system_role_name: Optional[str] = 'system', user_role_name: Optional[str] = 'user', assistant_role_name: Optional[str] = 'assistant', instruction: Optional[str] = '', max_length: Optional[int] = 512, max_new_tokens: Optional[int] = None, min_length: Optional[int] = 0, min_new_tokens: Optional[int] = None, do_sample: Optional[bool] = True, temperature: Optional[float] = 1.0, top_k: Optional[int] = 50, top_p: Optional[float] = 1.0, repetition_penalty: Optional[float] = 1.0)[源代码]
基于大型语言模型的对话文本生成推理。通过提供的分词器添加聊天模板后,将使用 generate() 对用户的查询进行推断。
- 参数:
tokenizer (PreTrainedTokenizer) - 用于解码词元的分词器。
query (str) - 用户对于推理的输入。
history (List[Dict[str, str]], 可选) - 一个对话对象,或包含有
"role"
和"content"
键的字典列表,代表到目前为止的聊天记录。默认值:None
。system_role_name (str) - 系统角色的名称。默认值:
"system"
。user_role_name (str) - 用户角色的名称。默认值:
"user"
。assistant_role_name (str) - 助理角色的名称。默认值:
"assistant"
。instruction (str, 可选) - 给模型的指令消息。默认值:
""
。max_length (int, 可选) - 生成词元的最大长度。对应于输入提示符的长度+ max_new_tokens 。如果之前设置过 max_new_tokens ,那么现在将会覆盖其效果。默认值:
512
。max_new_tokens (int, 可选) - 要生成的最大词元数,忽略提示符中的词元数。默认值:
None
。min_length (int, 可选) - 要生成的序列的最小长度。对应于输入提示符的长度+ min_new_tokens 。如果之前设置过 min_new_tokens ,那么现在将会覆盖其效果。默认值:
0
。min_new_tokens (int, 可选) - 要生成的最小标记数,忽略提示符中的标记数。默认值:
None
。do_sample (bool, 可选) - 是否对候选索引进行采样。如果将其设置为
True
,则启用抽样;如果设置为False
,则禁用抽样,相当于top-k 1。如果将其设置为None
,则遵循模型配置中的设置。默认值:True
。temperature (float, 可选) - 用于调制下一个词元概率的值。默认值:
1.0
。top_k (int, 可选) - 确定top-k数字词元索引作为候选。这个参数取值应该为正数。如果将其设置为
None
,则遵循模型配置中的设置。默认值:50
。top_p (float, 可选) - top-p下面的候选词元索引的累积概率,将被选择为候选索引。top-p的有效值在(0,1]之间。如果该值大于1,表示启用top-k算法。如果将其设置为
None
,则遵循模型配置中的设置。默认值:1.0
。repetition_penalty (float, 可选) - 生成单词频率的惩罚因子。如果将其设置为1,则不启用 repeat_penalty 。如果将其设置为
None
,则遵循模型配置中的设置。其默认值:1.0
。
- 返回:
两个参数, response 表示本次会话中大模型的回复结果,history 表示对话历史。
样例:
>>> import mindspore as ms >>> from mindformers.generation import text_generator >>> from mindformers import AutoModel, AutoTokenizer >>> ms.set_context(mode=0) >>> model = AutoModel.from_pretrained("llama2_7b") >>> tokenizer = AutoTokenizer.from_pretrained("llama2_7b") >>> query = "Hello!" >>> response, history = model.chat(tokenizer=tokenizer, query=query, max_length=32) >>> print(response) Thanks, sir.
- forward(input_ids: [Union[List[int], List[List[int]]]], valid_length_each_example: np.ndarray, block_tables: Optional[Tensor] = None, slot_mapping: Optional[Tensor] = None, prefill: bool = None, use_past: bool = False, encoder_mask: Optional[Tensor] = None, encoder_output: Optional[Tensor] = None, target_mask: Optional[Tensor] = None, **model_kwargs)[源代码]
模型前向传播的过程。
- 参数:
input_ids (List(List(int))) - 填充(Padding)后的输入索引。
valid_length_each_example (np.ndarray) - 除填充外的有效输入长度。
block_tables (Tensor) - 页面注意力的参数。
slot_mapping (Tensor) - 页面注意力的参数。
prefill (bool) - 选择是进行预填充预测还是解码预测。
use_past (bool) - 选择是否使用过去的状态。
encoder_mask (Tensor) - 用于编码器-解码器结构,对于纯解码器结构则不需要。
encoder_output (Tensor) - 用于编码器-解码器结构,对于纯解码器结构则不需要。
target_mask (Tensor) - 用于编码器-解码器结构,对于纯解码器结构则不需要。
- 返回:
两个参数,res 返回前向传播处理后的结果,current_index 记录序列的当前索引。
- generate(input_ids: Optional[Union[List[int], List[List[int]]]], generation_config: Optional[GenerationConfig] = None, logits_processor: Optional[LogitsProcessorList] = None, streamer: Optional[BaseStreamer] = None, seed: Optional[int] = None, **kwargs)[源代码]
可以根据给定的input ids(即数字id数组,本质是词元索引)来生成词汇。
大多数生成控制参数都在 generation_config 中进行配置,如果它们没有被传递,则将应用模型的默认生成配置。你可以通过传递相应的参数给 generate() 来随意重写 generation_config ,比如
.generate(inputs, top_k=3, do_sample=True)
。- 参数:
input_ids (List(str), List(List(str))) - 单个词元索引列表或一批词元索引列表。当输入为一批词元索引列表时,要求每个词元索引列表的长度保持一致。
generation_config (GenerationConfig, 可选) - 用生成配置来对生成调用进行基本参数化。
**kwargs
作为参数列表,会传递到与 generation_config 相匹配的属性处,并将覆盖默认值。如果没有提供 generation_config ,则将使用到模型配置中的默认配置。请注意,未指定的参数将继承[GenerationConfig]的默认值,应该检查其文档以进行参数化。默认值:None
。logits_processor (LogitsProcessorList, 可选) - 自定义置信度处理器,补充了由参数和生成配置构建的默认置信度处理器。如果传递了一个已经用参数或生成配置创建的置信度处理器,则会抛出错误。本特性适用于高级用户。默认值:
None
。streamer (TextStreamer) - 生成器使用的streamer。
seed (int) - 样本中使用的随机种子。
kwargs - generate_config 的特定参数化和(或)其他特定于模型的kwargs,这些kwargs将被转发给模型的 forward 函数。受支持的 generate_config 关键字可以在[GenerationConfig]的文档中检查。主要使用到的关键词如下:
max_length (int) - 生成词元的最大长度。对应于输入提示符的长度+ max_new_tokens 。如果之前设置了 max_new_tokens ,则将其效果覆盖。
max_new_tokens (int) - 要生成的最大词元数,忽略提示符中的词元数。
min_length (int) - 要生成的序列的最小长度。对应于输入提示符的长度+ min_new_tokens 。如果之前设置了 min_new_tokens ,则将其效果覆盖。
min_new_tokens (int) - 要生成的最小词元数,忽略提示符中的词元数。
do_sample (bool) - 是否对候选索引进行采样。如果将其设置为
True
,则启用抽样;如果设置为False
,则禁用抽样,相当于top-k 1。如果将其设置为None
,则遵循模型配置中的设置。top_k (int) - 确定top-k数字词元索引作为候选。这个参数取值应该为正数。如果将其设置为
None
,则遵循模型配置中的设置。top_p (float) - top-p下面的候选词元索引的累积概率,将被选择为候选索引。top-p的有效值在(0,1]之间。如果该值大于1,表示启用top-k算法。如果将其设置为
None
,则遵循模型配置中的设置。eos_token_id (int) - 句子结束的词元索引。如果设置为None,则遵循模型配置中的设置。
pad_token_id (int) - 填充的词元索引。如果设置为None,则遵循模型配置中的设置。
repetition_penalty (float) - 生成单词频率的惩罚因子。如果将其设置为1,则不启用 repeat_penalty 。如果将其设置为
None
,则遵循模型配置中的设置。默认值:None
。num_beams (int) - 用于束搜寻的束的数量。1表示不使用束搜寻。如果大于1,则 do_sample 将被设置为
False
。
- 返回:
生成的一个词元索引列表。
样例:
>>> from mindformers import LlamaForCausalLM, LlamaTokenizer >>> import mindspore as ms >>> ms.set_context(mode=0) >>> llama = LlamaForCausalLM.from_pretrained("llama2_7b") >>> tokenizer = LlamaTokenizer.from_pretrained("llama2_7b") >>> words = "translate the English to the Romanian: UN Chief Says There Is No Military Solution in Syria" >>> words = tokenizer(words, max_length=21, padding='max_length')['input_ids'] >>> output = llama.generate(words, do_sample=True) >>> output = tokenizer.decode(output[0], skip_special_tokens=True) >>> print(output) UN Chief Says There Is No Military Solution in Syria The United Nations Secretary-General, Ban Ki-moon, said that there is no military solution in Syria, calling on the international community >>> # Enable the top-p sampling >>> output = llama.generate(words, do_sample=True, top_p=0.4) >>> output = tokenizer.decode(output[0], skip_special_tokens=True) >>> print(output) UN Chief Says There Is No Military Solution in Syria UN Chief Says There Is No Military Solution in Syria. >>> # Enable the top-k sampling. >>> output = llama.generate(words, do_sample=True, top_k=10, top_p=1) >>> output = tokenizer.decode(output[0], skip_special_tokens=True) >>> print(output) Translation by: Adela Popa English Text: UN chief warns Syria conflict threatens entire region >>> from mindformers import LlamaForCausalLM, LlamaTokenizer >>> llama = LlamaForCausalLM.from_pretrained("llama2_7b") >>> tokenizer = LlamaTokenizer.from_pretrained("llama2_7b") >>> words = "translate the English to the Romanian: UN Chief Says There Is No Military Solution in Syria" >>> words = tokenizer(words, max_length=21, padding='max_length')['input_ids'] >>> output = llama.generate(words, num_beams=3) >>> output = tokenizer.decode(output[0], skip_special_tokens=True) >>> print(output) UN Chief Says There Is No Military Solution in Syria UN Chief Says There Is No Military Solution in Syria.
- infer(input_ids: Union[List[int], List[List[int]]], valid_length_each_example: np.ndarray, generation_config: GenerationConfig = None, logits_processor: Optional[LogitsProcessorList] = None, logits_warper: Optional[LogitsProcessorList] = None, block_tables: Optional[Tensor] = None, slot_mapping: Optional[Tensor] = None, prefill: bool = True, is_finished: List[bool] = None, encoder_mask: Optional[Tensor] = None, encoder_output: Optional[Tensor] = None, target_mask: Optional[Tensor] = None, **model_kwargs)[源代码]
用于对下一个位置做推断并返回其置信度,可以选择来用做预填充或解码预测。
- 参数:
input_ids (List(List(int))) - 填充(Padding)后的输入索引。
valid_length_each_example (np.ndarray) - 除填充外的有效输入长度。
generation_config (GenerationConfig) - 用生成配置来对生成调用进行基本参数化。
logits_processor (LogitsProcessorList, 可选) - [LogitsProcessorList]的一个实例。这是由继承自[LogitsProcessor]类的实例组成的一个列表,用于在每一步生成过程中修改语言模型头部的预测得分。默认值:
None
。logits_warper (LogitsProcessorList, 可选) - [LogitsProcessorList]的一个实例。这是一个由继承自[LogitsWarper]类的实例组成的列表,用于在每一步生成过程中的多项式采样之前,调整语言模型头部的预测得分分布。默认值:
None
。block_tables (Tensor) - 页面注意力的参数。
slot_mapping (Tensor) - 页面注意力的参数。
prefill (bool) - 选择是进行预填充预测还是解码预测。
is_finished (List(bool)) - 选择每个序列是否完成了生成。
encoder_mask (Tensor) - 用于编码器-解码器结构,对于纯解码器结构则不需要。
encoder_output (Tensor) - 用于编码器-解码器结构,对于纯解码器结构则不需要。
target_mask (Tensor) - 用于编码器-解码器结构,对于纯解码器结构则不需要。
- 返回:
两个参数,next_token 表示生成的下一个词元,is_finished 表示当前批次是否完成了序列生成任务。
- postprocess(input_ids, is_finished, res, generation_config: GenerationConfig, valid_length_each_example, current_index: Optional[Union[List[int], List[List[int]]]], logits_processor: Optional[LogitsProcessorList] = None, logits_warper: Optional[LogitsProcessorList] = None, need_gather_logits: bool = True)[源代码]
模型生成输出的后处理。
- 参数:
input_ids (List(List(int))) - 填充(Padding)后的输入索引。
res (List(List(int))) - 推断后的置信度。
is_finished (List(bool)) - 记录每个序列是否完成其生成。
generation_config (GenerationConfig) - 生成配置用作生成调用的基本参数化。
valid_length_each_example (np.ndarray) - 除填充外的有效输入长度。
current_index (List(int)) - 序列的当前索引。
logits_processor (LogitsProcessorList, 可选) - [LogitsProcessorList]的一个实例。这是由继承自[LogitsProcessor]类的实例组成的一个列表,用于在每一步生成过程中修改语言模型头部的预测得分。默认值:
None
。logits_warper (LogitsProcessorList, 可选) - [LogitsProcessorList]的一个实例。这是一个由继承自[LogitsWarper]类的实例组成的列表,用于在每一步生成过程中的多项式采样之前,调整语言模型头部的预测得分分布。默认值:
None
。need_gather_logits (bool) - 在解码预测且为第一次迭代时是否收集结果,设置为True。
- 返回:
四个参数,target_list 表示本次处理的目标列表,next_probs_cache 和 next_logits_cache 分别用作存储置信度和文本输出概率的缓存,is_finished 表示当前批次是否完成了序列生成任务。