- 人工智能
- 大模型
- 多模态
【免费下载链接】DeepSeek-V4.1-Flash
DeepSeek-V4.1-Flash 是一个多模态混合专家(MoE)模型,拥有 5520 亿骨干参数,并支持最多一百万 token 的上下文长度。该模型原生支持图像和文本输入,并以自回归方式生成文本
本文是围绕仓库中 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.txtinference/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 会:
- 通过
load_image_bytes(inference/image_processor.py)从本地路径、data:URL、http(s) URL 或 base64 数据加载图像字节; - 用
plan_image_grid/solve_resize_ratio(inference/image_processor.py)做保比例的尺寸规划,保证视觉 token 数不超过vision_max_n_token(配置中为 1024); - 将图像切成
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-tokens | 200 | 每轮最多生成的新 token 数(注意main()内部默认参数为 100,CLI 层为 200) |
--temperature | 1.0 | 采样温度 |
--thinking-mode | chat | 可选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 \ --interactiveinference/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.pyinference/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_rank1024 | Transformer 主干尺寸与 MLA 式潜变量注意力投影 |
| MoE | n_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_theta160000 | YaRN 外推;压缩 KV 使用独立 theta(一个潜向量代表多个 token,位置间隔更远) |
| Engram | engram_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_size99092 | n-gram 哈希记忆查询,仅在少量层注入残差流 |
| DSpark | dspark_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 层 |
| MTP | n_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_theta10000 | DeepSeek-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 的上下文长度。该模型原生支持图像和文本输入,并以自回归方式生成文本
相关推荐
RIOT XiPFS 最小示例实践:从 Flash 直接执行 FAE 程序的完整指南
RIOT XiPFS 最小示例实践:从 Flash 直接执行 FAE 程序的完整指南 本篇技术指南围绕 RIOT 仓库中的 xipfs_minimal_exam
物联网嵌入式操作系统实时系统DeepSeek-V3权重转换指南:FP8到BF16完整流程
DeepSeek V3权重转换指南:FP8到BF16完整流程 引言:为什么需要权重转换? DeepSeek V3作为当前最强大的开源混合专家模型(Mixture
基础模型大模型NLPDeepSeek在 React 中集成 G6:从最小可运行示例到 React 自定义节点的完整实战指南
在 React 中集成 G6:从最小可运行示例到 React 自定义节点的完整实战指南 导读 本篇指南以 react snippet.md https://li
数据可视化前端图表库
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考