OpenGVLab/SDLM-32B-D4
模型介绍
文件和版本
Pull Requests
讨论
分析

SDLM-32B-D4

[

📂GitHub📂 GitHub📂GitHub

](https://github.com/OpenGVLab/SDLM) [

📜技术报告📜 技术报告📜技术报告

](https://arxiv.org/abs/2509.24007) 🚀 项目主页 [

🤗HuggingFace合集🤗 HuggingFace 合集🤗HuggingFace合集

](https://huggingface.co/collections/OpenGVLab/sdlm-68ac82709d7c343ad36aa552)

简介

我们提出一种 Sequential Diffusion Language Model(SDLM,顺序扩散语言模型),以较低成本激发扩散模型的并行预测能力。具体而言,SDLM 通过将预测范围限制在固定块长度内来减少分布偏移,并通过最长前缀解码方法保证解码顺序,从而在确保生成质量的同时显著提升预测效率。我们的方法可以看作是对自回归(AR)范式的进一步泛化。因此,可以利用预训练的 AR 权重,仅通过少量指令微调,即可快速迁移至扩散框架。

总体思路

SDLM 以显著更快的解码速度实现了强劲性能。与可比自回归模型相比,其运行速度约为 2 倍,且精度相当;MATH-500 基准测试结果表明,相比其他扩散语言模型,其最高可实现 5 倍加速。

整体框架

  • 自回归:逐个预测 token。
  • 扩散:每一步重新生成所有 token。
  • SDLM(本文方法):每一步解码 D 个 token,随后保留最长的连续 n 个高置信 token(1 ≤ n ≤ D)。缓存的 token 将被复用,从而节省计算。

SDLM 系列

下表提供了 SDLM 系列的概览。

模型名称基础模型 🤗HF 链接 🤗
SDLM-3B-D4Qwen2.5-3Bhttps://huggingface.co/OpenGVLab/SDLM-3B-D4
SDLM-3B-D8Qwen2.5-3Bhttps://huggingface.co/OpenGVLab/SDLM-3B-D8
SDLM-32B-D4Qwen2.5-32Bhttps://huggingface.co/OpenGVLab/SDLM-32B-D4

模型架构

我们提出一种顺序分块掩码预测方法,以减少基于扩散模型的生成过程中的误差累积。该方法利用了一个观察结果:位置索引较低的 token 预测通常能够受益于更可靠的上下文信息,从而降低偏差并提升准确性。

  • (a) 训练流程。 重排序输入可实现结构化掩码,包括因果前缀(左上)、可见的跨块前缀(左下)以及块内双向注意力(右下)。
  • (b) 采样流程。 基于置信度的动态分块解码与 KV cache 复用。在每一步中,对一个包含 B 个 token 的块进行预测,其中包含 B-1 个填充掩码。选择置信度高的最长前缀作为动态输出。缓存的 KV 状态可实现高效解码。

image/png

性能

长文本基准测试

SDLM 展现出强劲性能,并带来显著更快的解码速度。与可比的自回归模型相比,其运行速度约快 2 倍,同时精度与其相当;MATH-500 基准测试的结果也显示,相比其他扩散语言模型,它可实现最高 5 倍的加速。

image/png

通用多选基准测试

image/png

块大小与自投机解码

image/png

性能与速度的权衡

SDLM-3B(B=4)与 SDLM-3B(B=8)在不同置信度阈值 τ 下,性能与速度之间的权衡。通过调整 τ,可在速度与性能之间实现可控权衡。SpeedUp 表示每次前向传播输出的平均 token 数。

image/png

推理

  1. 安装依赖

    关键包版本:

    transformers==4.37.2
    torch>=2.5.0
  2. 将模型生成脚本 sdlm_inference.py 下载到你的工作目录。

  3. 我们提供了示例代码,用于通过 transformers 运行 SDLM-32B-D4。

    import torch
    from transformers import AutoModelForCausalLM, AutoTokenizer
    from sdlm_inference import SDLM_generate
    
    if __name__ == "__main__":
        ckpt_hf = 'OpenGVLab/SDLM-32B-D4'
    
        model = AutoModelForCausalLM.from_pretrained(
            ckpt_hf,
            attn_implementation="eager",
            trust_remote_code=True
        ).to(dtype=torch.float16)
        tokenizer = AutoTokenizer.from_pretrained(ckpt_hf)
    
        prompt = '用 Python 写一个斐波那契函数。'
        messages = [
            {"role": "system", "content": "你是一个乐于助人的助手。"},
            {"role": "user", "content": prompt}
        ]
        text = tokenizer.apply_chat_template(
            messages,
            tokenize=False,
            add_generation_prompt=True
        )
    
        model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
    
        response, history = SDLM_generate(
            model,
            tokenizer,
            model_inputs,
            max_gen_len = 1024,
            temperature = 0,
            threshold = 0.5,
            n_future_tokens = 4,
            alg = 'prob_conf', #  prob_conf | entropy_conf | self_speculative
            save_history = True,
            use_cache = True
        )
    
        print('response: ', response[0])
    
        print('=======histroy')
        for item in history:
            print('cur total token ', item[1])
            print(item[0][0])
            print('--------')

训练

  1. 环境准备

    git clone https://github.com/OpenGVLab/SDLM.git
    cd SDLM
  2. 安装依赖

    关键包版本:

    transformers==4.37.2
    deepspeed==0.16.5
    torch>=2.5.0
    accelerate==0.32.1

    注意:如果使用 Flex Attention,需要进行额外配置。

  3. 准备训练数据

    我们使用的训练数据集在元文件 meta.json 中指定,并按照 ShareGPT 风格组织,符合 InternVL 聊天数据格式。

    该数据集由多个开源数据集组成,结构如下:

    数据集名称样本数领域
    ScaleQuest-Math1,000K数学
    Opc-sft-stage2436K代码
    Smoltalk1,100K通用
    Tulu-3-sft-mixture939K通用
    SciRIFF79K科学
    Table-GPT13K表格
    总计3,506K--
  4. 开始训练

    所有训练脚本都位于 shell/train 目录中。关键参数包括:

    • block_size:扩散窗口的大小。当前配置使用 4,我们也尝试了使用 8;更大的窗口尺寸仍在探索中。
    • attn_implementation:注意力实现类型。可选项包括 sdpa、eager 或 flex_attn。使用 Flex Attention 需要进行额外配置。为了快速开始,建议优先使用 sdpa。
    • causal_attn:是否在窗口内使用因果注意力。当前设置为非因果(False)。

    有关训练的更多详细信息,请参阅 github。

评估

目前,我们使用 Opencompass 进行评估。更多详情,请参阅评估指南。

致谢

我们衷心感谢开源社区所作出的基础性贡献:

  • InternVL:我们在此构建的代码库。
  • SMDM、LLaDA、Dream、Block Diffusion:为基于扩散的生成建模提供了有益启示。
  • Qwen2.5:作为对比研究中稳健的基础模型。
  • Opencompass:提供了全面的评估框架。
  • 本工作所使用的全部数据集的创建者,使严谨的训练与验证成为可能。

引用

如果您认为本项目对您的研究有帮助,请考虑引用:

@article{liu2025sdlm,
  title={Sequential Diffusion Language Models},
  author={Liu, Yangzhou and Cao, Yue and Li, Hao and Luo, Gen and Chen, Zhe and Wang, Weiyun and Liang, Xiaobo and Qi, Biqing and Wu, Lijun and Tian, Changyao and Zhang, Yanting and Li, Yuqiang and Lu, Tong and Qiao, Yu and Dai, Jifeng and Wang, Wenhai},
  journal={arXiv preprint arXiv:2509.24007},
  year={2025}
}