架构实现参考
按项目职责、扩展接口与执行边界定位源码。首次阅读请先看架构概览;具体配置继续使用现有的后端、模型与高级功能指南。
下列实现与支持说明从 fd699822 的原概览保留,数值例子保留各自的模型与设备语境;它们不是通用性能保证。支持组合以模型指南和后端指南为准,新增能力也不证明每个发布包或设备都已验证。
项目职责
这里描述职责;完整的包名、项目引用与使用示例见 C# 项目与包边界。
TensorSharp 是一个分层系统。每一层都是可独立打包的项目,因此源码使用者只需引用需要的部分。当前源码发布集合共 14 个包,由 eng/verify-packages.ps1 校验。包与 Release 版本对应各自的发布标签;发行后合并的功能需要包含它们的新版发行包,或使用当前源码构建。包的职责与引用方式 →
| 层 | 职责 |
|---|---|
| TensorSharp.Core | 核心 Tensor 类型、存储抽象、设备抽象,以及可扩展的运算注册表(Ops)。CPU 实现使用 System.Numerics.Vectors 做 SIMD。 |
| TensorSharp.Runtime | GGUF 解析、分词器(SentencePiece / BPE)、聊天模板渲染、采样、输出解析、分页 KV 缓存,以及连续批处理的调度器 / 引擎。提示词的框架化与回复解析现在按家族声明为 ChatProtocolRegistry 中的一份 ChatProtocol,而不再按架构名分支。 |
| TensorSharp.AgentHost | 构建在 Runtime 之上的可选智能体层:Agent Skills、模型 / 工具内部循环、有界子智能体委派、沙箱化的脚本与代码执行、持久工作区、文件编辑、依赖安装与产物收集。Runtime 不反向引用它,因此普通推理宿主无需携带智能体机制。 |
| TensorSharp.Models | ModelBase 以及具体架构与多模态编码器。生成模型家族通过插件注册——在 BuiltInArchitectures 中注册一份 ModelArchitectureDescriptor;ModelBase.Create() 从 GGUF 元数据自动识别架构,再交给对应描述符的工厂方法。句子编码器使用 EmbeddingModel.Load();见嵌入。 |
| TensorSharp.Backends.GGML | 通过原生 C++ 桥接(libGgmlOps)链接 ggml 实现加速运算 —— macOS 上用 Metal,Windows/Linux 上用 CUDA 与 Vulkan,以及原生 CPU。 |
| TensorSharp.Backends.Cuda | 直接 CUDA 路径:CUDA Driver API、cuBLAS GEMM,以及热点运算的 PTX 内核,并带 CPU 回退。 |
| TensorSharp.Backends.MLX | Apple Silicon 的 MLX 路径,封装 mlx-c,提供量化、融合与编译内核。 |
| TensorSharp.Distributed | 多节点张量并行所用的点对点 TCP 协调层,与模型 / 运行时层分离。 |
| TensorSharp.Knowledge | 独立的个人资料库:原文件与版本化文档、提取器、BM25/可选向量检索、范围隔离与引用位置;Chat、AgentHost 与宿主层接入同一个存储。知识库指南 → |
| TensorSharp.Chat | 服务端与 TensorAgent 共用的、与宿主无关的聊天流水线:模型服务、会话、生成、每模型的连续批处理引擎宿主、技能与子智能体循环,以及 Web UI 的请求 / 流式协议,不依赖 ASP.NET Core。CLI 项目虽然引用了该库,但并不基于它的流水线运行,而是用自己的循环驱动 TensorSharp.Runtime 的推理引擎。 |
| TensorSharp.Server | 构建在 TensorSharp.Chat 之上的 ASP.NET Core HTTP / 应用层:兼容 Ollama 与 OpenAI 的 REST API、浏览器聊天 UI 的路由、上传处理与参数解析。TensorSharp.Server.Host 是提供该页面的可执行程序。 |
| TensorSharp.Cli | 控制台宿主,用于本地提示词、多模态实验、提示词检查、JSONL 批处理工作流、交互式 REPL 与基准测试。 |
模型如何接入
架构是插件,而不是 switch 分支。一个家族只需声明自己一次,其余代码都不必知道它的名字:在 BuiltInArchitectures 里放一份 ModelArchitectureDescriptor(id、别名、工厂、显示名、针对无元数据 GGUF 的张量表识别、多 GPU 模式、原生调优项、投影器文件名提示),再加一份描述其文本格式的 ChatProtocol。下游一律改问能力接口,而不再比对架构字符串——IVisionCapableModel、IAudioCapableModel、IMRoPEPositionSink、IBatchedPagedModel、ISpeculativeTarget、ISpeculator。因此新增一个模型、一种模态或一种聊天格式,只需改它自己的描述符和自己的目录;ModelBase 本身也按关注点拆成了多个 partial(ModelBase.TensorParallel.cs、.CpuAttention.cs、.WeightLoading.cs、.KvCache.cs、.Warmup.cs)。具体步骤见 DEVELOPMENT.md 与模型卡片 README。
执行与权重加载
设备选择、构建条件与专用执行器见后端指南;调度、KV 与推测解码见高级功能。下面保留两个具体实现记录,供追查代码与测量范围。
通用算子可以回退到 CPU,但专用模型执行器有明确的后端与放置要求。不支持的组合会在加载时失败;数值与性能覆盖范围取决于具体模型、检查点与设备。详见后端指南与模型卡。
Direct 执行原语:Wan 与 MiniMax-H3
Wan 与 MiniMax-H3 的非 ggml 路径共用原语:TensorSharp.Models/Direct/DirectOps.cs 中的 Direct{Context, Linear, Ops},Wan 视频网络与 MiniMax-H3 在 BackendType.Cuda 和 BackendType.Cpu 上都走它。在 CPU 上,DirectLinear 不再在加载时把量化权重展开成 F32,而是保留 GGUF 的存储类型:--backend cpu 下一个 256×160、5 帧、单步的 Wan 渲染从 121.4 s 降到 80.9 s,权重内存只占原来的四分之一,而且距原生 ggml_cpu 渲染反而略更近(43.51 dB,旧路径为 43.39 dB)。F16/BF16/F32 权重仍走普通 GEMM。
托管 CPU:映射权重与量化内核
托管 cpu 后端的 ModelBase 加载器现在也按其 GGML 后端的方式加载:量化权重直接从 GGUF 的文件映射零拷贝绑定,而不再复制进新分配的匿名内存;加载时会打印切分结果——GLM-5.3-Flash UD-Q2_K_XL 上是 Quantized: 103255 MB (103255 MB file-backed), F32: 983 MB,这个模型的加载从「永远跑不完」(常驻内存 412 GB 且还在涨)变成约 48 秒,其中大部分是页缓存预取。凡是此前需要复制权重的模型都会受益,量化后的大 checkpoint 收益最明显。ManagedQuantizedOps 还补上了 IQ2_XS 与 IQ4_XS——托管反量化实现(与 ggml 自身的 dequantize_row_* 对照验证过),并进入 CPU 量化存储矩阵,因此它们在加载时保持量化而不再展开成 F32——以及直接的 IQ2_XS × Q8_K 与 IQ3_XXS × Q8_K 点积内核(带 AVX2 路径 VecDotIq2XsQ8KAvx2、VecDotIq3XxsQ8KAvx2);此前这两种类型都只能走通用的「先把整行反量化到临时缓冲」路径。
按目录查源码
宿主路由与运行时依赖见下方源码依据。这里列出实现入口,不把项目引用误作所有请求必经的调用链。
| 路径 | 内容 |
|---|---|
TensorSharp.Core/ | 张量库、运算、内存、设备抽象、CPU SIMD / 量化内核。 |
TensorSharp.Runtime/ | GGUF、分词器、模板、采样;Paged/ KV 原语,Scheduling/ 推理引擎、调度器与基数树前缀缓存,Speculative/ 共享的起草 / 验证核心(MTP/NextN 草稿头、DSpark/DFlash 块级起草、n-gram)。 |
TensorSharp.AgentHost/ | 技能、渐进式披露、有界工具循环、有界子智能体(Agents/)、OS 沙箱、会话 / 请求工作区、四个代码工具、依赖安装与生成产物。 |
TensorSharp.Models/Architecture/ | 架构插件表:ModelArchitectureDescriptor、ModelArchitectureRegistry、BuiltInArchitectures,以及多模态能力接口。 |
TensorSharp.Models/Models/<Family>/ | 每个架构一个文件夹(DeepSeek4——含 V4 与 V4.1、GlmDsa、Gemma4、Qwen35、Qwen4Exp、GptOss、Nemotron、Mistral3、HunyuanDense、MuseGlimmer、MuseSpark、DiffusionGemma、QwenImage、Ltx25、MiniMaxH3、WanVideo),另有 Video/ 存放各视频家族共用的接口与类型。自回归文本家族各含一个单序列前向与一个批量前向;DeepSeek4 与 GlmDsa 例外,它们使用整模型执行器;MuseSpark 在逐算子前向之外另有一个原生整模型执行器,在 GGML CUDA/Vulkan 上默认使用后者;媒体家族(DiffusionGemma、QwenImage、Ltx25、MiniMaxH3、WanVideo)走的是扩散管线而非 decode 循环。 |
TensorSharp.Models/Direct/ | Direct{Context, Linear, Ops}——Wan 视频网络与 MiniMax-H3 在 cuda / cpu 后端上共用的非 ggml 执行原语。 |
TensorSharp.GGML.Native/ | 到 ggml 的原生 C++ 桥接(matmul、融合 transformer 内核、分页注意力、MoE、Mamba2、GatedDeltaNet、扩散)。 |
TensorSharp.Distributed/ | 多节点张量并行使用的 TCP 网格与集合通信。 |
TensorSharp.Chat/ | 与宿主无关的模型服务、会话、聊天流水线、推理引擎宿主、技能与子智能体循环、遥测。 |
TensorSharp.Server/、TensorSharp.Server.Host/ | ASP.NET Core 端点、协议适配器与参数解析;服务器可执行程序、启动流程与 Web UI 页面。 |
docs/ | 各模型架构卡、分页注意力深入解析、环境变量矩阵、基准矩阵。 |
能力与验证边界
按领域展开保留的实现说明。每项先链接到已有使用指南;模型、检查点、后端、放置方式与设备共同限定支持范围。
模型家族
推理宿主
CLI、交互式 REPL、ASP.NET Core Web UI、Ollama 式 API、OpenAI Chat Completions 与 Responses 式 API、由 DiffusionGemma 提供的 Jev 兼容 POST /v1/systemone 类型化决策端点,以及 iOS/iPadOS 上的 TensorAgent(源码构建),以及 macOS 与 Windows 上的 TensorAgent(桌面发行包与使用指南)。
智能体工作
TensorSharp.AgentHost 为 Agent Skills 运行有界的工具循环;运维开启 --code-exec 后,还提供 read_file、write_file(仅新建文件)、shell 与 apply_patch。TensorSharp 只执行自己的内置工具;调用方定义的工具仍回传调用方处理。工作区在 Web/CLI 聊天期间持久存在,OpenAI/Ollama 的每个请求则拥有隔离工作区;OS 隔离默认是必需的。在服务端聊天路径上,支持工具的模型还可以把独立的工作委派给有界的子智能体——默认开启,默认只读(只有 worker 子智能体能获得父智能体的可写工具,且仅在运维加上 --agents-allow-worker-tools 时),可用 --no-multi-agent 关闭;TensorAgent 同样默认委派,可在设置 → Sandbox → Sub-agents 中关闭;CLI 只运行单个智能体。仍然没有交互式审批服务。→ 智能体工作
后端
纯 C# CPU、直接 CUDA/cuBLAS(cuda)、MLX Metal(mlx)、GGML CPU、GGML Metal、GGML CUDA、GGML Vulkan,以及 iOS/iPadOS TensorAgent 目标(通过静态链接的 .xcframework 使用 ggml_metal)。DeepSeek V4 另有三套专属的整模型执行器——Direct CUDA、原生 ggml 与纯 C#——在 GPU 执行器上通过 --layer-split N 按整层放置权重。DeepSeek V4.1 Flash 也有自己的一套:ggml_cuda 是它的服务后端,ggml_cpu 用那些融合算子回退到的标量内核跑同一套原生计算图,--backend cpu 跑纯 C# 的 DeepSeek4CpuExecutor——不用 ggml、不依赖原生库、也不需要 GPU——而 cuda 用 Direct CUDA 引擎自己的内核运行 V4.1;后两者都是正确性与可移植性路径,而非服务路径。GLM 5.x(GLM-5.2、GLM-5.3 与 GLM-5.3-Flash 相同)另有两套:ggml_cuda / ggml_vulkan / ggml_cpu / ggml_metal 上的原生 ggml 执行器(用 --layer-split N 选择整层放置;在 GGML GPU 后端上,传入 --tp N 则为 GLM-5.2、GLM-5.3 与 GLM-5.3-Flash 一样选择仅支持本地单进程的原生 TP),以及 cpu 与 cuda 上的托管逐算子路径——在 GGML 后端上也可以用 TS_GLM_NATIVE=0 强制走这条托管路径;MLX 不支持它。Muse Spark 在 ggml_cuda / ggml_vulkan 上默认使用 TensorSharp 自有的原生整模型执行器——每个微批向所有 GPU 与 CPU 提交一张 GGML 图,由 --layer-split N 与 TS_MUSE_SPARK_CPU_MOE=auto 放置各层与专家堆栈,在 ggml_cuda 上 --tp N 则通过上游 ggml 的 meta 后端把每一层切分到 N 张 GPU 上——TS_MUSE_SPARK_NATIVE=0 选择它的逐算子路径,ggml_vulkan 上的 --tp N 也走这条路径;只有 ggml_cuda 做过整模型实测。
提速手段
真正决定快慢的往往是选哪个权重,而不是加哪个参数。MiniMax-H3 是唯一的例外:它出厂即经 CFG 蒸馏,减少步数靠的是同一权重上的插件——FL2VA 的 LightX2V Turbo --lora(config/lora/minimax-h3-fl2v-turbo-8step.json 或 -4step.json)只按蒸馏时的 8 或 4 步采样,而不是默认的 20 步(4 步配方为推断所得,尚无 Turbo 耗时记录)——而 --width / --height 才是质量与成本之间的主导杠杆(文生视频默认 640×384;图生视频与首尾帧默认采用第一个关键帧的 768p 配方尺寸,3:2 照片为 1152×768,能保住在 640×384 下会糊掉的人脸,代价是数倍耗时;两个都给则对所有模式固定同一尺寸)。步数蒸馏的 Wan DiT(文件名含 Turbo / Lightning / lightx2v / FastWan / …-4steps-…)在加载时被自动识别,只跑 4 次无引导 DiT 前向,而非基础配方的 100 次:同一个 1088×832×121 帧的图生视频请求,基础 Wan2.2-TI2V-5B 实测约 3 小时 30 分,Turbo 权重为 17 分 30 秒(M5 Pro、ggml_metal)。Qwen-Image-2.1 默认的 CFG 1 本身就是每步一次 Transformer 预测,因此它的杠杆是分辨率——--width 1024 --height 1024 可把 2048×2048 默认值的潜在图像 token 数降为四分之一——以及步数:config/lora/ 中的步数蒸馏 LoRA 插件(Viggle Turbo、Pruna 8 步或 5 步、PAI Fun-Acc 4 步)把默认的 40 步降到 4–8 次 Transformer 前向。文本模型这边的手段是:选对后端(NVIDIA 用 ggml_cuda,Apple Silicon 用 ggml_metal,CPU 推理用 ggml_cpu 而非纯托管的 cpu)、整模型融合 decode 计算图(GPT OSS 在 A40 上 24 → 154 tok/s)、推测解码、--tp N,以及让放不下的模型跑起来的 --n-cpu-moe。→ 模型 · 基准测试
多模态
Gemma 4 图像/视频/音频;Qwen 3.5-family、Qwen 3.8 Flash Next、GLM-5.3-Flash、Mistral 3、Nemotron-H Omni、Muse-Glimmer 与 Muse Spark 图像输入,Qwen 3.8 Flash Next 还支持 video_url 视频;DiffusionGemma 通过 Gemma 4 视觉塔支持图像输入,视觉塔可从 mmproj GGUF 或上游 model-00011-of-00011.safetensors 分片加载(音频与视频会被拒绝),Jev 的 /v1/systemone 因此也能读取最多 8 张图像;DeepSeek V4.1 在用 --mmproj 挂上单独准备的视觉伴随文件后支持图像与视频(音频会被拒绝,而不是被忽略)。PDF 文档可经 Web UI 上传或 CLI --pdf 传入(提取文本并内联;扫描页渲染为图像交给视觉模型)。媒体输出:LTX 2.5(两阶段视频 + 48 kHz 立体声)、MiniMax-H3(H.264 MP4 外加一份原生 32 kHz 立体声 .wav,在同一份打包潜变量里一起去噪——文本 → 视频、图像 → 视频、首尾帧、参考 → 视频)、Qwen-Image-2.1(图像),以及 Wan 2.1 / 2.2(只有画面的 H.264 MP4,文本 → 视频与图像 → 视频)。→ 视频生成
连续批处理
vLLM 式分页 KV 缓存、默认开启并跨请求复用共享前缀的基数树(radix tree)前缀缓存(--no-prefix-cache 关闭复用)、迭代级调度器(默认开启;可用 --no-continuous-batching 关闭)。DeepSeek V4 与 GLM 5.x 在同一引擎上通过各自原生的 per-sequence slot 提供服务——压缩后的 MLA 每 token 只有一行缓存,没有可分页的布局——GLM 默认启用批处理融合解码(4 路并发下总吞吐 1.81 倍;TS_BATCHED_FUSED_DECODE=0 可关闭)。Qwen 3.8 Flash Next 则使用 per-sequence 状态持有器:每个在飞请求拥有自己的 KV、GatedDeltaNet、PLE 与 indexer 状态,因此在请求之间切换只是换一个引用,而不需要回传状态。Muse Spark 的原生执行器为每个请求分配一个 F16 的 per-sequence slot,在各槽位之间批量 decode、对同时到达的新文本提示批量 prefill,并把共享的系统提示词 / 模板前导检查点克隆进新对话。
推测解码
Qwen 3.6 与 Qwen3.8-27B(内嵌)、GLM-5.2 与 GLM-5.3(glm-dsa,同为内嵌——--spec 直接加载检查点自带的 NextN 块,无需额外下载,且在单设备或显式 --layer-split N 放置模式下生效:--tp N>1 时草稿块借用的是按列并行的主干 LM head,加载器会拒绝只凭某个 rank 手里那一段词表来起草;GLM-5.3-Flash 则完全没有实现 NextN)、Gemma 4(独立草稿 GGUF)以及 Qwen 3.8 Flash Next(独立的共享 MTP 头,仅限 GGML 后端)的 MTP / NextN 草稿头;DeepSeek V4 的 DSpark 块级起草(在 cuda / ggml_cuda 后端上通过 --draft-model 加载独立草稿 GGUF),以及 DeepSeek V4.1 的实验性 DSpark(在 ggml_cuda / ggml_cpu 上加载 deepseek41-dspark 草稿器,训练模型已在 ggml_cuda 双 GPU 按层切分下通过初步文本/图像 HTTP 检查;尚不构成通用质量或吞吐验证);Muse-Glimmer 与 Qwen 3.5 家族的 DFlash / DFlash2 块级草稿器(通过 --draft-model 加载独立草稿 GGUF);以及在接受推测解码的模型上可用的无权重 n-gram 草稿器——GPT OSS、Mistral 3、Hunyuan Dense 与 DiffusionGemma 不支持;DeepSeek V4 / V4.1 与 Muse-Glimmer 只有在加载了自己的草稿器时才会推测;Nemotron-H 则拒绝所有推测器。每个输出 token 都由请求自己的采样器从按正确前缀计算出的主干行中抽取,因此起草不会改变采样所依据的分布;但多行验证内核与单行 decode 内核的累加顺序不同,所以在 logits 接近打平时,贪心输出可能与普通解码分叉。默认关闭——在 CLI 或服务端用 --spec 启用(环境变量 TS_SPEC);指定 --draft-model 本身即会启用,除非同时给出 --no-spec。→ DSpark · DFlash
多 GPU
--tp N 仅选择张量并行,在层内切分权重;--layer-split N 在支持的架构上选择整层放置。两种参数互斥,不支持的请求会在启动时失败。按层切分仅限单节点;只有支持分布式张量并行的架构才能通过 --tp-node-id / --tp-peers 跨节点运行。旧的按层切分命令需将 --tp N 改为 --layer-split N(环境变量:TENSORSHARP_LAYER_SPLIT_DEGREE=N)。 → 多 GPU 与多节点
可观测性
结构化的逐轮日志、队列状态,以及跨 Web UI、Ollama 与 OpenAI 响应形态的 KV 缓存复用指标。
源码分发与版本说明
TensorAgent 提供本地应用界面,支持可搜索的模型家族目录、个人知识库与生成中的回答引导。桌面指南 · 知识库。个人知识库与回答引导在 v2026.10.10 后合入;请使用包含这些功能的新构建。
当前源码新增 LTX 2.5 两阶段音视频、EmbeddingGemma 2 多模态嵌入、17 个共享技能包与原生社区技能发现/安装。TensorAgent 目录为 39 个条目;实验标记和内存档位不等于所有设备已验证。 LTX 2.5 · EmbeddingGemma 2 · find-skills
宿主路由的源码依据
这是一组已核对的源码入口,而非完整调用图。CLI 虽引用 Chat 程序集,其常规自回归生成仍通过自己的会话直接构造 Runtime 引擎;扩散、嵌入和独立基准有专门路径。
- CLI:CliInferenceSession 直接创建
InferenceEngine并提交序列;Program 使用这层会话。 - Server 的 WebUiAdapter 与 TensorAgent 的 AgentAppHost 组合
WebUiChatService。 - ChatGenerationPipeline 把自回归请求交给共享 Runtime 引擎;InferenceEngineHost 管理其生命周期。
- Chat 的项目引用 包含 AgentHost、Knowledge、Models 与 Runtime;Runtime 不反向引用 AgentHost。