Magic3D 是 NVIDIA 在 CVPR 2023 发表的文本生成 3D 方法(arXiv:2211.10440,Chen-Hsuan Lin、Jun Gao、Karsten Kreis、Sanja Fidler、Ming-Yu Liu、Tsung-Yi Lin 等)。它要解决的是 DreamFusion 的两个硬伤:监督分辨率太低、优化太慢。做法是两段式——第一段用 64×64 的低分辨率扩散先验配合 Instant-NGP 稀疏哈希网格快速拿到粗模,第二段把粗模转成可形变四面体网格(DMTet),接 nvdiffrast 可微光栅化器,在 512×512 的潜空间扩散模型下直接优化带纹理的三角网格。论文报告的监督分辨率是 DreamFusion 的 8 倍,8 张 A100 上粗模 15 分钟、精修 25 分钟,合计 40 分钟,比 DreamFusion 约 1.5 小时快一倍,用户调研中 61.7% 的评测者更偏好 Magic3D 的结果。
先把最关键的一件事说清楚:Magic3D 没有官方开源实现,也没有可下载的权重。论文的粗模阶段用的是 NVIDIA 内部的 eDiff-I 基础扩散模型,这个模型本身就没有公开。你在网上搜到的所有能跑的 Magic3D,实质都是社区复现,其中被接受为事实标准的是 threestudio(threestudio-project/threestudio,Apache-2.0),它用开源 T2I 模型替掉 eDiff-I,提供三个配置:magic3d-coarse-if.yaml 用 DeepFloyd/IF-I-XL-v1.0 引导、guidance_scale 20、64×64 渲染、implicit-volume 几何、哈希网格 n_levels 16、log2_hashmap_size 19、跑 10000 步;magic3d-coarse-sd.yaml 是显存更省的 Stable Diffusion 路线;magic3d-refine-sd.yaml 用 stabilityai/stable-diffusion-2-1-base、guidance_scale 100、512×512 渲染、tetrahedra-sdf-grid 几何、isosurface_resolution 128、跑 5000 步。另一条路是 ashawkey/stable-dreamfusion,它的 --dmtet 阶段本质上就是 Magic3D 的精修思路。
官方给出的显存标注很低——coarse-sd 约 6GB、refine-sd 约 5GB、coarse-if 约 15GB 抽文本嵌入加 10GB 训练——但这些数字对应的是默认的小 batch。threestudio 自己在 README 里演示的效果用的是 batch size 8,论文用的是 32,而 batch size 恰恰是 SDS 类方法里 3D 一致性和收敛速度的主要来源。所以现实的租卡逻辑不是「6GB 就够」,而是「有多少显存就把 batch 提到多少」。这也是为什么按秒计费的短租对 Magic3D 特别合适:你不是在跑一个常驻推理服务,而是一个 prompt 一次、几十分钟到几小时的优化任务,跑完导出 obj,机器就该停。
01 —
Magic3D 有哪些能跑的版本
原论文不可复现,下面四条是实际可执行的路径,显存数字取自各自项目的官方标注。
| 版本 | 参数量 | 显存 | 上下文 | 说明 |
|---|---|---|---|---|
| Magic3D 原论文(NVIDIA,CVPR 2023) | eDiff-I 基础模型 + 潜空间扩散,batch size 32 | 8× A100 80GB,官方未标单卡显存 | 粗模 64×64 / 精修 512×512,各 5000 步 | 代码与权重从未发布,eDiff-I 本身不公开,无法原样复现,只能作为方法基准阅读。 |
| threestudio configs/magic3d-coarse-if.yaml | DeepFloyd/IF-I-XL-v1.0 引导,guidance_scale 20 | 约 15GB 抽文本嵌入 + 约 10GB 训练(默认 batch) | 64×64 渲染,max_steps 10000 | 质量最好的粗模路线。IF 权重是门控的,要先在 Hugging Face 模型页接受协议并 huggingface-cli login。 |
| threestudio configs/magic3d-coarse-sd.yaml | Stable Diffusion 引导 | 约 6GB(默认 batch) | 64×64 渲染,implicit-volume + 哈希网格 | 省显存的粗模路线,适合先把管线跑通、验证 prompt 和相机参数,再换 IF 出正式结果。 |
| threestudio configs/magic3d-refine-sd.yaml | stabilityai/stable-diffusion-2-1-base,guidance_scale 100 | 约 5GB(默认 batch) | 512×512 渲染,isosurface_resolution 128,max_steps 5000 | DMTet 精修阶段,产出带纹理的三角网格。必须用 system.geometry_convert_from 接上粗模的 last.ckpt。 |
| ashawkey/stable-dreamfusion --dmtet | Instant-NGP 主干 + DMTet 精修 | 约 16GB(Instant-NGP 主干) | --iters 5000,需单独下载 256 分辨率四面体网格 | Apache-2.0。作者本人在 README 里推荐去看 threestudio,把它当作更轻量的备选而非首选。 |
| 前馈式后继方案(对照参考) | TRELLIS text-xlarge 2.0B / Hunyuan3D 2.1 DiT 3.0B + Paint 1.3B | TRELLIS 需 ≥16GB;Hunyuan3D 形状 6GB、形状加贴图 16GB | 单次前向,秒级到分钟级 | 不做逐 prompt 优化。要的是量产资产就走这条;要的是可控的蒸馏实验才留在 Magic3D。 |
02 —
Magic3D 该租哪张卡
按 batch size 而不是按官方最低显存挑卡——batch 才是 3D 一致性的来源。
先跑通管线:coarse-sd 加 refine-sd,默认 batch,验证 prompt 和导出链路
RTX 3090 24GB$0.193/卡·时
官方标注的 6GB 加 5GB 在 24GB 上绰绰有余,这是把整条两段式流程跑完一遍最便宜的方式。
出正式结果:coarse-if 粗模,15GB 抽嵌入加 10GB 训练,batch 提到 8
RTX 4090 24GB$0.540/卡·时
DeepFloyd IF-I-XL 的文本嵌入抽取峰值就要 15GB,24GB 才能在抽完不释放的情况下继续把 batch 拉起来。
追论文质量:batch size 拉到 16 到 32,512×512 精修不降分辨率
RTX A6000 48GB$0.817/卡·时
48GB 能容下 IF 引导加大 batch 的激活,同时留出 DMTet 四面体网格和 nvdiffrast 缓冲的余量。
批量出资产:一个节点上并行排几十个 prompt 的优化任务
A100 SXM4 80GB$1.088/卡·时
80GB 单卡可同时跑多个 trial,NVLink 节点最多 14 卡,直接对标论文的 8 卡配置。
03 —
从开机到导出 obj 的四步
选 PyTorch 预置镜像开机,剩下的都在一个 SSH 会话里完成。
- 01
开机装环境,处理好两个编译坑
在 NexGPU 控制台选 PyTorch 预置镜像开一台 24GB 及以上的卡,SSH 进去克隆 threestudio。tiny-cuda-nn 的构建有时需要把 pip 降到 23.0.1,先装 ninja 能显著缩短 CUDA 编译时间。精修阶段依赖 nvdiffrast,无头机器上它要走 EGL,缺驱动库就会在编译 nvdiffrast_plugin_gl.so 或运行时 eglInitialize() 报错——预置镜像里已经带好这套库,自己从裸 Ubuntu 起就得手动补 libegl1 和 libgl1。
git clone https://github.com/threestudio-project/threestudio && cd threestudio && pip install ninja && pip install -r requirements.txt - 02
跑粗模阶段,DeepFloyd IF 要先过门控
IF-I-XL-v1.0 是门控权重,必须先在 Hugging Face 的模型页面上接受许可协议,再在机器上 huggingface-cli login 贴入 token,否则拉权重会直接 401。配置默认跑 10000 步、64×64 渲染。显存有富余就把 data.batch_size 从默认值提上去,这是 threestudio 官方 README 里排第一条的提质建议。如果只是想先看看管线通不通,把配置换成 magic3d-coarse-sd.yaml,6GB 就能起。
python launch.py --config configs/magic3d-coarse-if.yaml --train --gpu 0 system.prompt_processor.prompt="a delicious hamburger" data.batch_size=8 - 03
转 DMTet 精修,调好等值面阈值
精修阶段用 system.geometry_convert_from 指向粗模 trial 目录里的 last.ckpt,几何类型从 implicit-volume 切成 tetrahedra-sdf-grid,渲染分辨率抬到 512×512,跑 5000 步。粗模密度场偏空或者浮点碎片多的时候,网格会抽空或者边缘发白,这时用 system.geometry_convert_override.isosurface_threshold 手动调阈值,官方示例给的是 10.,往上调收紧、往下调放松。
python launch.py --config configs/magic3d-refine-sd.yaml --train --gpu 0 system.prompt_processor.prompt="a delicious hamburger" system.geometry_convert_from=outputs/magic3d-coarse-if/a_delicious_hamburger@LAST/ckpts/last.ckpt system.geometry_convert_override.isosurface_threshold=10. - 04
导出网格,取走文件再停机
mesh-exporter 默认导出 obj 加 mtl,直接能拖进 Blender 或 Unity。导完 scp 或者从 Jupyter 里下载走,然后在控制台停实例——计算按秒计停机即止,存储会一直计到卷被销毁为止,所以中间结果确认不用了就顺手把卷删掉。
python launch.py --config outputs/magic3d-refine-sd/a_delicious_hamburger@LAST/configs/parsed.yaml --export --gpu 0 resume=outputs/magic3d-refine-sd/a_delicious_hamburger@LAST/ckpts/last.ckpt system.exporter_type=mesh-exporter
一个资产到底要花多少钱
先算论文那套配置的等价成本。Magic3D 论文的 40 分钟是在 8 张 A100 上测的,NexGPU 的 A100 SXM4 80GB 是 $1.088/卡·时,8 卡就是 $8.704/时;40 分钟等于 0.667 小时,$8.704 × 0.667 ≈ $5.81,这就是复刻论文速度跑出一个资产的账面价格。再算省钱路线:单张 RTX 3090 24GB 是 $0.193/卡·时,coarse-sd 加 refine-sd 一整轮按跑满 4 小时估(实际时长取决于 batch size 和步数),$0.193 × 4 = $0.772 一个 prompt;同样的预算跑 20 个 prompt 是 $0.193 × 4 × 20 = $15.44,比大多数商用 3D 生成 API 的单资产定价乘以 20 还便宜。中间路线用 RTX 4090 24GB 跑 IF 粗模,$0.540 × 4 = $2.16 一轮。存储另算:一个 trial 目录含 checkpoint 和逐步渲染的验证视频大约 5GB,$0.414/GB·月 × 5 ≈ $2.07/月,导出 obj 之后把卷销毁就不再计费。没有起租时长、没有开通费、没有配额审批,粗模不满意随时 Ctrl-C 换 seed 重来,只按实际跑的秒数付钱。
04 —
