惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园_首页
G
Google Developers Blog
A
About on SuperTechFans
酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
Last Week in AI
Last Week in AI
博客园 - 聂微东
T
Tailwind CSS Blog
宝玉的分享
宝玉的分享
V
Visual Studio Blog
美团技术团队
The Cloudflare Blog
量子位
T
The Blog of Author Tim Ferriss
罗磊的独立博客
V
V2EX
S
SegmentFault 最新的问题
小众软件
小众软件
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
MyScale Blog
MyScale Blog
博客园 - Franky

博客园 - .NET骚操作

AVX性能暴涨135%,吊打OpenVINO.NET——SimdPaddleOCR 1.3发布! ARM64端到端再提速40%:SimdPaddleOCR 1.2 发布! C# 手写向量化能追上 C 吗? SimdPaddleOCR发布——一个纯 C# 的完整 OCR 推理库 .NET 10 的正则性能现在什么水平?我拿它和 Go、Python、C++、PCRE2 测了一轮 C++ vs .NET 数组原地反转实测:小数组 C++ 碾压,大数组 .NET 反杀? Sdcb Chats 1.10 私有化代码执行器部署教程 复刻 ChatGPT 高级数据分析!Sdcb Chats 1.10 重磅发布:能分析Excel、做PPT .NET 10了,HttpClient还是不能用using吗?我做了一个实验 两天烧掉200美元!我AI大模型网关终于支持了Claude模型 Sdcb Chats 1.8:又一次底层重构,彻底将模型提供商解耦 没有前端后,我把 MCP 做进了 Chats 1.7.0 AI 网关 不服跑个分?.NET 10 大整数计算对阵 Java,结果令人意外 从 OpenAI 兼容到 Anthropic 崛起:大模型“交错思考”协议的演进与变局 当加密ID需要变成Guid:为什么我选择了AES-CBC而非GCM? AES 加密模式演进:从 ECB、CBC 到 GCM 的 C# 深度实践 美丽而脆弱的天体运动:当C#遇见宇宙混沌 我是不是很有钱? Chats 1.6.8 发布:全面支持最新的 gpt-5 模型等 Sdcb Chats 1.6.6 发布,彻底移除 Azure.AI.OpenAI 专用包 那些被推迟的 C# 14 特性及其背后的故事 我最喜欢的 C# 14 新特性 更复杂的代码,为何跑得快了10倍?一次Draw Call优化引发的思考 一个被BCL遗忘的高性能集合:C# CircularBuffer<T>深度解析 当物理定律与高精度计算相遇:我的新开源项目 N-Body
HyMT2Sharp发布:一个纯C#、高度优化的本地翻译库
.NET骚操作 · 2026-09-14 · via 博客园 - .NET骚操作

大家好,今天我正式开源发布 HyMT2Sharp(NuGet: Sdcb.HyMT2Sharp.Model),Github仓库: https://github.com/sdcb/HyMT2Sharp 。这是一个纯 C# 的 腾讯混元翻译大模型MT2Hy-MT2非官方 CPU 推理实现:不依赖 llama.cpp,不依赖 ONNX Runtime,自带 AVX2 内核,面向进程内调用。

cover

仓库语言统计条也是纯紫色的——纯C#。权重不打进包,你自己下一份 GGUF 就能跑。

csharp-100-percent

有一点必须先说清楚:Q2_0C 和 1.25-bit STQ1_0 这两种 GGUF,官方 llama.cpp 根本跑不了。 腾讯放出了量化文件,配套的是他们自己的硬件加速路径;通用 CPU 上的解码、GEMV/GEMM、panel 重排,是 HyMT2Sharp 重新自研的。Q4_K_M 还能拿 llama.cpp 对一下速度,Q2 / Q1.25 没有这条对照基线——不是我们不愿意比,是上游就没有这条路。

它有多快?

大家最关心的肯定还是:纯 C# 写的小模型推理,会不会被 llama.cpp 按在地上摩擦?

测试环境是 Ryzen 7 5800X(Zen 3)、Windows、Release、8 线程,avx2=Truevnni=False。不计模型加载与 warmup;prefill 为 512 token 三次平均,decode 为 512 token 上下文后连续生成 128 token。

模型 prefill 512 decode 128 prefill 三次
HyMT2Sharp Q1.25 / STQ1_0 553.63 tok/s 43.10 tok/s 570.5 / 531.1 / 560.8
HyMT2Sharp Q2_0C 541.00 tok/s 43.79 tok/s 560.4 / 506.6 / 559.7
HyMT2Sharp Q4_K_M 416.33 tok/s 24.79 tok/s 417.0 / 412.7 / 419.4
llama.cpp Q4_K_M(build 10894) 254.93 ± 3.10 tok/s 27.39 ± 0.37 tok/s llama-bench -p 512 -n 128 -t 8 -ngl 0

Q4_K_M 上,这份 C# 实现的 prefill 已经比 llama.cpp 快一截。Q1.25 / Q2 的 decode 还能再往上走一档——这两档量化没有 llama.cpp 对照行,因为官方 llama.cpp 不识别 Q2_0C / STQ1_0。表里那行 llama.cpp 只覆盖 Q4_K_M,是此前记录,没有跟本轮绑在一起复测。5800X 连续满载时频率和温度会飘,这些数字不是硬件上限。

换句话说:Q4 比的是“同一条大家都认识的路,C# 能不能更快”;Q2 / Q1.25 比的是“这条路官方 CPU 后端根本没铺,我们自己从 GGUF block 布局抠到 AVX2 kernel”。腾讯侧主要给的是硬件加速路径,HyMT2Sharp 的推理后端是重新写的,不是把 llama.cpp 包一层。

当然要泼两盆冷水:

  • 目前只支持 x86 CPU 推理(AVX2 路径)。Apple Silicon 那套内置 GPU 已经很强,这个库暂时用不上。
  • 测过的量化只有 Q4_K_M、Q2_0C、1.25-bit STQ1_0,其它格式和更大尺寸的 Hy-MT2 没测过。

复现命令:

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

NuGet 包

客户工程一般只装入口包,另外两个会传递引用进来:

dotnet add package Sdcb.HyMT2Sharp.Model
说明
Sdcb.HyMT2Sharp.Model 推理入口:加载 GGUF、分词、KV cache、Forward
Sdcb.HyMT2Sharp.Gguf GGUF v2/v3 读取(通常被 Model 传递引用)
Sdcb.HyMT2Sharp.Kernels AVX2 / AVX-VNNI 量化 kernel(通常被 Model 传递引用)

HyMT2Sharp.CliHyMT2Sharp.ServerHyMT2Sharp.Benchmark 是仓库里的示例和基准工具,不发 NuGet。

GGUF 需要自己下:

CLI 用法

从仓库直接跑(把 --model 换成你的路径):

dotnet run --project src/HyMT2Sharp.Cli -c Release -- --model "D:\_\model\Hy-MT2-1.8B-Q4_K_M.gguf"

不传 --threads 时按 CPU 拓扑自动绑物理 P-core(5800X 上是 8 线程,绑物理核、不占 SMT)。加 --prompt 跑单轮后退出;省略就进入多轮对话。

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

网页版用法

HyMT2Sharp.Server 提供 OpenAI 兼容的 POST /v1/chat/completions(含 SSE 流式),并自带聊天页:

dotnet run --project src/HyMT2Sharp.Server -c Release -- --model "D:\_\model\Hy-MT2-1.8B-Q4_K_M.gguf"

web

浏览器打开 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}"

进程内调用

HunyuanDenseModel 负责加载、分词、KV cache 和 Forward。库里没有内置 Generate / ArgMax,采样和拼接留给调用方。下面是一个最小 greedy 流式示例:

using Sdcb.HyMT2Sharp.Model;

using HunyuanDenseModel model = new(@"D:\_\model\Hy-MT2-1.8B-1.25Bit.gguf");

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);

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 = ArgMax(logits);
        if (model.Tokenizer.IsStop(token))
            break;

        generated.Add(token);
        string next = model.Tokenizer.DecodeVisible(generated);
        if (next.Length > visible.Length && next.StartsWith(visible, StringComparison.Ordinal))
            yield return next[visible.Length..];
        visible = next;

        logits = model.Forward([token]);
        await Task.Yield();
    }
}

static int ArgMax(float[] logits)
{
    int best = 0;
    for (int i = 1; i < logits.Length; i++)
        if (logits[i] > logits[best])
            best = i;
    return best;
}

threads = 0(默认)自动绑物理 P-core。实例不是线程安全的,并发请求请排队或各用各的实例。

起源:从 SimdPaddleOCR 到翻译小模型

几天前我写了 SimdPaddleOCR——用超过 1000 美元的 gpt-5.6-sol 和 Fable 5,做出一个本地高度优化过的纯 C# OCR 推理库。做完之后我有点手痒:有了 System.Runtime.Intrinsics / System.Numerics.Vectors,纯 C# 在 AI 领域还可以干什么?

目光落到了腾讯混元的 Hy-MT2。它最小型号只有 1.8B,足够塞进本机。我对比过 Firefox 的 Bergamot(体积不到 50MB):Bergamot 很轻,但 Hy-MT2 的译文更自然。说干就干。

差点就没新开项目:TensorSharp

初期其实没准备新开仓库。纯 C# 世界里已经有 TensorSharp,它也不引用 llama.cpp。Vulkan / CUDA 后端看起来很漂亮,提交记录里还能多次看到 Fable 5.1 的身影——作者显然是认真想把它优化好的。

但我实测下来,它的 CPU 后端没有预想中那么快。当时同一台机器上,托管 CPU 路径比 llama.cpp 慢了 80% 以上:

实现 pp512 tok/s tg128 tok/s vs llama.cpp prefill vs llama.cpp decode
llama.cpp 356.59 ± 2.65 27.47 ± 1.24 100% 100%
HyMT2Sharp(本轮) 163.13 19.94 46% 73%
HyMT2Sharp(此前 decode 峰值) 131.55 21.82 37% 79%
TensorSharp --backend cpu(托管) 45.4 13.4 13% 49%
TensorSharp ggml_cpu 139.6 18.0 39% 66%

这张表是早期对照,不是今天那台 5800X 上的复测;和上面的 553 tok/s 没有对比关系。它只说明一件事:当时如果只是“拿一个现成的纯 C# 张量库套上去”,CPU 上还是会输给 llama.cpp 一大截。

于是这个项目开了。又花了上百美元的普通模型和几十美元的 Fable 5.1 去抠 kernel、panel GEMM、量化路径之后,才有了文首那张表。Q4_K 还能对着 llama.cpp 的现成算子打磨;Q2_0C / STQ1_0 没有现成 CPU 后端可以抄,block 布局、反量化、AVX2 GEMV/GEMM 都是按腾讯放出的 GGUF 自己啃出来的。

一个 C# 写的东西,prefill 可以比 llama.cpp 更快——前提是你接受它现在只做 x86 CPU。这不是“C# 全面超越 llama.cpp”,只是在这条被抠过的 Hy-MT2 路径上,托管代码也能把 AVX2 吃饱。Q2 / Q1.25 更进一步:官方通用推理栈走不通,HyMT2Sharp 把这条路铺上了。

开源与交流

仓库:https://github.com/sdcb/HyMT2Sharp 喜欢的话给个 Star。许可证是 Apache-2.0。

大家可以扫我的微信加群:

如果群满了或者不方便加微信,也可以加入.NET骚操作 QQ 群:495782587 期待大家的宝贵意见!