类似 llama-server,加载 GGUF 到显存,常驻等待请求生成视频。
前提:Windows,NVIDIA 显卡 ≥12 GB 显存,Python 3.10+。
打开终端(PowerShell 或 bash),一步一步来:
不需要全局安装 CUDA toolkit,只需 NVIDIA 驱动 + 下面这条命令:
pip install torch --index-url https://download.pytorch.org/whl/cu130选对 CUDA 版本很关键:上面是 CUDA 13 版(
cu130),适配较新的 GPU(含 Blackwell / DGX Spark GB10,架构 sm_121)。老卡(Ampere/Ada,如 A6000)用cu126也行。装错版本会在加载时报CUDA error: no kernel image is available for execution on the device——表示这份 torch 没有你显卡架构的计算内核,需换匹配的版本。
验证 GPU 可用(同时检查架构是否被支持):
python -c "import torch; print('cuda', torch.cuda.is_available()); print('gpu', torch.cuda.get_device_name(0)); print('cc', torch.cuda.get_device_capability(0)); print('arch_list', torch.cuda.get_arch_list())"
# cuda 必须是 True;cc(计算能力)应能在 arch_list 里找到匹配项
# 例:GB10 的 cc 是 (12, 1)=sm_121,arch_list 里必须有 sm_120/sm_121cd sulphur-server
pip install -r requirements.txt浏览器打开:
https://huggingface.co/Abiray/Sulphur-2-base-GGUF/tree/main
12 GB 显存优先下载 sulphur_dev-Q3_K_S.gguf(10.3 GB),放到项目目录下。
python prepare_base.py下载到 ./LTX-2.3-Diffusers/,约 57 GB。这里不会下载 transformer/,因为 transformer 由 GGUF 文件替代;只下载 VAE、text encoder、scheduler、tokenizer、processor、connectors、audio_vae、vocoder 等 pipeline 组件。
如果是手动离线下载,最终目录应类似:
sulphur-server/
├─ server.py
├─ prepare_base.py
├─ requirements.txt
├─ sulphur_dev-Q3_K_S.gguf
└─ LTX-2.3-Diffusers/
├─ model_index.json
├─ vae/
├─ text_encoder/
├─ audio_vae/
├─ vocoder/
├─ scheduler/
├─ tokenizer/
├─ processor/
└─ connectors/
不要放入 LTX-2.3-Diffusers/transformer/;它会被 sulphur_dev-Q3_K_S.gguf 替代。
python server.py --model ./LTX-2.3-Diffusers --gguf ./sulphur_dev-Q3_K_S.gguf --port 4323看到 Server ready 就成功了。服务只使用本地 ./LTX-2.3-Diffusers,如果目录不存在会直接报错,不会在启动时下载大文件。
浏览器访问 http://localhost:8080/,可以用表单发请求、看队列、取消任务、下载视频。
不要直接双击
static/index.html,那样走file://协议发不了请求。
Abiray/Sulphur-2-base-GGUF 只提供量化后的 transformer 单文件;Diffusers 目前也不能直接把整个 pipeline 从 GGUF 加载出来。因此这里是混合加载:
sulphur_dev-Q3_K_S.gguf:替代transformer/。diffusers/LTX-2.3-Diffusers的非 transformer 组件:提供 VAE、text encoder、scheduler、tokenizer、processor、connectors、audio_vae、vocoder。
SulphurAI/Sulphur-2-base 是 Sulphur 的原始权重页面;如果跑完整/ComfyUI 权重,要从那里下载。但本服务走 Diffusers + GGUF:GGUF 已经替代 Sulphur 的 transformer,剩下需要的是 LTX-2.3 pipeline 组件目录,所以预下载脚本使用 diffusers/LTX-2.3-Diffusers。
UI 不再让你手填裸参数,而是给出符合 LTX-2.3 约束的档位,避免填出非法值被服务端 400 拒绝:
- Resolution(分辨率):横向 16:9 / 竖向 9:16 / 方形 1:1 三组档位,从最低到 4K。所有档位的宽高都已对齐到 32 像素(LTX-2 硬性要求)。注意官网标称的 1080p=1920×1080、4K=3840×2160 里 1080 和 2160 不能被 32 整除,故这里用等效的
1920×1088、3840×2176。默认1024×576。 - Duration + FPS(时长 + 帧率):选时长(2/3/5/8/10 秒)和帧率(24/25/48/50),前端自动换算成合法的
8k+1帧数并夹到 9~1281,下方实时显示实际帧数与时长。 - Quality(质量档):草稿/标准/精细/最高,对应 15/20/30/40 推理步。
服务默认按 12 GB 显卡配置:transformer(GGUF)常驻 GPU,其余组件 CPU offload,VAE 分块解码。大显存显卡可用 --no-offload / --no-vae-tiling 提速。
关键账:text_encoder 是 gemma3 12B,bf16 加载约 24 GB,且只在开头编码 prompt 时跑一次;VAE 只在结尾 decode 一次。所以 offload 这两者几乎不影响每步速度——每步跑的是常驻的 transformer。是否 --no-offload(全常驻)取决于 transformer + 24GB text_encoder + ~7GB VAE/其他 + 激活 是否塞得进显存。
| 显卡 | GGUF | 建议启动 | 说明 |
|---|---|---|---|
| 12 GB | Q3_K_S(10.3 GB) |
python server.py --gguf ./sulphur_dev-Q3_K_S.gguf |
默认全套省显存策略 |
| A6000 48 GB | Q8_0(22.8 GB) |
python server.py --gguf ./sulphur_dev-Q8_0.gguf --no-vae-tiling |
全常驻会 OOM(22.8+24+7+激活 > 48),保持 offload;峰值 ~30 GB |
| A6000 48 GB | Q4_K_M(14.3 GB) |
python server.py --gguf ./sulphur_dev-Q4_K_M.gguf --no-offload --no-vae-tiling |
14.3+24+7≈45 GB,可全常驻、零搬运最快 |
| DGX Spark 128 GB (GB10) | bf16(42 GB) |
python server.py --gguf ./sulphur_dev_bf16.gguf --no-offload --no-vae-tiling |
统一内存架构,最高画质全常驻。需 CUDA 13 版 torch(见步骤 1) |
DGX Spark(GB10)注意:① 是 CPU/GPU 共享的统一内存(128 GB LPDDR5x),offload 到"CPU"没有跨设备搬运意义,直接
--no-offload全常驻最省事。② 架构是 Blackwell sm_121,必须装 CUDA 13 版 torch(cu130),否则报no kernel image。A6000 上跑 bf16(42 GB)时
42+24>48,text_encoder 塞不下,不要加--no-offload。
各档位在 24 fps、5 秒(121 帧)下的默认起点建议:num_inference_steps=20,显存够再上 30。如果 OOM,优先降分辨率档位或缩短时长。
参数上限(防止一个请求打爆显存):width/height ≤ 3840,num_frames ≤ 1281,prompt ≤ 2000 字符。超出返回 400。
生成完成后,服务会把 mp4 写入项目下的 outputs/ 目录,例如:
outputs/<task_id>.mp4
任务状态记录会在内存里保留约 24 小时后自动清理,但 outputs/ 里的 mp4 文件会保留,方便之后手动整理或删除。
| 需要 | 说明 | |
|---|---|---|
| 硬盘 | ~68 GB 起 | GGUF(Q3_K_S 10.3 GB ~ bf16 42 GB)+ 非 transformer Diffusers 组件约 57 GB |
| 显存 | 12 GB 边缘可试 | 默认 transformer 常驻 GPU、其余 CPU offload;大显存可 --no-offload 全常驻。分辨率/帧数过高仍可能 OOM |
常见 GGUF 档位大小:Q3_K_S 10.3 GB · Q4_K_M 14.3 GB · Q6_K 17.8 GB · Q8_0 22.8 GB · bf16 42 GB。
联网机器上做完步骤 3 和 4,把整个目录拷到离线机器,然后直接步骤 2 + 5。
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /v1/video/generate |
提交任务,返回 task_id |
| GET | /v1/video/tasks |
列出当前仍在内存中的任务 |
| GET | /v1/video/status/{id} |
查状态 |
| POST | /v1/video/cancel/{id} |
取消排队 |
| GET | /v1/video/result/{id} |
下载 mp4 |
| GET | /health |
服务状态 |
状态:queued → waiting → processing → done / failed / cancelled
| 参数 | 默认值 | 说明 |
|---|---|---|
--model |
./LTX-2.3-Diffusers |
本地 Diffusers 组件目录;必须先用 prepare_base.py 预下载好,服务启动时不会隐式下载大文件 |
--gguf |
无 | GGUF transformer 文件路径 |
--host |
0.0.0.0 |
|
--port |
8080 |
|
--queue-size |
8 |
排满即拒 |
--no-offload |
关(默认 offload) | 关闭 CPU offload,把所有组件常驻 GPU。大显存(A6000/DGX)且用中等量化时更快;显存不足会 OOM |
--no-vae-tiling |
关(默认分块) | 关闭 VAE 分块解码。大显存下让最后一次 decode 走整块,更快 |
--compile |
关 | 对 transformer 做 torch.compile(实验性,GGUF 可能失败并自动回退) |
| HTTP | 含义 |
|---|---|
| 400 | 参数不对 |
| 404 | task_id 不存在 |
| 409 | 已开始,不能取消 |
| 410 | 已取消 |
| 425 | 还没生成完 |
| 500 | 生成出错 |
| 503 | 队列满 / 模型没加载完 |