命令行 (CLI)
TensorSharp.Cli 是用于本地提示词、多模态实验、提示词检查、JSONL 批处理工作流、交互式 REPL 与内置基准测试的控制台宿主。构建后二进制位于 TensorSharp.Cli/bin/...。
约 30 秒快速开始
请在 TensorSharp 仓库根目录执行,并先按平台安装 .NET 10 SDK。已验证的快速开始会构建原生 GGML 后端,并运行仓库基准已验证的 gemma-4-E4B-it-Q8_0.gguf(7.48 GiB)。复制并运行这些命令约需 30 秒;模型下载与首次 restore/构建耗时更长,取决于网络速度与机器性能。原生源码构建还需要 Git、网络访问、CMake 与可用的 C++ 工具链。
Linux + NVIDIA
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
echo "请用一段话说明本地推理。" > prompt.txt
dotnet run --project TensorSharp.Cli -c Release --no-build -- --model models/gemma-4-E4B-it-Q8_0.gguf --input prompt.txt --max-tokens 128 --backend ggml_cuda
Windows PowerShell + NVIDIA
$env:TENSORSHARP_GGML_NATIVE_ENABLE_CUDA = 'ON'
dotnet build TensorSharp.slnx -c Release -p:TensorSharpSkipMlxNative=true
curl.exe --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
Set-Content -Encoding utf8 prompt.txt "请用一段话说明本地推理。"
dotnet run --project TensorSharp.Cli -c Release --no-build -- --model models\gemma-4-E4B-it-Q8_0.gguf --input prompt.txt --max-tokens 128 --backend ggml_cuda
省略 --input 时,CLI 会退回内置的 What is 1+1? 提示词;若要进行自定义的单次文本推理,请把提示词保存到文件并通过 --input 传入。--prompt 仅用于 Qwen-Image-Edit 的编辑指令。
在其他原生后端上运行 Gemma 4 E4B
Apple Silicon 请省略 CUDA 环境变量并使用 ggml_metal;受支持的 Windows/Linux Vulkan GPU 请改为请求 TENSORSHARP_GGML_NATIVE_ENABLE_VULKAN=ON 并使用 ggml_vulkan;ggml_cpu 运行原生 CPU 内核,无需 GPU。同一仓库还提供内存占用更低的 gemma-4-E4B-it-Q4_K_M.gguf。纯文本不需要 mmproj;只有图像、视频或音频输入才需要通过 --mmproj 添加匹配的 mmproj-gemma-4-E4B-it-Q8_0.gguf。完整平台语法见快速开始。
示例
请在仓库根目录运行这些源码命令。替换示例路径,并选择构建所支持的原生后端。
# 文本推理(macOS)
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
--model <model.gguf> --input prompt.txt --output result.txt \
--max-tokens 200 --backend ggml_metal
# Windows/Linux + NVIDIA GPU 上的文本推理
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
--model <model.gguf> --input prompt.txt --output result.txt \
--max-tokens 200 --backend ggml_cuda
# 在任意 Vulkan GPU(AMD / Intel / NVIDIA)上的文本推理
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
--model <model.gguf> --input prompt.txt --output result.txt \
--max-tokens 200 --backend ggml_vulkan
# 多 GPU 主机:先列出可见的 Vulkan 设备,再按索引选择
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- --list-gpus
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
--model <model.gguf> --input prompt.txt --max-tokens 200 \
--backend ggml_vulkan --gpu-device 1
# 交互式逐轮聊天(REPL),带 KV 缓存复用与斜杠命令
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
--model <model.gguf> --backend ggml_metal --interactive
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
--model <model.gguf> --backend ggml_metal -i \
--system "You are a terse assistant." --temperature 0.7 --top-p 0.9 --think
多模态
# 图像推理(Gemma 3/4、Qwen 3.5-family)
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
--model <model.gguf> --image photo.png --max-tokens 200 --backend ggml_metal
# 视频推理(Gemma 4)
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
--model <model.gguf> --video clip.mp4 --max-tokens 200 --backend ggml_metal
# 音频推理(Gemma 4)
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
--model <model.gguf> --audio speech.wav --max-tokens 200 --backend ggml_metal
# PDF 文档问答(--input 是问题;扫描件/纯图像 PDF 需要视觉模型 +
# --mmproj,含文本的 PDF 可使用任意模型)
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
--model <model.gguf> --pdf report.pdf --input question.txt \
--max-tokens 400 --backend ggml_metal
推理、工具与采样
# 思考 / 推理模式
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
--model <model.gguf> --input prompt.txt --max-tokens 400 --backend ggml_metal --think
# 工具调用
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
--model <model.gguf> --input prompt.txt --max-tokens 300 --backend ggml_metal \
--tools tools.json
# 带采样参数(CLI 默认为贪心解码)
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
--model <model.gguf> --input prompt.txt --max-tokens 200 --backend ggml_metal \
--temperature 0.7 --top-p 0.9 --top-k 40 --repeat-penalty 1.2 --seed 42
图像编辑(Qwen-Image-Edit)
# 提示词 + 输入图像 -> 编辑后的图像。VAE + Qwen2.5-VL 文本编码器伴随文件
# 会在 DiT GGUF 旁解析(或用 --qwen-image-vae / --qwen-image-vl /
# --qwen-image-mmproj 指定)。
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
--model <qwen-image-edit-DiT.gguf> --image input.png \
--prompt "Make the sky a dramatic sunset." --output edited.png \
--backend ggml_cuda --diffusion-steps 30 --cfg 2.5 --diffusion-seed 0
DiffusionGemma 与检查
# DiffusionGemma 文本扩散生成
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
--model <diffusion-gemma.gguf> --input prompt.txt --backend ggml_metal \
--max-tokens 256 --diffusion-steps 48 --diffusion-seed 0
# 检查渲染后的提示词与分词,但不运行推理
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
--model <model.gguf> --input prompt.txt --dump-prompt
批处理与基准测试
# 批处理(JSONL)
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
--model <model.gguf> --input-jsonl requests.jsonl \
--output results.txt --backend ggml_metal
# 带 KV 缓存复用的多轮对话模拟(与 Web UI 行为一致)
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
--model <model.gguf> --multi-turn-jsonl chat.jsonl \
--backend ggml_metal --max-tokens 200
# 吞吐基准:best-of-N 的 prefill 与 decode 计时
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
--model <model.gguf> --backend ggml_metal \
--benchmark --bench-prefill 256 --bench-decode 128 --bench-runs 3
JSONL 格式为每行一个 JSON 对象:
{"id": "q1", "messages": [{"role": "user", "content": "What is 2+3?"}], "max_tokens": 50}
{"id": "q2", "messages": [{"role": "user", "content": "Write a haiku."}], "max_tokens": 100, "temperature": 0.8}
配置文件(--config)
可以用 --config 传入一个 JSON 文件,取代冗长的命令行;服务端读取相同格式。命令行参数始终优先——先应用文件中的值,命令行上再次给出的参数会覆盖它们,因此可以在多台机器上复用同一个文件,只覆盖需要变化的部分。--config 可重复以叠加多个文件(后者优先)。允许注释与尾随逗号。
# 使用该文件,但本次运行覆盖后端
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
--config config/cli-basic.json --backend ggml_cpu
键名与下方长选项名相同(可带或不带前缀 --)。字符串/数字展开为 --key value,true 展开为裸开关 --key,数组展开为重复的标志。
变量。 在 "variables" 中定义一次共享值,用 ${name} 在任意字符串值中引用(未定义的名称回退到同名环境变量)。可以定义任意多个根路径。
自动下载。 任何文件参数都可以写成带本地 path 与一个或多个 urls 的对象。若 path 不存在,则从第一个可用 URL 下载(镜像按顺序尝试),保存到该路径,之后复用;进度打印到 stderr,可选的 sha256 用于校验。
{
"variables": { "modelRoot": "C:/models", "hf": "https://huggingface.co" },
"backend": "ggml_cuda",
"max-tokens": 256,
"temperature": 0.7,
"model": {
"path": "${modelRoot}/Qwen3.5-9B-Q8_0.gguf",
"urls": [ "${hf}/unsloth/Qwen3.5-9B-GGUF/resolve/main/Qwen3.5-9B-Q8_0.gguf" ]
}
}
开箱即用的示例见仓库 config/ 目录(cli-basic.json、server-basic.json、variables.json、auto-download.json、qwen-image-edit.json)——每个都使用真实、公开、无需授权的 URL,因此在全新机器上也能直接运行。完整说明见 config/README.md。
命令行选项
不带任何参数运行 CLI —— 或使用 --help(也支持 -h、-?、/?)—— 会打印完整的参数参考:逐项列出说明、默认值、取值范围与示例,并在日志与模型机制启动之前退出。未知参数会被忽略,因此请准确复制选项名,否则拼写错误也可能看起来执行成功。
输入 / 输出
| 选项 | 说明 |
|---|---|
--model <path> | GGUF 模型文件路径(必需)。 |
--input <path> | 包含用户提示词的文本文件。单次文本提示词只能来自文件;--prompt 保留用于 Qwen-Image-Edit 的编辑指令。 |
--pdf <path> | 单次模式的 PDF 文档输入。含文本的 PDF 会完整提取并内联文本;扫描件/纯图像 PDF 会光栅化为页面图像,并需要视觉模型 + --mmproj。--input 变为针对文档的问题;TS_PDF_MAX_PAGES 限制读取页数(默认:全部)。 |
--input-jsonl <path> | 含批量请求的 JSONL 文件(每行一个 JSON)。 |
--multi-turn-jsonl <path> | 用于带 KV 缓存复用的多轮对话模拟的 JSONL 文件。 |
--output <path> | 将生成文本写入此文件。 |
--image / --video / --audio <path> | 用于视觉 / 视频 / 音频推理的媒体文件(音频需要 Gemma 4 的音频编码器)。 |
--mmproj <path> | 多模态投影器 GGUF 路径。建议显式传入;自动检测只识别少数旧式伴随文件名。 |
运行时
| 选项 | 说明 |
|---|---|
--max-tokens <N> | 最大生成 token 数(默认:100)。 |
--backend <type> | 计算后端:cpu、cuda、mlx、ggml_cpu、ggml_metal、ggml_cuda、ggml_vulkan(默认:ggml_cpu)。 |
--gpu-device <N> | ggml_vulkan 后端在多 GPU 主机上使用的 Vulkan 设备索引(默认:0;环境变量 TS_GGML_VULKAN_DEVICE)。 |
--list-gpus | 列出 ggml-vulkan 可见的 Vulkan 设备(索引 + 显卡名称)后退出。 |
--help | 打印完整参数参考(逐项列出说明、默认值、取值范围与示例)后退出;不带任何参数启动 CLI 时也会显示。 |
--kv-cache-dtype <type> | KV 缓存精度:f32、f16、q8_0 或 q4_0(默认:自动,由后端/模型选择;覆盖 KV_CACHE_DTYPE 环境变量)。块量化档位需要原生 GGML flash-attention 路径;q4_0(约为 f32 占用的 1/7)面向 128K–256K 的超长上下文。 |
--interactive / -i | 启动交互式 REPL(见下文)。 |
--system <text> / --system-file <path> | 从文本或文件设定会话的系统提示。仅交互式 REPL 与 DiffusionGemma 扩散模式使用它;普通单次文本模式会忽略系统提示。 |
--think | 启用思考 / 推理模式(思维链)。 |
--tools <path> | 含工具 / 函数定义的 JSON 文件。 |
--dump-prompt | 渲染提示词 + 分词后退出(不生成)。 |
--tp <N> | 张量并行度 —— 在单个进程内把模型切分到 N 张 GPU 上(默认:1)。需要 --backend cuda、ggml_cuda 或 ggml_vulkan;用 TENSORSHARP_TP_DEVICES 指定使用哪几张卡。→ 多 GPU 与多节点 |
--tp-node-id <N> | 多节点分布式张量并行中本节点的 0 起始编号。需与 --tp-peers 一起使用。 |
--tp-peers <list> | 集群中所有节点的 host:port 列表,逗号分隔(例如 192.168.1.10:9500,192.168.1.11:9500)。所有节点必须完全一致;端口没有默认值,且需在节点之间可达。 |
--config <path> | 从 JSON 配置文件读取参数(命令行参数会覆盖它)。支持 ${变量} 与模型自动下载。可重复。 |
采样
CLI 默认为贪心解码:temperature 0、top-k 0、top-p 1.0、min-p 0、关闭惩罚、seed -1(与默认值匹配 Ollama 的服务端不同)。传入以下参数可启用采样;这些参数也会带入交互式 REPL。
| 选项 | 说明 |
|---|---|
--temperature <f> | 采样温度(默认 0 = 贪心)。 |
--top-k <N> | Top-K 过滤(默认 0 = 禁用)。 |
--top-p <f> | 核采样阈值(默认 1.0 = 禁用)。 |
--min-p <f> | 最小概率过滤(默认 0 = 禁用)。 |
--repeat-penalty <f> | 重复惩罚(默认 1.0 = 无)。 |
--presence-penalty <f> / --frequency-penalty <f> | 存在 / 频率惩罚(默认 0 = 禁用)。 |
--seed <N> | 随机种子(默认 -1 = 非确定性)。 |
--stop <string> | 停止序列(可重复)。 |
DiffusionGemma、基准测试与日志
| 选项 | 说明 |
|---|---|
--diffusion-steps <N> | DiffusionGemma 每块去噪步数(默认:48)。 |
--diffusion-seed <N> | DiffusionGemma 确定性采样器种子(默认:0)。 |
--diffusion-blocks <N> | 块自回归画布数量(0 由 --max-tokens 推导)。 |
--image <path> / --prompt <text> / --output <path> | Qwen-Image-Edit:输入图像、编辑指令与输出 PNG(默认 edited.png)。复用 --diffusion-steps / --diffusion-seed。 |
--cfg <F> | Qwen-Image-Edit true-CFG 引导尺度(省略则自动取值:2.5,加载 Lightning LoRA 时为 1.0;<= 1 关闭负向分支)。 |
--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),在加载时合并进 DiT;自动推导去噪步数(如 4 或 8),并将 CFG 切换为 1.0(无负向分支)。 |
--benchmark | 运行合成的 prefill/decode 吞吐基准。 |
--bench-prefill / --bench-decode / --bench-runs <N> | 合成的 prefill 长度、decode 长度与运行次数。 |
--bench-kvcache / --bench-kv-turns <N> | 多轮 KV 缓存复用基准(带缓存 vs 强制重置)。 |
--warmup-runs <N> | 计时前丢弃的前向次数(默认:0)。 |
--log-level <lvl> | trace、debug、info、warning、error、critical、off。 |
--log-dir <path> / --log-file <0|1> / --log-console <0|1> | JSON 行文件日志的目录与开关。 |
完整参考(含 --test、--test-templates 与分块 prefill 正确性检查)见 API 参考 页。
交互式 REPL 命令
用 --interactive / -i 启动。任何不以 / 开头的内容都是一轮用户输入;输入 /help 查看列表。提示头显示当前模型、后端、架构、上下文长度、投影器、对话深度与待发送附件。生成时按 Ctrl+C 中断;在提示符处按 Ctrl+C 退出。
对话
| 命令 | 说明 |
|---|---|
/help、/? | 显示所有交互命令。 |
/exit、/quit | 离开会话。 |
/reset、/new | 清空对话历史与 KV 缓存。 |
/history · /save <file> | 打印对话 / 将记录写入文件。 |
/system <text> | 设置系统提示(空参数会清除它)。 |
/think on|off · /multiline on|off | 切换推理模式 / 多行输入。 |
模型与运行时
| 命令 | 说明 |
|---|---|
/info、/status | 显示已加载模型、后端、架构、上下文/词表大小、投影器、深度。 |
/model <path> | 在当前后端上加载另一个 .gguf(重置会话)。 |
/backend <name> | 在另一后端上重新加载当前模型。 |
/mmproj <path> | 加载或替换多模态投影器。别名:/projector。 |
采样(实时)与上传(下一轮)
| 命令 | 说明 |
|---|---|
/sampling、/show | 打印当前采样配置。 |
/max · /temp · /topk · /topp · /minp | 设置回复长度 / 温度 / top-k / top-p / min-p。 |
/repeat · /presence · /frequency · /seed | 设置惩罚与随机种子。 |
/stop <text> · /clearstop | 添加 / 清除停止序列。 |
/image <path> · /audio · /video · /text | 为下一轮附加媒体或内联一个文本文件。 |
/clearattach | 丢弃待发送附件而不发送一轮。 |