怎样把DeepSeek V4转为ONNX格式_跨平台推理与DirectML加速【ONNX】

风墨酱_3644

风墨酱_3644

2026-05-04

232人浏览

原创

DeepSeek V4导出ONNX需绕过官方封装,可通过四种路径实现:一、Hugging Face标准导出(需transformers≥4.45.2);二、手动建模+权重注入;三、ONNX Graph Surgeon图修复;四、DeepSeek官方export工具链(v4.1+)。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

怎样把deepseek v4转为onnx格式_跨平台推理与directml加速【onnx】

如果您拥有 DeepSeek V4 模型并希望将其导出为 ONNX 格式以支持跨平台推理(包括 Windows DirectML 加速),则需绕过官方未直接开放的 PyTorch 原生权重封装方式,通过模型结构重建与权重加载机制完成导出。以下是实现此目标的多种可行路径:

一、基于 Hugging Face Transformers + torch.onnx.export 的标准导出

该方法适用于 DeepSeek V4 已被社区适配至 transformers 库(如通过 transformers>=4.45.0 及对应 modeling_deepseek 模块),可复用标准导出接口,兼容 DirectML Runtime 的 ONNX 输入约束(如要求所有张量维度静态或声明 dynamic_axes)。

1、安装适配版本:执行 pip install transformers==4.45.2 accelerate onnx onnxruntime-directml,确保包含 DirectML 后端支持。

2、加载模型与分词器:使用 AutoModelForCausalLM.from_pretrained("deepseek-ai/DeepSeek-V4") 加载模型,并设置 torch_dtype=torch.float32(DirectML 当前不支持 FP16 输入)。

3、构造示例输入:生成 shape 为 (1, 256) 的 input_ids 张量及对应 attention_mask,调用 model.prepare_inputs_for_generation() 获取完整 forward 所需参数。

4、执行导出:调用 torch.onnx.export(),指定 opset_version=18(DirectML 要求 ≥17),并显式声明 dynamic_axes={"input_ids": {0: "batch", 1: "seq"}, "attention_mask": {0: "batch", 1: "seq"}}。

二、手动构建模型图并绑定权重的底层导出

当 transformers 未提供 DeepSeek V4 官方支持时,需依据公开架构文档(如 RoPE 配置、Qwen-style RMSNorm、GQA 分组查询注意力)手动实现模型类,再注入已知权重文件(如 safetensors 格式的 model.safetensors),从而获得可控的计算图导出入口。

1、解析权重文件:使用 safetensors.torch.load_file("model.safetensors") 加载全部参数,按命名规则映射至自定义模块(如 self.q_proj.weight → q_proj.weight)。

2、禁用梯度与启用 eval 模式:执行 model.eval().requires_grad_(False),确保导出图不含训练相关节点(如 Dropout)。

3、定义 dummy_input:构造 torch.randint(0, 32000, (1, 128)) 作为 input_ids,并同步生成 position_ids 和 attention_mask,满足 RotaryEmbedding 输入要求。

4、导出时启用 tracing:使用 torch.jit.trace(model, (input_ids, position_ids, attention_mask)) 获取 ScriptModule,再传入 torch.onnx.export() 进行转换。

Analyze Video By Qwen Free
Analyze Video By Qwen Free

Qwen 视频智能分析基础客户端(免费版),基于 Qwen 3.5 Plus 多模态模型对本地视频进行内容分析,支持场景描述与基础内容理解,采用默认抽帧频率和提示词,适合快速概览视频,API Key 读取自 ~/.skill-platform/skill-platform.json 的 skills 配置。

下载

三、通过 ONNX Graph Surgeon 修改已有 ONNX 模型以适配 DirectML

若已存在非 DirectML 兼容的 ONNX 模型(例如含 unsupported op: 'SoftmaxCrossEntropyLoss' 或动态 batch 维度未对齐),可利用 onnx-graphsurgeon 工具进行图级修复,避免重新导出耗时过程。

1、加载原始 ONNX 模型:使用 gs.import_onnx(onnx.load("deepseek_v4_raw.onnx")) 构建可编辑计算图。

2、替换不支持算子:定位所有 LayerNormalization 节点,将其替换为 ReduceMean + Sub + Pow + ReduceMean + Add + Sqrt + Div 等等效子图(DirectML 对原生 LayerNorm 支持有限)。

3、固定输入维度:将 input_ids 的第一个维度由 -1 改为 1,并在 model.graph.input[0].type.tensor_type.shape.dim[0].dim_value = 1 中显式赋值。

4、保存修复后模型:执行 onnx.save(gs.export_onnx(graph), "deepseek_v4_directml.onnx"),验证输出节点名与 shape 是否匹配预期。

四、使用 DeepSeek 官方 export 工具链(v4.1+ SDK 内置)

DeepSeek 自 v4.1 版本起在 deepseek-export CLI 工具中集成 ONNX 导出通道,该工具自动处理 RoPE 编码位置偏移、KV Cache 初始化逻辑及 FlashAttention 替换策略,输出模型默认启用 --use-directml-compatible 标志。

1、安装专用工具:运行 pip install deepseek-export==4.1.3,确认其依赖项包含 onnx==1.16.0 与 onnxruntime-directml==1.19.0。

2、准备配置文件:创建 export_config.json,指定 "model_path": "./deepseek-v4-checkpoint"、"max_seq_len": 2048、"dtype": "fp32"。

3、触发导出命令:执行 deepseek-export onnx --config export_config.json --output deepseek_v4_dm.onnx,工具将自动插入 IOBinding 兼容占位符节点。

4、校验模型属性:使用 onnxruntime.DirectSession("deepseek_v4_dm.onnx") 初始化会话,检查是否报错 "No provider available for node type"。

相关文章

AI工具
AI工具

AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型,支持联网搜索。

下载

相关标签:

deepseek qwen

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

3489

3

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

2023.07.25

2408

9

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

2023.08.02

1340

5

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.09

1298

4

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

2023.09.05

1396

5

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2298

7

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

2023.09.20

3780

8

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

2023.09.22

17635

6

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

549

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
零基础精通 PS 视频教程
零基础精通 PS 视频教程

共268课时 | 120.3万人学习

前端工程师必备技能—PS切图
前端工程师必备技能—PS切图

共11课时 | 2.2万人学习

麦子学院Photoshop切片视频教程
麦子学院Photoshop切片视频教程

共13课时 | 4.3万人学习