当前位置: 首页 > ai >正文

昇思+昇腾开发板+DeepSeek模型推理和性能优化

昇思+昇腾开发板+DeepSeek模型推理和性能优化

模型推理

流程: 权重加载 -> 启动推理 -> 效果比较与调优 -> 性能测试 -> 性能优化
权重加载
如微调章节介绍,最终的模型包含两部分:base model 和 LoRA adapter,其中base model的权重在微调时被冻结,推理时加载原权重即可,LoRA adapter可通过PeftModel.from_pretrained进行加载。

### 加载基础模型
model = AutoModelForCausalLM.from_pretrained("MindSpore-Lab/DeepSeek-R1-Distill-Qwen-1.5B-FP16", mirror="modelers", ms_dtype=mindspore.float16)
### 加载LoRA adapter
model = PeftModel.from_pretrained(model, "./output/adapter_model_for_demo") # adapter_model path
## 启动推理
通过model.generate,启动推理。generate_kwargs = dict(input_ids=input_ids,streamer=streamer,max_new_tokens=1024,do_sample=True,top_p=0.9,temperature=0.1,num_beams=1,
)
## 使用线程启动生成
t = Thread(target=model.generate, kwargs=generate_kwargs)
'''

效果比较

演示中以一个微调多轮后的LoRA权重为例,在微调前(不加载LoRA adapter),在问模型“你是谁”时,回答的是 "DeepSeek-R1”,而在加载LoRA adapter之后,回答为“甄嬛”。
微调前:

问: 你是谁?
答: 您好!我是由中国的深度求索(DeepSeek)公司开发的智能助手DeepSeek-R1。如您有任何任何问题或需要帮助,我会尽我所能为您提供帮助。

微调后:

问: 你是谁?
答: 我是甄嬛,家父是大理寺少卿甄远道。

效果调优

在进行长文本输出的过程当中,输出回答到一定长度后模型会输出重复内容,如下图所示,可在generate_kwargs中添加 repetition_penalty=1.2,解决长文本输出重复问题。
调优前: 模型在生成长回复时,末尾出现大量重复语句。
调优后: 通过设置 repetition_penalty,模型能够生成逻辑连贯且不重复的长篇回复。

性能测试

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

export INFERENCE_TIME_RECORD=True

此时,从终端的运行日志可以看到,平均推理时间为0.727秒,可通过禁用多线程将推理速度适当提升为平均单token推理时长0.674秒。
操作: 在脚本中添加禁用多线程代码

from mindspore._c_expression import disable_multi_thread
disable_multi_thread()

性能优化

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

前序准备

实现解码逻辑(decode函数、prefill-decode阶段)。
实例化StaticCache,动态Cache无法成图。
添加jit装饰器
设置O2整图下沉进一步优化。
调用 model.jit()。
使用 mindspore.jit 装饰器修饰decode函数。

#### 1. 设置上下文
mindspore.set_context(enable_graph_kernel=True, mode=mindspore.GRAPH_MODE, jit_config={"jit_level": "02"})#### ... 模型加载 ...
#### 2. 编译模型
model.jit()#### 3. jit装饰器修饰解码函数
@mindspore.jit(jit_config=mindspore.JitConfig(jit_syntax_level='STRICT'))
def decode_one_tokens_logits(model, cur_token, input_pos, cache_position, past_key_values):logits = model(...)return logits

Top_p函数的实现

出于效率的考虑,优先使用numpy进行函数的实现。
而在gather函数的实现上,基于mindspore.mint的实现方式会出现报错,故使用mindspore.ops来实现。
modeling_qwen2.py的decoder_layer中,需添加_modules.values()
为了在静态图模式下能正确遍历网络层,需要修改循环方式。

原代码
for decoder_layer in self.layers:
修改后
for decoder_layer in self.layers._modules.values():

modeling_qwen2.py原RotaryEmbedding在静态图编译会出现报错

需要参考modeling_llama.py将该类进行重写。相关pr已经合入mindnlp的0.4分支。

性能优化效果测试

推理时间测试代码
##### 自回归生成循环
cache_position = mindspore.tensor([seq_length + 1])
for i in range(1, NUM_TOKENS_TO_GENERATE):s = time.time()next_token = decode_one_tokens(model, next_token, None, cache_position, past_key_values)generated_ids[:, cache_position] = next_token.int()cache_position += 1t = time.time()print("[%d]: %s" % (i, t-s)) # 打印单步生成耗时

不使用jit优化,每个token推理时间约为1.1秒。
使用jit优化,每个token推理时间约为0.32秒,效率显著提高。
但是在推理首个token前需要对全图进行编译,故首token推理时间较长。在推理token数量较多时,使用JIT优化对效率提升效果更明显。

http://www.xdnf.cn/news/17087.html

相关文章:

  • 自己本地搭建的服务器怎么接公网?公网IP直连服务器方法,和只有内网IP直接映射到互联网
  • 线性代数中矩阵的基本运算运算
  • 哲学中的主体性:历史演进、理论范式与当代重构
  • FLAN-T5:大规模指令微调的统一语言模型框架
  • python-自定义抠图
  • OpenSpeedy绿色免费版下载,提升下载速度,网盘下载速度等游戏变速工具
  • Datawhale AI夏令营 第三期 task2 稍微改进
  • MyBatis实现SQL
  • Python日志记录库——logaid
  • Centos-Stream 10 安装教程(2025版图文教程)
  • ASP3605I同步降压调节器的高频化设计与多相扩展技术优化方案
  • Python 函数详解
  • 重生之我在暑假学习微服务第十天《网关篇》
  • 微软Dragon Ambient eXperience (DAX) 深度解析
  • 《UE教程》第一章第六回——迁移独立项目(资源)
  • 【学习嵌入式day-17-数据结构-单向链表/双向链表】
  • 【计算机网络】6应用层
  • 深度学习·基础知识
  • selenium自动化收集资料
  • 从汇编角度揭秘C++构造函数(1)
  • 【深度学习新浪潮】混元3D是什么产品?
  • 2025《艾诺提亚失落之歌》逆向工程解包尝试
  • 【模电笔记】—— 直流稳压电源——整流、滤波电路
  • 二叉树——堆及其实现
  • 防御保护07-08
  • 三种灰狼算法求解无人机三维路径规划【MATLAB实现】
  • Android AppSearch 深度解析:现代应用搜索架构与实践
  • 论文阅读笔记:《Curriculum Coarse-to-Fine Selection for High-IPC Dataset Distillation》
  • 《算法导论》第 4 章 - 分治策略
  • uniapp云打包打包安卓app失败,显示:本地安装包生成失败,请重试或者切换到非安心打包模式进行打包