课程总结
本次课程内容包括模型推理和优化。推理代码使用了经过蒸馏优化的中小型LLM(DeepSeek-R1-Distill-Qwen-1.5B-FP16),通过MindNLP库加载模型和分词器,构建符合格式的对话输入,利用流式生成和多线程实现实时交互,最终在命令行中提供了一个简单的对话界面。模型的优势是运行高效(1.5B参数+FP16精度),适合在普通硬件上快速部署和使用。优化代码是基于 MindSpore 框架对大模型推理过程进行编译优化配置,可以提高模型推理的速度和性能。
一、模型推理
模型基本信息:DeepSeek-R1-Distill-Qwen-1.5B-FP16
模型类型:这是一个因果语言模型(Causal Language Model, CausalLM),核心能力是基于输入文本生成后续内容(如对话回复、文本续写等),是大语言模型(LLM)的一种。
通过MindNLP库加载模型,并实现交互式对话。以下是核心步骤:
-
模型与分词器加载:
- 分词器(Tokenizer):负责将自然语言(如用户输入的中文/英文)转换为模型能处理的数字序列(token ID),同时在生成后将数字序列转回文本。
- 模型(AutoModelForCausalLM):加载预训练的生成模型,包含模型的所有神经网络结构和权重,是生成回复的核心计算单元。
-
对话历史构建:
- 按照大语言模型的对话格式(包含"system"(系统提示)、“user”(用户)、“assistant”(助手)三种角色),将历史对话和当前输入组装成模型可理解的输入结构。
- 系统提示
"你是一个智能聊天机器人,以最简单的方式回答用户问题"定义了模型的行为(简洁回答)。
-
模型生成(推理)过程:
- 核心是调用
model.generate(...)方法,模型基于输入的对话历史,按概率生成合理的回复。 - 为了提升交互体验,使用
TextIteratorStreamer和多线程(Thread)实现流式输出(像人打字一样逐字显示回复,而非等待全部生成后一次性输出)。
- 核心是调用
-
命令行交互:
最后通过循环实现命令行对话,支持:- 输入文本获取模型回复;
- 输入
clear清空对话历史和屏幕; - 输入
stop终止程序。
二、模型优化
教程代码使用jit即时编译方法,将Python函数修饰成计算图,通过图优化等技术,提高运算性能。具体配置说明如下:
-
库导入
导入了 MindSpore 核心库、MindNLP 提供的 transformer 模型工具(分词器、模型类、静态缓存等),以及用于性能评估的time和numpy。 -
MindSpore 上下文配置
enable_graph_kernel=True:启用图算融合优化,MindSpore 会自动分析计算图中的算子,将可融合的操作(如连续的加减乘除、激活函数等)合并为一个更高效的复合算子,减少算子间的数据传输开销,提升计算效率。mode=mindspore.GRAPH_MODE:启用静态图模式(GRAPH_MODE),MindSpore 会先将模型代码编译为完整的计算图,再进行执行。相比动态图模式(PYNATIVE_MODE),静态图能进行更全局的优化(如算子融合、内存复用),更适合高性能推理场景。jit_config={"jit_level": "O2"}:设置 JIT(即时编译)优化级别为 O2。O2 是较高的优化级别,MindSpore 会进行包括循环展开、常量折叠、死代码消除、算子融合等深度优化,进一步减少运行时的冗余计算,提升执行速度。
心得体会
在研究 MindSpore 的 JIT 编译技术以优化 DeepSeek-R1-Distill-Qwen-1.5B 模型推理的过程中,我对模型性能调优有了更深入的理解。最初,我误以为模型推理速度主要由模型架构和硬件性能决定,而忽视了编译优化这一重要环节。然而,在实际操作中,我发现开启 JIT 编译后,MindSpore 能够动态优化模型的计算图,将重复的计算操作进行合并或提前预处理,从而显著减少了单次推理的时间开销。