Sdcb.HyMT2Sharp
2.0.0
Prefix Reserved
dotnet add package Sdcb.HyMT2Sharp --version 2.0.0
NuGet\Install-Package Sdcb.HyMT2Sharp -Version 2.0.0
<PackageReference Include="Sdcb.HyMT2Sharp" Version="2.0.0" />
<PackageVersion Include="Sdcb.HyMT2Sharp" Version="2.0.0" />
<PackageReference Include="Sdcb.HyMT2Sharp" />
paket add Sdcb.HyMT2Sharp --version 2.0.0
#r "nuget: Sdcb.HyMT2Sharp, 2.0.0"
#:package Sdcb.HyMT2Sharp@2.0.0
#addin nuget:?package=Sdcb.HyMT2Sharp&version=2.0.0
#tool nuget:?package=Sdcb.HyMT2Sharp&version=2.0.0
HyMT2Sharp

中文 | English
纯 C# 的 Hy-MT2(hunyuan-dense)非官方推理实现。CPU 自带 AVX2 / AVX-512 / NEON SIMD 内核,另有 Vulkan 与 Metal GPU 后端;不依赖 llama.cpp 或 ONNX Runtime,面向进程内调用。
当前验证过的 GGUF 量化:Q8_0、Q6_K、Q4_K_M、Q2_0C、1.25-bit STQ1_0。其它格式与模型规模尚未测试。
模型
推理包 Sdcb.HyMT2Sharp 不含权重。可以从 Hugging Face 下载 GGUF,也可以直接引用 NuGet 权重包:
| 量化 | Hugging Face | NuGet 权重包 | 分片数 | 总大小 |
|---|---|---|---|---|
| 1.25-bit STQ1_0 | Hy-MT2-1.8B-1.25Bit-GGUF | Sdcb.GgufWeights.Hy-MT2-1.8B-1.25Bit | 2 | 约 440 MB |
| Q2_0C | Hy-MT2-1.8B-2Bit-GGUF | Sdcb.GgufWeights.Hy-MT2-1.8B-2Bit | 3 | 约 573 MB |
| Q4_K_M | Hy-MT2-1.8B-GGUF | Sdcb.GgufWeights.Hy-MT2-1.8B-Q4_K_M | 5 | 约 1.1 GB |
| Q6_K | Hy-MT2-1.8B-GGUF | Sdcb.GgufWeights.Hy-MT2-1.8B-Q6_K | 7 | 约 1.4 GB |
| Q8_0 | Hy-MT2-1.8B-GGUF | Sdcb.GgufWeights.Hy-MT2-1.8B-Q8_0 | 8 | 约 1.8 GB |
只需引用表中的顶层包,其余分片包(.Part2…)会作为依赖自动还原,分片数含顶层包本身;总大小即该模型 GGUF 的大小,也是输出目录多出的体积。包很大,首次还原可能会比较慢(2Bit 约 573 MB,本机用时约 7.5 分钟)。加载方式:new HunyuanDenseModel(Sdcb.GgufWeights.Hy_MT2_1_8B_2Bit.Weights.Model())。
快速开始
从仓库直接运行 CLI。CLI 和 Server 默认引用 NuGet 包 Sdcb.GgufWeights.Hy-MT2-1.8B-2Bit,不传 --model 即加载内置的 2Bit 权重;也可以用 --model 指定自己的 GGUF 文件:
dotnet run --project src/HyMT2Sharp.Cli -c Release
dotnet run --project src/HyMT2Sharp.Cli -c Release -- --model "D:\_\model\Hy-MT2-1.8B-Q4_K_M.gguf"
不传 --threads 时按 CPU 拓扑自动绑定物理 P-core(不含 SMT 和 E-core;大小核例如 8P+8E 为 8,5800X 为 8)。加 --prompt 跑单轮后退出;省略则进入多轮对话。
HTTP 服务
HyMT2Sharp.Server 提供 OpenAI 兼容的 POST /v1/chat/completions(含 SSE 流式)和内置聊天页:
dotnet run --project src/HyMT2Sharp.Server -c Release
同样可用 --model(或环境变量 HYMT2_MODEL)指定 GGUF 文件。
浏览器访问 http://127.0.0.1:8080,或用 curl:
curl http://127.0.0.1:8080/v1/chat/completions -H "Content-Type: application/json" -d "{\"messages\":[{\"role\":\"user\",\"content\":\"Translate the following segment into Chinese, without additional explanation:SimdPaddleOCR is officially released today (NuGet: Sdcb.SimdPaddleOCR). It is a complete OCR inference engine written entirely in C#. It does not depend on Paddle Inference or ONNX Runtime, and it does not require shipping OpenCV native libraries.\"}],\"max_tokens\":128}"
WinForms 示例(Windows)
HyMT2Sharp.WinForms 是一个桌面翻译窗口:左边输入、右边流式输出,可选引擎(自动 / CPU / Vulkan)和目标语言,底部状态栏显示加载时间与 prefill / decode 速度。权重固定用 2Bit 包,换量化请改 csproj 里的权重包引用。支持高 DPI(PerMonitorV2)。
dotnet run --project src/HyMT2Sharp.WinForms -c Release
作为库使用
安装推理包:
dotnet add package Sdcb.HyMT2Sharp
HunyuanDenseModel 负责加载 GGUF、分词、KV cache 和 Forward。库内提供 Sampler(Sampler.ArgMax,以及 temperature / top-p / top-k 等采样),但没有内置 Generate,文本拼接留给调用方。下面是一个最小 greedy 流式示例,权重来自 Sdcb.GgufWeights.Hy-MT2-1.8B-2Bit 包(见模型):
using System.Runtime.CompilerServices;
using Sdcb.GgufWeights.Hy_MT2_1_8B_2Bit;
using Sdcb.HyMT2Sharp.Backends;
using Sdcb.HyMT2Sharp.Model;
// 也可以直接传 GGUF 路径:new HunyuanDenseModel(@"D:\models\Hy-MT2-1.8B-Q4_K_M.gguf")
using HunyuanDenseModel model = new(Weights.Model(), backend: BackendFactory.Create());
await foreach (string piece in Generate(model, "Translate the following segment into Chinese, without additional explanation:SimdPaddleOCR is officially released today (NuGet: Sdcb.SimdPaddleOCR). It is a complete OCR inference engine written entirely in C#. It does not depend on Paddle Inference or ONNX Runtime, and it does not require shipping OpenCV native libraries."))
Console.Write(piece);
// 完整字符串:string text = string.Concat(await Generate(...).ToArrayAsync());
static async IAsyncEnumerable<string> Generate(
HunyuanDenseModel model,
string user,
int maxTokens = 128,
[EnumeratorCancellation] CancellationToken cancellationToken = default)
{
int[] prompt = model.Tokenizer.Encode(ChatTemplate.RenderHunyuanDense([new ChatMessage("user", user)]));
float[] logits = model.Forward(model.AlignPrompt(prompt).Suffix);
await Task.Yield();
List<int> generated = [];
string visible = "";
for (int i = 0; i < maxTokens; i++)
{
cancellationToken.ThrowIfCancellationRequested();
int token = Sampler.ArgMax(logits);
if (model.Tokenizer.IsStop(token))
break;
generated.Add(token);
// A trailing U+FFFD is a UTF-8 sequence split across tokens; wait for the next token.
string next = model.Tokenizer.DecodeVisible(generated).TrimEnd('\uFFFD');
if (next.Length > visible.Length && next.StartsWith(visible, StringComparison.Ordinal))
{
yield return next[visible.Length..];
visible = next;
}
logits = model.Forward([token]);
await Task.Yield();
}
}
BackendFactory.Create() 自动选择后端:macOS 优先 Metal,其次 Vulkan(需要系统装有 Vulkan 驱动),都不可用时返回 null,即纯 CPU。也可以传 "cpu" / "vulkan" / "metal" 指定,或设置环境变量 HYMT_BACKEND。CLI 用 --backend 选择,Server 自动选择。
threads = 0(默认)自动绑物理 P-core,不占 SMT 和 E-core。HunyuanDenseModel 不是线程安全的,并发请求请串行化或各用独立实例。
NuGet 包
| 包 | 版本 | 说明 |
|---|---|---|
Sdcb.HyMT2Sharp |
单 dll:GGUF、分词、KV cache、CPU SIMD kernel、Vulkan / Metal 后端、Forward |
HyMT2Sharp.Cli、HyMT2Sharp.Server、HyMT2Sharp.WinForms、HyMT2Sharp.Benchmark 是仓库内的示例与基准工具,不发布 NuGet。
Sdcb.HyMT2Sharp 还带 3 个 LINQPad 脚本,都引用 Sdcb.GgufWeights.Hy-MT2-1.8B-2Bit 权重包:hello-world(单次翻译,注释里可切换模型卡上的各类 prompt)、cli(交互式翻译,/to <语言> 切换目标语言)、minimal-api(ASP.NET Core minimal API,POST /translate 与流式 GET /translate/stream)。包打了 linqpad-samples 标签,免费版也能用。
性能
测试环境:Ryzen 7 5800X(Zen 3)、Windows、Release、8 线程,avx2=True、vnni=False。不计模型加载与 warmup;prefill 为 512 token 三次平均,decode 为 512 token 上下文后连续生成 128 token。完整数据(五种量化、同窗口 llama.cpp 对照、跨机器对比与带宽分析)见 docs/perf.md。
| 模型 | prefill 512 | decode 128 | prefill 三次 |
|---|---|---|---|
| HyMT2Sharp Q1.25 / STQ1_0 | 564.66 tok/s | 47.75 tok/s | 573.5 / 558.6 / 562.1 |
| HyMT2Sharp Q2_0C | 488.95 tok/s | 47.53 tok/s | 494.6 / 492.0 / 480.5 |
| HyMT2Sharp Q4_K_M | 423.99 tok/s | 26.55 tok/s | 426.8 / 419.8 / 425.5 |
| HyMT2Sharp Q6_K | 403.25 tok/s | 22.96 tok/s | 410.0 / 391.5 / 408.9 |
| HyMT2Sharp Q8_0 | 319.81 tok/s | 16.60 tok/s | 318.5 / 319.9 / 321.0 |
| llama.cpp Q4_K_M | 246.24 ± 0.82 tok/s | 31.57 ± 0.17 tok/s | llama-bench -p 512 -n 128 -t 8 -ngl 0 -dev none |
Q1.25 与 Q2 的 decode 基本持平;相比 Q4,Q1.25 prefill 快约 33%、decode 快约 80%。decode 全部贴着内存带宽墙,吞吐近似反比于权重大小。5800X 连续满载时频率与温度波动较大,上述数字不代表硬件上限。llama.cpp 加载不了 Q2_0C / STQ1_0,只能对照 K 系量化。
另一台开发机B(hybrid CPU,8 P-core + 16 E-core,DDR4-3200,AVX-VNNI)上复测过 Q4 / Q6 / Q8:prefill 约 4–6 倍于 llama.cpp(Q6 463.7 vs 119.1、Q8 548.8 vs 93.0 tok/s);decode 同样贴带宽墙。完整数据、带宽微基准与噪声说明见 docs/perf-B.md。
复现:
dotnet run --project src/HyMT2Sharp.Benchmark -c Release -- --model "D:\_\model\Hy-MT2-1.8B-1.25Bit.gguf" --bench-prefill 512 --bench-decode 128 --threads 8
dotnet run --project src/HyMT2Sharp.Benchmark -c Release -- --model "D:\_\model\Hy-MT2-1.8B-Q4_K_M.gguf" --bench-prefill 512 --bench-decode 128 --threads 8
dotnet run --project src/HyMT2Sharp.Benchmark -c Release -- --model "D:\_\model\Hy-MT2-1.8B-2Bit.gguf" --bench-prefill 512 --bench-decode 128 --threads 8
Q2 panel 默认 64 KiB tile,可用 --q2-col-tile-kb 64 显式指定。--profile 输出 STQ / Q2 / Q4 矩阵与注意力分项耗时。
实现要点
- Q8_0:34 B / 32 权重。层权重(含 token_embd,兼任 lm_head)重排成 8 列 panel;prefill 一次吃 8 个 token,decode 在 panel 上做 GEMV,权重按单条顺序流读取。有 AVX-VNNI 时内积用
vpdpbusd,否则用vpmaddubsw。激活量化夹在 −127..127。QKV 与 gate/up 的 GEMV 各融合成一次并行调度;输出行按动态 chunk(Interlocked.Add,与 ggml mul_mat 相同思路)在 worker 间分配。 - Q6_K:沿用
q6_Kx8 × q8_Kx4panel。整模的 Q、K、V 和 gate/up 共用一次激活量化、一次并行调度,行分配同样是动态 chunk。内积固定 AVX2vpmaddubsw+vpmaddwd(实测 VNNI 版在 Raptor Lake 上更慢,VNNI 函数保留供其它 CPU 与测试)。 - decode attention:scores → softmax → combine 按 head 融合在一次并行调度里,score 行保持在热缓存。
- Q4_K_M:
q4_Kx8 × q8_Kx4AVX2 panel GEMM;decode 走 Q8 行量化 + GEMV。Q4 内核不走 VNNI。 - Q2_0C:8 列压缩 panel,保留 2-bit 权重,不展开为逐字节副本。
- STQ1_0:42 B / 256 权重的 stride-16 block,加载时重排为 8 行 panel,prefill / decode 均走 AVX2 GEMV / GEMM。
- Q2 prefill:QKV、gate/up、SiLU→down 复用 Q8 激活量化;2-bit 点积用 int32 归约避免 int16 溢出。
- Portable SIMD:分发顺序 AVX-VNNI → AVX2 →
Vector<T>。无 AVX2 的平台(ARM64/NEON、老 x64)自动落到 portable 档:decode 的 Q4_K/Q6_K 走奇偶 i16 激活 + u16 lane 拆位的DotAct(Q4_K_M 已追平 AVX2 的带宽墙),其余格式走DotVec;prefill 走 BLIS 式外积 float GEMM(VecGemmF,寄存器驻留 6×2V 累加器 + FMA)。此时跳过 panel repack,省 ~40% 权重内存。HYMT2SHARP_FORCE_PORTABLE=1可强制启用验证,实测见 docs/perf.md 第 5 节。 - Q2 尾部列与非对齐 token 路径保留。
开发与测试
dotnet test tests/HyMT2Sharp.Tests -c Release
dotnet run --project src/HyMT2Sharp.Cli -c Release -- --model "D:\_\model\Hy-MT2-1.8B-2Bit.gguf" --prompt "Translate the following segment into Chinese, without additional explanation:SimdPaddleOCR is officially released today (NuGet: Sdcb.SimdPaddleOCR). It is a complete OCR inference engine written entirely in C#. It does not depend on Paddle Inference or ONNX Runtime, and it does not require shipping OpenCV native libraries." --max-tokens 128
dotnet run --project src/HyMT2Sharp.Cli -c Release -- --model "D:\_\model\Hy-MT2-1.8B-Q4_K_M.gguf" --prompt "Translate the following segment into Chinese, without additional explanation:SimdPaddleOCR is officially released today (NuGet: Sdcb.SimdPaddleOCR). It is a complete OCR inference engine written entirely in C#. It does not depend on Paddle Inference or ONNX Runtime, and it does not require shipping OpenCV native libraries." --max-tokens 128
微信群
如果微信群二维码过期了,请加入 QQ 群 .NET骚操作 495782587。
许可证
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 2.0.0 | 55 | 10/12/2026 |