在这里插入图片描述

写在前面:为什么 DiC 值得读三遍?

  • 学术角度:首次在同一篇论文里系统回答了“当扩散模型遇到端侧算力天花板,纯卷积能否取代 ViT”。
  • 工程角度:提供了完整训练-量化-部署脚本,骁龙 8 Gen 3 上 512×512 图 0.9 s 出图,比 DiT-L 快 5×。
  • 商业角度:开源协议 Apache-2.0,可商用,已在华为昇腾社区上线 NPU 一键转码示例。

背景:Transformer 的“甜蜜陷阱”

模型参数量MACs@512²A100 延迟显存端侧可行性DiT-XL/2675 M525 G420 ms80 GB❌DiT-L/2344 M277 G230 ms40 GB❌DiC-B72 M94 G110 ms8 GB✅

DiC 架构:一条“卷积高速公路”

  1. 宏观 Block:Frequency-Aware Dilated Conv(FADC)
  • 动机:扩散过程对高频(纹理、边缘)敏感,低频(构图、语义)可粗略。

  • 设计:每个 Block 由三条并行分支组成,分别使用 dilation=1、3、5 的 3×3 卷积。输出在通道维度拼接后,利用 1×1 Group Conv 融合。通过 可学习频率门控 γ∈[0,1] 动态调节各分支权重(类似 SE,但只针对频率通道)。

class FADC(nn.Module):    
	def __init__(self, c, dilations=[1,3,5]):        
	super().__init__()        
	self.convs = nn.ModuleList([            
		nn.Conv2d(c, c//3, 3, padding=d, dilation=d, groups=c//3)
		for d in dilations        
	])
	self.gate = nn.Sequential(            
		nn.AdaptiveAvgPool2d(1),            
		nn.Conv2d(c, c//16, 1), nn.SiLU(),v            
		nn.Conv2d(c//16, len(dilations), 1), nn.Softmax(dim=1)        
	)    
	def forward(self, x):        
		outs = [conv(x) for conv in self.convs]        
		g = self.gate(x).unsqueeze(-1).unsqueeze(-1)        
		out = torch.cat(outs, dim=1)        
		return x + out * g
  • 复杂度:参数量与 MACs 随 dilation 增大仅线性增加,无二次项。
  1. 微观单元:Dual-Path Residual(DPR)
  • 问题:纯卷积 100+ 层后梯度范数崩塌。
  • 解决:Path A 为常规残差:Conv-BN-SiLU。Path B 在卷积前插入 Gated Linear Unit (GLU):
h = Conv(x) ⊙ Sigmoid(Conv(x))

两条路径输出相加,抑制梯度消失(实验 1000 层仍 0.98 梯度范数)。

  1. 位置嵌入:Sinusoidal → Convolutional
  • 不采用 2D RoPE 或可学习绝对位置编码,而是把 timestep t 通过 FiLM 注入:
scale, shift = MLP(t).chunk(2, dim=1)
h = h * scale.view(-1,1,1,1) + shift.view(-1,1,1,1)
  • 好处:纯卷积,无额外内存碎片,NPU 友好。

在这里插入图片描述

训练秘籍:让 72 M 参数也能驯服 512×512

1. Mixed-Frequency Sampling(MFS)

Patch 大小比例作用64×6460 %低频语义快速收敛128×12830 %中频结构512 x 51210 %高频细节精修

  • 实现在 dataloader 中根据梯度范数动态调整采样概率,官方代码里通过 EMA of gradient variance 控制。

  • 结果800 k → 260 k step,FID 无退化,显存峰值从 36 GB → 11 GB。

    1. 损失函数:Hybrid L2 + VGG Perceptual
  • L2 保像素保真;VGG-16 relu3_3 保感知。

  • 权重 1:1,训练更稳,不易过拟合纹理。

    1. 数据 & 超参
  • 训练集:LAION-2B 中 2 M 512×512 子集。

  • 优化器:AdamW,lr=1e-4,weight_decay=0.01。

  • EMA decay=0.9999,防止小模型震荡。

端侧部署:从 FP32 到 INT8 的“无痛”量化

量化方案:

  • 误差FP32 FID 8.97 → INT8 FID 9.14,视觉无感差异。
  • 速度骁龙 8 Gen 3 Hexagon NPU INT8 推理 0.9 s(批大小 1),功耗 3.2 W。

阶段权重量化激活量化校准方式PTQINT8 per-channelINT8 per-tensor512 图 MSE 最小化QAT同上同上LSQ+ 学习 scale

内存布局优化

  • 把 GroupNorm 替换为 InstanceNorm + 1×1 Conv(等价,但 NPU 支持更好)。
  • 将 timestep MLP 权重折叠进卷积权重(weight pre-fusion),减少一次访存。

实验:DiC 与 DiT 的“针尖对麦芒”

定量指标

模型FID↓sFID↓IS↑Precision↑Recall↑DiT-L/210.848.91247.60.830.59DiC-B8.977.95254.30.850.62

定性分析

  • 高频纹理DiC 在人脸发丝、动物皮毛上细节更丰富,得益于多尺度 dilation。
  • 全局一致性由于 still 纯卷积,large object 的相对位置略弱于 DiT,但 MFS 缓解了此问题。

Ablation:每个组件的贡献

去掉的模块ΔFID说明FADC → 普通 3×3+1.74失去频率感知去掉 dilation=5 分支+0.63低频建模不足去掉 DPR Path B+0.96梯度崩塌,训练不稳去掉 MFS+1.12训练收敛慢

快速开始:30 分钟跑通 demo

conda create -n dic python=3.10
conda activate dic
pip install torch==2.3.0 torchvision --index-url https://download.pytorch.org/whl/cu118pip install dic-diffusion  # 官方包
git clone https://huggingface.co/PKU-Huawei/DiCcd DiC && wget https://huggingface.co/PKU-Huawei/DiC/resolve/main/dic-b-512.pth
python demo.py --ckpt dic-b-512.pth \                
--prompt "A futuristic cyberpunk city, neon lights, 4k" \                --steps 20 --seed 42 --device cuda

在这里插入图片描述

官方代码仓库:https://github.com/PKU-DiC/DiC
DiC 论文(arXiv 2507.08123)

Logo

昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链

更多推荐