TensorSharp : 开源本地LLM推理引擎
摘要
TensorSharp是一个开源的.NET库,用于在本地运行LLM推理,支持GGUF模型,并提供CLI、Web聊天机器人和兼容OpenAI的API,支持多种后端选项(CUDA、Metal、CPU)。
查看缓存全文
缓存时间: 2026/07/04 18:51
zhongkaifu/TensorSharp
来源:https://github.com/zhongkaifu/TensorSharp
TensorSharp
面向 GGUF 模型的原生 .NET LLM 推理引擎,支持自回归 LLM 和 DiffusionGemma 风格的文本扩散模型。TensorSharp 提供控制台应用程序、基于 Web 的聊天界面,以及 Ollama/OpenAI 兼容的 HTTP API,便于编程访问。
快速开始
从零开始到流式回复,大约需要 30 秒(模型下载完成后)。
1. 先决条件 — .NET 10 SDK (https://dotnet.microsoft.com/download/dotnet/10.0)、git,以及(可选)GPU 工具链:NVIDIA → CUDA Toolkit 12.x;Apple Silicon → Xcode 命令行工具(Metal 内置)。完整列表请查看先决条件。
2. 克隆与构建 — 原生 GGML 库在首次构建时自动编译。
git clone https://github.com/zhongkaifu/TensorSharp.git
cd TensorSharp
dotnet build TensorSharp.slnx -c Release
3. 下载模型 — 一个体积小、经过充分测试的入门模型是来自 ggml-org/gemma-4-E4B-it-GGUF (https://huggingface.co/ggml-org/gemma-4-E4B-it-GGUF) 的 Gemma-4-E4B (Q8_0)。更多选择请参考已验证模型。
4. 运行 — 根据你的硬件选择 --backend(参见选择后端):
# 单次生成
echo "用一句话解释混合专家模型。" > prompt.txt
./TensorSharp.Cli --model gemma-4-E4B-it-Q8_0.gguf --input prompt.txt --backend ggml_metal # macOS
./TensorSharp.Cli --model gemma-4-E4B-it-Q8_0.gguf --input prompt.txt --backend ggml_cuda # Windows/Linux + NVIDIA
./TensorSharp.Cli --model gemma-4-E4B-it-Q8_0.gguf --input prompt.txt --backend cpu # 可移植 / 调试
# 交互式聊天(REPL)
./TensorSharp.Cli --model gemma-4-E4B-it-Q8_0.gguf -i --backend ggml_metal
更喜欢浏览器 UI 加 HTTP API?启动服务器即可:
./TensorSharp.Server --model gemma-4-E4B-it-Q8_0.gguf --backend ggml_metal
# 打开 http://localhost:5000 — 同时提供 Ollama 和 OpenAI 兼容的端点
CLI 二进制文件位于构建后的 TensorSharp.Cli/bin/...,服务器位于 TensorSharp.Server/bin/...。完整选项请参见:CLI 用法 · [服务器用法](#Web 应用程序)。
选择后端
不确定使用哪个后端?从这里开始。每个后端对于尚未实现的操作都会回退到 CPU,因此所有后端的输出都是正确的。
| 你的硬件 | 推荐后端 | 标志 | 说明 |
|---|---|---|---|
| Apple Silicon (Mac) | GGML Metal | --backend ggml_metal | macOS 默认。--backend mlx 是另一种 Apple Silicon GPU 路径。 |
| Windows / Linux + NVIDIA GPU | GGML CUDA | --backend ggml_cuda | 最经过测试的 NVIDIA 路径。--backend cuda 是用于实验的直接 PTX/cuBLAS 后端。 |
| 无 GPU / 可移植性 / 调试 | 纯 C# CPU | --backend cpu | 无需原生依赖。如需更快的 CPU 推理,请使用 --backend ggml_cpu(原生内核)。 |
有关每个后端的完整描述以及每个后端加速的内容,请参见计算后端。
已验证模型
这些架构已实现,并经过测试/基准矩阵的执行。选择适合你硬件的量化格式(例如 Q4_K_M 用于低内存,Q8_0 用于更高质量)。更多尺寸和多模态投影仪文件请参见模型下载 (GGUF)。
| 系列 | 示例模型 (GGUF) | 图像 / 视频 / 音频 | 思考 | 工具 | 卡片 |
|---|---|---|---|---|---|
| Gemma 4 | gemma-4-E4B-it (https://huggingface.co/ggml-org/gemma-4-E4B-it-GGUF)(还有 31B、26B-A4B MoE) | ✅ / ✅ / ✅ | ✅ | ✅ | gemma4.md |
| Qwen 3.5 / 3.6 | Qwen3.5-9B (https://huggingface.co/unsloth/Qwen3.5-9B-GGUF)(还有 35B-A3B MoE) | ✅ / — / — | ✅ | ✅ | qwen35.md |
| Qwen 3 | Qwen3-4B (https://huggingface.co/Qwen/Qwen3-4B-GGUF) | — / — / — | ✅ | ✅ | qwen3.md |
| GPT OSS | gpt-oss-20b (https://huggingface.co/ggml-org/gpt-oss-20b-GGUF)(MoE) | — / — / — | ✅ | ✅ | gptoss.md |
| Nemotron-H | Nemotron-H-8B (https://huggingface.co/bartowski/nvidia_Nemotron-H-8B-Reasoning-128K-GGUF)(还有 47B、Omni) | ✅ (Omni) / — / — | ✅ | ✅ | nemotron.md |
| Mistral 3 | Mistral-Small-3.1-24B (https://huggingface.co/bartowski/Mistral-Small-3.1-24B-Instruct-2503-GGUF) | ✅ / — / — | — | — | mistral3.md |
| Gemma 3 | gemma-3-4b-it (https://huggingface.co/google/gemma-3-4b-it-qat-q4_0-gguf) | ✅ / — / — | — | — | gemma3.md |
| DiffusionGemma | diffusion-gemma GGUFs | — / — / — | — | — | diffusiongemma.md |
| Qwen-Image-Edit | qwen-image-edit GGUFs (MMDiT + VAE + Qwen2.5-VL) | 🖼️ 图像 → 图像 | — | — | qwenimage.md |
亮点
-
与 llama.cpp 一较高下 — 纯 .NET 实现 — 在相同的 GGUF 文件和 GPU 上直接对比,TensorSharp 在关键工作负载上匹配或超越了经过手工调优的 C++
llama.cpp:Gemma 4 26B-A4B MoE 预填充速度 1.32×,首词输出快 1.30×(几何平均;某些场景高达 1.70× / 1.65×),Gemma 4 12B 在每个解码场景均获胜或持平(几何平均 1.17×),流式工具调用解码速度提升 2.37×,Gemma 4 E4B 的结构化输出(JSON)解码速度提升 7.7×(405 vs 52 tok/s)。→ 与 llama.cpp 直接对比 -
连续批处理与分页 KV 缓存 — vLLM 风格的分页 KV 池,带有块哈希前缀共享和迭代级调度器,在服务器中默认开启。→ 深入解读
-
MTP / NextN 推测解码 — 多令牌预测草稿头加速 Qwen 3.6(NextN 块嵌入在主干 GGUF 中)和 Gemma 4(单独的
gemma4-assistant草稿 GGUF)的独立解码。草稿每次提议多个令牌,主干在一次批处理前向中验证它们,由请求自身的采样器驱动草稿和验证。通过--mtp-spec(+ Gemma 4 的--mtp-draft-model)选择启用。→ 推测解码 -
DiffusionGemma 文本扩散 — 基于 Gemma-4 派生 MoE 主干的块级熵界去噪,提供 CLI 生成标志和 Web UI 去噪预览流。→ DiffusionGemma 卡片
-
Qwen-Image-Edit 图像编辑 — 提示 + 输入图像 → 编辑后的图像,驱动包含 60 个块的 MMDiT 扩散变压器,配合 Qwen-Image VAE 和 Qwen2.5-VL-7B 文本编码器。支持 CUDA 图捕获的完整 DiT 前向、FlowMatch-Euler 真 CFG 去噪,以及 Web UI 实时去噪预览。→ Qwen-Image-Edit 卡片
-
多模态 — 图像 / 视频 / 音频输入(Gemma 4);Gemma 3、Qwen 3.5 系列、Mistral 3 和 Nemotron-H Omni 的图像输入。→ 多模态支持
-
工具调用 / 函数调用 — 三种 API 风格均支持多轮工具调用,并具有架构无关的输出解析。→ 工具调用
-
思考 / 推理模式 — 针对 Qwen 3、Qwen 3.5/3.6 系列、Gemma 4、GPT OSS 和 Nemotron-H 的结构化思维链。→ 思考模式
-
Ollama 和 OpenAI 兼容 API — 用于现有工具的即插即用端点,外加浏览器聊天 UI。→ HTTP API
-
原生量化的计算 — Q4_K_M / Q8_0 / MXFP4 / IQ2_XXS 等格式在矩阵乘法中运行,无需反量化到 FP32。
以下内容为详细参考。如果你是新手,只需阅读上述五个部分即可开始运行。
文档地图
| 从这里开始 | 当你想要… |
|---|---|
| 快速构建与使用 | 构建解决方案、编译原生 GGML 桥接并运行 CLI 或服务器 |
| 支持的模型架构 | 检查哪些 GGUF 架构键、模态、思考模式和工具调用路径已实现 |
| 计算后端 | 在纯 C# CPU、直接 CUDA/cuBLAS、MLX Metal、GGML CPU、GGML Metal 和 GGML CUDA 之间选择 |
| HTTP API | 使用 Ollama 兼容、OpenAI 兼容或 Web UI SSE 端点 |
| 逐模型架构卡片 | 阅读一个架构的端到端文档(起源、前向图、组件、参数,以及 TensorSharp 如何实现/优化预填充和解码) |
| 分页注意力与连续批处理 | 了解 vLLM 风格的分页 KV 缓存、前缀共享和迭代级调度器 |
| 环境变量特性矩阵 | 查看哪些高影响运行时标志影响哪些模型、后端和提示类型 |
| 测试/基准矩阵运行器 | 遍历模型 × 后端 × 特性 × 环境变量单元格并生成回归报告 |
| 服务器 API 示例 | 复制服务器接口的完整 curl 和 Python 示例 |
| 服务器集成测试 | 针对正在运行的服务器执行公共 API 契约测试 |
当前状态
| 领域 | 状态 |
|---|---|
| 模型系列 | Gemma 3/4、DiffusionGemma、Qwen 3、Qwen 3.5/3.6 系列 GGUFs(qwen35、qwen35moe、qwen3next)、GPT OSS、Nemotron-H(包括 Nemotron 3 Nano Omni)和 Mistral 3。通过 Qwen-Image-Edit(qwen_image MMDiT)进行图像编辑。 |
| 推理宿主 | CLI、交互式 REPL、ASP.NET Core Web UI、Ollama 风格 API、OpenAI Chat Completions 风格 API。DiffusionGemma 当前使用 CLI 扩散运行模式和 Web UI 去噪流;Qwen-Image-Edit 通过 CLI 图像编辑模式和 Web UI 图像编辑流程运行。 |
| 后端 | 纯 C# CPU、直接 CUDA/cuBLAS(cuda)、MLX Metal(mlx)、GGML CPU、GGML Metal、GGML CUDA |
| 多模态 | Gemma 4 图像/视频/音频;Gemma 3、Qwen 3.5 系列、Mistral 3 和 Nemotron-H Omni 图像输入 |
| 连续批处理 | vLLM 风格的分页 KV 缓存、请求间的块哈希前缀共享、迭代级调度器(默认启用;通过 --no-continuous-batching 选择退出) |
| 推测解码 | MTP / NextN 草稿头,用于 Qwen 3.6(嵌入式 NextN)和 Gemma 4(单独的 gemma4-assistant 草稿 GGUF)的独立解码;默认关闭,通过 --mtp-spec(+ Gemma 4 的 --mtp-draft-model)选择启用。在 ggml 后端和纯 C# cuda 后端上有收益;CPU / MLX 保持在标准解码。 |
| 服务器模型范围 | 一个通过 --model 显式托管的 GGUF;可选的显式投影仪通过 --mmproj;不进行目录扫描 |
| 可观测性 | 跨 Web UI、Ollama 和 OpenAI 响应格式的结构化每轮日志、队列状态和 KV 缓存重用指标 |
| 测试/评估工具 | TensorSharp.TestMatrix 在支持的宿主上遍历模型、后端、特性和环境变量单元格,然后与每宿主基线进行比较 |
特性
- 多架构支持 — Gemma 4、Gemma 3、DiffusionGemma、Qwen 3、Qwen 3.5/3.6 系列、GPT OSS、Nemotron-H、Mistral 3 和 Qwen-Image-Edit(图像编辑)
- 多模态推理 — 图像、视频和音频输入(Gemma 4);Gemma 3 / Qwen 3.5 系列 / Mistral 3 / Nemotron-H Omni 的图像
- 思考 / 推理模式 — 带有 `` /
<|channel>thought/<|channel>analysis标签的结构化思维链输出(Qwen 3、Qwen 3.5/3.6 系列、Gemma 4、GPT OSS、Nemotron-H) - 工具调用 / 函数调用 — 模型可以调用用户定义的工具;三种 API 风格均支持多轮工具调用对话
- 量化模型支持 — 加载 Q4_K_M、Q8_0、F16、MXFP4 及其他量化格式的 GGUF 文件;执行原生量化矩阵乘法,无需反量化到 FP32,包括针对大型 GGUF 的内存高效纯 C# CPU 加载
- GPU 加速 — macOS 上的 GGML Metal、Windows/Linux 上配合 NVIDIA GPU 的 GGML CUDA、带有 PTX 内核的直接 CUDA/cuBLAS 后端,以及针对 Apple Silicon 的 MLX 后端(mlx-c / Metal),均支持未实现操作的 CPU 回退
- 优化的纯 C# CPU 后端 — 托管 GEMM 快速路径,加上 RMSNorm、RoPE、Softmax、融合激活及其他推理热点的融合 SIMD 内核
- 连续批处理与分页 KV 缓存 — vLLM 风格的分页 KV 池,带有请求间的块哈希前缀共享、可接纳/抢占序列的迭代级调度器、用于非常大的 KV 工作集的可选 SSD 支持层,以及原生的融合分页注意力内核(
TSGgml_PagedAttentionForward),该内核在 Metal/CUDA 上驱动ggml_flash_attn_ext。在TensorSharp.Server中默认启用;使用--no-continuous-batching选择退出。参见 docs/PAGED_ATTENTION_AND_CONTINUOUS_BATCHING.md。 - MTP / NextN 推测解码 — 多令牌预测草稿头加速独立(非并发)解码。Qwen 3.6 将其 NextN 块融合到主干 GGUF 中;Gemma 4 通过
--mtp-draft-model加载单独的 EAGLE 风格gemma4-assistant草稿 GGUF,其草稿层关注目标的 KV 缓存。草稿每步最多提议--mtp-draft个令牌(在草稿置信度 ≥--mtp-pmin时保留),主干在单个批处理前向中验证它们;请求自身的采样器(包括惩罚)驱动草稿和验证,因此输出与标准解码相同。通过--mtp-spec选择启用(默认关闭)。在 ggml 后端上,融合的多令牌验证/草稿步骤内核使其明显获益;纯 C#cuda后端运行完全驻留在 GPU 上的逐操作验证/草稿,同样获益。CPU / MLX 保持在标准解码。环境变量:TS_MTP_*(通用)和TS_GMTP_*(Gemma 4 调优)。 - 批处理 / 并行推理 — Mistral 3、Gemma 4、GPT OSS、Qwen 3、Qwen 3.5/3.6 系列和 Nemotron-H 的
IBatchedPagedModel.ForwardBatch实现默认运行,将 N 个序列打包到单个前向传播中,具有分页 K/V 散布和通过原生内核的逐序列注意力。每个模型都暴露了TS__BATCHED=0的逃生门(例如TS_GEMMA4_BATCHED=0、TS_QWEN35_BATCHED=0、TS_GPTOSS_BATCHED=0、TS_NEMOTRON_BATCHED=0),用于回退到逐序列 KV 交换路径,以便进行 A/B 比较或回归隔离。 - Ollama 和 OpenAI API 兼容 — 现有工具的即插即用替换端点
- 可配置采样 — 温度、top-k、top-p、min-p、重复/存在/频率惩罚、随机种子、停止序列
- 聊天模板 — 从 GGUF 元数据自动加载(Jinja2),每个架构有硬编码的回退
- 推理引擎 — 新的
InferenceEngine(工作线程调度器 + 分页块池)取代了TensorSharp.Server内部的旧单请求 FIFO 队列。旧队列对象现在是一个用于状态/事件形状的兼容性垫片;引擎本身处理并发。 - 批量处理 — 控制台应用程序中的 JSONL 输入支持,以及内置的预填充/解码吞吐量推理基准测试
- 流式传输 — 通过 SSE(Web)或 stdout(控制台)的逐令牌输出,支持正在进行的生成的中止/停止
- 文本扩散生成 — DiffusionGemma 使用迭代熵界去噪采样器,而非自回归的
Forward()。CLI 暴露了--diffusion-steps、--diffusion-seed和--diffusion-blocks;Web UI 流式传输整条消息的replace事件,用于实时去噪预览,并通过DiffusionBatchScheduler批处理并发扩散请求。 - 图像编辑 (Qwen-Image-Edit) — 提示加输入图像产生编辑后的图像。加载的
qwen_imageGGUF 是 MMDiT 扩散变压器;TensorSharp 在它旁边解析两个配套的 GGUF — Qwen-Image VAE(图像 ↔ 16 通道潜在空间)和 Qwen2.5-VL-7B 文本编码器(提示 → 3584 维条件,可选的视觉接地通过mmproj)。流水线将参考图像进行 VAE 编码,构建文本(以及可选的图像)条
相似文章
大语言模型与本地AI硬件的推理引擎(2026版)
本文提供了一份全面的指南,针对2026年本地AI硬件上的大语言模型推理引擎,解释了如何根据硬件策略、工作负载和服务模型进行选择,并涵盖了诸如llama.cpp、MLX、ExLlamaV2/3、vLLM、SGLang、TensorRT-LLM和NVIDIA Dynamo等引擎。
大规模LLM推理开放手册(GPU内部机制、KV缓存、批处理、vLLM/SGLang/TensorRT-LLM)[P]
一本正在编写中的开放手册,解释LLM推理内部机制,包括GPU内存层次结构、KV缓存、批处理以及vLLM和TensorRT-LLM等流行推理引擎。
@akshay_pachaar:每个推理引擎都犯了同样的错误。像 vLLM 或 SGLang 这样的推理引擎,是位于你的请求与模型权重之间的软件……
LMCache 是一个开源的 KV 缓存管理层,它将缓存 I/O 与计算分离,可插入 vLLM、SGLang 和 TensorRT-LLM,通过并行化缓存查找和共享 GPU 内存,实现高达 14 倍的首 token 延迟降低和 4 倍的解码加速。
Show HN: Tiny-vLLM – 使用C++和CUDA的高性能LLM推理引擎
Tiny-vLLM是一个高性能的LLM推理引擎,采用C++和CUDA实现,提供连续批处理和PagedAttention等特性,并作为教育资源。
@0xSero:关于 LLM 推理与部署,看这一篇就够了。你听说过:- vLLM - SGLang - llama.cpp - …
vLLM、SGLang、llama.cpp 与 ExLlamaV3 等主流开源推理引擎概览,助你轻松托管并运行大模型。