Text Generator
Mindformers大模型套件提供了text generator方法,旨在让用户能够便捷地使用生成类语言模型进行文本生成任务,包括但不限于解答问题、填充不完整文本或翻译源语言到目标语言等。
当前该方法支持Minformers大模型套件中6个生成类语言模型
Text Generator支持度表
增量推理
Mindformers大模型套件的text generator方法支持增量推理逻辑,该逻辑旨在加快用户在调用text generator方法进行文本生成时的文本生成速度。
在此提供使用高阶接口进行各模型增量推理的测试样例脚本:
# mindspore设置图模式和环境
import mindspore; mindspore.set_context(mode=0, device_id=0)
from mindformers import AutoConfig, AutoModel, AutoTokenizer
# 按需设置模型类型名,高阶接口将根据类型名实例化相应模型
model_type = "glm_6b"
# 按需设置测试的输入文本
input_text = "中国的首都是哪个城市?"
# 获取模型默认配置项并按需修改
config = AutoConfig.from_pretrained(model_type)
# use_past设置为True时为增量推理,反之为自回归推理
config.use_past = True
# 修改batch_size和模型seq_length
config.batch_size = 1; config.seq_length=512
# 根据配置项实例化模型
model = AutoModel.from_config(config)
# 实例化tokenizer
tokenizer = AutoTokenizer.from_pretrained(model_type)
# 对输入进行tokenizer编码
input_ids = tokenizer(input_text)["input_ids"]
# 调用model.generate接口执行增量推理
output = model.generate(input_ids, max_length=128, do_sample=False)
# 解码并打印输出
print(tokenizer.decode(output))
注:
- 首次调用generate时需要进行mindspore图编译,耗时较长;在统计在线推理的文本生成速度时,可以多次重复调用并排除首次调用的执行时间
- 使用增量推理(use_past=True)时的生成速度预期快于自回归推理(use_past=False)
Batch推理
text generator方法也支持同时对多个输入样本进行batch推理;在单batch推理算力不足的情况下,多batch推理能够提升推理时的吞吐率
以下给出测试batch推理能力的标准测试脚本,仅上述增量推理测试脚本仅有少数区别
import mindspore;mindspore.set_context(mode=0, device_id=0)
from mindformers import AutoConfig, AutoModel, AutoTokenizer
model_type = "glm_6b"
# 多batch输入文本
input_text = [
"中国的首都是哪个城市?",
"你好",
"请介绍一下华为",
"I love Beijing, because"
]
# 是否使用增量推理
use_past = True
# 预设模型seq_length
seq_len = 512
config = AutoConfig.from_pretrained(model_type)
# 将batch size修改为输入的样本数
config.batch_size = len(input_text)
config.use_past = use_past
config.seq_length = seq_len
model = AutoModel.from_config(config)
tokenizer = AutoTokenizer.from_pretrained(model_type)
# 对输入batch进行pad
input_ids = tokenizer(input_text, max_length=config.seq_length, padding="max_length")["input_ids"]
output = model.generate(input_ids, max_length=128, do_sample=False)
print(tokenizer.decode(output))
注: batch推理的推理吞吐率提升表现与设备计算负荷相关;在seq_len较短并开启增量推理的情况下,计算负荷较小,使用batch推理通常会获得较好的提升
流式推理
Mindformers大模型套件提供Streamer类,旨在用户在调用text generator方法进行文本生成时能够实时看到生成的每一个词,而不必等待所有结果均生成结束。
实例化streamer并向text generator方法传入该实例:
from mindformers import AutoModel, AutoTokenizer, TextStreamer
tok = AutoTokenizer.from_pretrained("gpt2")
model = AutoModel.from_pretrained("gpt2")
inputs = tok(["An increasing sequence: one,"], return_tensors=None, add_special_tokens=False)
streamer = TextStreamer(tok)
_ = model.generate(inputs["input_ids"], streamer=streamer, max_length=20, top_k=1)
# 'An increasing sequence: one, two, three, four, five, six, seven, eight, nine, ten, eleven,'
上述脚本不再对输出文本进行统一解码打印,而是每生成一个中间结果就由streamer实时打印
分布式推理
说明: 由于MindSpore版本问题,分布式推理仅支持MindSpore 2.0及以上版本,且暂不支持流水并行推理模式。