
最近 AI 圈有两个方向热度很高一个是 Meta 何恺明团队提出的 ELF——一种利用扩散模型直接生成任意长度的连续语义特征的语言模型架构简洁到极致却在同等参数规模下超越了主流自回归模型另一个是国内 AI 算力生态的快速成熟——昇腾从“可用”走向“好用”越来越多高校和科研团队开始基于昇腾算力做前沿算法验证。这两个热点在 2025 年突然交叉了南京大学团队基于昇腾算力同步提出了连续扩散语言模型并完成了训练与推理验证。这意味着连续扩散语言模型不再只是英伟达生态里的“高端玩具”在国产算力上也能跑通、能复现、能继续做研究。本文不打算只做新闻复述而是站在技术实践角度拆解三件事ELF 和连续扩散语言模型到底解决了什么问题昇腾算力跑这类模型时架构上有什么特殊之处如果你想在自己项目里复现类似思路从环境搭建到代码验证该怎么落地以及会遇到哪些坑。1. 为什么连续扩散语言模型值得关注先看传统自回归语言模型的工作方式逐 token 预测生成第 t1 个 token 时依赖前 t 个 token 的完整上下文。ChatGPT、Claude、Llama 基本都是这个套路。它的优点是生成质量稳定、训练目标清晰但有两个硬伤推理速度受限于逐步解码无法并行生成训练时需要严格的前后依赖扩展超长上下文时计算成本呈二次增长。何恺明团队的 ELF 给的解法很直接把文本序列编码成一组连续的语义向量然后用扩散模型一次性生成整段语义特征最后通过一个轻量解码器把语义特征映射回 token 序列。整个过程不再逐 token 自回归而是“先整体语义再局部还原”。这里有一个容易误解的点ELF 不是第一个把扩散模型用在文本生成上的方案但它做了一个关键简化——用预训练语言模型获取连续语义特征扩散模型只需要学习这些特征的分布而不是直接学习离散 token。这绕开了离散文本和连续扩散过程之间的梯度断裂问题。所以连续扩散语言模型的本质是一套“语义特征生成”框架语言模型负责把文本映射成语义空间扩散模型负责在语义空间内做生成解码器负责把生成结果还原。它让自然语言生成从“逐字造句”变成了“整体勾勒再细化”这个转变带来的直接收益就是生成阶段的并行度大幅提升。南京大学团队在昇腾上复现并验证了这一思路说明这套框架对底层硬件没有强依赖只要算力平台提供完整的算子库和分布式训练能力就能支撑扩散语言模型的训练和部署。2. ELF 与连续扩散语言模型的核心概念2.1 什么是 ELFELFContinuous Latent Language Model是 Meta 何恺明团队提出的语言模型架构。它的全称和内部细节在论文里有完整描述这里只提炼关键设计。ELF 的流程可以分成三段编码阶段输入文本通过一个预训练语言模型如 Llama 的 encoder 部分映射为连续语义特征即 latent representation。扩散生成阶段把这些连续语义特征当作扩散模型的训练目标训练一个扩散模型学习从高斯噪声逐步去噪还原出语义特征。解码阶段还原出的语义特征通过一个轻量解码器映射回 token 序列得到最终文本。这里最重要的设计判断是为什么用连续语义特征而不是直接生成离散 token因为在连续空间里可以定义平滑的噪声添加和去噪过程而离散 token 之间没有天然的“距离”概念扩散模型难以直接学习。通过语义特征这个中间表示扩散模型成功规避了离散空间生成的核心障碍。2.2 什么是连续扩散语言模型连续扩散语言模型是一类方法的统称ELF 是其中的代表性工作。它的核心特征如下对比维度自回归语言模型连续扩散语言模型生成方式逐 token 顺序生成整段语义特征并行生成训练目标最大化下个 token 概率最小化语义特征还原误差推理速度受限于序列长度可并行去噪理论上可加速上下文建模依赖注意力机制逐步扩展依赖扩散步数控制全局一致性硬件适配各类加速卡均可需要较强的矩阵运算和连续张量支持需要特别说明的是连续扩散语言模型并不是要全面取代自回归模型。它在长文本全局一致性、可控生成、并行推理加速这些维度上有潜力但当前在复杂推理、多轮对话、代码生成等任务上还没法完全追平自回归模型。更准确的说法是它为语言模型提供了一条互补的技术路线。2.3 ELF 与昇腾结合的背景昇腾是华为推出的 AI 算力产品系列包含昇腾 310、昇腾 910B 等不同定位的加速卡。昇腾 910B 面向训练和推理是目前国内科研机构使用较多的高端 AI 加速卡。过去在昇腾上跑大模型开发者经常遇到的问题是主流框架 PyTorch 的算子不能直接跑在昇腾卡上需要经过 CANNCompute Architecture for Neural Networks昇腾的异构计算架构做算子适配。这意味着很多新模型不能“装完即跑”需要做一层适配和算子迁移。南京大学团队的工作恰恰验证了连续扩散语言模型这个较新的架构可以通过昇腾的 PyTorch 适配层Torch-NPU完成训练和推理。这说明昇腾生态对前沿算法结构的支持已经比早期完善很多不再局限于跑通常见 CNN、Transformer。3. 昇腾算力跑 ELF 类模型的硬件与软件栈如果你打算在昇腾上跑连续扩散语言模型需要先理解它的软硬件分层。3.1 昇腾硬件产品定位从材料看昇腾系列主要包括以下类型昇腾 310面向边缘推理场景功耗低适合部署轻量模型。昇腾 910B面向训练和推理算力较强是目前高校和科研机构使用较多的型号。昇腾 310P推理卡数据带宽和算力介于 310 和 910B 之间。跑 ELF 这种需要训练扩散模型的任务至少需要昇腾 910B 及以上规格。如果是纯推理部署在昇腾 310P 上也可以尝试但要注意显存和带宽限制。3.2 软件栈结构昇腾的软件栈从底层到上层可以分成四层硬件层昇腾加速卡。计算架构层CANN提供算子库、图编译、运行时管理等核心能力。框架适配层Torch-NPU、MindSpore 等。Torch-NPU 让 PyTorch 代码可以基本不改地跑在昇腾上。应用层vLLM、MindIE 等推理服务框架。跑 ELF 这类研究型模型绝大多数场景走的是 PyTorch Torch-NPU 这条路径因为研究代码通常基于 PyTorch 编写迁移成本最低。3.3 昇腾上跑模型的两个常见误区误区一昇腾兼容 PyTorch 等于所有 PyTorch 代码都能直接跑。实际上 Torch-NPU 只是提供了基础算子映射如果你的模型里用了自定义算子、某些 torch 函数还没有在 NPU 上实现仍然需要适配和改写。误区二昇腾 910B 显存够就能训练大模型。显存只是前提之一更关键的是算子执行效率和通信带宽。扩散模型的训练涉及大量矩阵乘法和噪声调度计算如果算子没有针对性优化训练效率会明显低于同级别英伟达卡。4. 昇腾环境准备与基础配置下面以在昇腾 910B 服务器上复现 ELF 类型连续扩散语言模型为例给出环境搭建的完整思路。版本号以实际环境为准本文重点演示通用过程。4.1 硬件环境昇腾 910B 加速卡至少 1 张建议 4 张以上做分布式训练。宿主机 CPU建议 64 核以上。内存建议 256GB 以上。操作系统Ubuntu 20.04 / 22.04或 openEuler。磁盘建议预留 500GB 以上用于存放数据集、checkpoint 和日志。4.2 安装 CANN 与 Torch-NPU昇腾的软件安装整体分三步安装驱动和固件、安装 CANN 工具包、安装 Torch-NPU 适配层。# 1. 安装驱动和固件以 Ascend HDK 为例 ./Ascend-hdk-*.run --full --install # 2. 安装 CANN 工具包 ./Ascend-cann-toolkit_*.run --install # 3. 设置环境变量 source /usr/local/Ascend/ascend-toolkit/set_env.sh安装完成后通过npu-smi info查看加速卡状态。npu-smi info正常输出能看到昇腾卡的芯片型号、显存使用率、温度等信息。如果看不到卡先检查驱动是否安装成功、固件版本是否和 CANN 匹配。4.3 安装 PyTorch 与 Torch-NPUTorch-NPU 是 PyTorch 在昇腾上的适配层安装时要注意版本必须与 CANN 版本、PyTorch 版本严格对应。# 以 Python 3.8 PyTorch 2.1.0 为例 pip3 install torch2.1.0 pip3 install torch-npu2.1.0安装完成后验证 NPU 是否可用import torch import torch_npu # 检查 NPU 是否可见 print(torch.npu.is_available()) print(torch.cuda.is_available()) # 这里返回 False因为昇腾不是 CUDA # 查看 NPU 设备数量 print(torch.npu.device_count())如果输出True和大于 0 的设备数量说明环境基本可用。4.4 验证连续扩散模型的张量能否在 NPU 上执行跑完整训练前建议先做一个最小化验证创建张量做一次扩散模型的 denoise 核心操作确认算子能在 NPU 上执行。import torch import torch_npu device torch.npu.current_device() # 模拟一个语义特征的 batchbatch_size2, seq_len128, hidden_size512 x torch.randn(2, 128, 512).to(device) t torch.randint(0, 1000, (2,), devicedevice) # 模拟一次噪声预测 noise_pred torch.nn.functional.linear(x, torch.randn(512, 512).to(device)) print(noise_pred.shape)如果这段代码能正常输出说明 PyTorch 的基础算子已经在昇腾上映射成功可以继续走完整训练流程。5. 基于昇腾实现连续扩散语言模型的完整示例这一部分我们用一个最小实现来还原 ELF 的核心训练思路把文本编码成语义特征训练扩散模型去预测噪声最终还原语义特征。这不是 ELF 的完整复现而是帮助理解核心机制的最小可运行示例。5.1 整体代码结构diffusion_lm/ ├── config.py # 配置参数 ├── semantic_encoder.py # 语义编码器 ├── diffusion_model.py # 扩散模型 ├── decoder.py # 语义特征解码器 ├── train.py # 训练脚本 └── infer.py # 推理脚本5.2 配置参数# 文件路径config.py class Config: # 语义特征维度 hidden_size 512 # 序列长度 seq_len 128 # 扩散步数 num_diffusion_steps 1000 # 训练轮数 epochs 10 # batch size batch_size 16 # 学习率 lr 1e-4 # 是否使用 NPU use_npu True这个配置适合先在单卡上做功能验证实际复现 ELF 时 hidden_size、seq_len、batch_size 都需要显著增大。5.3 语义编码器ELF 的关键前提是能拿到连续语义特征。我们这里用一个简化的做法用一个小型文本编码器可以由任意语言模型承担把输入 token 序列映射为稠密向量序列。# 文件路径semantic_encoder.py import torch import torch.nn as nn class SemanticEncoder(nn.Module): 简化版语义编码器将 token 序列映射为连续语义特征。 实际项目中可替换为任意预训练语言模型的 encoder 部分。 def __init__(self, vocab_size, hidden_size): super().__init__() self.embedding nn.Embedding(vocab_size, hidden_size) self.encoder_layer nn.TransformerEncoderLayer( d_modelhidden_size, nhead8, batch_firstTrue ) self.encoder nn.TransformerEncoder(self.encoder_layer, num_layers2) def forward(self, input_ids): # input_ids: [batch, seq_len] emb self.embedding(input_ids) # [batch, seq_len, hidden] return self.encoder(emb) # [batch, seq_len, hidden]这里要说明ELF 用的是预训练语言模型来获得语义特征不是从零训练的 Transformer。上面的代码是为了让示例可运行用了最简单的编码器结构。真实复现时请把 SemanticEncoder 替换成你要用的预训练模型的 encoder 部分。5.4 扩散模型扩散模型的核心是学习预测噪声。这里实现一个简单的 MLP 扩散模型输入是带噪语义特征和时间步输出是预测的噪声。# 文件路径diffusion_model.py import torch import torch.nn as nn class DiffusionModel(nn.Module): 简化版扩散模型输入带噪声的语义特征和时间步预测噪声。 真实 ELF 中会使用更复杂的网络结构如 Transformer 或 UNet。 def __init__(self, hidden_size, seq_len): super().__init__() self.hidden_size hidden_size self.seq_len seq_len self.time_embed nn.Embedding(1000, hidden_size) self.net nn.Sequential( nn.Linear(hidden_size hidden_size, hidden_size * 4), nn.GELU(), nn.Linear(hidden_size * 4, hidden_size * 4), nn.GELU(), nn.Linear(hidden_size * 4, hidden_size) ) def forward(self, x, t): # x: [batch, seq_len, hidden] # t: [batch] t_emb self.time_embed(t).unsqueeze(1) # [batch, 1, hidden] t_emb t_emb.expand(-1, self.seq_len, -1) # [batch, seq_len, hidden] h torch.cat([x, t_emb], dim-1) # [batch, seq_len, 2*hidden] return self.net(h)5.5 扩散过程定义扩散过程的定义包括两个核心操作前向加噪和反向去噪。# 文件路径diffusion_model.py 追加 class DiffusionProcess: def __init__(self, num_steps1000, beta_start1e-4, beta_end0.02): self.num_steps num_steps self.betas torch.linspace(beta_start, beta_end, num_steps) self.alphas 1.0 - self.betas self.alpha_bar torch.cumprod(self.alphas, dim0) def q_sample(self, x0, t, noiseNone): 前向加噪过程给定干净语义特征 x0生成 t 步后的带噪特征。 if noise is None: noise torch.randn_like(x0) alpha_bar_t self.alpha_bar[t].view(-1, 1, 1) return torch.sqrt(alpha_bar_t) * x0 torch.sqrt(1 - alpha_bar_t) * noise, noise def sample(self, model, shape, device): 反向去噪过程从纯噪声开始逐步还原语义特征。 x torch.randn(shape, devicedevice) for t in reversed(range(self.num_steps)): t_tensor torch.full((shape[0],), t, devicedevice, dtypetorch.long) noise_pred model(x, t_tensor) alpha_t self.alphas[t] alpha_bar_t self.alpha_bar[t] alpha_bar_prev self.alpha_bar[t-1] if t 0 else torch.tensor(1.0) # 根据 DDPM 的采样公式更新 x x (x - (1 - alpha_t) / torch.sqrt(1 - alpha_bar_t) * noise_pred) / torch.sqrt(alpha_t) if t 0: x x torch.sqrt(1 - alpha_bar_prev) * torch.randn_like(x) return x5.6 解码器语义特征还原成 token 序列需要一个解码器。对于 ELF实际做法是训练一个轻量映射头从语义特征预测 token。这里用线性层加 argmax 作为简化示例。# 文件路径decoder.py import torch import torch.nn as nn class SemanticDecoder(nn.Module): 将语义特征映射回 token logits。 真实 ELF 可能使用预训练语言模型的 decoder 轻量映射头。 def __init__(self, hidden_size, vocab_size): super().__init__() self.fc nn.Linear(hidden_size, vocab_size) def forward(self, semantic_features): # semantic_features: [batch, seq_len, hidden] return self.fc(semantic_features) # [batch, seq_len, vocab]5.7 训练脚本把所有模块组合起来在昇腾 NPU 上执行训练。# 文件路径train.py import torch import torch.nn as nn import torch.optim as optim import torch_npu from config import Config from semantic_encoder import SemanticEncoder from diffusion_model import DiffusionModel, DiffusionProcess from decoder import SemanticDecoder def train(): cfg Config() device torch.npu.current_device() if cfg.use_npu else torch.device(cpu) # 模型初始化 vocab_size 10000 encoder SemanticEncoder(vocab_size, cfg.hidden_size).to(device) diffusion_model DiffusionModel(cfg.hidden_size, cfg.seq_len).to(device) decoder SemanticDecoder(cfg.hidden_size, vocab_size).to(device) diffusion_process DiffusionProcess(cfg.num_diffusion_steps) # 优化器 optimizer optim.Adam( list(encoder.parameters()) list(diffusion_model.parameters()) list(decoder.parameters()), lrcfg.lr ) loss_fn nn.MSELoss() # 模拟输入随机生成 token id input_ids torch.randint(0, vocab_size, (cfg.batch_size, cfg.seq_len), devicedevice) for epoch in range(cfg.epochs): optimizer.zero_grad() # 1. 编码语义特征 x0 encoder(input_ids) # [batch, seq_len, hidden] # 2. 随机时间步 t torch.randint(0, cfg.num_diffusion_steps, (cfg.batch_size,), devicedevice) # 3. 前向加噪 x_noisy, noise diffusion_process.q_sample(x0, t) # 4. 预测噪声 noise_pred diffusion_model(x_noisy, t) # 5. 计算扩散损失 loss loss_fn(noise_pred, noise) # 6. 语义特征还原后计算重建损失简化 x_reconstructed diffusion_process.sample( diffusion_model, x0.shape, device ) logits decoder(x_reconstructed) recon_loss nn.CrossEntropyLoss()( logits.view(-1, vocab_size), input_ids.view(-1) ) total_loss loss 0.1 * recon_loss total_loss.backward() optimizer.step() if epoch % 2 0: print(fEpoch {epoch}, Diffusion Loss: {loss.item():.4f}, Recon Loss: {recon_loss.item():.4f}) if __name__ __main__: train()运行训练python train.py这里要提醒上面的示例为了可运行做大幅度简化diffusion_process.sample内部走完整 1000 步反向去噪在真实训练中这样做会非常慢。实际 ELF 训练只在推理阶段做完整采样训练时只做单步噪声预测不会在每轮训练里跑完整逆向过程。上述代码适合验证算子正确性和跑通流程不适合直接搬到大规模训练。5.8 推理脚本# 文件路径infer.py import torch import torch_npu from config import Config from diffusion_model import DiffusionModel, DiffusionProcess from decoder import SemanticDecoder def infer(): cfg Config() device torch.npu.current_device() if cfg.use_npu else torch.device(cpu) vocab_size 10000 diffusion_model DiffusionModel(cfg.hidden_size, cfg.seq_len).to(device) decoder SemanticDecoder(cfg.hidden_size, vocab_size).to(device) diffusion_process DiffusionProcess(cfg.num_diffusion_steps) # 加载权重 diffusion_model.load_state_dict(torch.load(diffusion_model.pth, map_locationdevice)) decoder.load_state_dict(torch.load(decoder.pth, map_locationdevice)) # 从纯噪声开始生成 semantic_shape (1, cfg.seq_len, cfg.hidden_size) generated_features diffusion_process.sample(diffusion_model, semantic_shape, device) # 映射回 token logits decoder(generated_features) # [1, seq_len, vocab] generated_ids torch.argmax(logits, dim-1) print(generated_ids.cpu().numpy()) if __name__ __main__: infer()运行推理python infer.py5.9 关键逻辑解释上述代码实现了 ELF 流水线的三个核心环节语义编码器负责把离散 token 转成连续语义特征扩散模型负责学习从带噪特征还原干净语义特征解码器负责将语义特征映射回 token 空间。训练目标是让扩散模型准确预测噪声同时让解码器能从还原特征中重建原文。它和真实 ELF 的主要差距在于真实 ELF 使用大规模预训练语言模型作为语义编码器和解码器扩散模型也不是简单的 MLP而是在语义特征空间上处理序列关系的 Transformer。但宏观思想是完全一致的。6. 运行验证与效果判断6.1 环境验证命令按照上面代码运行后你首先会看到 NPU 初始化日志和训练 loss 输出。如果一切正常输出类似Epoch 0, Diffusion Loss: 1.1234, Recon Loss: 2.3456 Epoch 2, Diffusion Loss: 0.9876, Recon Loss: 1.8765判断训练是否正常推进看两个指标Diffusion Loss 是否逐渐下降说明扩散模型在学会预测噪声。Recon Loss 是否下降说明解码器能从噪声还原结果中重建语义信息。如果 Diffusion Loss 不降通常是学习率设置过大、模型结构有误或者数据没有归一化。 如果 Recon Loss 不降而 Diffusion Loss 正常说明解码器能力不足或语义特征与 token 的映射关系没有建立好。6.2 推理验证推理阶段从纯高斯噪声生成语义特征再通过解码器得到 token 序列。对于这个最小示例由于语义编码器、扩散模型、解码器都是从零训练的生成结果大概率是乱码。这是正常的——示例的目的不是产出高质量文本而是验证昇腾上连续扩散语言模型的训练链路是否可用。真实复现 ELF 时判断生成效果的标准是生成文本的困惑度是否接近自回归模型的水平。在长文本生成上全局语义一致性是否更好。并行去噪带来的推理加速是否达到预期。6.3 失败排查第一步如果运行python train.py直接报错先确认三件事torch.npu.is_available()是否返回 True。CANN 环境变量是否已 sourcesource /usr/local/Ascend/ascend-toolkit/set_env.sh。报错里是否有Not implemented、Op not supported这类关键词如果有说明某个算子还没在昇腾上适配需要找替代算子或改写实现。7. 昇腾跑连续扩散语言模型的常见问题与排查方法问题现象可能原因排查方式解决方案启动时报错Acl device init failed驱动和固件版本不匹配运行npu-smi info查看驱动状态重装匹配版本的驱动和固件模型加载后报错Op not supported模型中使用昇腾未适配的算子查看报错中的算子名称在 PyTorch 中查找替代实现改写为昇腾支持的标准算子组合训练时显存不足OOMbatch_size 过大或序列长度过长查看npu-smi info的显存占用减小 batch_size使用梯度累积训练速度远低于预期部分算子未走优化内核回退到 CPU查看训练日志检查是否有算子回退警告升级 CANN 版本检查算子映射表多卡训练时通信报错HCCL 配置不正确检查 /etc/hccn.conf 网卡配置确认服务器网卡 IP 和 HCCL 通信配置正确训练 loss 不下降学习率设置不合理打印每步 loss观察拟合情况调整学习率或预热策略PyTorch 代码在 NPU 上运行但结果与 CPU 不一致部分算子存在精度差异随机种子固定后对比 CPU 和 NPU 输出根据情况调整混合精度策略必要时切回 FP32这些是昇腾新用户最常见的几个坑。其中算子适配问题是相对耗费时间的——昇腾的算子库更新速度很快但仍然做不到所有 PyTorch 算子全覆盖。遇到不支持的算子优先看官方算子文档找标准的替代实现。8. 最佳实践与工程建议8.1 昇腾环境管理昇腾的软件栈版本耦合度比 CUDA 生态更严格。CANN、Torch-NPU、PyTorch 三个版本必须匹配。建议在项目开始时先锁定版本组合并通过 requirements.txt 固定依赖。不要随便升级其中一个组件否则很容易出现“能识别卡但算子跑不通”的中间状态。建议用 Docker 做环境隔离。昇腾官方提供了带 CANN 和 Torch-NPU 的容器镜像直接基于镜像开发可以省掉大量环境配置时间。FROM quay.io/ascend/cann:8.0.0-910b-ubuntu22.04-py3.9 # 这里镜像名称和 tag 以实际昇腾社区发布为准 RUN pip3 install torch2.1.0 torch-npu2.1.08.2 数据精度配置连续扩散模型的训练对精度比较敏感。在昇腾上训练时建议前期调试用 FP32确认逻辑正确后再切混合精度。混合精度开启时特别关注 loss 是否出现 NaN。扩散模型中的时间步嵌入和噪声预测网络在低精度下容易出现数值不稳。如果开启混合精度后 loss 发散可以在关键位置强制使用 FP32例如时间步嵌入层。8.3 模型适配策略如果你要在昇腾上复现一个完整的 ELF 或其他扩散语言模型建议按以下顺序推进先在 CPU 上用极小数据跑通训练流程确认逻辑正确。切到单卡 NPU验证算子是否全部兼容。这一步会暴露大部分问题。单卡稳定后再上多卡分布式训练。分布式训练时注意通信算子是否正确执行关注 HCCL 相关日志。这样的路径能帮你把“模型逻辑问题”和“硬件适配问题”分开排查避免混合在一起难定位。8.4 从模型角度给昇腾适配的建议连续扩散语言模型包含三个独立组件语义编码器、扩散模型、解码器。这三个组件对算子的要求不同语义编码器如果复用现有预训练模型大概率已经在昇腾适配过。优先选择昇腾支持列表内的模型。扩散模型是适配的重点其中的时间步嵌入、噪声调度、矩阵乘操作都需要验证算子支持情况。解码器通常是轻量映射头一般不会有算子问题。把三部分拆开分别做算子级验证效率远高于直接整模型跑。8.5 性能优化方向如果你已经能在昇腾上跑通连续扩散语言模型下一步可以关注性能优化使用 CANN 提供的融合算子减少算子间的数据搬运。对扩散模型的去噪循环做静态图编译避免反复的 Python 解释开销。使用torch.npu的图模式graph mode编译减少动态图带来的调度开销。在有多个 sequence 并行生成时充分利用 batch 并行度。8.6 生产环境部署注意点连续扩散语言模型如果用于生产环境推理有几个特殊问题显存占用完整去噪过程需要维护多步中间结果显存峰值高于同规模自回归模型。延迟虽然是并行生成但每一步去噪都是整段序列的矩阵运算短文本场景下不一定比自回归快。缓存管理如果使用 vLLM 一类框架管理推理服务需要确认其对扩散模型的支持程度。昇腾上的 vLLM 适配目前主要集中在自回归模型自定义扩散模型的接入需要额外开发。9. 总结与下一步学习方向从这次南京大学基于昇腾实现连续扩散语言模型的事件里能提炼出的核心信息不只是“又一个新模型”而是连续扩散语言模型正在从理论走向工程验证昇腾算力也已经从传统 CNN 时代走到了可以支撑前沿语言模型研究的阶段。如果你从事大模型推理优化ELF 的并行生成思路值得深入研究它有可能在长文本生成场景提供比自回归更高的吞吐。如果你在研究扩散模型ELF 的语义特征中间层设计是一个重要的范式转移它让扩散和语言模型不再是对立路线而是组合协作关系。如果你在做国产算力适配这个案例说明只要 CANN 算子库支持到位哪怕是很新的架构也能迁到昇腾上。下一步建议动手路径先跑通本文的最小示例验证昇腾环境可用然后阅读 ELF 原始论文理解语义特征的定义方式和损失函数细节接着用昇腾支持的预训练模型替换示例中的简易编码器和解码器慢慢逼近完整实现。对昇腾生态的技术人来说这是一个值得长期跟踪的方向。随着国产算力的软件生态继续完善类似 ELF 这样的前沿模型在昇腾上的适配速度只会越来越快。现在进入这个领域正好能赶上窗口期。