KTransformers 精度基准测试指南:基于 DeepSeek-V3 的 MMLU/MMLU-pro 复现方法与结果解析 KTransformers 精度基准测试指南基于 DeepSeek-V3 的 MMLU/MMLU-pro 复现方法与结果解析【免费下载链接】ktransformersA Flexible Framework for Experiencing Heterogeneous LLM Inference/Fine-tune Optimizations项目地址: https://gitcode.com/GitHub_Trending/ktr/ktransformers导读本文基于 KTransformers 项目官方基准测试文档doc/en/benchmark.md完整讲解项目团队用于校验异构推理精度的 MMLU / MMLU-pro 快速评测方案从数据集准备、评测提示词、API 评测脚本到 bf16 / q8_0 / q4km / iq1 / fp8 等多种 CPU 与 GPU 权重格式、cpuinfer/marlin/fp8gemm等 Kernel 组合下的精度结果与逐用例复现步骤。读完本文你将能够在本地复现 KTransformers 的精度验证流程并理解如何通过修改优化规则 YAML 与源码来切换 GEMM Kernel、MLA Kernel从而评估不同异构优化配置对推理精度的影响。一、评测背景为什么需要一套快速精度检查流程KTransformers 是一个用于体验异构 LLM 推理 / 微调优化的灵活框架其核心思路是在 CPU 与 GPU 之间按算子类型灵活分配计算典型如将 MoE 专家权重放在 CPU、Attention 与 GEMM 放在 GPU。由于同一模型可能以多种量化格式bf16、q8_0、q4km、iq1、fp8 等加载并由不同 Kernel 执行CPU 侧cpuinfer、GPU 侧marlin/fp8gemmMLA 侧triton/torch量化与 Kernel 选择必然引入精度差异。为了快速、方便地评估精度项目采用一个简单的 Python 脚本仓库内 mmlu_test.py在固定数据集上对比 KTransformers 与云端服务平台的推理结果从而对项目精度做出初步评估。官方明确说明这是一项初步判断preliminary assessment不是对模型的完整学术评测。二、测试设置数据集、模型与提示词2.1 数据集与取样方式评测使用MMLU数据集取样策略如下选取全部子数据集并使用固定随机种子脚本中为random.seed(42)进行 shuffle保证每次测试的数据顺序一致跳过 few-shot 部分仅取前1,000 条数据做快速检查。重要说明由于跳过了 few-shot 且只测 1,000 条结果可能与 DeepSeek-V3 官方技术报告不完全一致1,000 条样本只提供初步判断存在合理波动。R1 的测试及更多测试当时仍在进行中文档记录时的状态。2.2 模型与权重格式评测以DeepSeek-V3为主部分用例为 DeepSeek-R1覆盖以下权重格式组合角色格式CPU 侧权重bf16、q8_0、q4km、iq1GPU 侧权重bf16、q4km→marlin4bit/8bit、fp8对应 KernelCPUcpuinferGPUtorch/marlin/fp8gemmMLAtorch/triton文档同时给出权重获取线索bf16 模型可从公开渠道获取后用 llama.cpp 转为 GGUFq4km 对应 DeepSeek-V3-Q4_K_M 系列 GGUFq8_0 对应 DeepSeek-V3-Q8_0 系列 GGUF均不在此给出外部链接请以原文档为准。2.3 评测提示词与参数为保证各 Kernel / 格式间可比统一使用如下单轮问答提示词无 few-shotThere is a single choice question. Answer the question by replying A, B, C, D. No other answers are accepted. Just the letter. Question: {question} A. {option_a} B. {option_b} C. {option_c} D. {option_d} Answer: 采样参数设定temperature0.6。这一提示词与参数均可在评测脚本 mmlu_test.py 中找到对应实现。2.4 基线对照为验证 KTransformers 的结果文档选择了 Siliconflow 云服务平台作为基线baseline所有测试使用同一脚本、同一数据集运行从而对项目精度做初步评估。基线分数Siliconflow与 KTransformers 得分Ktrans Point并列展示在结果表中。三、评测脚本实现解析评测脚本 mmlu_test.py 的核心逻辑可以分为四个环节理解它有助于你复现或改造评测数据加载DataEvaluator.load_data通过pd.read_parquet读取cais/mmlu数据集的 test 分片将每条记录转为字典存入列表提示词构造get_prompt将记录中的 question 与 choices 拼接成 2.3 节所示的模板MMLU-pro 版本见 mmlu_pro_test.py推理调用generate_text向 OpenAI 兼容的/v1/chat/completions接口发起 POST 请求。默认api_url为http://localhost:10003/v1/chat/completions即本地 KTransformers 服务地址可通过--api_url参数切换后处理与打分post_processing/score取回复最后一个字符作为预测答案与标准答案chr(answer 65)比对命中计 1 分否则 0 分。脚本同时输出每个问题的 JSON 结果文件与日志文件总耗时、吞吐量、平均分并支持通过--concurrent控制评测条目数默认 1000。实测时可通过--api_url分别指向本地 KTransformers 服务与基线云服务用同一份数据完成对比。四、完整结果表文档记录以下为文档记录的结果。表中CPU Weight Format / CPU Kernel描述 CPU 侧加载权重格式与执行 KernelGPU Weight Format / GEMM Kernel / MLA Kernel描述 GPU 侧情况Siliconflow 列与 Ktrans Point 列分别对应基线得分与 KTransformers 得分。4.1 MMLUshuffle 1ktemperature0.6#模型CPU Weight FormatCPU KernelGPU Weight FormatGEMM KernelMLA KernelSiliconflowKtrans Point1DeepSeek-V3bf16cpuinferbf16torchtorch81.681.92DeepSeek-V3q8_0cpuinferbf16torchtorch81.683.13DeepSeek-V3q4kmcpuinferbf16torchtriton81.681.44DeepSeek-V3q4kmcpuinferq4km→marlin 8marlintriton81.681.15DeepSeek-V3q4kmcpuinferq4km→marlin 4marlintriton81.681.06DeepSeek-V3q4kmcpuinferfp8fp8gemmtriton81.681.57DeepSeek-R1iq1cpuinferfp8fp8gemmtriton78.683.64.2 MMLU-proshuffle 1ktemperature0.6#模型CPU Weight FormatCPU KernelGPU Weight FormatGEMM KernelMLA KernelSiliconflowKtrans Point1DeepSeek-V3q4kmcpuinferfp8fp8gemmtriton57.757.62DeepSeek-V3q4kmcpuinferq4km→marlin 4marlintriton57.757.53DeepSeek-R1iq1cpuinferfp8fp8gemmtriton71.9tbd4.3 待补测项HumanEval 与 GSM8K 两个基准当时标记为 tbd待测试KTransformers 侧得分同样待补充。读表提示文档特别提醒由于仅测 1,000 条且为快速检查结果波动属正常现象同一数据集、固定种子保证可比性。从表内数据可看到不同量化与 Kernel 组合下 KTransformers 得分与基线大致相当部分组合甚至更高可作为配置选型的参考但不应据此得出超越基线的绝对结论。五、逐用例复现细节文档对每个用例给出了具体的复现操作全部围绕优化规则文件 DeepSeek-V3-Chat.yaml 展开。5.1 MMLU 用例Case 1CPU bf16 / GPU bf16 / torch / torch使用 v3-chat YAML将其中所有KLinearMarlin替换为KLinearTorch在该文件中查找全部出现处逐一替换。源权重为 DeepSeek-V3-bf16需用 llama.cpp 转为 GGUF。Case 2CPU q8_0 / GPU bf16 / torch / torch同样使用 v3-chat YAML但需修改代码以单独加载 CPU 侧专家权重。文档在 experts.py 中留下了注释标记点约 L122、L136、L137 三处其中 L137 处需改为本地权重文件路径。q8_0 权重文件对应 DeepSeek-V3-Q8_0 系列 GGUF。Case 3CPU q4km / GPU bf16 / triton操作同 Case 2同样需改 experts.py 加载 CPU 专家权重q4km 权重文件对应 DeepSeek-V3-Q4_K_M 系列 GGUF。Case 4CPU q4km / GPU q4km→marlin 8无需修改源码两侧均用 q4km。但需注意 YAML 文件中的两处位置约 L29 与 L18即所有使用KLinearMarlin的规则下方为每条KLinearMarlin规则添加num_bits: 8参数即把该 kwargs 加到所有使用KLinearMarlin的配置中。Case 5CPU q4km / GPU q4km→marlin 4不需要修改 YAML直接使用默认配置即可。权重文件同样为 DeepSeek-V3-Q4_K_M。Case 6GPU fp8 / fp8gemm这是混合张量mixture tensor用例需参考 fp8_kernel.md 学习如何测试。Case 7DeepSeek-R1CPU iq1 / GPU fp8同样为混合张量用例参考 fp8_kernel.md。5.2 MMLU-pro 用例Case 1CPU q4km / GPU fp8 / fp8gemm混合张量用例参考 fp8_kernel.md。Case 2CPU q4km / GPU q4km→marlin 4无需修改 YAML使用默认配置权重为 DeepSeek-V3-Q4_K_M。Case 3DeepSeek-R1CPU iq1 / GPU fp8混合张量用例参考 fp8_kernel.md。5.3 优化规则文件中的关键配置DeepSeek-V3-Chat.yaml 定义了默认的异构注入策略理解它可以解释上述用例为何要改 YAMLlm_head 与除 kv_b_proj 外的 Linear替换为KTransformersLineargenerate_op用KLinearMarlin、prefill_op用KLinearTorchCase 1 即把KLinearMarlin全部改成KLinearTorch以实现纯 torch GEMMMoE 模块DeepseekV3MoE替换为KDeepseekV3MoE其中mlp.experts的generate_op为KExpertsCPU生成阶段专家走 CPU、prefill_op为KExpertsTorch、out_device为cuda这正是CPU 加载专家权重的来源也是 Case 2/3 需要单独加载 CPU 专家权重的原理Attention替换为KDeepseekV2Attention优化的 MLA 实现absorb_for_prefill默认 False改为 True 可支持长上下文但 prefill 可能变慢MoE Gate替换为KMoEGate运行在cuda:0。六、Kernel 切换方法6.1 切换 GEMM KernelMarlin ↔ TorchGEMM Kernel 由优化规则 YAML 中的generate_op/prefill_op控制默认KLinearMarlinGPU 量化 GEMM切换为纯 torch将KLinearMarlin改为KLinearTorch对应 DeepSeek-V3-Chat.yaml 中所有使用处。6.2 切换 MLA KernelTriton ↔ Torch默认行为Linux 上 MLA Kernel 使用 TritonWindows 上使用 Torch。若需在 Linux 上强制使用 Torch例如 Case 1/2 需要 torch MLA文档给出的做法是手动修改 attention.py删除forward中所有 if 分支判断强制调用self.forward_windows方法该方法对应 Windows 的 torch 实现位于 attention.py 附近而 Linux Triton 实现在forward_linux_triton约 L196。从源码结构看KDeepseekV2Attention.forward约 L685内部按平台/条件在forward_linux_triton、forward_linux_flashinfer、forward_windows、forward_xpu等实现间分派因此修改分派逻辑即可完成 Kernel 切换。七、环境注意事项g/as 版本与开发容器进行 bf16 测试无论是 CPU Weight 还是 GPU Weight时Ubuntu 20 或更早版本可能因系统自带的 g 与 as汇编器版本过旧而遇到编译问题。为便于复现结果项目提供了预配置的开发容器容器内已预装适配 bf16 构建的环境但未安装 ktrans 包仍需手动安装若干依赖包模型挂载目录可在devcontainer/devcontainer.json中配置文档提到检查其中的mouts配置项——注意这是原文档的笔误实际对应 devcontainer 的 mounts/挂载配置。八、限制与适用范围最后重申本文所述评测方法的边界避免误用非完整评测跳过 few-shot、仅 1,000 条样本、temperature0.6结果不宜与 DeepSeek-V3 技术报告直接对比初步结论文档明确定位为快速检查与初步精度评估HumanEval / GSM8K 等基准仍待补测波动合理1,000 条样本下分数存在合理波动环境依赖复现 bf16 用例需注意 g/as 版本建议使用提供的开发容器环境。如需进一步深入可继续阅读仓库内的 fp8_kernel.md混合张量 / fp8 用例、mmlu_pro_test.pyMMLU-pro 脚本以及 DeepSeek-V3-Chat.yaml优化规则全文。【免费下载链接】ktransformersA Flexible Framework for Experiencing Heterogeneous LLM Inference/Fine-tune Optimizations项目地址: https://gitcode.com/GitHub_Trending/ktr/ktransformers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考