跳到主要内容

3D 生成模型

LGM 本地部署:10GB 显存跑通图生 3D,真正吃显存的不是它本身

LGM 本体只有 0.415B 参数、fp16 权重 830MB,一张 24GB 卡装得下三个模型还剩一大半。难点从来不在显存,而在两个要现编的 CUDA 扩展、一个被 readme 写错的权重文件名,和无头服务器上必炸的 nvdiffrast。

LGM 的全称是 Large Multi-View Gaussian Model,来自北大与南洋理工 S-Lab 的 Jiaxiang Tang(ashawkey)等人,论文 arXiv:2402.05054,代码在 3DTopia/LGM,权重在 ashawkey/LGM,代码与权重都是 MIT。它的思路很干脆:不做 SDS 优化,也不直接回归网格,而是先用多视角扩散模型把一张图(或一句提示词)变成 0°/90°/180°/270° 四个视角,再喂给一个非对称 U-Net,逐像素吐出 14 个通道 —— 3 维位置、1 维不透明度、3 维尺度、4 维旋转四元数、3 维颜色,也就是一个 3D 高斯的全部参数。四张 128×128 的特征图拼起来就是 65,536 个高斯,论文宣称 5 秒出一个 3D 物体,训练渲染分辨率拉到了 512。

所以搞清楚显存花在哪很重要。LGM 自己的 fp16 权重只有 830MB,官方 readme 写的「约 10GB」是整条链路的总账:ImageDream(图生 3D,guidance 5.0)或 MVDream SD2.1(文生 3D,guidance 7.5)跑 30 步扩散,加上 rembg 抠图的 U2-Net、LPIPS 的 VGG(训练时才载入)、以及最后 360° 环绕视频渲染的开销。换句话说,把 LGM 单独抠出来做推理服务,显存占用会低得多;但你照着官方脚本一把梭,就得按 10GB 起步准备。24GB 的卡是这条链路最舒服的落点 —— 不是因为跑不动,而是因为你还要留出空间给 convert.py 那段网格拟合。

还有一件必须讲清楚的事:LGM 是 2024 年 2 月的工作,readme 的 News 栏停在 2024.4.3 那次旋转归一化 bug 修复。今天开源 3D 生成的第一梯队已经换成了 TRELLIS(image-large 1.2B、text-xlarge 2.0B,官方要求至少 16GB 显存,MIT)和腾讯混元 Hunyuan3D 2.1(DiT 3.0B + Paint 1.3B,形状生成 6GB、形状加纹理 16GB)。但 LGM 没有被淘汰,它占的是另一个生态位:0.4B 参数、830MB 权重、MIT 无附加条款、单卡秒级出高斯、代码短到能整个读完。做批量预览、做资产初筛、做高斯泼溅管线的前端、做教学与二次开发的起点,它到今天仍然是性价比最高的那一个。

01 —

权重与配置:别拿错文件

官方只公开了 big 配置的权重,四个 safetensors 文件里只有一个是你该用的。

版本参数量显存上下文说明
big + model_fp16_fixrot.safetensors0.415B(415,042,848)权重 830MB/整条链路 ~10GBsplat 128 → 4×128×128 = 65,536 高斯,渲染 512唯一该用的版本。2024.4.3 修掉旋转归一化的严重 bug 后又微调了 30 个 epoch,命令行必须显式 --resume 到这个文件名。
big + model_fp16.safetensors(已废弃)0.415B权重 830MB同上,splat 128 / 渲染 512旋转归一化有 bug 的旧权重。坑在于 readme 的示例命令行至今还写着这个文件名,照抄就会拿到画质劣化的结果,而且不报错。
model_fixrot.safetensors(fp32 全精度)0.415B权重 1.66GB,按 F32 常驻splat 128 / 渲染 512要在 LGM 上继续训练、蒸馏或改架构,从这个全精度文件起步;纯推理没必要,infer.py 会直接 model.half()。
lrm / small 配置(无公开权重)同架构,少一层解码器训练 bf16、batch 8/卡splat 64 → 16,384 高斯,渲染 256,12 视角监督论文里的默认设置,up_channels 是 (1024,1024,512,256)。官方没放权重,想要只能自己训。
tiny 配置(无公开权重)下采样通道砍到 (32,64,128,256,512),官方未公布参数量训练 batch 16/卡splat 64 → 16,384 高斯,渲染 256,8 视角论文消融用的小架构。适合拿来验证训练管线是否跑通,或者在便宜卡上做数据实验。

02 —

该租哪张卡

推理 10GB 起步,但网格转换和训练复现是两个完全不同的量级。

  • 跑通图生 3D/文生 3D,出 .ply 和 360° 视频

    RTX 3090 24GB$0.193/卡·时

    10GB 的链路放进 24GB 绰绰有余,而且 Tesla T4 16GB 要 $0.298 —— 比它又贵又小,没有理由选。

  • 批量出资产 + convert.py 高斯转带贴图网格

    RTX 4090 24GB$0.540/卡·时

    网格化是 fit_nerf 512 步加 fit_mesh 2048 步的优化循环,纯算力活,Ada 的吞吐把每个资产的分钟数直接砍下来。

  • 常驻 Gradio 服务,同时挂 TRELLIS 或 Hunyuan3D 2.1 做效果对比

    RTX A6000 48GB$0.817/卡·时

    48GB 能把 LGM 全链路和一个 16GB 级别的新模型同时常驻,省掉反复换权重的冷启动。

  • 按官方 acc_configs/gpu8.yaml 复现训练

    A100 SXM4 80GB$1.088/卡·时

    big 配置是 bf16、batch 8/卡、8 视角监督加 LPIPS VGG,显存和 NVLink 都要够;NexGPU 单节点最多 14 卡,8 卡一次开完。

03 —

四步跑起来

torch 2.1.0 + cu118 是官方验证过的组合,两个 CUDA 扩展必须现场编译。

  1. 01

    开一张 24GB 卡,先把 torch 和 xformers 钉死

    官方明确写了 xformers is required。版本必须和 torch、CUDA 对齐,先装 torch 2.1.0 + cu118 再装 xformers,顺序反了 pip 会把 torch 拖回默认版本。NexGPU 的 PyTorch 预置镜像开机即用,按秒计费,编译这一段的钱是真的花不了几分。

    pip install torch==2.1.0 torchvision==0.16.0 torchaudio==2.1.0 --index-url https://download.pytorch.org/whl/cu118 && pip install -U xformers --index-url https://download.pytorch.org/whl/cu118
  2. 02

    编译 diff-gaussian-rasterization 和 nvdiffrast

    LGM 用的不是原版高斯光栅化器,而是 ashawkey 加了深度和 alpha 输出的分支,必须带 --recursive 克隆,否则子模块缺失直接编译失败。nvdiffrast 只有导出网格才用得上,但一起装完省事。两个都要 nvcc,镜像里带 CUDA toolkit 会顺很多。

    git clone --recursive https://github.com/ashawkey/diff-gaussian-rasterization && pip install ./diff-gaussian-rasterization && pip install git+https://github.com/NVlabs/nvdiffrast && pip install -r requirements.txt
  3. 03

    只拉修好旋转的那个权重

    830MB,一分钟的事。ImageDream(ashawkey/imagedream-ipmv-diffusers)和 MVDream SD2.1(ashawkey/mvdream-sd2.1-diffusers)会在首次运行时自动下载,注意它们是 trust_remote_code=True 加载的,离线环境要提前 warm 一遍缓存。

    mkdir -p pretrained && wget -P pretrained https://huggingface.co/ashawkey/LGM/resolve/main/model_fp16_fixrot.safetensors
  4. 04

    推理出高斯,再转成带 1024 贴图的网格

    infer.py 走 rembg 抠图、recenter(border_ratio 0.2)、ImageDream 30 步扩散、LGM 一次前向,输出 .ply 和 .mp4。convert.py 才是耗时的那一段:高斯先拟合成 NeRF(512 步),marching cubes 出面片,再 fit_mesh 2048 步、decimate 到 5 万面,最后烘 1024×1024 贴图。云上无显示器时 --force_cuda_rast 不是可选项,是必需项。

    python infer.py big --resume pretrained/model_fp16_fixrot.safetensors --workspace workspace_test --test_path data_test && python convert.py big --test_path workspace_test/saved.ply --force_cuda_rast

一次完整跑通要花多少钱

按 RTX 3090 24GB 的 $0.193/卡·时算一笔实账。第一次开机要编译 diff-gaussian-rasterization 和 nvdiffrast、拉 ImageDream 与 MVDream 权重,算 0.5 小时:0.5 × $0.193 = $0.0965。接着连续跑批量图生 3D 三小时:3 × $0.193 = $0.579。再用 convert.py 把挑中的高斯转成带贴图的 glb,一小时:1 × $0.193 = $0.193。合计 4.5 小时 × $0.193 = $0.8685 —— 不到一美元,整套 3D 生成管线从零跑通并产出可用资产。换成 RTX 4090 24GB($0.540/卡·时)同样 4.5 小时是 $2.43,多付的两美元买的是扩散采样和网格拟合这两段的时间。存储要分开算:LGM 的 fp16 权重 830MB,加上 ImageDream、MVDream 和输出的 .ply/.mp4/.glb,按 20GB 计是 20 × $0.414 = $8.28/月;实例一停计算就停止计费,但存储会一直算到你销毁它为止,所以跑完把 workspace 导出再删是最省的做法。真要从头复现训练,官方给的是 acc_configs/gpu8.yaml:A100 SXM4 80GB 按 $1.088/卡·时,8 卡就是 8 × $1.088 = $8.704/小时,NexGPU 单节点最多能开到 14 卡,不用申请配额、没有最低消费。

04 —

常见问题

LGM 本地部署到底需要多大显存?8GB 的卡够不够?

官方 readme 给的数字是约 10GB,指的是 ImageDream、MVDream 和 LGM 三个模型同时驻留的总量,8GB 会卡在多视角扩散那一步而不是 LGM 本身。LGM 的 fp16 权重只有 830MB,你完全可以把多视角扩散拆到另一张卡或另一个进程里,让 LGM 单独跑在小卡上。但对绝大多数人来说,直接开一张 RTX 3090 24GB 按 $0.193/卡·时跑完整链路,比花两小时改代码省钱得多 —— 在 NexGPU 上这两小时的机器成本是 $0.386。

为什么我在服务器上跑 convert.py 会挂在 nvdiffrast / OpenGL 上?

因为 nvdiffrast 默认走 OpenGL 后端,需要一个可用的显示上下文,而云上的 GPU 实例是无头的,没有 X server 也没有 EGL 设备。解法在 LGM 的 core/options.py 里已经准备好了:加 --force_cuda_rast 切到 CUDA 光栅化后端。这是把 LGM 搬上云最常踩的一个坑,NexGPU 的预置镜像里 CUDA toolkit 是齐的,加上这个 flag 就能直接跑通。

model_fp16.safetensors 和 model_fp16_fixrot.safetensors 有什么区别?

fixrot 是 2024 年 4 月 3 日修复旋转归一化严重 bug 后重新微调 30 个 epoch 的版本,前者是 bug 未修的旧权重。坑在于官方 readme 的示例命令行仍然写着 --resume pretrained/model_fp16.safetensors,而下载指令给的是 fixrot 那个文件,照抄命令行会静默地用错权重、拿到发糊的高斯且没有任何报错。永远显式写全 model_fp16_fixrot.safetensors。开一台按秒计费的实例做个 A/B,几美分就能亲眼看出差别。

LGM 出的是高斯还是网格?能直接导出 glb 给 Blender 或 Unity 吗?

infer.py 直接产出的是 3D 高斯的 .ply 和一段 360° 环绕 mp4,不是网格。要 glb 得跑 convert.py,那是一条 高斯 → NeRF → marching cubes → 网格拟合 → UV 烘焙 的优化链:fit_nerf 512 步、fit_mesh 2048 步(周期性 remesh,decimate 到 5 万面)、fit_mesh_uv 512 步烘 1024×1024 贴图。这是分钟级的优化循环,不是一次前向,所以批量出资产时它才是真正的算力大头。这也是我们推荐 RTX 4090 24GB($0.540/卡·时)跑这一段的原因。

2026 年了还值得用 LGM 吗?和 TRELLIS、Hunyuan3D 比怎么选?

看你要什么。要最好的几何和 PBR 材质,去用 TRELLIS(image-large 1.2B,官方要求至少 16GB 显存,MIT)或 Hunyuan3D 2.1(DiT 3.0B + Paint 1.3B,形状 6GB、形状加纹理 16GB)。要最快、最轻、最容易改的那一个,LGM 依然没有替代品:0.4B 参数、830MB 权重、MIT 无附加条款、代码短到能通读,做批量预览和资产初筛特别合适。实际的工程做法是两条线一起跑 —— 在 NexGPU 上开一张 RTX A6000 48GB($0.817/卡·时)同时装下 LGM 和一个 16GB 级新模型,同一批输入直接横评,比看别人的 demo 视频靠谱。

想自己训练 LGM 需要几张卡?数据集怎么办?

官方给的启动配置是 acc_configs/gpu8.yaml,也就是 8 卡起步;big 配置是 bf16、batch 8/卡、lr 4e-4、30 个 epoch、8 视角监督外加 LPIPS VGG 损失,渲染分辨率 512,显存吃得很实。数据这块要注意:官方原始 dataloader 基于 AWS S3,换环境不能直接用,必须改 core/provider_objaverse.py;训练用的那份约 8 万条 Objaverse 子集在 ashawkey/objaverse_filter 里公开。硬件上 A100 SXM4 80GB 是 $1.088/卡·时,8 卡节点 $8.704/小时,NexGPU 单节点最多 14 卡、节点最大显存 2,152GB,按秒计费、无配额申请、无启动费,跑一个 epoch 试试水的成本完全可控。

开始使用 NexGPU

无论你是企业研发团队还是独立开发者,都可以在几分钟内跑起第一个任务。

注册即可浏览全网实时价格,无需绑定支付方式。