昇思+昇腾开发板+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.pswp.cn/bicheng/92832.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92832.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/92832.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

未给任务“Fody.WeavingTask”的必需参数“IntermediateDir”赋值。 WpfTreeView

c#专栏记录: 报错 未给任务“Fody.WeavingTask”的必需参数“IntermediateDir”赋值。 WpfTreeView 生成 解决办法 清理和重新生成项目 完成上述配置后,尝试执行以下步骤: 清理项目:删除 bin 和 obj 文件夹。 重新生成项目&…

[Linux]学习笔记系列 -- [arm][lib]

文章目录arch/arm/lib/delay.cregister_current_timer_delay 注册当前定时器延迟read_current_timer 读取当前定时器drivers/clocksource/timer-stm32.cstm32_clocksource_init STM32 平台上初始化时钟源https://github.com/wdfk-prog/linux-study arch/arm/lib/delay.c regis…

harbor仓库搭建(配置https)

目录 1. 环境准备 2. 配置https的原因 3. 生成ca证书 4. 搭建harbor仓库 5. 访问harbor 6. 修改加密算法 1. 环境准备 需要提前安装docker和docker-compose,harbor仓库版本越新,对应的docker和docker-compose版本越新。 主机IP192.168.48.19dock…

C++多线程服务器

C多线程服务器 因为自己同时在看多本书,之前看过《TCP/IP 网络编程》一书,其中有一个自己编写一个多线程服务器的例子,于是就把代码直接抄了一变。 在学习网络编程前需要先了解网络的7层模型。 具体代码如下: 服务器端&#xff1a…

【Pandas】常用数据处理技巧

一. 数据读取 1.pd.to_csv & pd.read_csv 细节: 1.pd.read_csv 需要 ignore_index True or ,index_col0 否则会有列Unnamed0 2.pickle具有更快的读取速度,与更小的体积。 读取前N行(若不需获取所有数据) pd.read_csv(…

Docker Compose 部署高可用 MongoDB 副本集集群(含 Keepalived + HAProxy 负载均衡)

Docker Compose 部署高可用 MongoDB 副本集集群(含 Keepalived HAProxy 负载均衡)背景与目标📋 环境规划**服务器信息****软件版本**部署步骤1. 创建目录结构2、生成 keyFile(三台机器内容必须一致)3. 准备 Keepalive…

MySQL(189)如何分析MySQL的锁等待问题?

分析MySQL的锁等待问题有助于发现和解决数据库性能瓶颈。锁等待问题通常会导致数据库响应时间变长,影响系统的整体性能。以下是详细深入的方法和代码示例,帮助你分析和解决MySQL的锁等待问题。 一、锁的类型和概念 在MySQL中,主要有以下几种锁…

26.Scikit-learn实战:机器学习的工具箱

Scikit-learn实战:机器学习的工具箱 🎯 前言:机器学习界的"宜家家具" 还记得第一次逛宜家的感受吗?琳琅满目的家具,每一件都有详细的说明书,组装简单,样式统一,关键是—…

wordpress文章摘要调用的3种方法

以下是WordPress文章摘要的3种调用方法: 1. 使用the_excerpt()函数 这是WordPress自带的函数,用于调用文章摘要。如果文章有手动填写的摘要,则会显示手动摘要;如果没有手动摘要,WordPress会自动从文章内容中提取前55个单词作为摘…

java excel转图片常用的几种方法

十分想念顺店杂可。。。在 Java 中实现 Excel 转图片,常用的方法主要分为两类:使用商业库(简单高效但可能收费)和使用开源库组合(免费但实现复杂)。以下是几种常用方案及实现思路:一、使用商业库…

QT项目 -仿QQ音乐的音乐播放器(第五节)

目录 一、CommonPage界⾯设置和显示 二、自定义ListItemBox 三、支持hover效果 四、自定义VolumeTool 五、界面设置 六、页面创建及弹出 七、绘制三角 一、CommonPage界面设置和显示 void CommonPage::setCommonPageUI(const QString &title, const QString &imag…

wstool和git submodule优劣势对比

wstool 和 git submodule 都可以用来管理项目中的外部源代码依赖,但它们的设计理念、工作流程和适用场景有很大不同。 我们来深入对比一下它们的优势和劣势。 核心理念比喻 git submodule:像是在你的汽车设计图纸中,直接嵌入了另一家公司&…

六、RuoYi-Cloud-Plus OSS文件上传配置

1.前面我们完成了RuoYi-Cloud-Plus 部署及启动,此刻已经可以正常访问。 前面文章的专栏内容在这,感兴趣可以看看。 https://blog.csdn.net/weixin_42868605/category_13023920.html 2.但现在虽然已经启动成功,但有很多功能我们依旧用不了&a…

达梦数据库日常运维命令

查询数据库表空间数据文件使用大小限制DECLARE K INT:(SELECT cast(PAGE()/1024 as varchar)); BEGIN SELECTF."PATH" 数据文件 ,F.CLIENT_PATH,G.NAME 所属表空间,F.MAX_SIZE||M 文件扩展限制,(CASE F.AUTO_EXTEND WHEN 1 THEN 是 ELSE 否 END) 文件…

使用线性降维方法进行数据降维

在数据科学与机器学习的领域中,维度灾难问题经常导致模型的性能下降。线性降维方法是一种常见的技术,用于在保留尽可能多的原始数据特征的同时,减少数据集的维度。这些方法通过将高维数据映射到低维空间来减少特征数量,从而加速模…

OpenCV图像裁剪与 ROI 操作

在图像处理领域,ROI(Region of Interest)区域感兴趣操作是非常基础而重要的一环。无论是进行目标检测、图像分割,还是简单的图像处理,都离不开对图像某一区域的选取与处理。本文将结合 OpenCV 的 C 接口,详…

关于AI应用案例计算机视觉、自然语言处理、推荐系统和生成式AI四大领域的详细技术分析。

一、计算机视觉应用:实时物体检测 案例描述:使用YOLOv8模型实现实时物体检测系统,应用于安防监控场景。 1. 代码示例(Python) python from ultralytics import YOLO import cv2# 加载预训练模型 model YOLO("…

各个网络层拥有的协议简写

OSI 七层模型(从下到上分别为物理层、数据链路层、网络层、传输层、会话层、表示层、应用层)是网络通信的经典理论框架,每层都有其核心功能和对应的协议。以下是各层的主要协议列举:1. 物理层(Physical Layer&#xff…

django基于Python的设计师作品平台的数据可视化系统设计与实现

django基于Python的设计师作品平台的数据可视化系统设计与实现

等保测评-RabbitMQ中间件

RabbitMQ-docker部署查看版本:rabbitmqctl version、rabbitmqctl status | grep version配置文件:一般为rabbitmq.conf端口号:一般为15672一、身份鉴别a)应对登录的用户进行身份标识和鉴别,身份标识具有唯一性&#xf…