跳到主要内容

3D 生成模型

Shap-E 本地部署:315M 参数、1.33GB fp16 权重,24GB 单卡跑通文生 3D

OpenAI 的 Shap-E 不输出点云也不输出体素,它直接扩散出一个隐式函数的参数——同一份潜变量既能当 NeRF 渲染,也能 marching cubes 出带顶点色的网格。权重小得离谱,显存压力全压在渲染那一步。

Shap-E 是两段式的。第一段叫 transmitter,用 PointCloudPerceiverChannelsEncoder 把 3D 资产(点云加多视角点云,12 层、宽度 1024)确定性地编码成一组隐式函数参数;第二段是条件扩散,在这个 1,048,576 维的潜空间上训练——潜变量形状是 1024×1024,先验网络是 24 层、16 头、宽度 1024 的 transformer,正好 315M 参数,官方叫它 text300M。采样器用 HeunDiscreteScheduler,1024 个训练时间步,exp 噪声表,预测目标是 x_start 而不是常见的 epsilon,配 Karras sigma(sigma_min=1e-3,sigma_max=160)。所以 Shap-E 的 64 步采样跟 SD 的 64 步完全不是一个语义,别照搬调参经验。

资源账很反直觉:Shap-E 的权重根本不是瓶颈。openai/shap-e 在 Hugging Face 上整仓 4.9GB,但那是 fp32 和 fp16 两套并存的结果——你真正要加载的 fp16 三件套是 prior 631.4MB、renderer 452.6MB、CLIP ViT-L/14 文本塔 247.3MB,合计约 1.33GB。图生 3D 的 openai/shap-e-img2img 把文本塔换成 606.4MB 的 CLIP 视觉塔,fp16 合计约 1.69GB。原始仓库那四个 .pt 也不大:transmitter.pt 1.78GB、text_cond.pt 1.26GB、image_cond.pt 1.26GB、vector_decoder.pt 905MB。吃显存的是渲染:create_pan_cameras 默认打 20 帧环绕,NeRSTF 渲染器每条光线粗采样 64 点、细采样 128 点,显存随 frame_size² × 20 帧 × 192 采样点 × batch_size 线性膨胀。官方 notebook 默认 batch_size=4,issue #42 里一张 RTX 2060 Super 8GB 就在这一步 OOM 了。

还有一层现实要说清楚:openai/shap-e 仓库的最后一次提交停在 2023 年 11 月(normalize_scene 的一个 bug fix),全仓一共只有 14 个 commit,上游事实上已经冻结。它的质量天花板也写死在配置里——transmitter 的 renderer 段 grid_size: 128,意味着 STF 出网格永远是 128³ marching cubes,加上 CLIP 的 77 token 提示词上限,你不可能靠长 prompt 把它推到 Hunyuan3D-2.1(3.0B DiT + 1.3B 贴图模型)或 TRELLIS 那种细节层级。但 Shap-E 依然是最快、最省、最容易读懂的隐式 3D 生成基线:1.33GB 权重、几秒出潜变量、MIT 许可、diffusers 里 ShapEPipeline 一直维护到主分支。在 NexGPU 上,一张 RTX 3090 24GB 是 $0.193/卡·时,按秒计费、停机停算,跑通它比在本地折腾环境便宜得多。

01 —

Shap-E 的四个权重和两条管线

官方 .pt 检查点与 diffusers 管线的真实体积,全部按字节核对

版本参数量显存上下文说明
text300M(text_cond.pt)315Mfp32 检查点 1.26GB / fp16 约 631MB77 token 提示词(CLIP ViT-L/14)文生 3D 的条件扩散先验,24 层、16 头、宽度 1024,输出 1024×1024 潜变量。
image300M(image_cond.pt)316Mfp32 检查点 1.26GB,另需 CLIP 视觉塔 fp16 606MB单张参考图,建议先抠掉背景图生 3D 版本,条件从文本换成 CLIP 图像嵌入,guidance_scale 官方示例用 3.0 而不是 15.0。
transmitter(transmitter.pt)444Mfp32 检查点 1.78GB1,048,576 维潜变量(1024×1024)编码器加解码器的合体,只有当你要把自己的 3D 资产编码进潜空间时才需要它——那条路还要装 Blender 3.3.1 以上并设 BLENDER_PATH。
vector_decoder(decoder.pt)226Mfp32 检查点 905MB / fp16 452.6MBgrid_size 128,粗采样 64 + 细采样 128纯推理只需要这个:把潜变量解成 NeRSTF 隐式场,再渲 NeRF 或走 STF 出网格。
diffusers openai/shap-e先验 315M + CLIP 文本塔 124Mfp16 三件套约 1.33GB(整仓 4.9GB)frame_size 64–256,20 帧环绕维护得最好的一条路,ShapEPipeline 三行就能跑,output_type="mesh" 直接出网格。
diffusers openai/shap-e-img2img先验 316M + CLIP 视觉塔 303Mfp16 合计约 1.69GB(整仓 6.0GB)参考图缩到 256×256 输入ShapEImg2ImgPipeline,配 Kandinsky 或 SDXL 先出图再转 3D 是社区常见玩法。

02 —

Shap-E 该租哪张卡

权重只有 1.33GB,选卡的真正依据是渲染吞吐和 batch 规模

  • 最低成本跑通 text-to-3D,fp16、batch 1、frame_size 64→256

    RTX 3090 24GB$0.193/卡·时

    Ampere 起步就有 bf16,24GB 显存足够把默认 batch_size=4、frame_size=256 的 20 帧环绕渲染稳稳兜住,价格是全站最便宜的一档。

  • 交互式调 prompt,反复出 20 帧 256 环绕图并导 STF 网格

    RTX 4090 24GB$0.540/卡·时

    瓶颈在 NeRSTF 的逐点 MLP 求值,4090 的算力密度让每轮迭代明显快过 3090,调参循环缩得越短越划算。

  • 批量刷几百条 prompt 建资产库,batch_size 拉到 8–16

    A100 PCIE 80GB$0.824/卡·时

    显存随 batch_size 线性涨,80GB 让你一次并行渲完再统一导出,省掉反复加载权重的开销。

  • 拿 Shap-E 当基线,同机对比 Hunyuan3D-2.1(形状 6GB、形状加贴图 16GB)

    RTX 5090 32GB$0.723/卡·时

    32GB 能同时驻留 Shap-E 的 1.33GB 和 Hunyuan3D 的形状加贴图全流程,横评不用来回换实例。

03 —

四步把 Shap-E 跑起来

从 NexGPU 的 PyTorch 镜像开机到导出可进 Blender 的 glb

  1. 01

    开实例,装依赖

    在 NexGPU 控制台选一张 RTX 3090 24GB 和 PyTorch 预置镜像,SSH 或 Jupyter 进去。Shap-E 的依赖极轻,不需要编译任何 CUDA 扩展。

    pip install diffusers transformers accelerate trimesh
  2. 02

    拉 fp16 权重,跑第一个 prompt

    用 variant="fp16" 只拉半精度分片,避免把 4.9GB 整仓拖下来。guidance_scale 官方推荐 15.0,num_inference_steps 用 64,frame_size 从 64 起步确认管线通了再上 256。

    python -c "import torch; from diffusers import ShapEPipeline; from diffusers.utils import export_to_gif; p=ShapEPipeline.from_pretrained('openai/shap-e', torch_dtype=torch.float16, variant='fp16').to('cuda'); export_to_gif(p('a shark', guidance_scale=15.0, num_inference_steps=64, frame_size=256).images[0], 'shark.gif')"
  3. 03

    出网格并修正朝向

    把 output_type 改成 "mesh" 就走 STF 分支出 128³ marching cubes 网格,export_to_ply 存 ply。Shap-E 的网格默认是从底部视角摆放的,进 Blender 或 UE 之前要绕 X 轴转 -90°,否则模型是躺着的。

    python -c "import trimesh, numpy as np; m=trimesh.load('3d_cake.ply'); m.apply_transform(trimesh.transformations.rotation_matrix(-np.pi/2,[1,0,0])); m.export('3d_cake.glb', file_type='glb')"
  4. 04

    需要官方仓库能力时再装原版

    只有要用 image300M 的原生采样、或者用 encode_model.ipynb 把自己的资产编码进潜空间时才需要 clone 原仓库。注意 setup.py 里挂着 clip 的 git 依赖,encode_model 那条路还要 Blender 3.3.1 以上并导出 BLENDER_PATH。

    git clone https://github.com/openai/shap-e && cd shap-e && pip install -e . && pip install git+https://github.com/openai/CLIP.git

一轮资产生成到底花多少钱

按 RTX 3090 24GB 的 $0.193/卡·时 算一笔实账。开机、装 diffusers、拉 openai/shap-e 的 fp16 分片(约 1.33GB),十分钟就位:0.167 时 × $0.193 = $0.03。接着刷 200 条 prompt,每条 batch_size=4 先用 frame_size=64 出候选、挑中的再用 frame_size=256 重渲一遍,连导 ply 和 obj 一共占 3 小时 GPU:3 × $0.193 = $0.58。权重加八百多个网格文件占 30GB,当天跑完就销毁实例,存储按 $0.414/GB·月 折成一天是 30 × $0.414 ÷ 30 = $0.41。最后把约 4GB 的 glb 拉回本地:4 × $0.0081 = $0.03。整轮 $1.05 出头。想让 20 帧 256 渲染快一大截就换 RTX 4090 24GB,同样 3 小时是 3 × $0.540 = $1.62。至于 H100 SXM 80GB 的 $3.582/卡·时——一个 315M 参数的先验根本喂不饱它,那笔预算留给 Hunyuan3D 或者训练任务。NexGPU 按秒计量、按小时计价,没有起租门槛、没有开通费、不用申请配额,实例一停算力就停计费。

04 —

常见问题

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

权重端极轻:fp16 下 prior 631.4MB、renderer 452.6MB、CLIP 文本塔 247.3MB,合计约 1.33GB。但显存不是权重决定的——NeRSTF 渲染器每条光线要跑 64 个粗采样加 128 个细采样,create_pan_cameras 一次打 20 帧,显存按 frame_size² × 20 × 192 × batch_size 涨。官方 notebook 默认 batch_size=4,仓库 issue #42 里一张 RTX 2060 Super 8GB 就是在这一步炸的。想稳,把 batch_size 降到 1、frame_size 降到 64 能挤进 8GB;想按默认配置舒服地跑,直接上 24GB。NexGPU 的 RTX 3090 24GB 是 $0.193/卡·时,比你为这件事买张卡划算太多。

Shap-E 是不是已经过时了?2026 年还值得部署吗?

上游确实冻结了:openai/shap-e 全仓 14 个 commit,最后一次是 2023 年 11 月的 normalize_scene 修复。质量天花板也写死在配置里,transmitter 的 renderer 段 grid_size 就是 128,STF 出网格永远是 128³ marching cubes,形体偏圆钝是结构性的,不是你 prompt 写得不好。要更高细节就该看 Hunyuan3D-2.1(Hunyuan3D-DiT-v2-1 3.0B 形状模型加 Hunyuan3D-Paint-v2-1 1.3B 贴图模型,官方说形状生成 6GB 显存、形状加贴图共 16GB)或者 TRELLIS 这类结构化隐式方案。但 Shap-E 仍然是最省的基线:MIT 许可、1.33GB 权重、diffusers 主分支还在维护 ShapEPipeline,几秒出一个潜变量。在 NexGPU 上开一台 RTX 5090 32GB($0.723/卡·时)可以把 Shap-E 和 Hunyuan3D 放同一台机器上横评,不用来回搬数据。

Shap-E 生成的模型能直接导进 Blender 或 Unreal 吗?

能导,但有两个坑。第一,朝向:decode_latent_mesh 和 diffusers 的 export_to_ply 出来的网格默认是底部视角摆放的,进引擎前要绕 X 轴转 -π/2,官方 diffusers 文档就直接给了这行 trimesh 变换。第二,材质:Shap-E 的 STF 分支输出的是逐顶点 RGB,不是 UV 展开加贴图,128³ 的顶点密度决定了色彩分辨率——想要真正的 PBR 贴图必须自己重拓扑加烘焙,或者换成带 Paint 模型的方案。原仓库支持 ply 和 obj(obj 输出是社区 PR #20 加上去的),glb 用 trimesh 转一下就有。这些后处理都不吃显存,在 NexGPU 上跟生成放同一台实例里做,省掉一次数据搬运。

为什么我跑出来的效果比官方 demo 差很多?

多半是三件事。一是提示词:文本条件走的是 CLIP ViT-L/14 文本塔,max_position_embeddings 是 77,写长句会被硬截断,Shap-E 吃的是短、具体、常见的物体名词。二是 guidance_scale:diffusers 的函数签名默认 4.0,但官方 notebook 和文档示例都用 15.0,不改这个出来的就是一坨糊的。三是采样量:官方 notebook 默认 batch_size=4 就是让你一次出四个候选挑一个,Shap-E 的方差本来就大,单次采样看运气。另外 num_inference_steps 建议按官方示例给到 64(默认签名只有 25)。这些都要靠反复试,而反复试就是按秒计费最划算的场景——NexGPU 的 RTX 4090 24GB $0.540/卡·时,调完关机就不再计算力费用。

T4、V100、P40 这些便宜卡能跑 Shap-E 吗?

先分清 fp16 和 bf16。Hugging Face 模型卡提到 bfloat16,但 bf16 需要 Ampere 及以上架构——Tesla T4(Turing)和 Tesla V100(Volta)都不支持 bf16,得老老实实用 torch.float16 加 variant="fp16",这条路它们跑得动,T4 16GB 是 $0.298/卡·时、V100 32GB 是 $0.188/卡·时,V100 那 32GB 显存跑大 batch 甚至比 3090 还宽裕。Tesla P40 是另一回事:GP102 核心的 FP16 吞吐只有 FP32 的六十四分之一,24GB 显存再大也救不回来,$0.214/卡·时 看着便宜实际最贵。真要省,NexGPU 的 RTX 3090 24GB $0.193/卡·时 既有 bf16 又有 24GB,是这一档里没有争议的答案。

本地部署要下多少东西?安装过程有哪些已知的坑?

走 diffusers 是最干净的:pip 装 diffusers、transformers、accelerate、trimesh,权重用 variant="fp16" 只拉半精度分片(约 1.33GB),不加这个参数会把整仓 4.9GB 的 fp32 加 fp16 全拖下来。走原仓库要多趟几个坑:setup.py 里挂着 clip @ git+https://github.com/openai/CLIP.git,装的时候得能访问 GitHub;Python 3.8 及以下曾有 AttrDict 的 TypeError(PR #75 修的);encode_model.ipynb 需要 Blender 3.3.1 以上并设好 BLENDER_PATH 环境变量。NexGPU 有 2000 多个预置镜像,PyTorch、vLLM、ComfyUI 都在里面,开机就是配好 CUDA 的环境;出问题在 Telegram 上直接问,中英文都有人接,不用排工单。控制台在 console.nexgpu.net。

开始使用 NexGPU

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

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