kvcache-ai-ktransformers/doc/zh/KTransformers-Fine-Tuning_User-Guide_zh.md
2025-11-08 08:54:32 +00:00

302 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

- [KTransformers 微调 × LLaMA-Factory 集成 用户指南](#ktransformers-微调-x-llama-factory-集成--用户指南)
- [Introduction](#introduction)
- [Quick to Start](#quick-to-start)
- [快速上手](#快速上手)
- [环境安装](#环境安装)
- [核心功能1使用KTransformers作为backend微调超大规模MoE模型](#核心功能1使用ktransformers作为backend微调超大规模moe模型)
- [核心功能2与微调后模型即原模型+LoRA Adapter聊天用于交互](#核心功能2与微调后模型即原模型lora-adapter聊天用于交互)
- [核心功能3生成微调后模型即原模型+LoRA Adapter的API用于批量生成并评测指标](#核心功能3生成微调后模型即原模型lora-adapter的api用于批量生成并评测指标)
- [KT微调速度性能测试用户侧](#kt微调速度性能测试用户侧)
- [端到端性能](#端到端性能)
- [显存/内存性能](#显存内存性能)
- [结论](#结论)
# KTransformers 微调 × LLaMA-Factory 集成 用户指南
**MadSys实验室, KVCache-AI团队, 趋境科技, LLaMA-Factory团队**
## 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的高效协同。
![image-20251011010558909](../assets/image-20251011010558909.png)
我们在 LLaMA-Factory 框架下,对比评测了 **HuggingFace**、**Unsloth**、**KTransformers** 三种后端的 LoRA 微调方案。结果显示KTransformers为超大规模的MoE模型671B等提供了**4090 级别**的唯一可行方案并在较小规模的MoE模型DeepSeek-14B上面也展现了更高的吞吐和更低的显存占用。
| Under LoRA (BF16)+[NekoQA-10K-风格化对话数据集](https://github.com/mindsRiverPonder/LLM-practice) | HuggingFace Backend | Unsloth Backend | KTransformers Backend |
| ------------------------------------------------------------ | ---------------------------------------- | ------------------------------------ | --------------------- |
| [14B-DeepSeekV2-Lite] LoRA Fine-tuning throughput | 303.58 token/s | 455.37 token/s | 530.38 token/s |
| [14B-DeepSeekV2-Lite] GPU Memory | 32.12 GB | 9.64 GB | 6.08 GB |
| [671B-DeepSeekV3] LoRA Fine-tuning throughput | <font color='red'>Too Huge to run</font> | <font color='red'>NOT SUPPORT</font> | 40.35 token/s |
| [671B-DeepSeekV3] GPU Memory多卡总和 | 理论值1400 GB † | <font color='red'>NOT SUPPORT</font> | 70 GB † |
**1400 GB** 为**理论显存**FP16 全参数常驻,非可运行配置);**70 GB** 为 KT 策略Attention 驻 GPU + MoE分层 offload下的**实测峰值**。
![按照模型划分的对比图_02](../assets/image-compare_model.png)
### 微调效果示例
#### 风格化对话测试CatGirl风格语气
数据集:[NekoQA-10K: 面向猫娘语言建模的对话数据集](https://zhuanlan.zhihu.com/p/1934983798233231689),目标是提升风格一致性与可辨识度。
下图对比了原始模型和微调模型的回答,可以看到微调后模型在语气和称谓上更加稳定地保持了猫娘风格(红框部分),验证了**风格迁移微调**的有效性。
![风格化数据集模型输出对比_01](../assets/风格化数据集模型输出对比_01.png)
#### Benchmark测试
数据集选取:
1采用了[西式翻译腔数据集](https://github.com/Benson114/Translational-Style-ChatLLM),该数据集要求模型按西式表达习惯进行夸张的翻译,有明确的定制化风格需求。
2采用了[AfriMed-QA](https://aclanthology.org/2025.acl-long.96/)数据集ACL-2025作为非洲地区医疗领域的专用数据集具有很强的场景定制特征包含选择题和简答题两种形式非常适合作为垂直领域微调的评估。针对单选和简答形式我们分别进行测试结果如下。
下表显示了微调前后模型在这些数据集上的指标变化。可以看到经过 LoRA 微调后,各项指标**大幅提升**,验证了微调的有效性:
| 西式翻译腔数据集 | BLEU-1 | BLEU-2 | BLEU-3 | BLEU-4 | ROUGE-1 | ROUGE-2 | ROUGE-L |
| ------------------------------- | --------- | --------- | --------- | --------- | --------- | --------- | --------- |
| V2-Lite原模型不LoRA微调 | 20.66 | 8.33 | 4.54 | 2.89 | 22.71 | 4.52 | 19.19 |
| **KT-LoRA微调DeepSeek-V2-Lite** | **35.41** | **22.44** | **15.42** | **11.18** | **42.03** | **18.38** | **33.10** |
| V3原模型不LoRA微调 | 8.49 | 3.34 | 1.62 | 0.96 | 15.91 | 2.55 | 10.07 |
| **KT-LoRA微调DeepSeek-V3** | **37.02** | **23.70** | **16.21** | **11.49** | **43.43** | **18.96** | **34.54** |
| AfriMed-QA数据集简答任务 | BLEU-1 | BLEU-2 | BLEU-3 | BLEU-4 | ROUGE-1 | ROUGE-2 | ROUGE-L |
| ------------------------------- | --------- | --------- | --------- | --------- | --------- | --------- | --------- |
| V2-Lite原模型不LoRA微调 | 13.58 | 11.12 | 9.10 | 7.23 | 22.48 | 7.81 | 11.73 |
| **KT-LoRA微调DeepSeek-V2-Lite** | **35.90** | **27.63** | **22.99** | **19.15** | **35.25** | **17.50** | **28.44** |
| V3原模型不LoRA微调 | 12.75 | 10.27 | 8.05 | 5.99 | 20.33 | 5.65 | 10.11 |
| **KT-LoRA微调DeepSeek-V3** | **42.42** | **34.12** | **28.95** | **24.54** | **41.97** | **22.37** | **33.28** |
| AfriMed-QA数据集单选任务 | Accuracy |
| ------------------------------- | ---------- |
| V2-Lite原模型不LoRA微调 | 0.0645 |
| **KT-LoRA微调DeepSeek-V2-Lite** | **0.4812** |
| V3原模型不LoRA微调 | 0.5833 |
| **KT-LoRA微调DeepSeek-V3** | **0.7930** |
从以上测试可以看出,即使是参数量巨大的 MoE 模型,通过 KTransformers 后端的高效微调,**也能在特定任务上快速达到理想效果**。
## Quick to Start
### 快速上手
本节将指导您如何安装环境并使用 **LLaMA-Factory + KTransformers** 完成微调和推理。我们将涵盖以下内容:
- 环境依赖的安装配置
- 使用 KTransformers 作为后端微调超大规模 MoE 模型
- 加载微调后的模型(原模型 + LoRA 适配器)进行对话/推理
- 批量推理微调模型并评测指标
### 环境安装
根据下面示例同时安装KTransformers和LLaMA-Factory环境这次为了简化KTransformers的安装流程我们特意封装了wheel包避免本地编译具体安装步骤如下注意对应好本地的python版本、torch版本、cuda版本和不同文件名的KTransformers包
```shell
# 1. 安装conda环境
conda create -n Kllama python=3.12 # choose from : [3.11, 3.12, 3.13]
conda install -y -c conda-forge libstdcxx-ng gcc_impl_linux-64
conda install -y -c nvidia/label/cuda-11.8.0 cuda-runtime
# 2. 安装llamafactory环境
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics]" --no-build-isolation
# 3. 安装对应torch和python版本的KTransformersCUDA版本可以跟whl命名的不一致从https://github.com/kvcache-ai/ktransformers/releases/tag/v0.4.1
pip install ktransformers-0.4.1+cu128torch27fancy-cp312-cp312-linux_x86_64.whl
# 4. 安装flash-attention参照python版本和torch版本从https://github.com/Dao-AILab/flash-attention/releases下载
pip install flash_attn-2.8.3+cu12torch2.7cxx11abiTRUE-cp312-cp312-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.git
pip 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](https://github.com/deepseek-ai/DeepSeek-V3/blob/main/inference/fp8_cast_bf16.py) 转换。
```yaml
### model
model_name_or_path: opensourcerelease/DeepSeek-V3-bf16
trust_remote_code: true
### method
stage: sft
do_train: true
finetuning_type: lora
lora_rank: 8
lora_target: all
### dataset
dataset: identity
template: deepseek
cutoff_len: 2048
max_samples: 100000
overwrite_cache: true
preprocessing_num_workers: 16
dataloader_num_workers: 4
### output
output_dir: saves/Kllama_deepseekV3
logging_steps: 10
save_steps: 500
plot_loss: true
overwrite_output_dir: true
save_only_model: false
report_to: none # choices: [none, wandb, tensorboard, swanlab, mlflow]
### train
per_device_train_batch_size: 1
gradient_accumulation_steps: 8
learning_rate: 1.0e-4
num_train_epochs: 3.0
lr_scheduler_type: cosine
warmup_ratio: 0.1
bf16: true
ddp_timeout: 180000000
resume_from_checkpoint: null
### ktransformers
use_kt: true # use KTransformers as LoRA sft backend
kt_optimize_rule: examples/kt_optimize_rules/DeepSeek-V3-Chat-sft-amx-multi-gpu.yaml
cpu_infer: 32
chunk_size: 8192
```
其中,`kt_optimize_rule`提供了大量默认的YAML文件来控制**KTransformers的放置策略**下面针对YAML文件名和功能对照特别说明也可以参考[ktransformers/optimize_rules](https://github.com/kvcache-ai/ktransformers/tree/main/ktransformers/optimize/optimize_rules)\*指通配符)
| 文件名字段 | 功能特征 |
| --------------------------------------------- | -------------------------------------------------- |
| DeepSeek-V2-Lite-Chat-\*或DeepSeek-V3-Chat-\* | 对应的不同模型 |
| \*-sft-\* | 微调所用的放置策略,其他为推理所用 |
| \*-amx-\* | 使用AMX指令集进行CPU运算其他为llamafile |
| \*-multi-gpu-X\* | 使用X张GPU进行模型并行显存共担X为空默认是2张 |
例如:`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修改方式如下
```yaml
- 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等配套内容以便后续加载。
![演示文稿1_01](../assets/演示文稿1_01.png)
### 核心功能2与微调后模型即原模型+LoRA Adapter聊天用于交互
运行命令:`llamafactory-cli chat examples/inference/deepseek3_lora_sft_kt.yaml`
调用KT微调的adapter (safetensor格式) 推理对话。
```yaml
model_name_or_path: opensourcerelease/DeepSeek-V3-bf16
adapter_name_or_path: saves/Kllama_deepseekV3
template: deepseek
infer_backend: ktransformers # choices: [huggingface, vllm, sglang, ktransformers]
trust_remote_code: true
use_kt: true # 调用KTransformers backend
kt_optimize_rule: examples/kt_optimize_rules/DeepSeek-V3-Chat-sft-amx-multi-gpu.yaml # 请选择和LoRA微调的时候保持一致的YAML文件
cpu_infer: 32
chunk_size: 8192
```
同时我们也支持GGUF格式的adapter进行推理如果您已经使用了上述LLaMA-Factory+KTransformers的微调方案就不用管啦~)。
safetensors 场景填**文件所在目录**GGUF 场景填**文件路径**,也就是说您需要把`adapter_name_or_path`选为具体的GGUF格式文件。
加载过程中适配了KT每层的命名和torch.save保存下来的常规命名的不同正常映射日志`Loaded adapter weight: XXX -> XXX`,展示如下。
![image-20250801165752484](../assets/image-20250801165752484.png)
### 核心功能3生成微调后模型即原模型+LoRA Adapter的API用于批量生成并评测指标
运行命令:`API_PORT=8000 llamafactory-cli api examples/inference/deepseek3_lora_sft_kt.yaml`
调用KT微调的adapter给出API其他API使用逻辑和llamafactory原生方式一致。
```yaml
model_name_or_path: opensourcerelease/DeepSeek-V3-bf16
adapter_name_or_path: saves/Kllama_deepseekV3
template: deepseek
infer_backend: ktransformers # choices: [huggingface, vllm, sglang, ktransformers]
trust_remote_code: true
use_kt: true # use KTransformers as LoRA sft backend to inference
kt_optimize_rule: examples/kt_optimize_rules/DeepSeek-V3-Chat-sft-amx-multi-gpu.yaml
cpu_infer: 32
chunk_size: 8192
```
## KT微调速度性能测试用户侧
### 端到端性能
**测试定义:**
`step_time`:一次优化步(包含 `gradient_accumulation_steps (GAS)` 次累积)的总时间,涵盖 **PyTorch 张量搬运 + Attention + MoE + 其他计算等**
`tokens_per_step = GAS × qlen``token/s = tokens_per_step / step_time`
**测试设置:**`GAS=16``qlen=512`(即每步 8192 tokensLoRA`r=8, alpha=32, dropout=0.1`使用AMX指令集优化GPU选取RTX 4090CPU选取Intel Xeon Platinum 8488C。
**实测结果:**
**DeepSeek-V3-671B**step_time = 203 s` → `token/s ≈ 8192 / 203 **≈ 40.35 token/s**
**DeepSeek-V2-Lite-14B**step_time = 36 s` → `token/s ≈ 8192 / 36 **≈ 227.6 token/s**
### 显存/内存性能
DeepSeek-V3671B61层其中58层有MoE占用显存多卡总量大约**70GB**、内存占用约1.2-1.3TB。
DeepSeek-V2-lite14B27层其中26层有MoE占用显存大约**5.5GB**、内存占用约150GB。
## 结论
通过开发 KTransformers LoRA微调并将其集成到 LLaMAFactory我们为希望高效训练与部署 MoE 大模型的用户提供了可行指南。KT 带来最尖端的优化(支持 DeepSeek、Qwen、Kimi 等,配合 AMX 加速 kernel同时通过 LoRA 微调在极低 GPU 显存下实现定制化。LLaMAFactory 则提供友好的统一界面,更广的用户支持。
该集成(类似 Unsloth 补丁所带来的提速)意味着即便是数百亿乃至万亿总参数量的 MoE 模型,也可在普通硬件上完成微调并低延迟部署。**显存节省、速度提升、易用性** 三者兼得。我们鼓励用户在下一次 MoE 项目中尝试 LLaMAFactory 的 KT 集成,并参考本文档进行操作。也欢迎提出任何问题和建议!