昇思学习营第七期·昇腾开发板学习打卡_第03次

DeepSeek-R1-Distill-Qwen-1.5B 模型推理

在进行了这一章的学习后,我们学会了如何对模型进行推理。

在前两章的基础上,我们学习了环境的配置和lora的微调训练,我们来进行推理。

首先是权重的加载:

这个是用了lora微调之后的模型,来看一下效果对比:

可以看到效果非常明显了。

效果调优

在进行长文本输出的过程当中,输出回答到一定长度后模型会输出重复内容,如下图所示,可在generate_kwargs中添加repetition_penalty=1.2,解决长文本输出重复问题

对性能做一下测试:

凡是在推理过程中涉及采样(do_sample=True)的案例,可以通过配置如下变量,注释掉之前添加的同步模式代码,再运行代码,即可获取每个token的推理时长和平均时长:

export INFERENCE_TIME_RECORD=True

对新能做一下优化:

通过上述禁用多线程的方式,可以适当减少平均单token的推理时长,但效果不明显。在此基础上,还可以通过jit即时编译的方式进一步加速jit即时编译通过jit修饰器修饰Python函数或者Python类的成员函数使其被编译成计算图,通过图优化等技术提高运行速度。在本章节的场景下,jit修饰器应该修饰模型decode的函数,但由于原代码将模型的logits计算、解码等过程整体封装成了一个model.generate函数,不好进行优化,所以需要手动实现解码逻辑。

其中主要的思想是:

添加jit装饰器
  • 设置O2整图下沉进一步优化
  • model.jit()
  • mindspore.jit装饰decode函数
优化效果:

性能优化-经验分享:
  • Top_p函数的实现 出于效率的考虑,优先使用numpy进行函数的实现 而在gather函数的实现上,基于mindspore.mint的实现方式会出现报错,故使用mindspore.ops来实现。
  • modeling_qwen2.py的decoder_layer中,需添加_modules.values()

实操推理:

设置prompt:

进行对话:

jit优化实操:

开启O2级别的jit优化,开启图算融合:

设置prompts:

完成每一步时间推理计算: