Heidi Labs
GitHub TrendingGitHub Trending 项目约 59 分钟23,646 字

TensorFold:Zig 编写的 LLM 推理引擎

本文目录

TensorFold#

TensorFold 通过一个 Zig 二进制文件在 Apple Silicon 和 NVIDIA GPU 上提供语言模型服务。该引擎读取检查点、对请求分词,并直接运行 Metal 或 CUDA 内核。提供服务不需要安装 Python 或 MLX。

使用编程智能体进行构建?让它在编写任何代码之前先加载贡献者技能。

使用智能体参与贡献#

在编辑 TensorFold 之前,请使用 Agent Traffic Control,以便贡献者和智能体避免重复工作和冲突变更。 在选择 issue 之前查看实时智能体雷达,并遵循 CONTRIBUTING.md 和 ATC 贡献者说明。

将 ATC 安装或升级到 0.9.4 或更高版本,然后在更新后的 TensorFold 克隆中运行:

npm install -g github:ashhart/ATC
atc check ISSUE --json
atc claim ISSUE --json

将 ISSUE 替换为 issue 编号,并且只有在完整检查表明该工作空闲后才认领。 TensorFold 启用了自动公开签到:成功的新认领会启动雷达上的匿名会话并返回其会话编号。 保留该编号,不要启动重复会话。 对于已经属于你的工作,使用 atc start ISSUE --json 启动会话。 只有在希望显示已验证的 GitHub 名称时,才向 claim 或 start 添加 --github-name;--local 会将新会话保留在你的机器上。 看板显示 issue、活动状态和最后签到;GitHub 仍会将验证评论与其作者关联。 确认发布是公开的;unavailable 表示公开更新失败,即使本地认领或会话成功。

仅在智能体工作期间、在其五分钟签到过期之前发送心跳:

atc pulse ISSUE SESSION working --json
atc who path/to/file --json
atc overlap --json
atc land ISSUE SESSION --json
atc release ISSUE --json

在适当的时候使用 reviewing 或 blocked,在会话停止时落地(land),并在打开 pull request 之前解决重叠。 在打开 pull request 之前,让智能体运行 pull request 技能;支持技能的智能体可以将其安装为 tensorfold-pull-request。

快速开始#

从 Qwen3.5-2B 开始,这是在 Metal 和 GB10 上检查过的小型 4 位检查点。以下命令会下载其 固定修订版,然后将其作为 local-model 提供服务。模型权重有自己的许可证。 正在审查或基准测试 TensorFold?评估 TensorFold 涵盖固定、签名检查、 容器以及无需 GPU 的测试。

搭载 Apple Silicon 的 Mac#

使用 Homebrew 安装,然后启动服务器:

brew install ashhart/tensorfold/tensorfold
tensorfold pull mlx-community/Qwen3.5-2B-MLX-4bit@93760be4f1f69842a46bc13dbdc0f19e291392a3
tensorfold serve mlx-community/Qwen3.5-2B-MLX-4bit --name local-model --context 8192 --no-thinking

搭载 NVIDIA GPU 的 Linux#

使用适用于你的 CPU 的发布归档:GB10 上使用 linux-aarch64,x86_64 主机上使用 linux-x86_64。 它需要 glibc 2.28 或更新版本,以及 NVIDIA 驱动 R580 或更新版本(CUDA 13.0),并提供 libcuda.so.1。请保持归档中的目录在一起。 其内核使用 CUDA 13 构建,因此 TensorFold 在启动时会拒绝较旧的驱动;nvidia-smi 会显示已安装的驱动版本。 参见 CUDA 运行手册,了解运行时库和支持的 GPU。

V=1.2.7
case "$(uname -m)" in
  aarch64|arm64) PLATFORM=linux-aarch64 ;;
  x86_64) PLATFORM=linux-x86_64 ;;
  *) echo 'No release archive for this CPU' >&2; exit 1 ;;
esac
curl -fLO "https://github.com/ashhart/TensorFold/releases/download/v$V/tensorfold-$V-$PLATFORM.tar.gz"
curl -fLO "https://github.com/ashhart/TensorFold/releases/download/v$V/tensorfold-$V-$PLATFORM.tar.gz.sha256"
sha256sum -c "tensorfold-$V-$PLATFORM.tar.gz.sha256"
tar -xzf "tensorfold-$V-$PLATFORM.tar.gz"
export PATH="$PWD/tensorfold-$V-$PLATFORM/bin:$PATH"
tensorfold() { command tensorfold-native "$@"; }
tensorfold pull mlx-community/Qwen3.5-2B-MLX-4bit@93760be4f1f69842a46bc13dbdc0f19e291392a3
tensorfold serve mlx-community/Qwen3.5-2B-MLX-4bit --name local-model --context 8192 --no-thinking

发送请求#

让服务器保持运行。在另一个终端中,在任一平台上运行:

curl -fsS http://127.0.0.1:8080/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d '{"model":"local-model","messages":[{"role":"user","content":"Say hello in one sentence."}],"max_tokens":128,"temperature":0}'

该 API 还提供 completions、Responses 和 Anthropic Messages。/v1/models 列出所提供的名称。 在搭载 NVIDIA GPU 的 Windows 上,请遵循原生 Windows 构建指南。 使用 tensorfold --help、tensorfold capabilities --json 和 tensorfold serve REPO --help 来检查你的二进制文件。 你也可以提供完整的本地检查点目录或现有的 Hugging Face 缓存。

tensorfold web [ARGS...] 会打开 TensorFold Web,这是一个用于选择、运行模型并与之聊天的小型本地 Web 应用。 如果需要安装,交互式发布二进制文件会在你同意后,提出使用 uv 安装其匹配版本。 有关手动安装和无人值守使用,请参见 Web 启动器。

--parallel N 将活动请求上限设为 N;额外的请求会等待空闲槽位。 省略该标志会使用 --parallel auto,它会在内存和引擎允许的范围内请求最多八条流。 如果引擎无法容纳那么多流,显式数字会被拒绝。 阅读引擎启动时的容量行,例如 CUDA 上的「8 streams at once」,了解它接受的计数。 关闭 API 认证时,/health 会将 live.connections 报告为活动请求加等待请求, 将 live.waiting 报告为排队数量。例如,8 个连接中有 4 个等待,意味着 4 个活动请求。 完成或取消活动请求会释放其槽位;取消等待请求会将其从队列中移除。

Mac 应用#

TensorFold 桌面工作区捆绑了本地引擎、模型下载、硬件建议、实时生成指标、编程工作器和文档编辑。 下载 Apple Silicon beta 9 DMG,或从 app/ 构建。 桌面应用会直接启动捆绑的 tensorfold-native 可执行文件。 app/mobile/ 中的移动客户端仍是预览软件。

TensorFold Starlight(企业版)#

TensorFold Starlight 为组织提供一个受治理的 OpenAI 和 Anthropic 兼容端点,用于管理 Mac、Linux GPU 服务器和 Windows 机器上的 TensorFold 引擎集群。 它通过组织的身份提供商(OIDC 或 SAML,支持 SCIM 预配)让人登录,决定谁可以使用哪个模型以及模型在哪里运行,在节点上放置并监督模型,并核算每一个词元。 它可以完全离线运行,也可以在相同的身份、策略和预算下代理经批准的前沿提供商;安装指南涵盖 Docker、Kubernetes 和 Linux 服务。 Starlight 位于自己的仓库 ashhart/tf-starlight 中:它固定其测试所用的 TensorFold 发布版本,并在 CI 中针对该发布版本检查其节点传递给 tensorfold serve 的每个标志。 Starlight 是新产品:仍需真实 GPU 集群或身份提供商租户的关卡列在其资格说明中。

Living Weights(实验性)#

Living Weights 教会一个正在运行的模型在其自身权重中学习新事实。使用 --slide 启动 Nemotron 3.5 Lightning 服务器,并告诉它一些事情:每个通过课程检查的事实都会写入检查点文件夹的 文件中。这是实验性的:相关事实可能相互干扰,过去几十个事实以及开启思考后,回忆会下降,而且学到的事实在 Mac 上会损失一些解码速度。已知问题 中有详细信息。

tensorfold pull TensorFold/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-MLX-4bit
hub="${HF_HUB_CACHE:-${HF_HOME:-$HOME/.cache/huggingface}/hub}/models--TensorFold--NVIDIA-Nemotron-3.5-Lightning-30B-A3B-MLX-4bit"
src="$hub/snapshots/$(cat "$hub/refs/main")"
mkdir -p ~/models && cp -RL "$src" ~/models/nemotron-living # always teach a copy
(umask 077; openssl rand -hex 24 > ~/models/slide-key) # --slide starts only with a key
tensorfold serve ~/models/nemotron-living --slide --api-key-file ~/models/slide-key

让该服务器保持运行,并从另一个终端发送课程:

curl -N http://127.0.0.1:8080/v1/slide/learn -H "Authorization: Bearer $(cat ~/models/slide-key)" \
  -H 'Content-Type: application/json' -d '{"text": "I like blue."}'

改为发送一份文档,它会找出其中的事实并逐一学习。打开 http://127.0.0.1:8080/slide 以 3D 形式观看:事实、每个事实在模型层中占用的神经元、保存它们的分片 文件,以及当前正在运行的课程。

学习可在 Apple Silicon Mac 和 NVIDIA GB10(DGX Spark)上运行,在一个设备上学习过的文件夹可以在另一个设备上提供服务。在 APFS 卷上,cp -cRL 会创建一个克隆,在课程修改它之前共享原始文件的数据。它会重写文件夹中的文件: 在第一课之前,服务器会将原始文件保存在隐藏快照中,而 tensorfold slide rollback ~/models/nemotron-living 会将它们放回,撤销每一课。Living Weights 指南涵盖密钥、教学文件和网页、omp 的 /learn 命令、 3D 视图、撤销课程以及预期情况。

选择一个模型#

以下是原生发布版的提供路径。一个配方也可能描述较旧的 Python 0.6.6 引擎; 请将其原生部分与当前变更结合使用。 下方硬件记录的是已记录的适用范围,而不是未经测量的最低要求。上下文、并行请求、提示缓存 和草稿器都需要权重之外的内存。tensorfold info REPO 报告检查点的内存下限。 如果没有发布 RAM 容量,请在为大型检查点提供服务之前检查该下限。 CUDA 发布镜像包含 sm_80、sm_86、sm_120 和 sm_121。A100(sm_80)有内核检查证据 (#846),但没有记录在案的已服务检查点,因此未进行模型资格认证。 Nemotron 和稠密 Qwen 有针对 sm_80 到 sm_89 的 NVFP4/FP8 回退代码(#901、#1470);没有记录显示此类模型在 sm_80 到 sm_89 上运行过。

安装后运行表格中的命令。在 Linux 归档安装中,使用快速开始中的 tensorfold shell 函数。 REPO@revision 会固定一次拉取;拉取后,在提供服务时使用不带修订版的仓库名。 转换会被明确标记:其上游权重需要先经过链接的转换,才能原生提供服务。

模型 / 格式下载机器与内存范围原生配方 / 限制
dots.mocr,BF16 OCR使用本地 dots-studio/dots.mocr 检查点。原生 HIP;已检查 AMD R9700(gfx1201),单 GPU。原生 OCR 配方;完整模型卡演示与 HF 词元匹配。原生 CUDA 仅提供文本提示(CUDA 配方)。没有视频、MTP 头或 Metal 资格认证。
Qwen3.5-2B,MLX 4-bittensorfold pull mlx-community/Qwen3.5-2B-MLX-4bit@93760be4f1f69842a46bc13dbdc0f19e291392a3一台 Mac(已检查 M5 Max),或一台 GB10;未发布 RAM 最低要求。2B;CUDA 发布检查。仅文本。
Qwen3.8-27B,MLX 4-bittensorfold pull TensorFold/Qwen3.8-27B-MLX-4bit<br>tensorfold pull z-lab/Qwen3.8-27B-DFlash2一台 Mac(M5 Max/M3 Ultra),或一台 GB10;32 GB Mac 需要提高 iogpu.wired_limit_mb(启动拒绝信息会指出该值)。27B。添加 --drafter z-lab/Qwen3.8-27B-DFlash2;否则解码为普通模式。
Nemotron 3.5 Lightning 30B-A3B,MLX 4-bittensorfold pull TensorFold/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-MLX-4bit一台 Mac(M1-M5),或一台 GB10;也在 RTX 3090 / RTX PRO 6000 上检查过。Lightning。包含 MTP。
Lightning,混合 oQ4 / oQ6 / oQ8tensorfold pull TensorFold/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-oQ4<br>tensorfold pull TensorFold/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-oQ6<br>tensorfold pull TensorFold/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-oQ8已检查一台 M3 Ultra。宽度和 MTP 说明。仅 Metal;将 4 位检查点的 MTP 头复制到草稿器。
Lightning,NVIDIA NVFP4tensorfold pull nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-NVFP4已检查一台 GB10。存在针对 sm_80 到 sm_89 的非集群回退代码;没有记录显示在 sm_80 上运行过 NVFP4/FP8 服务。Lightning;CUDA 变更。
Nemotron 3.5 Super VL 120B-A12B,NVFP4tensorfold pull nvidia/NVIDIA-Nemotron-3.5-Super-VL-120B-A12B-NVFP4@82d93699acd3be9e4617c53360fe5b3f5dbeb1b3一台或两台 GB10;权重为 70.8 GiB,在单台上启用视觉时为 73.2 GiB。单/双 GB10 命令。为图像添加 --vision。
Nemotron 3.5 Bolt 74B-A9BNVIDIA 的检查点原生 CUDA;24 GB 检查点,已在 RTX PRO 6000 上检查。Bolt/Omni 视频;发布资格认证。
Qwen3.8 Flash Next,MLX 6-bittensorfold pull TensorFold/Qwen3.8-Flash-Next-MLX-6bit-MTP已检查一台 M5 Ultra;未发布 RAM 最低要求。Metal,运行手册。
Qwen3.8 Flash Next,MLX 4-bittensorfold pull TensorFold/Qwen3.8-Flash-Next-MLX-4bit-MTP一台 GB10;已上传 73.3 GiB,外加映射表和缓存。Metal 也有原生 4 位路径(已检查 M3 Ultra)。原生 CUDA。NVFP4/双本地 rank 和视觉路径是实验性的。Metal 的共享会话限制见已知问题。
GLM-5.3-Flash,MLX 4-bittensorfold pull TensorFold/GLM-5.3-Flash-MLX-4bit-MTP两台 M5 Ultra;单 Mac 原生服务未获资格认证。成对 Metal 运行手册。不要使用 Python 配方中的单 Mac 命令。
GLM-5.3-Flash,EXL3/TR3tensorfold pull Mia-AiLab/GLM-5.3-Flash-EXL3-TR3-4bpw两个 CUDA rank;发布版检查双 GB10 配置。发布范围、检查点。实验性检查点;使用原生 rank 选项,而不是 Python 安装。
GLM-5.3-Flash,NVFP4tensorfold pull nvidia/GLM-5.3-Flash-NVFP4@423acf37583782c51c142d145aef733d72943d93在 TP=2 下使用两台 GB10:@Bizuayeu 在 1.1.0 上于 302.1 秒内加载了完整检查点并提供了服务。原生 CUDA;贡献运行:三次运行中每个提示的词元哈希一致,并在 199,307 个词元中找到了一个口令;未覆盖评分提示和超过两个 rank 的情况。
GLM-5.3-Flash,FP4-Localtensorfold pull nvidia/GLM-5.3-Flash-FP4-Local@76348ddb2be2e35e39ecfc00e75dc07703f4f3d5在 TP=2 下使用两台 GB10,或在 TP=3 下通过直连链路环使用三台:@Bizuayeu 按存储原样加载并在两种规模下提供服务。权重为 165.3 GiB,比 NVFP4 少 13%。原生 CUDA,在 1.1.5 中(#1050)。NVIDIA 的混合精度检查点:NVFP4 路由专家,其余大部分为 FP8。在较小的体积下,精度与 NVFP4 一样接近 BF16(回执)。
GLM-5.3-Flash,XSFP4tensorfold pull Bizuayeu/GLM-5.3-Flash-XSFP4@88736f916f8939607fde8a4b881dcae749f7551d在 TP=2 下使用两台 GB10,或在 TP=3 下通过直连链路环使用三台:@Bizuayeu 在两种规模下都提供了服务。权重为 165.7 GiB。原生 CUDA,在 1.1.5 中通过 FP4-Local 的路径实现。FP4-Local 的路由专家从 BF16 权重重新拟合,并折入平滑处理,运行在相同内核上。按其模型卡的三项指标,均比 FP4-Local 和 NVFP4 更接近 BF16。
GLM-5.3-Flash,Jammed XSFP4tensorfold pull Bizuayeu/GLM-5.3-Flash-Jammed-XSFP4@0a22bb46ecef3d0f5f96e41dc6011be12974fbf1在 TP=2 下使用两台 GB10,或在 TP=3 下通过直连链路环使用三台:@Bizuayeu 在两种规模下都提供了服务。权重为 160.2 GiB;在 TP=2 下,每台 GB10 比块 16 时少持有 6.6 GiB。原生 CUDA,在 1.2.3 中(#2041)。从块 32 的 BF16 重新拟合,采用 XSFP4 的平滑处理,每行的缩放因子被打包(csf0_v1,仅由该路径读取),速度与 XSFP4 相同。其 KL 和 top-1 比 NVIDIA 的两个检查点更接近 BF16,但不及 XSFP4(见其模型卡)。
GLM-5.3,EXLR8 hometensorfold pull kindlingai/glm-5.3-exlr8-k2-k3-k4@f459f5d0272a529403dd9b3fd32f771f4250a0d4 --exlr8 home --node 0/2 --dir ~/models/glm-5.3-exlr8-home两台 M5 Ultra Mac,每台 256 GB;在 8k 上下文 / 四条流下,每台 Mac 常驻约 160 GB。双 Mac 配方。在另一台 Mac 上使用 --node 1/2;需要 Thunderbolt 5 和 MCDMA。没有 CUDA 后端。
LFM2.5-24B-A2B,MLX 4 / 6 / 8-bittensorfold pull LiquidAI/LFM2.5-24B-A2B-MLX-4bit@667408d494bde191c2cb9dd4f4549827816b9275<br>tensorfold pull LiquidAI/LFM2.5-24B-A2B-MLX-6bit@1deec53eb49571e21cdcbf82fd5839248f07ed88<br>tensorfold pull LiquidAI/LFM2.5-24B-A2B-MLX-8bit@67ab417dd02d0c9545802a726df668620eae049d一台 Mac(已检查 M4 Pro),或一台使用 4 位导出版本的 NVIDIA GPU(已检查 GB10)。原生配方(CUDA),发布历史。权重:LFM Open License v1.0。
Qwen3.6-35B-A3B,带 MTP 的 MLXtensorfold pull TensorFold/Qwen3.6-35B-A3B-MLX-4bit-MTP@81169a9bc511a27c1b4eedb77a2cd98ced431847一台 GB10;20.9 GB 检查点。Qwen3.6。原生 CUDA 回执见此处。Metal 也会注册此模型类型;配方中的 Metal 命令描述的是 Python 0.6.6。
Qwen3.6-35B-A3B,带 MTP 的 NVIDIA NVFP4tensorfold pull nvidia/Qwen3.6-35B-A3B-NVFP4@1355db6a052410cfd62085d94b58866fd0f2c3c5一台 GB10;设备上 20.3 GiB,带草稿器为 20.9 GiB。原生 CUDA。使用 --drafter 指定同一检查点进行 MTP 草稿。
Gemma 4 31B,MLX 4-bittensorfold pull mlx-community/gemma-4-31B-it-4bit@696d436c404745a59f30e4939a658162b0a9e57f<br>tensorfold pull z-lab/gemma-4-31B-it-DFlash@eabd648301ce28583cc14757912e5e0f84e152e1一台 Mac(已检查 M5 Ultra),或 CUDA 上的一台 GB10。M5 之前的 Metal 有行路径;其 assistant 和 DFlash 草稿器需要 M5 张量单元。Metal 上的原生 31B,CUDA 资格认证。使用 --drafter 指定草稿器;使用 --vision 处理图像。
Gemma 4 12B,转换后的 MLX 4-bithf download google/gemma-4-12B-it --revision 707f0a3b8a3c7ad586ed01e27eafbad8a27dd0f7 --local-dir ~/models/gemma-4-12b-hf<br>hf download google/gemma-4-12B-it-assistant --revision 46d4c6f13f0ac0ad827b915669b8df9b81c64c51 --local-dir ~/models/gemma-4-12b-assistant一台 Mac(已检查 M5 Ultra);转换后的文本权重为 6.3 GB,图像权重为 100 MB,外加 assistant/缓存。MLX 4-bit 也可在一台 GB10 上提供服务。M5 之前的 Metal 有行路径;MTP assistant 需要 M5 张量单元。转换并提供服务。上游下载需要 hf;转换需要 Python、mlx 和 mlx-lm。服务是原生的;CUDA 资格认证包括 MTP assistant。
Step-5-Preview,转换后的 affinehf download stepfun-ai/Step-5-Preview --local-dir ~/models/step5-preview-fp8一台 256 GB Mac;文本 166.9 GiB,MTP 增加 2.5 GiB,视觉增加 3.7 GiB。转换并提供服务。文档中的 256 GB 配置提供转换后的 affine 权重;转换上游 FP8 下载需要 Python 和 mlx。
MiniMax-M3.1-Flash,社区 affine 3/4-bithf download BobClawblaw/MiniMax-M3.1-Flash-MLX-mix34 --revision 9524999057e0d277d26438606e033e2191fb465c --local-dir ~/models/MiniMax-M3.1-Flash-MLX-mix34<br>hf download BobClawblaw/MiniMax-M3.1-Flash-MLX-mix256k --revision 916e7ca1044f1c3e7566163096243c940327224d --local-dir ~/models/MiniMax-M3.1-Flash-MLX-mix256k一台 256 GB M5 Ultra;203.7 GiB(32,768 词元窗口)或 189.2 GiB(147,456),外加缓存。MiniMax-M3.1-Flash。设置 MINIMAX_LOAD_LIMIT_GB;使用 --vision 处理图像。社区检查点:MiniMax NVFP4 发布版的有损转换(KL 0.244 / 0.295)。MiniMax 社区许可证。
Kolibri-1,块 FP8(研究)tensorfold pull Aleph-Alpha/Kolibri-1@e52eb4627d11516b0c01de49210ab5a4e4061444一台 NVIDIA GPU;已在 GB10 上测量;74 GB 检查点。Kolibri。仅文本;复制草稿,没有 EAGLE-3/神经草稿器。
Liquid AI d1-3B,决策尚未记录。原生 CUDA;未发布 RAM 最低要求。下文 API 章节。/v1/systemone 和 /v1/decisions。
Fish Audio Drama 3,语音尚未记录。原生 Metal 或 CUDA;已在 GB10 上测量。发布音频说明、参考语音和对话说话人。带采样控制的 /v1/audio/speech;需要检查点和 codec.pth。
Drama 3 剪枝 NVFP4,语音hf download plotarmordev/drama-3-NVFP4-Pruned --revision 494db08481db952f834b2241bce63fb3dfa72554 --local-dir drama-3-NVFP4-Pruned原生 Metal;检查点约 21 GiB,外加运行时状态。不是最低 RAM 或跨后端质量声明。打包专家、BF16 稠密/tower 权重和 FP32 累加;无需转换。使用 serve drama-3-NVFP4-Pruned --cfg-gamma 1.5 --cfg-batched,搭配经认证的目录语音。

GLM-5.3:一台机器还是两台?#

原生发布版未对单机上的 GLM-5.3 进行资格认证。GLM-5.3 EXLR8 home 需要两台 256 GB M5 Ultra Mac; 其配方给出了拉取和服务命令。GLM-5.3-Flash 是另一个模型: 其原生 Metal 配置需要两台 M5 Ultra。原生 CUDA 有记录的 TP=2 和 TP=3 配置,包括 在两台和三台 GB10 上的 FP4-Local 和 XSFP4。旧配方中的单台 256 GB Mac GLM-5.3-Flash 命令适用于 Python 0.6.6,而不是此发布版。 关于 NVFP4 路径,请参见 CUDA 上的 GLM-5.3-Flash 以及 两台 GB10 上的贡献运行覆盖了什么。

DeepSeek 检查点尚未由任何发布版二进制文件提供服务:全模型关卡 #827 仍然开放。 MiMo 的原生后端尚未进入发布版。Bonsai 的三元打包和 Gemma 4 26B-A4B 仍仅支持 Python; 它们不是原生下载推荐。已知问题列出了当前限制, 包括 Flash Next 的共享会话缓存/性能行为以及 27B 的草稿器限制。

精确解码#

每个被接受的草稿必须等于同一原生引擎在 "draft": false 时产生的词元。 恢复的请求必须等于全新执行,每条并发流必须等于其单独运行。 比较会固定检查点、后端、设置和运行时。 不同的量化和不同的后端可能产生不同的输出。 Metal 上的 Flash Next 在显式 --parallel N 大于 1 且能容纳那么多会话时,使用共享目标轮次。 那里的单个贪心请求使用 GPU 侧轮次,并在第二个请求到达时移交。 --parallel auto(默认值)和 --parallel 1、学习以及双 Mac 服务使用单回复驱动。 FZ_BATCH_MTP_SERIAL=1 在共享主机上恢复串行 MTP 草稿。 较早的 MTP 链回执记录了自己的固定提交。 Nemotron、GLM、2B 模型和 Qwen3.8-27B 使用共享车道轮次(shared lane rounds)。 在 Metal 上,27B 共享轮次中的最多 128 条流各自绘制自己的 DFlash2 树。

磁盘上的模型#

tensorfold pull TensorFold/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-MLX-4bit
tensorfold models
tensorfold models --json
tensorfold info TensorFold/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-MLX-4bit

pull 会将检查点下载到 Hugging Face 缓存,并与 Hub 核对下载内容:大文件按 sha256,小文件按 git blob sha1。 大文件通过最多 16 个连接分块下载,中断的拉取会利用缺失的分块续传。 它会拒绝 model_type 没有原生家族的检查点,并为 --drafter 获取 27B 的 DFlash2 草稿器。models 会列出它认识的模型类型的缓存检查点,info 显示一个检查点的家族、格式、上下文和内存下限。 models --json 将同一列表作为一个文档输出给程序:schema 为 1,每个检查点包含 repo、family 和 model_type;family 是显示标题,model_type 是用于匹配的键。 tensorfold serve REPO 按仓库名提供缓存的检查点。

上下文压缩#

压缩默认关闭,关闭时每个回复都保持不变。 使用 --compact-at 时,会溢出的对话会被压缩,而不是被拒绝。 服务器逐字保留系统提示和最近的轮次,并且绝不会将工具调用与其结果分开。 较旧的轮次会变成一条记忆笔记:目标、约束、进展、决策、下一步、确切的名称和数字,以及工具调用读取或更改的文件。 之后的每次压缩会更新之前的笔记,而不是从头开始。发送回压缩后对话的客户端会保留其笔记。 回复会在 tensorfold.compaction 下携带笔记和压缩计数,每个回复都会报告 context_window 和 context_used。 相同的请求会得到相同的压缩和相同的回复。使用 --compact-memory 时,存储的笔记会在请求之间保留。

Cortheon 模式#

默认关闭。--cortheon 会为每个聊天请求提供 Cortheon 的推理程序和由服务器运行的网络研究,因此任何 OpenAI 兼容客户端无需设置即可获得该能力。 模型会按其任务类型经历 Cortheon 的各个阶段,并且可以调用 cortheon_search 和 cortheon_fetch,服务器运行这些调用而客户端看不到它们。 关于当前事实的问题,或使用外部库进行构建的请求,会在模型开始之前进行研究。 更改了文件的编程任务会被要求在完成之前运行其测试。 网络文本会被过滤掉针对模型的指令,且读取只访问公共地址。 启用该标志后,根据对话编写的搜索查询会发送到 DuckDuckGo,或在设置 BRAVE_SEARCH_API_KEY 时发送到 Brave,页面从此机器获取;不启用时,服务器不进行搜索,也不读取页面。 参见 Cortheon 模式。

模型发现#

GET /v1/models(以及 /models)会公布每个提供的名称和别名。当引擎报告有限的 上下文窗口时,每个条目都会包含相等的 context_length 和 max_model_len 整数扩展字段。这些 是已加载引擎的有效提示加回复词元限制,包括任何启动内存适配; 它们不是默认回复限制。未指定引擎窗口时会省略这两个字段。客户端应 仍然处理按请求的内存拒绝:公布的上下文并不保证每个工作负载都能容纳。

会思考的模型还带有 OpenRouter 风格的 reasoning:default_enabled、default_effort(仅在 使用 --reasoning-effort 时),以及 supported_efforts——其模板命名的级别,从高到低,当模板有思考开关时最后是 none。不给级别命名的模板会省略 supported_efforts。这些描述的是 chat 和 Responses 请求。

服务标志#

只读的 /memory 诊断会报告进程占用和生命周期峰值、 可用的后端分配计数器,以及应用的保留前缀计划,而不改变内存策略。

二进制文件的 capabilities --json 响应会列出其支持的标志和平台特定值。 serve MODEL --help 会打印用法而不加载模型。

标志含义
--host HOST、--port PORT监听地址和端口,默认 127.0.0.1:8080。
--unix-socket PATH在新的仅属主可用的 Unix 套接字 PATH 上监听,而不是 TCP,与 --host 或 --port 一起使用时会被拒绝;支持 macOS 和 Linux。已存在的 PATH,或其他用户可写的目录(除非像 /tmp 那样带粘滞位),会被拒绝,来自其他用户的连接会被关闭。API 密钥、--metrics-open 和 Host 检查与 TCP 上一样适用(客户端发送回环 Host 或 --allowed-host 中的 Host):套接字权限是第二层保护,不能替代密钥。
--profile stable显式保留当前默认值;profiles 描述初始切换注册表和启动报告。
--name NAME向客户端公布的模型 ID。
--alias NAME另一个可接受的模型 ID;可重复以指定多个别名。
--api-key KEY要求 bearer 密钥;可重复以指定多个密钥。
--api-key-file FILE从权限受限的文件读取密钥;一个密钥可以限制为某些路由。
--metrics-open启用 API 认证时,允许在没有密钥的情况下访问 /metrics、/v1/metrics 和 /v1/load。
--dashboard启用本地 /dashboard 页面和 /stats 端点。
--max-inflight N、--max-inflight-per-key N拒绝超过 N 个同时进行中的模型请求,总体或按密钥,返回 429;默认 0 表示关闭。参见准入。
--requests-per-second N、--request-burst N在一个突发之后,拒绝某个密钥每秒超过 N 个的模型请求;默认 0 表示关闭。
--context N限制提示加回复词元;模型的窗口和内存检查仍然适用。Qwen3.8-27B 默认为 32,768,最高可到 262,144。
--rope-yarn F在 CUDA 构建上为 Qwen3.5 和 3.6 使用此因子,在检查点训练窗口之上扩展 YaRN 上下文;其他构建会拒绝该标志。
--loops N对循环模型的循环块执行 N 次传递,从 1 开始;不指定时使用检查点自身的计数。其他构建会拒绝该标志。
--speed-up FILE用于双 Mac Flash Next 或 GLM 服务的排名和链路设置。
--max-tokens N默认回复限制,4096;请求可以覆盖它。
--temperature T采样温度;零请求贪心解码。
--prompt-seed使用原生提示派生的键,而不是新的 OS 回退值;请求和配置的默认种子仍然优先。
--top-p P、--top-k K、--min-p P采样默认值。
--instruct-sampling SET关闭思考时采样聊天请求的采样默认值:card(Qwen 3.5、3.6 和 3.8 模型卡的 temperature 0.7、top_p 0.8、top_k 20、presence_penalty 1.5)、在其上覆盖的 name=value 对,或 none;服务标志仍然优先。贪心请求、原始 completions 和服务器自身的请求从不采用这些值。
--thinking、--no-thinking选择聊天模板是否开启推理块。
--reasoning-effort LEVEL默认模板努力级别:minimal、low、medium、high、xhigh 或 max。
--thinking-budget N在引擎支持关闭推理块的地方限制推理词元。
--thinking-reserve N开启思考时,允许推理在一个请求的 max_tokens 之外最多使用 N 个词元,max_tokens 随后限制答案(车道引擎)。
--loop-guard在引擎支持的地方,关闭逐字重复自身的推理(短循环或长段落)。
--loop-guard-stop与 --loop-guard 类似,但在守卫触发处结束回复:保留到此为止的推理,不给出答案或工具调用,finish_reason 为 content_filter,并产生 reasoning_loop 错误(API)。
--no-drafts通过同一引擎生成普通参考输出。
--drafter DRAFTER外部草稿器,作为目录或 Hugging Face 缓存中的 repo id,用于接受草稿器的模型:Qwen3.8-27B 使用 DFlash2,Gemma 4 31B 使用其配方中指定的草稿器。没有草稿器时,它们进行普通解码。
--drafter-bits 0 或 4模型提供选择时的草稿器权重精度:4 位(默认),或 0 以保持 bf16。CUDA 上的 Qwen3.8-27B 只接受 4。
--record DIR在 DIR 下写入每条流已提交的词元、位置和被读取的行,用于草稿器训练。仅限 CUDA Nemotron;单条流会经历车道轮次,当可用磁盘低于 25 GiB 时停止记录。
--keep-warm SECONDS在请求之后让 Metal GPU 在空闲时保持活动这么久,默认 900;零表示禁用。
--cfg-gamma GAMMAMetal Drama 语音:语义引导强度,有限值 1–5;0/默认禁用。只有参考条件请求会被引导。启用的回复会报告 X-Cfg-Gamma;codec 头保持条件式。
--cfg-allow-request-gammaMetal Drama 语音:允许有限的 1–5 X-Cfg-Gamma 请求头;无效值会在引擎提交前返回 400。没有此选择加入时,服务器的 gamma 固定。
--cfg-force-guided在启用 Metal Drama 引导策略时,即使在 gamma 1 也执行无条件状态。gamma 1 时的语义混合仍然是精确的条件 logit 恒等。
--cfg-batched在启用 Metal Drama 引导时,在一个命令缓冲区中提交两个独立的主干状态,而不是分开提交。权重是共享的;额外状态计入准入。不是向量化批处理。
--silence-floor-dbfs DBFS仅 Drama 语音:为静音守卫显式设置帧功率下限,没有默认下限。使用公共或内置语音,在安静的目标语音以下进行校准。
--silence-seconds SECONDS仅 Drama 语音:在低于显式下限持续这么多秒后停止,保留音频并报告静音。默认未设置:关闭;在有意的停顿以上进行校准。
--silence-onset-s SECONDS仅 Drama 语音:开启静音守卫后,当合成语音的发声时长少于 --silence-onset-voiced-s 且低于其下限持续这么多秒时停止,保留音频并报告静音。未给出时关闭;必须小于 --silence-seconds。
--silence-onset-voiced-s SECONDS仅 Drama 语音:--silence-onset-s 适用的发声秒数下限;与其一起使用时必需,没有默认值。在公共或内置语音上校准。
--silence-mid-s SECONDS仅 Drama 语音:开启静音守卫后,当语音结束落在低于下限的这一长度的连续段中时,在显式发声最低值之后以静音结束。完整回复会携带小数 X-Silence-Mid-Trips 计数,包括零。必须小于 --silence-seconds,并与 --silence-mid-min-voiced-s 配对。默认未设置:关闭。
--silence-mid-min-voiced-s SECONDS与 --silence-mid-s 一起必需:在中段规则适用之前的正有限累积发声时长,包括相等。没有默认值;与其他静音阈值一起校准。
--silence-redraws N仅 Drama 语音:将静音守卫结束的完整回复再抽取最多 N 次,作为 seed salt + k 或显式请求 seed + k;N 为 1 或更大时需要守卫。默认未设置:关闭,0 也是如此;流从不重抽。参见语音重抽。
--silence-redraw-budget-s SECONDS仅当经过时间加上上一次录制时长能够容纳时才开始重抽;请求的 X-Deadline-S 可以降低它。没有默认预算。
--silence-redraw-controls LIST重抽时只说出过滤到所列控制项的输入,如同 --allowed-controls 的过滤;空列表会移除所有控制项。
--short-reply-ratio R当以 stop 结束的完整回复音频短于其文本预期长度的 R(大于 0、小于 1)时,也重抽;需要 --silence-redraws 和 --short-reply-chars-per-s。没有默认值。
--short-reply-chars-per-s CPS所服务语音的完整回复中每秒音频的输入字符数,用于设置预期长度;需要 --short-reply-ratio。没有默认值;在你自己的语音上校准。
--register-redraw-st ST仅 Drama 语音:当第一个短语之后的某个短语比其他短语的开头中位数高出 ST 个半音时,再抽取一次完整回复;需要下面两个标志。默认未设置:关闭,三者都没有默认值。参见语音重抽。
--register-redraw-high PERCENT该短语的发声帧中必须位于 --register-high-hz 以上的比例。
--register-high-hz HZ标记高音区的音高线,75 到 600 Hz;在你自己的语音上校准。
--parallel N 或 auto将活动请求上限设为 N,其余排队。默认 auto 会在内存和引擎允许的范围内请求最多 8;无法容纳的显式计数会被拒绝。在启动时读取接受的计数。
--prompt-cache-gib GIB保留前缀预算;默认在 Metal 和统一内存 CUDA 上为流之后剩余空间的一半(在空间允许时下限为 16 GiB),在独立 CUDA 上为 8 GiB 主机快照,Flash Next 的批处理主机为 16 GiB。显式值会覆盖它;0 表示禁用。
--prompt-cache-over-cap允许显式前缀预算超过服务器加载后 RAM 剩余空间的 70%。
--learn将共享提示前缀保留在磁盘上,以便新对话恢复;相关模型见表格下方。
--learn-dir DIR--learn 保存它们的位置,默认为 ~/.cache/tensorfold/learned;隐含 --learn。
--learn-gib GIB每台 Mac 上用于已学习前缀的磁盘空间,默认 32;最近最少使用的先被移除。隐含 --learn。
--learn-min-free-gib GIB--learn 在每台 Mac 上保留的可用磁盘空间,默认 4;低于此值时学习暂停,服务继续。
--learn-conversations也将每个提示状态保留在磁盘上,包括每个对话和共享前缀,放在一个取代 --learn 的存储中,以便重启、崩溃或驱逐后的下一轮可以读回。隐含 --learn;参见磁盘上的对话。
--learn-daily-gib GIB--learn-conversations 每天可写入磁盘的量,所有模型合计,默认 32;超过后状态只保留在 RAM 中。
--recall根据先前请求读写的词元 ID 记录进行草稿,因此重复文本可以在几轮内验证;回复保持不变。默认关闭;参见 Recall 了解磁盘上保留什么。
--recall-dir DIR记录目录,默认在 ~/.cache/tensorfold/recall 下按分词器划分;隐含 --recall。
--recall-gib GIB记录使用的磁盘空间,默认 1/16 GiB;最旧的 ID 先被移除。隐含 --recall。
--recall-read-only从记录进行草稿而不向其添加内容,如同关卡和基准测试运行时;隐含 --recall。
--snapshot-dir none将前缀状态保留在内存中;none 是受支持的值。
--max-snapshots 0启动时禁用磁盘快照;0 是受支持的值。
--compact-at auto 或 FRACTION开启上下文压缩(见下文)。auto 在提示和回复将超过窗口减去保留量时进行压缩。
--compact-keep TOKENS压缩时逐字保留的最近词元数;默认是 20,000 或窗口的四分之一,取较小者。
--compact-memory DIR还将每个对话的记忆笔记作为 Markdown 文件保存在 DIR 中。
--cortheon为聊天请求提供 Cortheon 的推理程序和服务器运行的网络研究;参见 Cortheon 模式。
--no-update-check接受的兼容性开关;通过其包管理器更新已安装的二进制文件。
--backend auto使用为平台编译的后端;mlx 在 macOS 上选择原生 Metal,cuda 在 Linux 上选择 CUDA。

--prompt-cache-gib 适用于 Nemotron、Flash Next、GLM、Qwen3.8-27B 和 LFM2.5-24B-A2B, --prompt-cache-over-cap 适用于相同模型,但 GLM 除外。 --learn 将共享提示前缀(例如系统提示及其工具)保留在磁盘上,以便新对话在重启或升级后恢复它们,只要计算出相同的比特。它涵盖单台 Mac 上的 GLM-5.3-Flash、Nemotron 和 Flash Next;Qwen3.8-27B、Qwen3.5-2B、LFM2.5-24B-A2B、GLM-5.3(EXLR8)和 CUDA 服务器会在启动时拒绝它。 Metal 上的 Qwen3.8-27B 还会从服务器第一个槽位中上次回复留下的状态恢复后续轮次,当提示缓存没有保存到那么远时:该轮次只读取其新词元,即使在缓存无法保留长对话的 Mac 上也是如此。当缓存无法保留整个上下文时,服务器还会在每个提示历史结束处保留该槽位的 DeltaNet 状态,因此模板丢弃上一条回复推理的轮次可以从那里恢复。回复与全新提示传递的词元相同;TF_QWEN27_SLOT_RESUME=0 会同时关闭两者。

采样默认值来自检查点的 generation_config.json,然后由服务标志和请求字段覆盖。 --context 0 是家族特定的;对 GLM 使用正限制,并检查启动时报告的容量。 支持的环境变量列在 capabilities --json 中,包括 API 密钥、请求日志和 Hugging Face 缓存路径。 TF_Q27_PROFILE=N 使原生 Metal Qwen3.8-27B 服务器每 N 个解码轮次记录一次按类别的 GPU 时间明细(1 表示 64),并在其回复中添加 gpu_seconds;这仅用于诊断,被分析的轮次运行会更慢。

社区基准#

tensorfold benchmark MODEL 在缓存的模型上运行公共代码和聊天测试夹具,并保存可移植的回执; --publish 可选地将其提交到 tensorfold.dev 进行审查。参见基准命令和测量定义。

构建与贡献#

使用 .zig-version 中固定的 Zig 版本,目前是 0.17.0。 .metal 源文件需要 Xcode 的 Metal 编译器。安装完整 Xcode 及其 Metal Toolchain 组件 (xcodebuild -downloadComponent MetalToolchain);仅安装 Command Line Tools 会使每次内核编译失败,并提示 unable to find utility "metal"。

zig build native -Dcpu=apple_m1
zig build test test-golden -Dcpu=apple_m1

结构化输出和必需的工具调用需要发布归档中的 lib/ 或 zig build grammar -Dxgrammar=DIR;使用 git clone --branch v0.2.8 --recurse-submodules https://github.com/mlc-ai/xgrammar 准备 DIR(使用原生构建相同的 --prefix 作为 grammar)。

要为单个 GPU 构建一个精简服务器(zig build -Dgpu=spark -Dnvcc=...,比四目标服务器小约 69%),参见为单个 GPU 构建服务器。

在 macOS 上,测试还会运行可用的 Metal 设备检查。主机测试子集参见 CONTRIBUTING.md。

服务器是 zig-out/native/bin/tensorfold-native。 发布归档包含原生可执行文件、运行时资产和许可证通知;打包描述了经过资格认证的 CUDA 输入。 关于缓存感知的性能回执,请参见已观察的缓存基准证据。 客户端保留服务器使用情况和输出指纹,并验证冷/重用状态,而不是推断它们。

阅读 CONTRIBUTING.md 了解精确性、精度和性能关卡。 编程智能体还应加载 docs/recipes/SKILL.md;支持技能的智能体可以将其安装为 tensorfold-contributor。 TensorFold 采用 Apache-2.0 许可证;参见 LICENSE、NOTICE 和 THIRD_PARTY_NOTICES.md。

贡献者#

感谢每一位向 TensorFold 发送 pull request、测量结果或 bug 报告的人:

@0mao0、@321sssrt-bit、@AbrahamCete、@aditya1503、@AdrianBinDC、@ajensenwaud、@akol1、@alenperic、@Alexbob0、@alexderz、@anvilsong、@Arminova、@b-ostrov、@BadAd84、@barelyworkingcode、@Benjamin-Wegener、@benthecarman、@benwilson、@BHCC2025、@Bizuayeu、@BlivionIaG、@BobClawblaw、@borodach23、@Boscoeuk、@boxabirds、@brandonmmusic-max、@bunnyfu、@CanadaApollo6、@CerebralCoding、@cesarswong、@chadhurley25075-png、@chaog992、@Charlie-Louis、@Chedrian07、@chris247474、@christrade215、@crescit、@cshintov、@cwschroeder、@DakotaTexas、@danyo1399、@Deesha08、@Defilan、@DevRico003、@di37、@diwakergupta、@drowzeys、@easthambuilds、@ecohash-co、@edurdias、@eleqtrizit、@ericlsimplifi、@EugeneClaw、@fche、@feni6、@florianbrede-ayet、@gbgbgbg、@GDACONSULT、@gecobattya、@gilby、@Gogo6969、@gprot42、@GraithSecurity、@grantoverton、@grearjake-star、@greatyingzi、@GustavBlack、@harrisonfriia、@haxudev、@heitke、@hichaiuse、@ivanfioravanti、@jasontitus、@javierbits、@jayleaton、@jeffpeng3、@jeidbugs404、@Jenpo、@jerryfane、@jetnet、@jishnuvenugopal、@jkuepker、@joeynyc、@johnymoo、@JordiPosthumus、@joshuaswarren、@JRaxworthy、@jrb-ai、@jschmied、@juliankang4、@justincasey、@kelchm、@kieranscotney、@kingjamez、@kky42、@laudney、@lcgutierrez、@LECYWZA、@lijian1999、@liumorrisclaw、@LXD-8、@m-naoki-m、@mapamalu、@mcclanahanaman、@MESevenJourney、@mgoldwasser、@MiaAI-Lab、@mikolaj92、@millaguie、@Mirrdhyn、@Moutonc、@MovieMaker93、@mrpmorris、@mrv777、@MV10、@NeoAiLabs、@Nipale-ai、@nmcbride、@nood-co1、@nullburn、@olexale、@omar16100、@optimisme、@otarkhan、@outcastofmusic、@paragontasx、@peacockesq、@philip-pentatonic、@plotarmordev、@pmeenan、@ppardus、@pulseandthread、@quigles1977、@rafafortes、@raymondkpwong、@robertpitt、@rootsbymenda、@RoscoeTT、@RS91Dev、@russellmm、@salmanarshad321、@samwang0041-star、@sanjaibalajee、@satindergrewal、@scottleimroth、@sethforprivacy、@sfxnz、@shantanugoel、@simon-lin88、@simonmd、@spenchey、@squarrier、@ss-cong、@Stephane-Eden、@styles01、@SvangenStudios、@swbiggart、@SxMShaDoW、@sxuff、@taussoe、@tfolkman、@ThinkOffApp、@ThomasHalwax、@Thotheris、@tinyapps、@tolewis、@tomByrer、@tonydehnke、@tournierjc、@tovereast、@tpischke、@urtho、@valacroix、@vcruz305、@vinicius-symetrix、@wojo、@xjqx2z、@yguanrong、@Yuepixel、@YvesLaRose、@ZackSample、@zweck。

docs/credits.md 说明了原生引擎各部分承载了谁的 Python 引擎工作。

可用内存配置说明了如何记录已应用的预算、上下文、缓存状态和进程峰值。