diff --git a/docs/mindspore/source_zh_cn/mindformers/usage/inference.md b/docs/mindspore/source_zh_cn/mindformers/usage/inference.md index 049d917358d72d55b1896baedb8f6679717b937e..55f57fe970cbf2f1c4ca142562a5b62d15d0aa61 100644 --- a/docs/mindspore/source_zh_cn/mindformers/usage/inference.md +++ b/docs/mindspore/source_zh_cn/mindformers/usage/inference.md @@ -1,3 +1,147 @@ # 推理 -[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/mindformers/usage/inference.md) \ No newline at end of file +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/mindformers/usage/inference.md) + +## 概述 + +MindFormers 提供了大模型推理能力,可以借助高级接口pipeline实现推理或者直接用run_mindformer脚本直接启动推理。在推理模式下,pipeline 接口可以帮助用户轻松地设置和执行模型推理任务。pipeline 接口简化了从数据准备到模型推理的整体流程。模块化设计允许用户通过配置文件或编程接口定义数据处理和推理的各个阶段,并且用户可以根据自己的需求定制数据处理逻辑和推理策略。此外,MindFormers 利用 MindSpore 的性能优势,提供高效的计算和数据处理能力。 + +目前 MindFormers 文本生成推理支持的特性如下表, + +|特性|作用| +|:-----|:------| +|[增量推理](#基于-pipeline-接口推理)|加快用户在调用 text_generator 方法进行自回归文本生成时的文本生成速度,在yaml文件中默认配置use_past=True,开启增量推理| +|[Batch推理](#基于-pipeline-接口推理)|支持同时多个样本输入进行batch推理,在单batch推理算力不足的情况下,多batch推理能够提升推理时的吞吐率| +|[流式推理](#基于-pipeline-接口推理)|提供Streamer类,用户在调用text_generator方法进行文本生成时能够实时看到生成的每一个词,而不必等待所有结果均生成结束| +|[分布式推理](#基于-run_mindformer-脚本推理)|对于无法在单卡上部署的模型,需要通过多卡分布式对模型进行切分后再推理| + +## 基本流程 + +结合实际操作,推理流程可以分解成以下步骤: + +1. **选择推理的模型:** + 根据需要的推理任务选择不同的模型,如文本生成可以选择Llama2等。 + +2. **准备模型权重:** + 从 HuggingFace 模型库中下载相应模型的权重,参考[权重转换](https://www.mindspore.cn/docs/zh-CN/master/mindformers/function/weight_conversion.html)文档转换为ckpt格式。 + +3. **执行推理任务:** + 调用 pipeline 接口或使用run_mindformer统一脚本执行推理任务。 + +## 基于 pipeline 接口推理 + +基于 pipeline 接口的自定义文本生成推理任务流程,支持单卡推理和多卡推理。关于如何使用 pipeline 接口启动任务并输出结果,可以参考以下实现方式,具体参数说明可以查看 [pipeline 接口的API文档](https://gitee.com/mindspore/mindformers/blob/dev/docs/api/api_python/mindformers.pipeline.rst)。 + +1. **脚本示例** + + ```python + from mindformers import build_context + from mindformers import AutoModel, AutoTokenizer, pipeline, TextStreamer + + # 构造输入 + inputs = ["I love Beijing, because", "LLaMA is a", "Huawei is a company that"] + + # 初始化环境 + build_context({'context': {'mode': 0}, 'parallel': {}, 'parallel_config': {}}) + + # 实例化tokenizer + tokenizer = AutoTokenizer.from_pretrained('llama2_7b') + + # 模型实例化 + # 修改成本地的权重路径 + model = AutoModel.from_pretrained('llama2_7b', checkpoint_name_or_path="path/to/llama2_7b.ckpt") + + # pipeline启动非流式推理任务 + text_generation_pipeline = pipeline(task="text_generation", model=model, tokenizer=tokenizer) + outputs = text_generation_pipeline(inputs, max_length=512, do_sample=False, top_k=3, top_p=1) + for output in outputs: + print(output) + + # pipeline启动流式推理任务 + streamer = TextStreamer(tokenizer) + text_generation_pipeline = pipeline(task="text_generation", model=model, tokenizer=tokenizer, streamer=streamer) + _ = text_generation_pipeline(inputs, max_length=512, do_sample=False, top_k=3, top_p=1) + ``` + +2. **执行脚本命令启动** + + 通过将示例保存到predict_custom.py中,并且修改加载权重的路径,然后直接执行predict_custom .py 脚本。 + + ```shell + python predict_custom.py + ``` + +3. **推理结果** + + 执行以上命令的推理结果如下: + + ```text + 'text_generation_text': [I love Beijing, because it is a city that is constantly constantly changing. I have been living here for ......] + 'text_generation_text': [LLaMA is a large-scale, open-source, multimodal, multilingual, multitask, and multimodal pretrained language model. It is ......] + 'text_generation_text': [Huawei is a company that has been around for a long time. ......] + ``` + +## 基于 run_mindformer 脚本推理 + +1. **脚本启动推理命令** + + 单卡推理可以直接执行[run_mindformer.py](https://gitee.com/mindspore/mindformers/blob/dev/run_mindformer.py),多卡推理需要借助 [scripts/msrun_launcher.sh](https://gitee.com/mindspore/mindformers/blob/dev/scripts/msrun_launcher.sh) 启动。以 Llama2 为例,推荐配置为[predict_llama2_7b.yaml](https://gitee.com/mindspore/mindformers/blob/dev/configs/llama2/predict_llama2_7b.yaml)文件。 + + ```shell + # 单卡推理 + python run_mindformer.py \ + --config configs/llama2/predict_llama2_7b.yaml \ + --run_mode predict \ + --use_parallel False \ + --load_checkpoint path/to/checkpoint.ckpt \ + --predict_data 'I love Beijing, because' + ``` + + ```shell + # 多卡推理 + bash scripts/msrun_launcher.sh "python run_mindformer.py \ + --config configs/llama2/predict_llama2_7b.yaml \ + --run_mode predict \ + --use_parallel True \ + --auto_trans_ckpt True \ + --load_checkpoint path/to/checkpoint.ckpt \ + --predict_data 'I love Beijing, because'" \ + 2 + ``` + + ```shell + # 多卡多batch推理 + bash scripts/msrun_launcher.sh "python run_mindformer.py \ + --config configs/llama2/predict_llama2_7b.yaml \ + --run_mode predict \ + --predict_batch_size 4 \ + --use_parallel True \ + --auto_trans_ckpt True \ + --load_checkpoint path/to/checkpoint.ckpt \ + --predict_data path/to/input_predict_data.txt" \ + 2 + ``` + + 脚本执行入参的说明列表: + |参数|参数说明| + |:---------------------------------|:-------------------------------------------------------------------------| + |config|yaml配置文件的路径| + |run_mode|运行的模式,推理设置为 predict| + |predict_batch_size|batch 推理的 batch_size大小| + |use_parallel|是否使用多卡推理| + |auto_trans_ckpt|多卡推理时需要配置为True,自动权重切分,默认值为False| + |load_checkpoint|加载的权重路径| + |predict_data|推理的输入数据,多batch推理时需要传输入数据的txt文件路径,包含多行输入| + |2|多卡推理命令中的 2 是推理时使用的卡数| + +2. **推理结果** + + 执行以上命令的推理结果如下: + + ```text + 'text_generation_text': [I love Beijing, because it is a city that is constantly constantly changing. I have been living here for ......] + ``` + +## 更多信息 + +更多关于不同模型的推理示例,请访问[MindFormers已支持模型库](https://www.mindspore.cn/docs/zh-CN/master/mindformers/start/models.html)