做3D资产生成这些年,我一直觉得最磨人的不是建模本身,而是“怎么用更少的成本,把形状、纹理、细节一次做对”。传统流程里,模型师、贴图师、绑定师各管一段,一个高质量资产从零开始往往要按天算。所以当我看到“3D-Diffusion: Scalable 3D Asset Generation with Diffusion Models”这个方向时,第一反应是:扩散模型终于从2D图像杀到3D资产领域了,而且这次不是小打小闹,是奔着“可规模化”去的。这篇解析,就是想把这个方向背后的技术选型、设计逻辑和落地路径讲清楚,给正在做3D生成、NeRF或者AIGC应用的同学一份可以直接抄作业的参考。
这个方向适合谁看?一类是刚接触3D生成,想搞明白扩散模型怎么处理非欧几里得结构的同学;另一类是在做3D资产生成但苦于效果不稳定、训练成本太高,想知道这个方案为什么更稳的开发者。我会把3D表示的选型、扩散过程的设计、可扩展性的来源、以及我在复现和改造过程中的坑,一块儿拆开讲。
1. 从一张图片到整座数字工厂:3D资产生成的痛点和扩散模型的切入点
1.1 传统3D流程的瓶颈
先说行业现状。一个标准的3D资产生产管线,通常是:概念设计确定风格,建模师用多边形网格搭出大体结构,拆UV,烘焙法线贴图,再交给材质师做纹理,最后进引擎或渲染器验证效果。这串流程里,每一步都依赖人工决策,而且每一环节的错误都会被后续环节放大。比如基础模型的比例稍微出了问题,后续的UV、贴图、绑定都要返工,返工成本随着环节靠后指数上升。
如果说静态资产还能靠熟练工硬扛,那动态资产、大规模场景、多类别资产生成就是完全另一个量级的问题。一个游戏项目动辄几千个可交互物件,一个影视项目可能需要上百个角色和载具,如果用传统流程,光排期就能把人逼疯。我见过不少团队尝试用程序化生成来缓解压力,但程序化方案的缺陷也很明显:它能做“同类变异”,很难做“跨类创造”,更不用说在风格统一的前提下生成全新结构。
所以这个领域一直在等一个真正能“从数据分布里学出泛化能力”的生成方案。这也是扩散模型被3D研究者盯上的根本原因——它在图像领域的表现已经证明,只要数据量和模型容量够,它能学出非常复杂的条件分布。
1.2 为什么偏偏是扩散模型
有人可能会问:GAN不是也可以做生成吗?早期3D生成也确实有基于GAN的方案,比如把体素或点云作为生成对象。但GAN有两个绕不开的老毛病:训练不稳定,模式坍缩。对于图像这种规则网格数据,GAN已经够难调了,换到3D这种拓扑不固定的结构上,训练难度会再上一个台阶。生成质量高不高先不说,光是“判别器怎么定义真实感”就是个哲学问题。
扩散模型的思路完全不同。它不靠对抗,靠的是“先破坏、再修复”的概率学习。训练时,把真实3D资产逐渐加噪直到变成纯噪声;推理时,从一个随机噪声开始,一步一步去噪,最终恢复成一个合理的3D结构。这种方式避免了对抗训练的不稳定,而且每一步去噪都是回归任务,损失函数简单直接。更关键的是,扩散模型天然支持条件生成:只要在去噪过程中输入类别标签、文本描述或图片特征,就能控制生成方向,这一点对资产生成来说太重要了。
3D-Diffusion这个方向正是把这些优势迁移到了3D领域。它不需要像GAN那样和判别器斗智斗勇,也不需要像自回归模型那样按固定顺序一点点“猜”下一个token,而是把整个3D对象当作一个整体来去噪。这种“整体生成”的直觉,和人看到一团乱线时自动脑补出一个轮廓的过程很像。
1.3 标题里的“Scalable”到底在说什么
标题里的“Scalable”不是一个营销词汇,它同时指向三个层面的扩展能力。第一是类别规模:早期3D生成模型往往只能生成单一类别,比如只生成椅子或者只生成车,而可规模的方案要能用同一个模型覆盖几百个类别。第二是数据规模:3D数据不像图像那么好获取,公开的3D数据集在数量、标注质量、类别平衡上都远不如2D数据,可规模化的前提是能高效利用有限的数据。第三是模型和算力规模:如果把扩散模型的主干做大,训练数据增多,生成质量能不能持续稳定提升,而不是一到某个规模就崩掉。
这三点合在一起,才是“Scalable 3D Asset Generation”的真正含义。它不是某一种技巧的堆叠,而是一个系统工程:数据怎么组织、3D怎么表示、模型怎么训练、推理怎么控制,每一环都要为规模化设计。少了任何一环,规模上去之后都会出问题。比如数据量大了但表示不合理,训练成本会爆炸;表示合理但模型结构不适合并行,扩展性也受限。
所以后续所有技术细节,都应该围绕“怎么在保证生成质量的前提下,把模型、数据和算力都推到更大规模”这条主线来理解。
2. 选对“积木”:3D表示方法决定了扩散模型的成败
2.1 三种主流3D表示的横向对比
扩散模型需要一个明确的“生成目标”,也就是说,我们需要先决定让模型输出什么格式的3D数据。这个选择直接决定后续所有设计,可以说是整个方向的基石。目前主流的3D表示大概有三类:显式结构化表示、隐式神经场表示、以及显隐混合表示。
显式结构化表示包括体素、点云和多边形网格。体素就是3D像素,结构规则,方便做卷积,但分辨率一大内存就爆炸;点云存储效率高,但缺少拓扑信息,模型要额外处理点与点之间的连接关系;网格是工业界的标准格式,有面和顶点的关系,但生成网格的拓扑本身就是一个很复杂的离散问题,扩散模型处理离散结构并不顺手。
隐式神经场表示的代表是NeRF那一套,用神经网络把空间坐标映射成密度和颜色。它的优点是能表达精细的连续几何和纹理,内存占用固定,分辨率只取决于查询点的数量;缺点也很明显,一个资产对应一个训练好的MLP,很难直接“生成”一个可以继续编辑加工的网格。
显隐混合表示则是两者取长补短,最具代表性的就是三平面(tri-plane)。它将3D空间投影到三个正交的2D特征平面上,每个位置的特征由它在三个平面上的投影拼接而成,然后再接一个小规模解码器得到密度和颜色。2D特征平面可以存成普通图像张量,又规则又紧凑,这让扩散模型可以直接复用2D的U-Net骨干,不用为3D重新发明网络架构。
| 表示方式 | 规则性 | 内存开销 | 生成难度 | 工业可用性 |
|---|---|---|---|---|
| 体素 | 高 | 高 | 中(分辨率受限) | 中 |
| 点云 | 低 | 低 | 高(需处理拓扑) | 中 |
| 网格 | 低 | 低 | 极高(离散结构) | 高 |
| NeRF/神经场 | 中 | 中 | 中(需拟合MLP) | 低 |
| 三平面 | 高 | 低 | 低(复用2D卷积) | 中 |
2.2 三平面表示为什么适合扩散
三平面之所以在很多3D扩散方案中被当作默认选择,核心原因就是“规则”。扩散模型的骨干网络基本都是基于卷积或者注意力机制设计的,这些结构对规则网格数据极其友好。体素虽然是规则三维网格,但计算量是立方级别的;三平面把三维相关性拆成三张二维图,计算量变成了平面级别,大大降低了训练和推理成本。
从信息完整性角度看,三平面并没有严重丢信息。空间里任意一点,可以通过它投影到XY、XZ、YZ三个平面上的位置,取出三组特征向量,再拼接成一个总特征。这个总特征既包含了点的局部位置信息,又通过三个方向的投影携带了空间的全局一致性。换句话说,三平面是用“三个方向看的视角”替代了“全空间的稠密存储”,是一种非常聪明的压缩。
而且三平面还有一个隐性优势:它和2D扩散模型之间的知识迁移特别顺滑。2D图像扩散模型已经在海量图文数据上预训练过了,如果3D扩散模型也采用类似的2D卷积骨干,就能用预训练权重做初始化,相当于把2D空间学到的先验搬到3D空间来。这个初始化带来的收益在训练早期特别明显,能让模型在数据量有限的前提下快速收敛到合理形状。
2.3 表示层面还需要解决的工程细节
选了三平面不等于万事大吉,还有很多工程细节会直接影响生成质量。首先是平面分辨率,每个特征平面的尺寸需要和生成精度匹配。分辨率太低,细节糊成一团;分辨率太高,扩散模型的通道数、显存占用都跟着涨。我在实际测试中,对于单物体生成任务,平面分辨率128到256之间是比较合理的起步区间,再高就需要考虑分块训练或者渐进式生成。
其次是解码器的设计。三平面本身只是特征存储,真正输出几何和颜色要靠一个小MLP解码器。这个解码器虽然轻量,但不能太浅,否则高频率细节会被直接“抹平”。我倾向于至少用4层带位置编码的MLP,并在输入特征之前拼接坐标的低频和高频编码,这样能显著提升几何细节的还原度。
还有一个容易被忽略的是空间范围的规范化。3D数据集的物体尺度差异很大,有的物体只有几十厘米,有的好几米。如果不做归一化,扩散模型会浪费大量生成能力在“尺度猜测”上。通常的做法是:把所有资产缩放到一个单位球或单位包围盒内,并在训练时把规范化的变换矩阵也存下来,推理完成后再根据条件信息恢复真实尺度。
3. 让噪声学会雕刻:3D扩散模型的核心机制拆解
3.1 前向过程:把3D资产“揉碎”
扩散模型的训练离不开前向扩散过程。对于三平面表示,前向过程就是对特征平面逐步加噪。具体来说,给定一张来自三平面表示的2D特征图,我们按一个预设的噪声调度器,在若干步内不断叠加高斯噪声,直到特征图完全被噪声淹没。
这个过程本身不复杂,复杂的是如何设计噪声调度。噪声步数太少,模型学不到从纯噪声恢复细节的能力;步数太多,训练成本成倍增加。现在一般用的是余弦调度或者它在3D任务上的变体,让噪声增加速度在中期平缓、在两端陡峭,这样模型在中期能看到更多“处于合理模糊状态”的样本,更容易学到有意义的去噪映射。
我在实践中还会关注一个细节:噪声加在哪个特征图上。三平面有三个正交平面,如果所有平面加同样强度的噪声,相当于假设三个方向的复杂度一致。但实际上,不同类别的物体在三个方向上的复杂度差异很大。比如一把椅子,XY平面的结构信息很多,XZ平面相对简单。给三个平面独立设置噪声强度,甚至让模型同时预测三组噪声残差,效果往往比统一加噪好。这个属于实现细节,论文里不会写,但影响非常直接。
3.2 逆向过程:从噪声长回形状
逆向过程是扩散模型真正干活的阶段。推理时,我们从三个随机高斯噪声平面出发,送入去噪网络,反复迭代若干步,预测每一步应该减掉的噪声,最终得到“干净”的三平面特征图。拿到干净的三平面之后,再用解码器稠密查询空间中的点,得到密度场和颜色场,最后用marching cubes之类的方法提取成网格资产。
去噪网络一般沿用2D扩散模型的主流结构,比如带时间步嵌入的U-Net或者DiT(Diffusion Transformer)。U-Net的优势是卷积的局部性强,对几何细节敏感;DiT的优势是全局建模能力好,容易扩展到更大的模型和数据量。两种我都试过,结论是:如果算力有限,先上U-Net,效果好、调参成本低;如果目标就是跨类别大规模生成,DiT的扩展性更值得押注。
这里有一个很多人没注意到的问题:三平面虽然被存成2D图,但它不是普通照片。一个特征平面的不同区域之间天然存在三维空间中的连续性——比如一个物体表面会在同一平面特征图上形成连续的纹理轨迹。因此,去噪网络不能只按普通图像处理,需要在特征提取的同时保留这种跨通道、跨平面的对应关系。最简单的做法是特征融合:在每个去噪block里,把三个平面两两组合做一次交叉注意力,让网络在去噪时能看到三视图之间的关系。这个设计不算复杂,但对生成形状的完整性提升很明显。
3.3 条件控制与生成自由度
扩散模型的另一个核心优势是条件的灵活注入。在3D资产生成场景里,我们最想要的控制方式通常是两种:类别标签控制和条件模态控制。类别标签控制最简单,直接把类别编码拼进时间步嵌入里就行;条件模态控制则更进一步,比如输入一张参考图、一段文字描述,甚至一个粗糙的线稿,让模型生成符合这个条件的3D资产。
做条件注入时,classifier-free guidance 几乎是必选方案。它的做法是:训练时随机丢弃一部分条件信息,让模型同时学会“有条件下生成”和“无条件生成”,推理时用两条路径的预测结果做外推,从而放大条件信号对生成结果的影响。这个技巧在2D图像生成里是扛把子,换到3D同样适用,而且效果提升非常直观——配合这个技巧,几何的类别属性和风格一致性都会有显著增强。
控制条件是强化生成可控性的关键,但它对训练数据的配对要求也更高。公开3D数据集里,有文本标注的子集比例并不高,能做到图文对和3D资产严格对齐的更少。一种妥协方案是先用无条件的3D扩散模型学几何分布,再在推理时引入一个跨模态对齐网络,把文本或图片特征映射为条件向量。这种两段式设计虽然不如端到端优雅,但解决数据缺失问题的效果立竿见影。
4. 从单类别到多类别:可扩展性的工程实现路径
4.1 数据如何组织:形状到什么程度算一个样本
可扩展性的起点是数据组织。3D资产和2D图像最大的不同在于,它没有一个统一的“分辨率”概念。一个网格有顶点数,一个神经场有隐层宽度,一个三平面有平面分辨率——这些指标彼此不互通。所以第一步要做的,是把异构数据统一成同一种样本格式。
在三平面方案里,统一流程大致是:对每个原始3D资产,先渲染多视角图像,再从多视角图反向拟合出对应的三平面特征,称为“编码”阶段。每个资产最终对应三张固定分辨率的特征图,这三张图就是扩散模型训练的完整样本。这一步相当于把各种格式的mesh、点云、神经场全部压缩成标准张量,之后无论数据来自哪个源,模型看到的都是同一空间的数据分布。
这个编码阶段的质量直接决定扩散模型的上限。如果拟合出来的三平面本身就有噪声或失真,后续扩散模型无论如何都学不出干净的分布。所以编码阶段不能贪快,一般需要足够的迭代步数,并在损失函数里加上深度监督和正则化,确保三平面在几何上忠实于原始资产。我见过不少团队在这里为了省时间降低迭代步数,结果扩散模型的生成质量莫名其妙地下降,排查半天才发现是训练数据本身就不干净。
4.2 模型骨架选UNet还是Transformer
到了模型规模这个层面,选择骨干网络就不再是“哪个更高效”这么简单了,而是要考虑扩展曲线。UNet加宽加深到一定程度之后,增加参数带来的收益会迅速衰减;DiT这类Transformer架构则比较平滑,参数量级从百万到十亿都能保持近似线性的收益。
但这不代表无脑上DiT就是对的。DiT需要用大量的数据才能发挥优势,3D数据的规模比图像小几个数量级,数据不足时Transformer更容易过拟合,生成结果会偏向训练集的平均形状,多样性反而下降。我的建议是分阶段走:在原型验证阶段用UNet,快速验证数据管道和训练流程;当数据规模和类别数都上台阶之后,再迁移到DiT做大规模训练。UNet模型的输出也可以作为DiT模型的初始化数据蒸馏来源,实现模型架构的无缝升级。
另一个和骨干网络配套的关键设计是时间步嵌入和规模正则。扩散模型的骨干随着规模增大,对时间步的感知能力要求也越高。如果时间步嵌入的维度不足,模型会难以区分“需要大改”和“只需微调”的阶段,导致去噪过程中出现结构性的抖动。这个细节容易被忽略,但当你把模型从几十M参数涨到几百M参数时,时间步嵌入的通道数基本要翻倍才能维持同等生成质量。
4.3 两阶段生成与规模化训练细节
真正让3D资产生成做到“内容级”可用,往往还需要两阶段策略:先粗后细。第一阶段用较低分辨率的特征平面生成整体形状和大致纹理,第二阶段在条件约束下修复细节,补充高频信息。两阶段的好处是把问题从“一步到位解决所有像素”转化为“逐步逼近目标”,极大降低单次学习的难度。
两阶段之间如何衔接也是技术活。一种方案是让第二阶段的模型以第一阶段的输出作为条件,这个条件可以是特征图的下采样版本,也可以是局部渲染图。另一种方案是让两个阶段共享同一个骨干,只是在不同分辨率上训练,训练过程中先用低分辨率预训练,再在高分辨率上微调。后者在部署上更有优势,因为最终推理时只用一个模型,省了一半显存。
规模化训练还有几个不得不提的工程技巧:
- 混合精度训练是必须的,但损失缩放需要针对3D特征图调整,不能用2D图像任务的默认值直接套。
- 大规模训练时的数据采样要按类别做频率平衡。3D数据集里椅子、桌子这类常见品类样本极多,而一些冷门品类样本极少,如果不做平衡,模型会严重偏向高频类别。
- 有条件训练时的条件丢弃比例不能照搬2D。2D常用的10%丢弃率在3D任务上容易导致条件信号过弱,我测试下来20%到30%之间的表现更稳定。
这些细节单独看都不大,但叠加在一起,就是“可扩展”和“只能跑通demo”这两种结果之间的差距。
5. 实操视角:一个最小可行3D扩散Demo怎么落地
5.1 环境与数据准备
如果和我一样是想先跑通验证流程,我建议不要一开始就上完整的多类别大规模方案,而是先做一个最小可行Demo。目标可以定为:给定一个公开3D数据集的小规模子集,训练一个能生成单类别资产的三平面扩散模型。
环境方面,我用的是一张24G显存的卡,框架选PyTorch。主要依赖包括diffusers库(负责扩散调度器和采样器)、以及配套的3D处理库用于渲染和网格提取。数据预处理流程是:从原始网格渲染多视角图,然后用一个预训练编码器把多视角图拟合为三平面特征。这里不需要自己从零写编码器,很多开源实现可以直接复用,但要注意开源实现里往往有多环境耦合问题,建议在干净环境里重建依赖并验证编码器输出形状后再进入训练。
5.2 一步步搭建并训练
我的搭建路径大致分四步:
第一步,准备数据管线。把原始网格文件读进来,做缩放归一化、去掉重复顶点、统一朝向,然后渲染多视角图。渲染分辨率不必太高,因为三平面编码阶段本身会做特征压缩,高分辨率渲染只会浪费磁盘。
第二步,生成三平面训练集。用编码器批量转换多视角渲染图为三平面特征图。我通常会把每张特征图做一次质量检查:可视化三平面的RGB通道和密度通道,确认几何轮廓是清晰的,而不是一坨模糊色块。这里发现问题要比训练完再查省力得多。
第三步,搭建去噪模型。第一阶段用一个小型U-Net,参数量控制在100M以内,输入输出通道数对齐三平面特征的通道数。训练配置可以直接参考2D扩散模型,但要修改噪声调度器,让总步数放宽到2000步左右。3D特征图的噪声敏感性比自然图像高,步数太短会造成生成结果出现波纹状伪影。
第四步,训练和采样。训练完一个checkpoint后,用DDIM采样器生成三平面,再用解码器查询点云和网格。我第一次跑通全流程时踩了个大坑:生成的网格总有一面是塌陷的。排查下来发现是采样时只用了三个平面中的两个,第三个平面被采样器错误地当作图像通道处理。这个教训让我意识到,三平面扩散虽然复用2D结构,但代码中必须时时保留“三个独立特征平面”的语义,不能把它当成普通三通道图像处理。
5.3 踩坑记录:训练不稳定和生成全黑
训练不稳定的问题在3D扩散里非常常见,症状大约是:loss不降,或者loss降了但采样结果全是噪声。遇到这种情况,我先检查三平面编码器的输出范围。不同编码器出来的特征值范围差异很大,有的在0到1,有的在-1到1,甚至有人会在特征里混入指数激活。扩散模型对输入范围极其敏感,如果特征的均值和方差和预训练2D模型假设的不一致,去噪网络会专注于拟合错误统计量,导致loss虚低但采样全黑。
我建议在进入模型之前对三平面特征做一次均值和方差归一化,并把这个归一化统计量保存好,在推理时反向还原。另一个常见问题是生成结果虽然形状合理,但纹理区域出现重复斑纹。这个多半是解码器的位置编码频率设置太高,高频编码放大了特征图中的微小噪声。调低最高频率,或者改成可学习频率,基本能解决。
还有一个需要特别提醒的:三平面和2D图像的通道顺序。把三平面当成三张独立的图喂给模型,和把它们拼接成一个三维张量喂给模型,训练效果差异巨大。前者每个平面独立卷积,特征之间缺乏交互;后者则天然具有平面间的通道注意力。我在最小Demo里选了后者,效果明显更稳。
6. 常见问题与排查技巧实录
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 生成结果全是噪声/黑块 | 三平面特征未归一化或范围失真 | 统计训练集特征均值方差,训练前统一归一化 |
| 网格某一面塌陷或缺失 | 三平面语义被当作普通张量处理 | 检查代码中三张特征图的索引映射,避免平面混淆 |
| 生成类别正确但形状单一 | 数据采样不平衡导致模式坍缩 | 训练时按类别做加权采样,增加条件丢弃率 |
| 纹理出现规律斑纹 | 解码器位置编码频率过高 | 降低高频编码上限,或改用可学习位置编码 |
| 训练loss稳定但评估指标下降 | 混合精度损失缩放不合适 | 针对3D特征图重调loss缩放因子,关闭部分层的低精度计算 |
| 采样速度太慢 | 去噪步数设置过密 | 换用DDIM采样器并逐步减少步数,30到50步即可 |
6.1 资源不够时的曲线救国方案
如果没有24G大显存,第一个想到的肯定是用梯度累积,但这只解决“显存峰值”问题,不解决“训练太慢”问题。实际上还有三条更实用的路。
第一条是降低特征平面分辨率,64×64起步,验证完loss和采样流程后再向上提分辨率。这就像先画草稿再描细节,流程跑通了才值得堆算力。第二条是用现成的2D扩散模型做初始化,把骨干网络换成预训练权重之后,3D解码器和输入输出层随机初始化,这样模型在早期就能利用2D稳定特征,收敛速度肉眼可见地加快。第三条是从单类别场景起步,用一个类的数据把整个训练链路打通,再逐步加入其他类别。很多多类别训练中才暴露的问题,其实单类别阶段就能通过生成质量间接发现。
6.2 判断生成质量的三板斧
判断一个3D扩散模型到底行不行,光看渲染图是不够的,渲染角度好看很容易给人错觉。我常用的三个指标:
第一看多视角一致性。围绕生成结果转一圈,如果某个视角突然出现奇怪的凹陷、凸起或者纹理撕裂,说明三平面编码里存在视角不一致,这是扩散模型没学好的典型症状。第二看拓扑合理性。生成一个椅子如果出现椅背直接穿模连接椅座,哪怕渲染图再漂亮,这个模型也需要重新审视。第三看编辑稳定性。把网格导入常规建模软件,做一次平滑或者重拓扑,看生成的密集网格能不能优雅地降面。能优雅降面的模型才是真正理解了结构,否则只是在密度场上“背”出了一个类别的平均值。
7. 你可以怎么扩展这个方向
7.1 从静态资产到动态资产
三平面扩散模型解决的是静态资产生成,但实际项目里还需要大量动态资产,比如会动的机械臂、人物角色的衣物摆动。扩展思路大致有两类:一类是在三平面之外增加时间轴维度,让扩散模型同时生成多帧特征平面,但训练成本会成倍上升;另一类是保持静态生成不变,在资产生成后才用其他网络做动态变形场预测。后者更符合工程惯例,因为它把“形状生成”和“动态摆姿”解耦,两个环节可以分别优化。如果追求效率,可以先生成静态资产并验证几何质量,再考虑动态扩展。
7.2 与多模态大模型的交叉
扩散模型在3D领域还有一个极具潜力的方向是和多模态大模型交叉。如果用文本或者图像作为条件控制3D生成,就能实现“给一段描述,直接拿回一个可用的3D模型”。这个方向上最大的瓶颈还是在数据配对质量和数量,但已经有越来越多的团队在尝试用合成语料扩充图文到3D的对齐数据。
我在实际测试中,用预训练的图文对齐模型生成伪条件向量,再喂给3D扩散模型,效果比我预期的好。尽管条件向量的质量参差不齐,但扩散模型的自回归去噪过程本身就具备一定纠错能力,它能自动忽略部分噪声条件,生成结果仍然符合几何常识。这说明3D扩散模型和跨模态条件注入之间是天然兼容的,未来如果能突破数据瓶颈,这个方向会成为AIGC的核心一环。
7.3 推理加速与轻量化部署
就算训好了模型,工程落地还逃不开推理速度问题。扩散模型采样动辄几十上百步,3D应用里还要额外跑解码器和网格提取,延迟很容易让人失去耐心。我试过几个加速方案,每个都有具体适用场景。
训练阶段就加入蒸馏方案是性价比最高的路径。把多步扩散“蒸馏”成单步或者少步生成,相当于让模型把几十步的精力压缩到几步内迸发出来,质量会有损失,但延迟可以从秒级降到毫秒级。另一种是换用一致性模型架构,它直接把任意噪声一步映射到数据分布,省掉了迭代采样环节,缺点是生成多样性会比全步扩散略低。最后是工程层面的优化,比如三平面解码器换成可转成ONNX的模型,推理时用GPU并行解码多个候选点,配合网格提取的并行化改造,整体吞吐能提升不少。
写在后面
从最开始的体素GAN一路做到三平面扩散,我的感受是这个方向正在把3D资产生成从一个“玄学活”变成一个“工程活”。以前调生成模型像碰运气,现在有了扩散模型这套稳定的学习框架,加上可扩展的3D表示,问题更多变成了数据和算力的工程问题。我个人在实际操作中最深的体会是:不要一开始就追求大模型、大批次,先把单类别、低分辨率的小链路跑通,跑通之后你才会真正理解三平面、噪声调度和条件控制之间的微妙关系。等这个最小系统稳定了,再去加数据、加参数、加类别,才是可规模化的正确姿势。后面有时间我打算再写一篇从两阶段生成推进到文本驱动3D资产生成的实操记录,继续和大家交流。