用户指南+技术讲解|KTransformers:2CPU+2GPU 微调千亿/万亿参数大模型

源地址https://mp.weixin.qq.com/s/VR88J7K-AsHcucnSJL-tZQ

 

图片

 

  导语  

 

由趋境科技和清华 KVCache.AI 共同开源的 KTransformers 上线模型微调功能,通过 KTransformers 与 LLaMA-Factory 的合作,能够在本地对 DeepSeek 671B 乃至 Kimi K2 1TB 这样的超大模型进行微调,该微调方案目前是在消费级显卡上实现微调超大参数MoE模型的唯一可行方案,并在较小规模的MoE模型(DeepSeek-14B)上面也展现了超过传统方案 1.8 倍的吞吐、显存占用降低 82%。以下是详细的用户使用指南和技术详解。如有任何问题,欢迎点击“阅读原文”加入 KTransformers 技术交流群交流或反馈。

 

 

 

用户指南篇

 

01

Introduction

 

从 DeepSeek-V3/R1 到 Qwen3-MoE、Kimi-K2,每一次超大模型的开源都带来性能与规模上的巨大跃升。然而,多数研究者与开发者受限于昂贵的显卡与动辄数千亿参数的模型,难以在资源受限条件下微调超大模型。面对这种差距,我们提出了一种更具可行性的方案:通过 KTransformers 与 LLaMA-Factory 的结合,仅需2~4张RTX 4090与较高内存CPU,便可微调DeepSeek-671B等超大规模的MoE模型。

 

该架构的核心目标是为资源受限下的研究者提供 在本地探索超大规模模型微调的可能性。同时,也在较小规模(如 14B/30B)提供快速定制特定场景的路径。我们以风格化对话、西式腔调翻译、医学问答作为代表任务,验证架构的可行性,并展示在数小时内达成个性化适配的可操作性。

 

如下图所示,LLaMA-Factory 是整个微调流程的统一调度与配置框架,负责数据处理、训练调度、LoRA 插入与推理接口管理; KTransformers 则作为其可插拔的高性能后端,在相同的训练配置下接管 Attention / MoE 等核心算子,实现异构设备(GPU+CPU)的高效协同。

 

图片

 

02

微调效果示例

 

风格化对话测试(CatGirl风格语气)

 

数据集:NekoQA-10K: 面向猫娘语言建模的对话数据集,目标是提升风格一致性与可辨识度。

 

下图对比了原始模型和微调模型的回答,可以看到微调后模型在语气和称谓上更加稳定地保持了猫娘风格(红框部分),验证了风格迁移微调的有效性。

 

图片

 

03

Quick to Start

 

快速上手

 

本节将指导您如何安装环境并使用 LLaMA-Factory + KTransformers 完成微调和推理。我们将涵盖以下内容:

 

  • 环境依赖的安装配置

  • 使用 KTransformers 作为后端微调超大规模 MoE 模型

  • 加载微调后的模型(原模型 + LoRA 适配器)进行对话/推理

  • 批量推理微调模型并评测指标

 

环境安装

 

根据下面示例,同时安装KTransformers和LLaMA-Factory环境,这次为了简化KTransformers的安装流程,我们特意封装了wheel包避免本地编译,具体安装步骤如下:(注意对应好本地的python版本、torch版本、cuda版本和不同文件名的KTransformers包)

 




 
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

# 1. 安装conda环境conda create -n Kllama python=3.10 # choose from : [3.10, 3.11, 3.12, 3.13]conda install -y -c conda-forge libstdcxx-ng gcc_impl_linux-64conda install -y -c nvidia/label/cuda-11.8.0 cuda-runtime# 2. 安装llamafactory环境git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.gitcd LLaMA-Factorypip install -e ".[torch,metrics]" --no-build-isolation# 3. 安装对应torch和python版本的KTransformers(CUDA版本可以跟whl命名的不一致),从https://github.com/kvcache-ai/ktransformers/releases/tag/v0.4.1pip install ktransformers-0.4.1+cu128torch28fancy-cp310-cp310-linux_x86_64.whl# 4. 安装flash-attention,参照python版本和torch版本,从https://github.com/Dao-AILab/flash-attention/releases下载pip install https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.3/flash_attn-2.8.3+cu12torch2.8cxx11abiTRUE-cp310-cp310-linux_x86_64.whl# abi=True/False可以用下面代码查看# import torch# print(torch._C._GLIBCXX_USE_CXX11_ABI)# 5. (可选)如果你想使用flash_infer的话(不然默认triton)git clone https://github.com/kvcache-ai/custom_flashinfer.gitpip install custom_flashinfer/

 

使用要点:在 LLaMA-Factory 的配置 YAML 文件中启用 KTransformers 后端,只需设置 use_kt: true,并指定相应的 kt_optimize_rule YAML 文件,即可切换到底层由 KTransformers 接管计算。下面我们将通过具体功能来说明如何设置这些配置。

 

核心功能1:使用KTransformers作为backend,微调超大规模MoE模型

 

运行命令:USE_KT=1 llamafactory-cli train

examples/train_lora/deepseek3_lora_sft_kt.yaml

 

需要注意的是,必须提供BF16格式模型文件,DeepSeek-V3-671B默认下载是FP8格式,需要通过 DeepSeek-V3/inference/fp8_cast_bf16.py 转换。

 




 
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

### modelmodel_name_or_path: opensourcerelease/DeepSeek-V3-bf16trust_remote_code: true### methodstage: sftdo_train: truefinetuning_type: loralora_rank: 8lora_target: all### datasetdataset: identitytemplate: deepseekcutoff_len: 2048max_samples: 100000overwrite_cache: truepreprocessing_num_workers: 16dataloader_num_workers: 4### outputoutput_dir: saves/Kllama_deepseekV3logging_steps: 10save_steps: 500plot_loss: trueoverwrite_output_dir: truesave_only_model: falsereport_to: none  # choices: [none, wandb, tensorboard, swanlab, mlflow]### trainper_device_train_batch_size: 1gradient_accumulation_steps: 8learning_rate: 1.0e-4num_train_epochs: 3.0lr_scheduler_type: cosinewarmup_ratio: 0.1bf16: trueddp_timeout: 180000000resume_from_checkpoint: null### ktransformersuse_kt: true # use KTransformers as LoRA sft backendkt_optimize_rule: examples/kt_optimize_rules/DeepSeek-V3-Chat-sft-amx-multi-gpu.yamlcpu_infer: 32chunk_size: 8192

 

其中,kt_optimize_rule提供了大量默认的YAML文件来控制KTransformers的放置策略,下面针对YAML文件名和功能对照特别说明,也可以参考ktransformers/optimize_rules:(*指通配符)

 

图片

 

例如:examples/kt_optimize_rules/DeepSeek-V3-Chat-sft-amx-multi-gpu.yaml为DeepSeek-V3-Chat模型用AMX指令集进行微调,并调用两卡模型并行。

 

对于微调任务,我们推荐使用AMX指令集加速,可以使用lscpu | grep amx查看CPU是否支持AMX指令集,AMX精度支持BF16/Int8,修改方式如下:

 




 
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

- match:    name: "^model\\.layers\\..*\\.mlp\\.experts$"  replace:    class: ktransformers.operators.experts.KTransformersExperts     # custom MoE Kernel with expert parallelism    kwargs:      prefill_device: "cpu"      prefill_op: "KExpertsTorch"      generate_device: "cpu"      generate_op: "KSFTExpertsCPU"      out_device: "cuda"      backend: "AMXInt8" # or "AMXBF16" or "llamafile" (default)

 

输出会保存在output_dir里面,默认为safetensor格式,并且保留adapter.json等配套内容以便后续加载。

 

图片

 

核心功能2:与微调后模型(即原模型+LoRA Adapter)聊天,用于交互

 

运行命令:llamafactory-cli chat

examples/inference/deepseek3_lora_sft_kt.yaml

 

调用KT微调的adapter (safetensor格式) 推理对话。

 




 
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

model_name_or_path: opensourcerelease/DeepSeek-V3-bf16adapter_name_or_path: saves/Kllama_deepseekV3template: deepseekinfer_backend: ktransformers  # choices: [huggingface, vllm, sglang, ktransformers]trust_remote_code: trueuse_kt: true # use KTransformers as LoRA sft backend to inferencekt_optimize_rule: examples/kt_optimize_rules/DeepSeek-V3-Chat-sft-amx-multi-gpu.yamlcpu_infer: 32chunk_size: 8192

 

同时,我们也支持GGUF格式的adapter进行推理(如果您已经使用了上述LLaMA-Factory+KTransformers的微调方案,就不用管啦~)。

 

safetensors 场景填文件所在目录,GGUF 场景填文件路径,也就是说您需要把adapter_name_or_path选为具体的GGUF格式文件。

 

加载过程中适配了KT每层的命名,和torch.save保存下来的常规命名的不同,正常映射日志Loaded adapter weight: XXX -> XXX,展示如下。

 

图片

 

核心功能3:生成微调后模型(即原模型+LoRA Adapter)的API,用于批量生成并评测指标

 

运行命令:API_PORT=8000 llamafactory-cli api

 examples/inference/deepseek3_lora_sft_kt.yaml

 

调用KT微调的adapter给出API,其他API使用逻辑和llamafactory原生方式一致。

 




 
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

model_name_or_path: opensourcerelease/DeepSeek-V3-bf16adapter_name_or_path: saves/Kllama_deepseekV3template: deepseekinfer_backend: ktransformers  # choices: [huggingface, vllm, sglang, ktransformers]trust_remote_code: true

use_kt: true # use KTransformers as LoRA sft backend to inferencekt_optimize_rule: examples/kt_optimize_rules/DeepSeek-V3-Chat-sft-amx-multi-gpu.yamlcpu_infer: 32chunk_size: 8192

 

如在具体的操作中有问题,欢迎点击“阅读原文”加入 KTransformers 技术交流群反馈。

 

开发技术篇

 

01

Introduction

 

为评估该集成的性能优势,我们使用 LLaMA-Factory 分别调用了 HuggingFace 默认后端、Unsloth 后端以及 KTransformers 后端进行 LoRA 微调的对比测试(在相同设置和数据集下)。结果表明,KTransformers 是目前唯一能在 2~4 张 24GB 4090卡上微调 671B 规模 MoE 模型 的方案;同时在 14B 规模的 MoE 模型上,相比另两种方案也具有更高的吞吐速率和更低的 GPU 显存占用。

 

图片

 

† 1400 GB 为理论显存(FP16 全参数常驻,非可运行配置);70 GB 为 KT 策略(Attention 驻 GPU + MoE分层 offload)下的实测峰值。

 

上表中可以看出,对于 14B 模型,KTransformers 后端的吞吐量相比 HuggingFace 默认方案提升了约 75%,而显存占用仅为其约 1/5。对于 671B 模型,HuggingFace 和 Unsloth 在单台4090环境下无法运行,而 KTransformers 能以 40 tokens/s 的速度LoRA微调,并将 GPU 显存需求控制在 70 GB。

 

图片

 

02

KT微调框架整体性描述

 

下面详细展示的是在 LLaMA-Factory 的微调框架中,KTransformers 后端如何接管底层算子并实现 Attention / MoE 的优化结构。

 

DeepSeek-V3/V2等MoE模型主要包括小参数、密集矩阵的Attention部分和大参数、稀疏矩阵的MoE部分。为了直观说明,我们以 DeepSeek-V2-Lite-Chat 的第 2 层为例(从该层起,每层包含 Attention 与 MoE 两个子模块),其中Attention由GPU承担主要计算与缓存(KV),剩下的大参数量MoE主要由CPU承担 。下文将先介绍 Attention 部分的替换与继承关系,再介绍 MoE 部分的封装与后端对接,最后说明多卡放置等特性支持。

 

Attention 部分(LoRA + KT 特性并存)

 

KTransformers 提供了算子模块的注入机制(BaseInjectedModule),而 PEFT 库提供了 LoRA 微调的层插入机制。为了在微调阶段同时兼容两者,我们设计了 KTransformersLinearLora 类,使其同时继承自 KTransformers 的线性层 (KTransformersLinear) 和 LoRA 的层基类 (LoraLayer)。如下图所示:

 

继承关系

 

如下图所示,KTransformersLinearLora 同时继承 KTransformersLinear 与 LoraLayer,既保留 KT 的高性能算子(如 prefill_linear / generate_linear),又能加载 LoRA参数(如 lora_A、lora_B 等矩阵);

 

替换策略

 

在微调准备阶段,用 KTransformersLinearLora 逐一替换 原 KTransformersLinear层(如下图右侧所示,主要包含Q/K/V/O 等线性层),从而在不破坏 KT 优化的前提下,将 LoRA 注入到了模型中,使其参数可训练。

 

 

图片

 

替换完成后,如下图(左)所示,在计算图中相当于在原模型的 Q/K/V/O 四个矩阵乘法位置都插入了 LoRA。下图(右)展示了 KTransformersLinearLora 的内部,它同时包含了 KT 模块的高性能计算接口(prefill 和 generate 阶段的方法)以及 LoRA 的 A、B 矩阵等参数。

 

图片

 

MoE 部分(算子封装+backward实现)

 

考虑到 MoE 参数量大且计算稀疏,我们采用“封装成黑盒算子”的策略处理:将 MoE 专家计算封装为一个对上游而言透明(单节点)、对下游可替换(多实现)的可微算子。

 

上游(PyTorch 计算图)

 

我们注册自定义 Autograd Function,整个 MoE 专家层在计算图中呈现为一个节点。如下左图红框所示,封装后计算图中只有 KSFTExpertsCPU 这样一个算子节点;而右图红框为未封装时的细粒度计算图——路由、专家选择以及 FFN 计算都完整展开在计算图中。封装后,对微调过程来说,MoE层就等同于一个普通 nn.Module,前向计算可求梯度,反向梯度也由我们来自定义算子返回。

 

下游(后端实现)

 

在这个 Autograd Function 内部,我们通过 pybind11 调用了 C++ 扩展实现具体的前向和反向计算。这里我们提供了多个可插拔后端实现,如 AMX 指令集版本(支持 BF16/INT8 算子优化)和 llamafile 版本。只要遵循同样的接口,即可灵活切换后端。例如在 YAML 优化规则里指定使用 "backend": "AMXBF16",就会调用 AMX 后端;改成 "llamafile" 则使用默认后端。

 

 

图片

 

MoE 反向优化 (CPU 实现)

 

在实现 MoE 自定义算子的反向传播时,我们特别优化了大矩阵的梯度计算开销。MoE反向计算需要频繁访问权重转置Wᵀ,为避免运行时反复转置带来的开销,我们在加载参数时预备一份权重转置Wᵀ 便于复用(如下图蓝框)。同时,缓存必要的中间激活(例如专家层中间投影结果,见下图红框),以便在反向阶段复用,减少重复计算。基于这些缓存,当前已提供 llamafile 与 AMX(INT8/BF16) 的MoE反向计算实现,并针对 NUMA 架构优化内存访问。

 

图片

 

多卡加载与训练:用“放置策略”而不是 DataParallel

 

为了在使用 2~4 张 GPU 时进一步降低单卡显存压力,KTransformers 结合模型并行技术实现了多卡协同微调。与常规的 DataParallel 不同,我们没有简单地将整层模型复制到每张卡(那样显存需求会翻倍),而是采用模型并行 + 显式算子放置的策略,让不同 GPU 各自承载模型的一部分层。

 

具体而言,我们对 Transformers Trainer 做了以下改动:

 

自定义训练器 (KTrainer)

 

接管模型加载到设备的逻辑,采用显示层放置。默认情况下 transformers 会在初始化时将模型 .to(device) 全部搬移到单块 GPU,我们通过自定义 KTrainer 阻止这一行为,利用 KTransformers 的优化规则 YAML,我们可以在每一层声明 device: cuda:0/cuda:1/... 来指定该层所在的设备。这样初始化模型时,各层就直接构建在目标 GPU 上,不需要额外拷贝。

 

禁用自动 DataParallel

 

当启动全局变量USE_KT=1时,我们暂时禁用了 LLaMA-Factory 和 HuggingFace Train 原本自动启动的多卡 DataParallel 封装。避免了框架层面对模型的重复拷贝,使我们能够完全掌控模型的分片方案。

 

梯度回传与汇总

 

由于模型各部分分散在不同 GPU 上,我们采取梯度汇总到 cuda:0 的方式。具体做法是:在反向传播时,仅将所需的梯度张量在设备间传输,而不传输整个模型的中间激活;各 GPU 计算各自部分的梯度,最终在0号卡汇总计算 loss。这种方式减少了不必要的通讯开销和激活冗余。

 

 

通过上述手段,我们实现了多 GPU 下依然遵循 KTransformers 放置策略的训练方案。用户只需选择合适的 kt_optimize_rule 配置文件(例如带有 multi-gpu 的 YAML),即可启用默认的模型分片方案。在 DeepSeek-671B 微调中,我们提供的 DeepSeek-V3-Chat-sft-amx-multi-gpu.yaml 就是一个两卡模型并行的典型策略:Attention 模块的 KV缓存和部分计算放在每张卡上,MoE 专家层在 CPU 上分片处理,两张卡共同承担全模型的计算。

 

03

KT-LoRA微调测试

 

实验设置

 

实验均采用 LLaMA-Factory 调度、KTransformers 后端、LoRA 轻量微调范式(超参数:rank = 8、α = 32、dropout = 0.1,BF16,gradient_accumulation_steps=16、qlen=512)以及与微调阶段一致的 KT 优化规则。我们分别评测了(a)风格化对话的迁移效果,以及(b)两类具有代表性的定量基准:西式翻译腔(生成式)与 AfriMed-QA(医疗垂直领域,含简答生成与单项选择两种子任务)。固定使用AMX指令集优化;GPU选取2张 48G VRAM 的 RTX 4090,CPU选取 Intel Xeon Platinum 8488C。

 

效果测试

 

生成式翻译风格基准测试

 

数据集采用了西式翻译腔数据集,要求模型采用夸张的“西式翻译腔”,属生成式风格控制任务,评价指标采用生成任务常见的 BLEU-1/2/3/4 与 ROUGE-1/2/L。

 

图片

 

如上表测试结果所示,在统一流程与放置策略下,两种规模的模型在微调后均出现一致性增益,支持“KT 后端 + LoRA 微调”组合在生成式风格控制上的可用性与有效性。同时,说明 KT 的异构放置与算子优化能够稳定支撑风格域的小样本适配。

 

医疗垂直领域基准(AfriMed-SAQ/MCQ)

 

数据集采用了AfriMed-QA数据集(ACL-2025),作为非洲地区医疗领域的专用数据集,具有很强的场景定制特征,包含单选题(MCQ)和简答题(SAQ)两种形式,在本案例中作为垂直领域微调的评估。评估标准上,SAQ 用 BLEU/ROUGE;MCQ 用 Accuracy。

 

图片

图片

 

如上表所示,(1)DeepSeek-V3(671B)经 KT-LoRA 微调后在MCQ和SAQ任务上均明显高于微调后的 DeepSeek-V2-Lite(14B),并且超过 V3 原模型。在我们的小规模设置中,初步说明了KT-LoRA微调巨大参数模型,在垂直领域中具有实际意义。

 

(2)在 SAQ/MCQ 两类子任务上,KT-LoRA 均带来一致增益,说明在 KT 的异构放置与后端算子支持下,LoRA 微调能够把“医疗等垂直领域的知识要点”有效注入模型。

 

局限性说明

 

目前我们基于的多为单数据集、小规模(2w条及以下)进行测试,旨在提供KT-LoRA微调系统有效性的“存在性证据”,而非对算法泛化或规模规律的概括性结论。我们报告中主要给出的是代表性数值;若要支持更强的算法结论,需要更大样本、跨语种/跨域多数据集与多随机种子重复实验,本文不作展开。

 

我们也特别欢迎大家加入LLaMA-Factory KT微调的开源项目中,如果大家有更多的测试结果,也特别特别欢迎写在下面的共享表格中,并补充好kt_optimize_rule 文件、数据集example、训练/评测 YAML、具体显存与 CPU 配置等,以便大家参考、复现~!

 

速度测试

 

端到端性能

 

测试定义:

 

step_time:一次优化步的总耗时(含张量搬运、Attention、MoE 等全部计算)。

tokens_per_step = GAS × qlen;token/s = tokens_per_step / step_time。

本节统一采用 GAS=16、qlen=512,因此 tokens_per_step = 8192。

 

实测结果:

图片

 

MoE部分的计算性能(DeepSeek-V3-671B)

 

理论估算

 

MoE 每层、每token的前/反向浮点计算总量 (FLOPs) 可近似

 

图片

其中:k = 8(Top-k 专家数),H = 7168(hidden size),I = 2048(intermediate size),常数 c = 16(折合前向=6、反向=10 的矩阵乘总系数)。

 

每步(全 MoE 层)FLOPs 近似

 

图片

 

 

实测情况:

 

MOE部分在CPU上面的性能情况:每秒浮点计算量

图片

图片

 

显存/内存性能

 

DeepSeek-V3(671B,61层,其中58层有MoE)占用显存大约70GB(多卡总量)、内存占用约1.2-1.3TB。

 

DeepSeek-V2-lite(14B,27层,其中26层有MoE)占用显存大约5GB、内存占用约30GB。

 

结论

 

通过将 KTransformers LoRA 微调集成到 LLaMA‑Factory,我们为希望高效训练和部署 MoE 大模型的用户提供了一条可行路径。KT 提供新的放置策略和算子优化(支持 DeepSeek、Qwen、Kimi 等模型,并结合 AMX 指令加速关键内核),配合 LoRA 微调实现了在极低 GPU 显存占用下的模型定制化训练;而 LLaMA‑Factory 则提供了友好的上层接口与配置管理,让这一切变得易于使用。

 

这种集成意味着即便是拥有数百亿乃至上万亿参数的 MoE 模型,也能够在相对普通的硬件上完成微调,并进行低延迟的推理部署。显存节省、速度提升和易用性在这套方案中达到了一定的平衡。我们期待社区在未来的 MoE 项目中尝试使用 LLaMA‑Factory 与 KTransformers 的组合,并欢迎参考本文档提供的指南进行操作。通过这一方案,超大模型不再是“无法企及”的存在,而成为每个开发者都可能驾驭的工具。

 

 

 

关于趋境

 

 

 

 

 

趋境科技是大模型推理加速先行者,助力企业低成本落地使用大模型。团队首创“以存换算”和“全系统异构协同推理”技术架构,开创大模型私有化部署新路径,将大模型推理门槛降低10倍,赋能企业低成本创新。基于创新技术架构发布高性价比大模型推理解决方案,实现软硬一体开箱即用,提供工作站、服务器、集群优化等多层级解决方案;搭载便捷大模型运维平台,纳管所有资源、分钟级启动大模型,降低大模型运维管理技术门槛和时间成本。同时已全面适配国产化硬件,提供从硬件-推理引擎-大模型自动化运维平台-应用的全栈式解决方案,当前已在金融、安全、法律等领域落地使用。

 

图片

 

往期推荐

图片

KTransformers 上线异构微调功能,2 张 4090 + 2 张 CPU 本地微调千亿/万亿大模型

算力成本降低85%,AI 应用效率提升50%,趋境科技助力金融领域AI应用高效落地

Mooncake 技术详解|长上下文场景 TTFT 骤降 84%,对接 SGLang HiCache 模块的设计和实现(上篇)

Mooncake技术详解|长上下文场景TTFT 骤降84%,对接 SGLang HiCache 模块的性能优化与灵活部署(下篇)

 

 

分享到: 微博 QQ 空间
对本文内容有合作意向?
我们将在 1 个工作日内与您联系
留言咨询