news 2026/9/30 5:01:13

DeepSeek-V4.1-Flash 最小推理参考实现:从权重转换、示例运行到自测的完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek-V4.1-Flash 最小推理参考实现:从权重转换、示例运行到自测的完整指南
  • 人工智能
  • 大模型
  • 多模态

【免费下载链接】DeepSeek-V4.1-Flash

DeepSeek-V4.1-Flash 是一个多模态混合专家(MoE)模型,拥有 5520 亿骨干参数,并支持最多一百万 token 的上下文长度。该模型原生支持图像和文本输入,并以自回归方式生成文本

项目地址:https://ai.gitcode.com/hf_mirrors/deepseek-ai/DeepSeek-V4.1-Flash
点击查看免费下载

本文是围绕仓库中 inference/README.md 展开的实战指南,讲解如何在本仓库的inference/目录下安装依赖、将 Hugging Face 格式权重转换为按张量并行(TP)分片的检查点、以 TXT/JSON 两种等价形式运行多模态示例、启动交互式对话以及执行模型自测。读完本文,你将掌握 DeepSeek-V4.1-Flash 参考推理栈的完整使用链路,并理解其底层架构组件(视觉编码器、压缩稀疏注意力、Engram、MoE、Hyper-Connections、DSpark)在源码中的具体落点。

概览:这是一套“可读的参考实现”,而非生产推理引擎

inference/目录提供的是一套以可读性为优先的参考实现(reference implementation),设计目标不是替代生产级 serving 引擎,而是把 DeepSeek-V4.1-Flash 的核心前向路径完整、透明地呈现出来。根据 inference/README.md 的定位,模型代码覆盖以下组件:

  • 视觉编码器与对齐器(vision encoder & aligner):将图像编码为 LLM 可消费的视觉 token;
  • 滑窗 + 压缩稀疏注意力及两级索引器(sliding-window plus compressed sparse attention with its two-level indexer):对应模型的长上下文压缩注意力机制;
  • Engram n-gram 查询(engram n-gram lookups):基于 token 的哈希式记忆查询;
  • MoE(混合专家):路由专家与共享专家的前向计算;
  • Hyper-Connections:残差流的并行多副本混合结构;
  • DSpark 前向路径(DSpark forward path):半自回归草稿生成的前向实现。

生成过程本身则是普通的自回归采样(plain autoregressive sampling),不包含生产引擎常见的批处理调度、KV cache 管理优化等服务化特性。

安装依赖

运行推理前,先在inference/目录下安装依赖:

python -m pip install -r requirements.txt

inference/requirements.txt 中声明的依赖如下,其中值得特别注意的是:

依赖版本约束说明
torch>=2.10.0深度学习框架,要求较新版本以支持 fp8/fp4 相关数据类型与算子
transformers无加载分词器(AutoTokenizer)与权重索引
tokenizers无分词器底层库
safetensors>=0.7.0安全格式的权重读写(safe_open/save_file/load_model)
numpy无数值计算
sympy无符号计算,Engram 哈希相关工具
Pillow无图像加载与预处理
tilelang==0.1.8精确锁定版本;kernel.py中的 fp8/fp4 GEMM、稀疏注意力、Sinkhorn 等算子均由 tilelang 编写
tqdm无进度条

tilelang被精确固定为0.1.8,这与 inference/kernel.py 中通过@T.prim_func定义的fp8_gemm_kernel、fp4_gemm_kernel、sparse_attn_kernel、hc_split_sinkhorn_kernel等算子强相关,升级或降级该版本可能导致算子编译失败。

转换 Hugging Face 权重:按张量并行秩分片

运行时需要为每个张量并行(tensor-parallel, TP)秩准备一个转换后的检查点文件。从inference/目录执行转换:

export HF_CKPT_PATH=/path/to/DeepSeek-V4.1-Flash-HF export SAVE_PATH=/path/to/DeepSeek-V4.1-Flash-TP8 export MP=8 python convert.py \ --hf-ckpt-path "${HF_CKPT_PATH}" \ --save-path "${SAVE_PATH}" \ --model-parallel "${MP}" \ --expert-dtype fp4 \ --tokenizer-path "${HF_CKPT_PATH}"

关键参数说明

参数必填说明
--hf-ckpt-path是原始 Hugging Face 格式检查点目录,需包含model.safetensors.index.json或*.safetensors权重文件
--save-path是转换输出目录,会生成model0-mp{MP}.safetensors~model{MP-1}-mp{MP}.safetensors共 MP 个分片
--model-parallel是张量并行度 MP;仓库模型权重按 8 路分片为model-00001-of-00048.safetensors~model-00048-of-00048.safetensors,官方示例使用MP=8
--expert-dtype否专家权重的存储精度,可选fp8或fp4,默认为fp4(对应发布模型的 E2M1 FP4 专家权重)
--tokenizer-path否存放tokenizer.json与tokenizer_config.json的目录;不传时回退到--hf-ckpt-path

源码级细节:专家数自动推断、FP4 转换与分片策略

专家数从权重名自动推断,无需手工传入。inference/convert.py 中的infer_num_experts通过正则(?:mlp|ffn)\.experts\.(\d+)\.扫描权重名,分别统计骨干网络(backbone)与 MTP 层中的路由专家数量,并断言二者都能被 MP 整除。

FP4 专家权重的无损转换。发布模型以e2m1fn(int8 打包的 FP4)存储专家权重,运行时若选择--expert-dtype fp4,inference/convert.py 直接将其 view 为torch.float4_e2m1fn_x2;若选择fp8,则调用cast_e2m1fn_to_e4m3fn(inference/convert.py)做无损升格——把每个 4-bit 值按 [0, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0] 及其负值表映射回浮点、乘上块内 offset 缩放后转为e4m3fn,同时输出新的e8m0fnu块缩放。转换器还断言 fp8 块大小为 32×32,并验证MAX_OFFSET_BITS = 6的约束(6.0 * 2^6 = 384 < 448,恰好落在 e4m3fn 的最大值内)。

权重名映射与分片。inference/convert.py 定义了embed、wq_b、wo_a、wo_b、head、attn_sink、weights_proj等张量的维度映射(dim=0或dim=1),转换时按对应维度做narrow切分;路由专家按n_local_experts = n_experts // MP均匀分到各秩(inference/convert.py);Engram 嵌入表则按行分片并对最后一块不足部分做 padding(inference/convert.py)。wo_a权重会与 scale 合并展开为 bfloat16(inference/convert.py),MTP 层与骨干共享的embed.weight/head.weight被跳过以免重复存储(inference/convert.py)。

分词器复制。--tokenizer-path指向的目录中若存在tokenizer.json和tokenizer_config.json,会被复制进转换后的检查点目录(inference/convert.py),因此运行时可直接用--ckpt-path加载分词器。

运行 TXT 与 JSON 示例:同一条多模态提示的两种等价表达

转换完成后,用 inference/run.sh 一键运行示例:

export CKPT_PATH=/path/to/DeepSeek-V4.1-Flash-TP8 export MP=8 INPUT_FILE=examples/example.txt ./run.sh INPUT_FILE=examples/example_harmony.json ./run.sh

两个文件表达的是同一条交织双图提示(interleaved two-image prompt),因此编码出的 prompt 与输入 token ID 完全一致。这一点在 inference/README.md 中明确说明,并受到encoding/测试的验证(见下文)。

TXT 格式:紧凑的<image>标记

inference/examples/example.txt 使用空行分隔多个 prompt,图像用<image>路径</image>标签内联:

中国的首都是哪里? 列出100以内的所有素数。 DeepSeek是做什么的公司? 请按“第一张、第二张”的顺序回答:第一张图<image>examples/images/carrots.jpeg</image>和第二张图<image>examples/images/corn.jpeg</image>中分别是什么食材?它们通常食用的部位分别是什么?

生成代码通过parse_tagged_text把这种紧凑写法解析为标准内容块(见 encoding/README.md 中的“Compact TXT notation”),它只是一个输入便捷层,不是第二套编码实现。

JSON 格式:OpenAI 兼容的多用例输入

inference/examples/example_harmony.json 是“Harmony 输入”:一个 JSON 数组,每个元素是一个 OpenAI 格式的 case({"messages": [...], "tools": [...]}或裸消息列表)。其中第一个 case 与 TXT 文件的最后一条提示完全等价——同样以文本块 + 两张image_url(examples/images/carrots.jpeg、examples/images/corn.jpeg)的交织方式提问;其余 case 覆盖了 system 提示、function 工具定义(get_weather)以及含多轮 assistant/system 消息的对话。

inference/generate.py 对两种输入的处理路径分别为:.json走load_cases+to_json编码;纯文本则按\n\n切分、经parse_tagged_text构造 case。加载的 case 会先经过encode_case与prepare_vl_inputs统一编码为 token。

图像如何变成 token:图像预处理管线

对于带图像的 prompt,inference/image_processor.py 会:

  1. 通过load_image_bytes(inference/image_processor.py)从本地路径、data:URL、http(s) URL 或 base64 数据加载图像字节;
  2. 用plan_image_grid/solve_resize_ratio(inference/image_processor.py)做保比例的尺寸规划,保证视觉 token 数不超过vision_max_n_token(配置中为 1024);
  3. 将图像切成n_vit_h × n_vit_w的 patch 网格送入 ViT,再经 3×3 aligner 降采样成n_llm_h × n_llm_w的 LLM token 网格,布局为[IMAGE_START] + ([IMAGE] * n_llm_w + [IMAGE_NEW_LINE]) * n_llm_h + [IMAGE_END](见 inference/image_processor.py 的模块 docstring)。

这些视觉 token 在input_ids中统一携带image_token_id(配置中为 129264),仅靠 token 类型区分,且必须全部落在首个 prefill 块内(inference/generate.py 会断言图像跨度不超过最短 prompt),因此多模态 prompt 会被逐个单独生成(inference/generate.py)。

交互式对话:torchrun 启动

torchrun --nproc-per-node "${MP}" generate.py \ --ckpt-path "${CKPT_PATH}" \ --config config.json \ --interactive \ --temperature 0.6

交互模式会打印>>>提示符循环读取输入,并支持两条内建命令:/exit退出、/clear清空对话历史(inference/generate.py)。在交互模式下args.max_batch_size被设为 1、args.max_seq_len被设为 64K(inference/generate.py)。

generate.py 全部命令行参数

参数默认值说明
--ckpt-path必填转换后的检查点目录
--config必填模型配置文件(如config.json),用于构造ModelArgs
--input-file""批处理模式的输入文件(TXT 或 JSON),与--interactive二选一(源码断言二者至少指定其一)
--interactive否(store_true)启用交互式对话
--max-new-tokens200每轮最多生成的新 token 数(注意main()内部默认参数为 100,CLI 层为 200)
--temperature1.0采样温度
--thinking-modechat可选chat或thinking,决定是否输出<think>...</think>推理块

采样在 inference/model.py 的sample函数中完成:温度为 0 时取 argmax,否则用 Gumbel-max trick(等价于多项式采样但避免 GPU-CPU 同步)。

多节点执行

多节点运行只需在generate.py之前追加torchrun的常规参数:

torchrun --nnodes <节点数> --node-rank <节点秩> \ --master-addr <主节点地址> --master-port <主节点端口> \ --nproc-per-node "${MP}" generate.py \ --ckpt-path "${CKPT_PATH}" \ --config config.json \ --interactive

inference/generate.py 根据WORLD_SIZE/RANK/LOCAL_RANK环境变量判断是否调用dist.init_process_group("nccl"),非 0 秩的进程会静默 print;交互输入经dist.broadcast_object_list广播到各秩(inference/generate.py)。

自测:python model.py

python model.py

inference/model.py 的__main__块会用ModelArgs的默认值构建一个小模型(dspark_block_size=6、dspark_target_layer_ids=(3, 4)),输入 2×150 的随机 token,先做 128 token 的 prefill,再逐 token 解码 22 步,并同步调用forward_spec走 MTP 草稿前向。由于权重未初始化,自测验证的是张量形状与 kernel 装配是否正确,而非数值正确性——但它真实调用了稠密 fp8 / MoE fp4 内核(fp8_gemm、fp4_gemm、sparse_attn等),是验证依赖与编译环境的最快方式。

配置参数速查:从config.json理解模型形状

运行时通过--config config.json传入 inference/config.json,其字段名与ModelArgs(inference/model.py)一一对应。以下是与推理最相关的几组参数:

分组关键参数(配置值)含义
骨干形状vocab_size129280、dim5120、n_layers40、n_heads64、head_dim512、q_lora_rank1280、o_groups8、o_lora_rank1024Transformer 主干尺寸与 MLA 式潜变量注意力投影
MoEn_routed_experts384、n_shared_experts1、n_activated_experts6、moe_inter_dim2304、score_funcsqrtsoftplus、route_scale1.5、swiglu_limit10.0每 token 激活 6 个路由专家 + 1 个共享专家
稀疏注意力window_size128、kv_source_layers[2,8,14,20]、index_source_layers[2,8,14,20,24,28,32,36]、compress_ratios(42 项)、index_n_heads32、index_head_dim128、index_topk512滑窗 128;压缩 KV 与索引器的层级共享方案;每查询保留 512 个压缩位置
候选预过滤candidate_source_layer20、candidate_topk_blocks2048、candidate_block_size8由第 20 层构造候选池,限制后续索引层开销与上下文长度解耦
RoPE 与长上下文original_seq_len65536、rope_theta10000、rope_factor16、beta_fast32、beta_slow1、compress_rope_theta160000YaRN 外推;压缩 KV 使用独立 theta(一个潜向量代表多个 token,位置间隔更远)
Engramengram_layer_ids[1,14]、engram_vocab_size16000000、engram_num_embeddings[384006168, 384016682]、engram_max_ngram_size4、engram_n_heads8、engram_head_dim256、engram_pad_id2、engram_compressed_vocab_size99092n-gram 哈希记忆查询,仅在少量层注入残差流
DSparkdspark_block_size5、dspark_noise_token_id128799、dspark_target_layer_ids[37,38,39]、dspark_markov_rank256、dspark_n_routed_experts128、dspark_n_activated_experts3半自回归草稿头:块大小 5,目标层为最后 3 层
MTPn_mtp_layers3骨干之后追加的草稿层数,用于forward_spec
视觉vision_n_layers32、vision_dim1024、vision_n_heads16、vision_inter_dim2816、vision_patch_size14、vision_downsample_ratio3、vision_max_n_token1024、vision_min_pixels295936、image_token_id129264、vision_rope_theta10000DeepSeek-ViT(2D-RoPE + 3×3 pixel-unshuffle 降采样)与图像 token 参数
数值格式dtypefp8、expert_dtypefp4、norm_eps1e-20稠密层 FP8(每 32×32 块一个 scale)、专家 FP4(每 32 个 K 元素一个 scale),见 inference/model.py

从 inference/model.py 的forward可以看到这些配置的装配顺序:先算 Engram 哈希与文本嵌入、合并图像嵌入,再展开为hc_mult份副本进入 Hyper-Connections,逐层执行(含 Engram 注入、滑窗/压缩注意力、MoE、Sinkhorn 混合),最后经norm与head输出 logits 并采样。这套链路与 inference/README.md 列出的架构组件一一对应,也是理解整个推理过程的源码级入口。

附:与编码层的衔接

批处理模式下,prompt 编码复用encoding/目录的参考实现(inference/generate.py 将../encoding加入sys.path),支持多轮对话、工具调用、thinking 模式、1–100 数值推理预算、会话中系统消息与交织图像(详见 encoding/README.md)。TXT 与 JSON 示例编码一致性由 encoding/test_encoding.py 的配对用例(tests/test_input_*.json与tests/test_output_*.txt)保证,可直接用python -m pytest -q test_encoding.py验证。

  • 人工智能
  • 大模型
  • 多模态

【免费下载链接】DeepSeek-V4.1-Flash

DeepSeek-V4.1-Flash 是一个多模态混合专家(MoE)模型,拥有 5520 亿骨干参数,并支持最多一百万 token 的上下文长度。该模型原生支持图像和文本输入,并以自回归方式生成文本

项目地址:https://ai.gitcode.com/hf_mirrors/deepseek-ai/DeepSeek-V4.1-Flash
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 5:01:12

UE5多人FPS网络同步实战:从服务器权威到延迟补偿

第一次把自己的UE5 FPS项目从单机切到多人时&#xff0c;我遇到的问题大概可以组成一本《联机踩坑大全》&#xff1a;角色射出的子弹有时候能命中、有时候穿人而过&#xff1b;同一个敌人&#xff0c;在队友屏幕上站在门口&#xff0c;在我屏幕上却已经跑进走廊&#xff1b;更要…

作者头像 李华
网站建设 2026/9/30 5:00:59

LLM基础设施论文实战导航:从报错到部署的工程路标

1. 这不是“论文列表”&#xff0c;而是一张大语言模型基础设施演进的路线图你搜“LLM Infra 相关论文”时&#xff0c;大概率是被某个报错卡住了——比如部署时LLM request failed: provider rejected the request schema or tool payload.&#xff0c;或是调试 RAG 流程发现向…

作者头像 李华
网站建设 2026/9/30 5:00:57

Android Recovery模式原理与实战:从启动机制到故障排查

1. Recovery 模式&#xff1a;Android 设备底层维护的“急救室”&#xff0c;不是刷机玄学&#xff0c;而是可验证、可调试、可复现的系统级能力Recovery 模式是 Android 设备上一个独立于主操作系统&#xff08;System&#xff09;运行的轻量级环境&#xff0c;它不依赖 /syst…

作者头像 李华
网站建设 2026/9/30 5:00:08

前端性能优化核心:异步加载原理、落地方式与实战指南

1. 异步加载到底解决了什么问题做过前端或者客户端性能优化的朋友&#xff0c;应该都有过这种体验&#xff1a;页面代码越堆越多&#xff0c;首屏打开越来越慢&#xff0c;白屏时间从原来的500毫秒变成一秒两秒&#xff0c;用户早跑了。刚开始我以为是网络问题&#xff0c;后来…

作者头像 李华
网站建设 2026/9/30 5:00:00

Playwright + Pytest 实战:从元素定位到CI集成的Web UI自动化测试方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/30 4:59:40

无人机风速风向仪:从运动平台解算真实大气的原理与工程实践

这几年做无人机气象载荷测试&#xff0c;被问得最多的一个问题是&#xff1a;无人机风速风向仪到底是什么&#xff1f;是不是就是把气象站上那个风速杯拆下来&#xff0c;绑到机身上就行&#xff1f;每次听到这个说法我都得解释半天——绑上去用很简单&#xff0c;测出来能用是…

作者头像 李华