服务器与 Web UI
TensorSharp.Server 是一个 ASP.NET Core 应用,托管单个 GGUF 模型,并在同一端口上暴露浏览器聊天 UI 以及兼容 Ollama 和 OpenAI 的 REST API。连续批处理引擎负责并发。
启动服务器
约 30 秒快速开始(Gemma 4 E4B)
按平台安装 .NET 10 SDK、Git、CMake 与 curl,然后在终端粘贴下面的命令。复制并运行这些命令约需 30 秒;7.48 GiB 的模型下载与首次还原/构建耗时更长,取决于网络速度与机器性能。它会通过原生 GGML 桥接托管仓库基准已验证的 Gemma 4 E4B Q8_0,使用推荐的公开 ggml-org 文件。下面的代码块面向 Linux + NVIDIA(CUDA 构建还需要 CUDA Toolkit):
git clone https://github.com/zhongkaifu/TensorSharp.git
cd TensorSharp
TENSORSHARP_GGML_NATIVE_ENABLE_CUDA=ON dotnet build TensorSharp.slnx -c Release -p:TensorSharpSkipMlxNative=true
curl --create-dirs --fail -L "https://huggingface.co/ggml-org/gemma-4-E4B-it-GGUF/resolve/main/gemma-4-E4B-it-Q8_0.gguf?download=true" -o models/gemma-4-E4B-it-Q8_0.gguf
dotnet run --project TensorSharp.Server.Host -c Release --no-build -- --model models/gemma-4-E4B-it-Q8_0.gguf --backend ggml_cuda
Apple Silicon 请省略 CUDA 环境变量并使用 ggml_metal;受支持的 Windows/Linux Vulkan GPU 请改为请求 TENSORSHARP_GGML_NATIVE_ENABLE_VULKAN=ON 并使用 ggml_vulkan;没有受支持的 GPU 时可省略该环境变量并使用 ggml_cpu。占用内存更低的 gemma-4-E4B-it-Q4_K_M.gguf 位于同一仓库。纯文本不需要投影器;图像、视频或音频还需匹配的 mmproj-gemma-4-E4B-it-Q8_0.gguf,并通过 --mmproj 传入。Windows PowerShell 与完整平台语法见快速开始。
在第二个终端中验证 OpenAI 兼容端点:
curl -s http://localhost:5000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"gemma-4-E4B-it-Q8_0.gguf","messages":[{"role":"user","content":"Reply with one short hello."}],"max_tokens":32}'
API 基址是 http://localhost:5000。内置 wwwroot/ 存在且启用时,GET / 会返回其中的 index.html 聊天界面。稳定的纯文本存活检查是 GET /health;只有未启用 Web UI 的无界面部署才会让根路径 / 回退为同一个健康响应。
推理必须在启动时传入 --model。服务器只托管启动时指定的 GGUF,以及可选且必须显式传入的 --mmproj;它不会扫描模型目录或自动探测投影器。/api/models/load 只能用其他受支持后端重新加载同一启动组合。无模型进程不能在运行时选择 GGUF。默认监听地址是 http://0.0.0.0:5000;--port、--host 与 --urls(环境变量 PORT / HOST / ASPNETCORE_URLS)可以改变它。
服务端没有内置 API Key 身份验证或 TLS,并监听所有网络接口。本机使用时请依靠主机防火墙;需要远程访问时应置于带身份验证的 HTTPS 反向代理之后,不要把 5000 端口直接暴露给不可信网络。
已构建的源码目录
构建完成后,从仓库根目录运行这些命令。它们会调用 TensorSharp.Server.Host/bin/TensorSharp.Server.Host.dll;该输出目录也包含复制好的原生库与 wwwroot/。Releases 页面也附带面向受支持平台的自包含 CLI 与服务器压缩包。
# Apple Silicon / Metal
dotnet TensorSharp.Server.Host/bin/TensorSharp.Server.Host.dll --model ./models/model.gguf --backend ggml_metal
# NVIDIA / GGML CUDA
dotnet TensorSharp.Server.Host/bin/TensorSharp.Server.Host.dll --model ./models/model.gguf --backend ggml_cuda
# AMD、Intel 或 NVIDIA / Vulkan;先查看设备索引
dotnet TensorSharp.Server.Host/bin/TensorSharp.Server.Host.dll --list-gpus
dotnet TensorSharp.Server.Host/bin/TensorSharp.Server.Host.dll --model ./models/model.gguf --backend ggml_vulkan --gpu-device 1
# 多模态:投影器始终显式指定
dotnet TensorSharp.Server.Host/bin/TensorSharp.Server.Host.dll --model ./models/model.gguf --mmproj ./models/mmproj.gguf --backend ggml_cuda
服务器级默认采样
默认值会填补请求未提供的任何字段。你显式配置过的参数还会覆盖客户端为其发来的值 —— 很多聊天客户端(如 VS Code Copilot Chat)会把 temperature/top_p 硬编码进每一次请求。加上 --sampling-precedence request 可把控制权交还给客户端。
dotnet TensorSharp.Server.Host/bin/TensorSharp.Server.Host.dll --model ./models/model.gguf --backend ggml_metal \
--temperature 0.7 --top-p 0.9 --top-k 40 --repeat-penalty 1.1 \
--presence-penalty 0.0 --frequency-penalty 0.0 --seed 42 \
--stop "</s>" --stop "<|endoftext|>"
Web UI 功能
打开 http://localhost:5000/。浏览器界面支持:
- 多轮对话,带流式 token 生成(SSE)。
- 每标签页独立的聊天会话 —— 每个标签页拥有自己的跟踪对话历史;请求 KV 块与前缀复用由推理引擎管理。
- 用于多模态推理的图像、视频、音频、PDF 与文本 / 代码上传(最大 500 MB)。
- PDF 文档:原生数字 PDF 会完整抽取文本层并内联到提示词;扫描 PDF 在视觉模型上回退为逐页图像(
TS_PDF_MAX_PAGES限制读取页数)。最终渲染的提示词会根据模型的实际上下文窗口进行检查。 - 思考 / 推理模式开关,以及带函数定义的工具调用。
- 消息编辑与删除,并可从对话中任意位置重新生成。
- 当托管
diffusion-gemmaGGUF 时,提供 DiffusionGemma 去噪预览(每步替换整条助手消息,最后定稿)。 - 托管
qwen_imageDiT 时提供 Qwen-Image-Edit:上传图像并输入编辑指令后,最多 8 帧实时去噪预览会原位刷新,最终 PNG 提供下载链接。 - 托管视频生成模型(MiniMax-H3 或 Wan)时提供视频生成:输入提示词,附上所加载权重声明支持的条件输入,浏览器通过 SSE 实时显示逐步去噪进度,直到 MP4 出现并提供下载链接。在 MiniMax-H3 上还会同时返回一条 32 kHz 立体声音轨 —— 它与画面出自同一次生成。所有数值仍然来自启动参数 —— 详见下文视频生成。
- 自由滚动 —— 在新 token 流式输出时阅读较早的回复;自动滚动会在回到底部时恢复。
Agentic Work 与代码执行
在能够完整往返工具调用的模型家族上,服务器可让单个模型在进程内执行「生成 → 工具 → 再生成」循环。Agent Skills 可以在不执行脚本的情况下被发现与读取;运维者需另行传入 --skills-allow-exec 才允许运行技能自带脚本。--code-exec 则显式开启由宿主处理的 read_file、edit_file、write_file、apply_patch 与沙箱化 shell 工具。Web UI 聊天会话会在各轮之间保留私有工作区;无状态 API 请求各自获得隔离的请求工作区,并在结束后删除。
执行类工具在运维者开启前保持关闭,但一旦开启,系统不会再逐条命令弹出审批。沙箱模式默认是 required,无法安全隔离时直接拒绝:macOS 使用 Seatbelt,Linux 要求 bubblewrap 0.12.0 或更新版本。Windows Job Object 只能约束后代进程,不能隔离文件系统或网络,因此技能脚本需要显式选择更弱的沙箱模式,而模型生成的命令需要 --code-exec-unconfined。这是 agentic 工具循环,并非多智能体编排。完整参数、模型家族限制、工作区生命周期与安全边界见 Agentic Work、Skills 与沙箱。
视频生成:网页界面能设什么,什么只能靠 API
托管一个视频生成模型(MiniMax-H3 或 Wan),网页界面就变成了一个视频生成器。这些接口判断的是 IVideoGenerationModel 接缝而不是架构字符串,因此其他模型会返回 400 与 The loaded model is not a video-generation model.。有必要清楚地知道浏览器实际控制了请求中多小的一部分:一次视频任务可能跑几分钟,也可能跑几小时,而浏览器在任务开始后无法再改变这一点。
# MiniMax-H3:画面与它的 32 kHz 立体声音轨在同一个潜变量里一起去噪
dotnet TensorSharp.Server.Host/bin/TensorSharp.Server.Host.dll \
--model ./models/minimax_h3_fl2va_pruned-Q4_K.gguf --backend ggml_cuda \
--video-width 640 --video-height 384 --video-steps 20 --video-frames 22
# 同样的几何参数,换另一个权重:用身份 / 外观参考生成一个新场景
dotnet TensorSharp.Server.Host/bin/TensorSharp.Server.Host.dll \
--model ./models/minimax_h3_ref2va_pruned-Q4_K.gguf --backend ggml_cuda \
--video-width 640 --video-height 384 --video-steps 20 --video-frames 22
FL2VA 与 Ref2VA 是两个权重文件,而不是两档设置:加载哪一个决定了附上的图像被当作关键帧还是参考,/api/models 报给浏览器的也正是这一点。config/minimax-h3-fl2va.json 与 config/minimax-h3-ref2va.json 带的是同一套几何参数,并会在首次运行时下载去噪器、共享的 Qwen3-VL-32B 文本编码器与两个 VAE —— 但不包括分词器,因为它不是一个命令行参数:请把上游 MiniMaxAI/MiniMax-H3 仓库 processor/ 目录下的 vocab.json 与 merges.txt 放到编码器旁边,或让 TS_VIDEO_TOKENIZER 指向存放它们的目录。
浏览器发送的是提示词,外加所加载模型声明支持的条件输入 —— 首帧、尾帧,或最多 maxReferenceImages 张参考图,以及随附的参考片段与音轨 —— 这份请求体是按 GET /api/models 返回的 video 能力对象拼出来的,而不是靠架构名去猜。帧数、fps、分辨率、去噪步数、seed、flow shift、采样器、负向提示词与引导缓存都没有在界面上暴露:它们来自启动参数或模型自身的配方。引导则根本没有对应的启动参数 —— 服务端完全没有 --cfg —— 只能在请求里设置,而 MiniMax-H3 会拒绝任何大于 1.0 的取值,因为它出厂就是 CFG 蒸馏过的。若要按请求设置这些值,请直接调用 POST /api/video-generate 或 /v1/videos/generations。
进程在启动时就已决定的部分:
| 由什么决定 | 设置项 | 说明 |
|---|---|---|
--model(进程内固定) | 属于哪个家族,以及去噪前向次数 | 最大的单项成本因素。MiniMax-H3 经过 CFG 蒸馏,每一步都只是一次无引导前向 —— 默认 20 步,快速工作点是 4–8 步。基础的 Wan2.2-TI2V-5B 走官方配方 50 步 × 2 次 CFG = 100 次 DiT 前向;步数蒸馏的 Turbo / Lightning / FastWan 权重会从文件名被识别出来,只跑 4 次无引导前向。在 M5 Pro 上、1088×832 × 121 帧的同一个请求,这就是约 3 h 30 m 与 17 m 30 s 的差别。→ H3 实测 · Wan 实测 · 下载 |
--video-width N / --video-height N | 默认输出尺寸 | 服务端最主要的画质杠杆,因为网页界面自己不发送尺寸:不设它们,每段视频都按模型默认尺寸生成。MiniMax-H3 的推荐起点是 640×384;只给出宽高之一时,H3 会按条件图像的宽高比推出另一个。别名:--width / --height。 |
--video-steps N | 默认去噪步数 | 分辨率之后第二重要的质量/耗时取舍。MiniMax-H3 默认 20 步;4–8 步是快速工作点,16–24 步明显更干净,超过约 30 步收益很小。请求中的 steps 会覆盖它。 |
--video-mode <mode> | 默认条件模式 | 为未带 videoMode 的请求钉住 t2v / i2v / fl2v / ref。不传它,每个请求会按自身携带的内容推断模式,通常这才是你想要的;只提供单一模式的部署才需要钉住它。 |
--video-frames N | 默认帧数 | 这是服务端范围的默认值,不是上限:请求里带 frames 就会覆盖它。数值会对齐到模型自身的时间网格 —— Wan 为 4k+1,MiniMax-H3 为 17k+5。不传该参数时按模型配方来 —— Wan2.2-TI2V 为 49 帧,其余 Wan 权重为 33 帧,MiniMax-H3 为 22 帧。 |
--fps N | 默认播放帧率 | 同样是默认值,可被请求中的 fps 独立覆盖。不传时配方给出 Wan2.2-TI2V 24 fps、其余 16 fps;MiniMax-H3 以固定 24 fps 训练,会覆盖任何其他取值。fps 只改变播放速度,不改变计算量。 |
--audio-vae <path> | 是否会返回音轨 | 只对与视频联合生成音频的模型有意义(minimax_h3_audio_vae_fp32.safetensors)。不传它,MiniMax-H3 照样能跑并产出视频,只是没有声音 —— 而 /api/models 上的 supportsAudio 会报 false。 |
| 请求本身(仅 API) | 其余全部 | width、height、frames、steps、cfg、cfg2、seed、fps、flowShift、sampler、negativePrompt、cfgCacheStride、videoMode、generateAudio、endImage、referenceImages、referenceVideos、referenceAudios、referenceVideoAudios。 |
Web UI 形态的接口按上述 JSON 字段名接收参数;同一个请求体在 /api/video-generate(返回一个 MP4)与 /api/video-generate/stream(SSE 去噪进度)上都可用。视频生成在进程内串行执行,同一时刻只跑一个任务:
curl -s http://localhost:5000/api/video-generate \
-H "Content-Type: application/json" \
-d '{
"prompt": "a red fox trotting through falling snow, cinematic",
"width": 640, "height": 384,
"frames": 22, "fps": 24,
"steps": 8, "cfg": 1.0, "seed": 42,
"videoMode": "t2v",
"generateAudio": true
}'
返回体是 { ok, url, audioUrl, width, height, frames, fps, seed, codec, elapsedSeconds };audioUrl 指向旁挂的 WAV,当模型没有产出音轨时为 null。Wan 使用同样的请求体,只是换成它自己的旋钮 —— "flowShift": 5.0、"sampler": "unipc"、"negativePrompt"、"cfgCacheStride": 2 —— 这些 MiniMax-H3 一个都用不上,因为它在 "cfg": 1.0 下无引导运行。
"image" 字段可直接携带 base64 条件帧(允许带 data:…;base64, 前缀);"imagePath"、"endImage" 以及每一个 reference* 条目都是 Web UI 使用的形式,必须引用 /api/upload 已经返回过的文件 —— 任何解析到上传目录之外的路径都会被拒绝。OpenAI 形态的 POST /v1/videos/generations 接收同样的参数,但尺寸写作 "size": "832x480"、负向提示词写作 "negative_prompt"。完整的请求/响应结构见 HTTP API 页。
开跑长任务之前,先估算规模。开销主要由 DiT token 数决定(latent_frames × (h/2) × (w/2)),而自注意力是 O(token²),因此帧数与帧面积的影响远大于步数。在 MiniMax-H3 上的顺序是分辨率、帧数、步数 —— 它本来就不用引导,没有蒸馏杠杆可拉。在 Wan 上:换用步数蒸馏权重、减少帧数、减小帧面积(但不要低于约 0.3 MP)、在基础权重上减少步数,最后是 "cfgCacheStride": 2 或 3(1.30× / 1.43×)。480p(约 0.4 MP)是 Wan 训练过的分辨率,属于真正的输出档位,而非降级模式。
配置文件(--config)
可以用 --config 传入一个 JSON 文件,取代冗长的命令行;CLI 读取相同格式。命令行参数始终优先——先应用文件中的值,命令行上再次给出的参数会覆盖它们,因此可以在多台主机上复用同一个文件,只覆盖需要变化的部分。--config 可重复以叠加多个文件(后者优先)。允许注释与尾随逗号。
# 从文件读取全部参数;本次仅覆盖后端
dotnet TensorSharp.Server.Host/bin/TensorSharp.Server.Host.dll --config config/server-basic.json
dotnet TensorSharp.Server.Host/bin/TensorSharp.Server.Host.dll --config config/server-basic.json --backend ggml_cpu
键名与下方长选项名相同(可带或不带前缀 --)。字符串/数字展开为 --key value,true 展开为裸开关 --key,数组展开为重复的标志(如 "stop": ["</s>", "<|eot|>"])。
变量。 在 "variables" 中定义一次共享值,用 ${name} 在任意字符串值中引用(未定义的名称回退到同名环境变量)。可以定义任意多个根路径——位于不同目录的模型各用一个。
自动下载。 任何文件参数都可以写成带本地 path 与一个或多个 urls 的对象。若 path 不存在,则从第一个可用 URL 下载(镜像按顺序尝试),保存到该路径,之后复用;进度打印到 stderr,可选的 sha256 用于校验。
{
"variables": { "modelRoot": "C:/models", "repo": "https://huggingface.co/unsloth/gemma-4-E4B-it-GGUF/resolve/main" },
"backend": "ggml_cuda",
"max-tokens": 4096,
"continuous-batching": true,
"stop": ["</s>", "<|eot|>"],
"model": { "path": "${modelRoot}/gemma-4-E4B-it-Q8_0.gguf", "urls": [ "${repo}/gemma-4-E4B-it-Q8_0.gguf" ] },
"mmproj": { "path": "${modelRoot}/gemma-4-E4B-mmproj-F16.gguf", "urls": [ "${repo}/mmproj-F16.gguf" ] }
}
开箱即用的示例见仓库 config/ 目录(cli-basic.json、server-basic.json、variables.json、auto-download.json、qwen-image-edit.json)——每个都使用真实、公开、无需授权的 URL,因此在全新机器上也能直接运行。完整说明见 config/README.md。
服务器选项
| 选项 | 说明 |
|---|---|
--model <path> | 要托管的 GGUF 文件(推理必需)。 |
--mmproj <path> | 显式多模态投影器 GGUF;只写文件名时相对于模型目录解析(传 none 可禁用)。需要 --model;不会自动扫描投影器。 |
--backend <type> | 默认后端:cpu、cuda、mlx、ggml_cpu、ggml_metal、ggml_cuda、ggml_vulkan。 |
--tp <N> | 张量并行度 —— 把托管的模型切分到本机 N 张 GPU 上(默认:1;环境变量 TENSORSHARP_TP_DEGREE)。需要 --backend cuda、ggml_cuda 或 ggml_vulkan。→ 多 GPU 与多节点 |
--tp-node-id <N> / --tp-peers <list> | 加入多节点 TP 集群:本节点的 0 起始编号,以及所有节点共享且顺序一致的 host:port 列表。服务端只能是节点 0(负责采样并对外提供 HTTP 的 driver);其余节点运行 TensorSharp.Cli worker。 |
--gpu-device <N> | ggml_vulkan 后端在多 GPU 主机上使用的 Vulkan 设备索引(默认:0;环境变量 TS_GGML_VULKAN_DEVICE)。 |
--list-gpus | 列出 ggml-vulkan 可见的 Vulkan 设备(索引 + 显卡名称)后退出。 |
--help | 打印完整参数说明后退出;不带任何参数时也会显示。推理始终需要启动参数 --model。 |
--config <path> | 从 JSON 配置文件读取参数(命令行参数会覆盖它)。支持 ${变量} 与通过 { "path": ..., "urls": [...] } 自动下载模型。可重复。 |
--max-tokens <N> | 所有端点(Web UI、Ollama、OpenAI)的生成上限:请求未指定时用它填充,请求要求更多时按它截断(默认:20000,该默认值只填充、不截断)。 |
--temperature / --top-k / --top-p / --min-p | 采样值(默认 0.8 / 40 / 0.9 / 0)。 |
--repeat-penalty / --presence-penalty / --frequency-penalty / --seed | 惩罚与随机种子(默认 1.1 / 0 / 0 / -1)。 |
--stop <string> | 停止序列(可重复)。在 config 优先级下与逐请求的 stop 列表合并;在 request 下被其替换。 |
--sampling-precedence <config|request> | 当请求同时携带了你在上面配置过的采样参数时以谁为准:config(默认)保留你的取值,request 让客户端的取值优先。你未配置过的参数始终取请求中的值。环境变量:TENSORSHARP_SAMPLING_PRECEDENCE。 |
--continuous-batching / --no-continuous-batching | 启用(默认)或禁用迭代级分页批处理。别名:--paged-batching。 |
--spec / --no-spec | 启用 / 禁用 NextN / MTP 推测解码(默认关闭)—— 对内嵌在主干 checkpoint 里的草稿器,这是显式的开启开关,因为加载它们会把额外权重调入显存。只在模型确实带有 MTP/NextN 草稿头时生效。GLM-5.2 与 GLM-5.3 的草稿头本来就在主干 GGUF 里,没有额外文件要下载,但该参数仍必须在模型加载之前出现在命令行上:正是它让 glm-dsa 把 NextN 层调入显存(GLM-5.2 的 IQ2_XXS 下约 3 GiB),同时也挤掉了一部分上下文空间。在 --tp N>1 下它会被拒绝 —— 那时草稿块只能借用按列切分的主干 LM head —— 因此这两个版本上的投机只在不传 --tp 的默认按层切分下生效。→ MTP |
--spec-draft <N> | 每个推测步草拟的最大 token 数(默认 8;块级草稿器默认取其训练块大小,并会把取值压到该块大小)。 |
--spec-pmin <f> | 保留某 token 所需的最低草稿置信度;0 表示完全不设门限。默认值取决于草稿器类型:逐 token 草稿头为 0.15,块级草稿器为 0.35(后者的门限是累积前缀概率,因此同一个数字要严格得多)。 |
--draft-model <path> | 所有以独立文件发布的草稿器共用的 GGUF 参数 —— DeepSeek V4 的 DSpark 支持模块、Muse-Glimmer 的 DFlash、Gemma 4 的 gemma4-assistant 草稿头。由文件自身的 general.architecture 决定加载方式,写出这个文件本身就会启用投机 —— 不需要再加 --spec(显式的 --no-spec 可将其否决)。Qwen 3.6、GLM-5.2 与 GLM-5.3 的 NextN 都位于主干 GGUF 中,不需要此参数 —— GLM-5.3 在 blk.78 上带的是完整的一块,由 --spec 负责启用;显式草稿无法激活时启动会失败。DSpark 在 cuda 与 ggml_cuda 后端上对单序列请求生效。每一行验证都用该请求自己的采样器,因此可与任意采样设置组合。环境变量:TS_DSV4_DSPARK。→ DSpark |
--prefill-chunk-size <N> | 每个调度步的最大 prefill token 数(设置 TS_SCHED_PREFILL_CHUNK)。 |
--kv-cache-dtype <type> | KV 缓存精度:f32、f16、q8_0 或 q4_0(默认自动,由后端 / 模型选择;环境变量 KV_CACHE_DTYPE)。 |
--paged-kv / --no-paged-kv | 独立 PagedKvCacheManager 的旧兼容开关,不在当前服务请求路径上;活跃请求 KV 由引擎管理。 |
--paged-kv-block-size / --paged-kv-ram-mb / --paged-kv-ssd-dir / --paged-kv-ssd-mb | 旧的独立 paged-KV 调参。当前服务请求请使用下方 TS_SCHED_* 引擎设置。 |
--paged-kv-quant-bits <b> | 旧的独立 TurboQuant 设置;服务端参数接受 0、4 或 8(运行时环境变量与 CLI 还接受 2)。 |
--qwen-image-vae / --qwen-image-vl / --qwen-image-mmproj <path> | 覆盖解析到的 Qwen-Image-Edit 伴随 GGUF(VAE / Qwen2.5-VL 文本编码器 / mmproj)。 |
--qwen-image-lora <path> | Qwen-Image-Edit Lightning 蒸馏 LoRA(.safetensors),作为运行期旁路挂在原封不动的量化基础权重旁边(不合并)。它从文件名自动推导去噪步数并把 CFG 切换为 1.0,使默认的 60 次 DiT 前向降到 4–8 次。环境变量:TS_QWEN_IMAGE_LORA。 |
--video-width <px> / --video-height <px> | 请求未带 width/height 时的默认输出尺寸。视频最主要的画质杠杆,因为网页界面自己不发送尺寸;MiniMax-H3 的推荐起点是 640×384,只给出宽高之一时 H3 会按条件图像的宽高比推出另一个。别名:--width / --height。 |
--video-steps <N> | 请求未带 steps 时的默认去噪步数。MiniMax-H3 默认 20 步;4–8 步是快速工作点,16–24 步明显更干净,超过约 30 步收益很小。 |
--video-mode <mode> | 请求未带 videoMode 时的默认条件模式:t2v、i2v、fl2v 或 ref。不传它,每个请求会按自身携带的内容推断模式,通常这才是你想要的。 |
--video-frames <N> | 请求未带 frames 时的默认输出帧数,会对齐到模型自身的时间网格(Wan 为 4k+1,MiniMax-H3 为 17k+5)。模型默认 33,Wan2.2-TI2V 为 49,MiniMax-H3 为 22。请求值会覆盖它 —— 这是默认值,不是上限。 |
--fps <N> | 请求未带 fps 时的默认 MP4 播放帧率。模型默认 16,Wan2.2-TI2V 为 24。以固定帧率训练的模型(MiniMax-H3,24 fps)会覆盖任何其他取值。fps 只改变播放速度,不改变生成的计算量。 |
--video-vae <path> | 视频 VAE —— wan_2.1_vae.safetensors,TI2V-5B 用 Wan2.2_VAE.safetensors,MiniMax-H3 用 minimax_h3_video_vae_fp16.safetensors。默认在 DiT 同目录扫描,包含 VAE/ 子目录。环境变量:TS_VIDEO_VAE;旧写法 --wan-vae 仍被接受。 |
--video-text-encoder <path> | 文本编码器 GGUF —— Wan 用 UMT5-XXL,MiniMax-H3 用 Qwen3-VL-32B。默认在同目录扫描(环境变量 TS_VIDEO_TEXT_ENCODER;也可写作 --video-te,旧写法为 --wan-te)。当 Wan 2.2 A14B 的两个专家不在一起时,用 --video-dit2 / TS_VIDEO_DIT2 指定第二个 high/low noise 专家。 |
--audio-vae <path> | 与视频联合生成音轨的模型所用的音频 VAE(minimax_h3_audio_vae_fp32.safetensors)。不传它这类模型照样能跑并产出视频,只是没有声音。环境变量:TS_VIDEO_AUDIO_VAE。 |
逐请求字段(temperature、top_p、seed、stop ……)会填补所有你未在此配置的参数;对于你配置过的参数,除非以 --sampling-precedence request 启动,否则以你的取值为准。chat.start 日志会打印每个请求实际使用的采样参数。
环境变量
| 变量 | 说明 |
|---|---|
BACKEND | 未传 --backend 时的默认后端(默认:macOS 上为 ggml_metal,其他平台为 ggml_cpu)。 |
MAX_TOKENS | 默认最大生成长度(默认:20000)。 |
MAX_CONTEXT | 硬性的上下文上限。不设时,自报的上下文只是上界:权重加载完之后引擎会去问各设备实际还剩多少显存,按「缓存加一整个 n_ubatch 计算图」能装下的大小定上下文,并打印它的选择(GLM-5.2 在 3× RTX PRO 6000 上:按层切分 342,272 token,--tp 3 91,136,--n-cpu-moe 30 646,400)。设了它,放得下就照办,放不下会带着数字直接报错,而不会被悄悄缩小。 |
TS_PDF_MAX_PAGES | 上传 PDF 时读取的页数上限,文本提取与页面图像渲染均遵循(默认:0 = 全部页面;CLI --pdf 同样遵循)。 |
VIDEO_SAMPLE_FPS / VIDEO_MAX_FRAMES | 每秒视频采样的帧数 / 可选的抽帧上限。 |
TS_FUSED_QKNORM_ROPE | Direct cuda 后端上 Qwen 3.5/3.6 文本 prefill 的融合 QK-Norm + RoPE CUDA 内核(默认开启;0 关闭)。 |
TENSORSHARP_TEMPERATURE、…_TOP_K、…_TOP_P、…_MIN_P | 当参数与请求体都未设置时的默认采样值。 |
TENSORSHARP_REPEAT_PENALTY、…_PRESENCE_PENALTY、…_FREQUENCY_PENALTY、…_SEED | 默认惩罚与随机种子。 |
TENSORSHARP_LOG_LEVEL / …_LOG_DIR / …_LOG_FILE | 日志级别、目录与文件开关(CLI 同样遵循)。 |
DIFFUSION_STEPS / DIFFUSION_MAX_BATCH | DiffusionGemma 每块去噪步数 / 批处理的最大并发扩散请求数。 |
TENSORSHARP_TP_DEGREE | 把托管模型切分到本机多少张 GPU 上(默认:1);服务端也支持 --tp N 参数。需要 --backend cuda、ggml_cuda 或 ggml_vulkan。→ 多 GPU 与多节点 |
TENSORSHARP_TP_DEVICES | 各 TP rank 使用的 GPU 序号,例如 0,2(默认 0..tp-1)。用于 GGML 后端。 |
TENSORSHARP_TP_NODE_ID / TENSORSHARP_TP_PEERS | 把张量并行扩展到多台机器:本节点的 0 起始编号,以及所有节点共用的逗号分隔 host:port 列表。两者必须同时设置。 |
TS_KV_CACHE_REDIS_URL / TS_KV_CACHE_REDIS_TTL_MINUTES | 把分页 KV 块持久化到 Redis,实现跨会话(乃至跨进程)复用,以及条目 TTL(分钟,默认 1440;0 = 不过期)。CLI:--redis-url / --paged-kv-redis-url / --paged-kv-redis-ttl。 |
TS_RESPONSES_STORE_REDIS_URL | 用 Redis 而非进程内存承载 OpenAI Responses API 存储。CLI:--redis-url。 |
服务器默认监听 http://0.0.0.0:5000;--port、--host 与 --urls(或环境变量 PORT / HOST / ASPNETCORE_URLS)可以改变它,Docker Space 镜像设置的是 PORT=7860。
连续批处理调参
调度器 / 引擎的旋钮在进程启动时读取。通过环境变量(或会被翻译成它们的 --continuous-batching 系列参数)设置。
| 变量 | 说明 |
|---|---|
TS_SCHED_DISABLE_BATCHED | 1 强制逐序列 KV 交换,即使模型支持批处理(= --no-continuous-batching)。 |
TS_SCHED_MAX_BATCHED_TOKENS | 每步 token 预算(默认 4096)。 |
TS_SCHED_MAX_RUNNING_SEQS | 最大在飞序列数(默认 16)。 |
TS_SCHED_PREFILL_CHUNK | 存在活跃 decode 时每请求的 prefill 上限(默认 256);仅 prefill 时会用满完整 token 预算。 |
TS_SCHED_SOLO_PREFILL_CHUNK | 系统中最多一个序列时的 prefill 分块大小,会限制所有独占 prefill 分块(默认 8192)。 |
TS_SCHED_DECODE_QUANTUM | 切换序列前的 decode token 数(默认 256 = 块大小)。 |
TS_SCHED_NUM_BLOCKS / TS_SCHED_BLOCK_SIZE | 引擎池中的物理块数(默认 256) / 每块 token 数(默认 256)。 |
TS_SCHED_PREFIX_CACHE | 0 禁用跨请求的块哈希前缀共享。 |
TS_BATCHED_FUSED_DECODE | 原生槽位路径(DeepSeek V4、GLM 5.x)默认启用批处理融合解码:一张图、每个序列一个 token,整批只读一次权重——GLM-5.2 在 4 路并发下总解码吞吐 1.81 倍。设为 0 可切回串行融合 decode;TS_GLM_BATCHED_DECODE=0 也会让 GLM 原生侧拒绝批处理。批处理会改变 GEMM 形状,而 2-bit MoE 可能把这点差异放大成不同的专家选择。 |
TS_<FAMILY>_BATCHED=0 | 逐模型的逃生口(如 TS_GEMMA4_BATCHED=0),回退到逐序列 KV 交换。 |