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) | 315M | fp32 检查点 1.26GB / fp16 约 631MB | 77 token 提示词(CLIP ViT-L/14) | 文生 3D 的条件扩散先验,24 层、16 头、宽度 1024,输出 1024×1024 潜变量。 |
| image300M(image_cond.pt) | 316M | fp32 检查点 1.26GB,另需 CLIP 视觉塔 fp16 606MB | 单张参考图,建议先抠掉背景 | 图生 3D 版本,条件从文本换成 CLIP 图像嵌入,guidance_scale 官方示例用 3.0 而不是 15.0。 |
| transmitter(transmitter.pt) | 444M | fp32 检查点 1.78GB | 1,048,576 维潜变量(1024×1024) | 编码器加解码器的合体,只有当你要把自己的 3D 资产编码进潜空间时才需要它——那条路还要装 Blender 3.3.1 以上并设 BLENDER_PATH。 |
| vector_decoder(decoder.pt) | 226M | fp32 检查点 905MB / fp16 452.6MB | grid_size 128,粗采样 64 + 细采样 128 | 纯推理只需要这个:把潜变量解成 NeRSTF 隐式场,再渲 NeRF 或走 STF 出网格。 |
| diffusers openai/shap-e | 先验 315M + CLIP 文本塔 124M | fp16 三件套约 1.33GB(整仓 4.9GB) | frame_size 64–256,20 帧环绕 | 维护得最好的一条路,ShapEPipeline 三行就能跑,output_type="mesh" 直接出网格。 |
| diffusers openai/shap-e-img2img | 先验 316M + CLIP 视觉塔 303M | fp16 合计约 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
- 01
开实例,装依赖
在 NexGPU 控制台选一张 RTX 3090 24GB 和 PyTorch 预置镜像,SSH 或 Jupyter 进去。Shap-E 的依赖极轻,不需要编译任何 CUDA 扩展。
pip install diffusers transformers accelerate trimesh - 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')" - 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')" - 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 —
