Sana.cpp:NVIDIA 文生图模型 C++ 重制版,苹果芯片提速约 4.8 倍
开源项目将 NVIDIA Sana 0.6B 文生图模型移植到 C++,在 Apple Silicon CPU 上推理速…
NVIDIA 此前发布的 Sana 是一个主打高效推理的文生图扩散模型。近日社区出现名为 Sana.cpp 的项目,将其 0.6B 参数量版本的完整推理链路用 C++ 重新实现,并宣称在 Apple Silicon CPU 上比 PyTorch 参考实现快约 4.8 倍。项目以 MIT 协议开源,仓库内同时提供权重下载脚本、命令行推理工具以及与 PyTorch 的对照基准。
项目构成
Sana.cpp 把整条文生图流程拆成三个独立模块,全部跑在本地 C++ 运行时中:
- 文本编码器:使用 Gemma-2 作为文本端,基于项目内置的 llama.cpp / ggml 推理引擎运行,CMake 在配置阶段通过 FetchContent 自动拉取并锁定版本。
- 扩散去噪器:包含 Transformer 主体以及 DPM-Solver++ 调度器,负责扩散迭代去噪。
- VAE 解码器:把最终潜变量还原为像素图像,支持 PNG / PPM 输出。
三者由 CLI 工具 sana_infer 串联起来,端到端产出图片,无需任何 Python 依赖。
性能与对比
仓库附带 bench_full_pipeline 二进制和 Python 端的 bench_reference_full_pipeline.py,可在同一输入下分别计时完整管线(编码 + 去噪 + 解码)。官方公布的数字显示,在 Apple Silicon CPU 上 C++ 版本相对 PyTorch 参考实现快约 4.8 倍。需要注意的是,Apple Silicon 是该项目的主要目标平台,编译时会链接 Accelerate 框架并启用 -mcpu=native;虽然也保留了通用的 -march=native 路径,但适配程度不如前者。
使用方式
构建与运行的基本流程如下:
- 构建:需 CMake ≥ 3.16 与支持 C++17 的编译器;执行
cmake -S . -B build与cmake --build build -j即可生成sana_infer、bench_full_pipeline与单元测试可执行文件。 - 下载权重:预转换的
.gguf权重托管在 Hugging Face 的doobluhc/sana-cpp-weights,运行./download_weights.sh weights即可获取,无需 Python 环境。 - 推理示例:
./sana_infer --prompt "a house by the lake" --output out.png,同时支持--negative-prompt、--steps、--seed、--guidance、--weights-dir、--gemma-gguf等参数。
Python 3 + torch + diffusers 仅在运行 PyTorch 参考基准时需要,正常推理流程并不依赖。
项目结构与许可
仓库目录划分清晰:src/ 为 C++ 库与 CLI,tests/ 为自带单元测试与完整管线基准,tools/ 为 PyTorch 参考基准,download_weights.sh 用于拉取权重。单元测试覆盖张量运算、Transformer 块、调度器与 Gemma-2 编码器,无需任何模型权重或外部数据集即可运行。
代码本身采用 MIT 协议发布,但 Sana 模型权重由 NVIDIA / Efficient-Large-Model 单独提供,使用前需留意上游模型的授权条款。
