🎉 简介
KTransformers(发音为Quick Transformers)旨在通过高级内核优化和放置/并行策略来增强您的🤗 Transformers体验。KTransformers是一个灵活的、以Python为中心的框架,其核心设计理念是可扩展性。 通过一行代码实现和注入优化模块,用户可以获得与Transformers兼容的接口、符合OpenAI和Ollama标准的RESTful API,甚至是简化版的ChatGPT网页界面。
我们对KTransformers的愿景是成为一个灵活的平台,用于尝试创新的LLM推理优化。如果您需要任何其他功能,请告诉我们。
✨ 更新
- 2024年8月15日:更新了注入和多GPU的详细教程。
- 2024年8月14日:支持llamafile作为线性后端。
- 2024年8月12日:支持多GPU;支持新模型:mixtral 8*7B和8*22B;支持GPU上的q2k、q3k、q5k反量化。
- 2024年8月9日:支持原生Windows。
🔥 展示案例
仅需24GB显存的桌面电脑上运行GPT-4级别的本地VSCode Copilot
https://github.com/user-attachments/assets/0b9fa2da-66f0-48eb-b4b9-f0e1f06f8927
- 本地236B DeepSeek-Coder-V2: 运行其Q4_K_M版本仅需21GB显存和136GB内存,可在本地桌面机器上实现,在BigCodeBench测试中得分甚至超过GPT4-0613。
- 更快的速度: 通过MoE卸载和注入来自Llamafile和Marlin的高级内核,实现2K提示词预填充126 tokens/s和生成13.6 tokens/s的速度。
- VSCode集成: 封装成兼容OpenAI和Ollama的API,可无缝集成为Tabby和其他各种前端的后端。
https://github.com/user-attachments/assets/4c6a8a38-05aa-497d-8eb1-3a5b3918429c
更多高级功能即将推出,敬请期待!
🚀 快速开始
准备工作
一些准备工作:-
CUDA 12.1及以上版本,如果您还没有安装,可以从这里安装。
-
Linux-x86_64系统,安装gcc、g++和cmake
sudo apt-get update sudo apt-get install gcc g++ cmake ninja-build
-
我们建议使用Conda创建一个Python=3.11的虚拟环境来运行我们的程序。
conda create --name ktransformers python=3.11 conda activate ktransformers # 您可能需要先运行'conda init'并重新打开shell
-
确保已安装PyTorch、packaging和ninja
pip install torch packaging ninja
安装
-
使用Docker镜像,请参阅Docker文档
-
您可以使用Pypi安装(适用于Linux):
pip install ktransformers --no-build-isolation
对于Windows,我们准备了一个预编译的whl包ktransformers-0.1.1+cu125torch24avx2-cp311-cp311-win_amd64.whl,需要cuda-12.5、torch-2.4、python-3.11,更多预编译包正在制作中。
-
或者您可以下载源代码并编译:
-
初始化源代码
git clone https://github.com/kvcache-ai/ktransformers.git cd ktransformers git submodule init git submodule update
-
[可选] 如果您想运行网站,请在执行
bash install.sh
之前编译网站 -
编译并安装(适用于Linux)
bash install.sh
-
编译并安装(适用于Windows)
install.bat
-
本地聊天
我们提供了一个简单的命令行本地聊天Python脚本,您可以运行它进行测试。注意,这只是一个非常简单的测试工具,仅支持一轮对话,没有关于上一次输入的任何记忆。如果您想尝试模型的全部功能,可以前往RESTful API和Web UI。这里我们以DeepSeek-V2-Lite-Chat-GGUF模型为例。但我们也支持其他模型,您可以用任何想测试的其他模型替换它。
运行示例
# 从克隆的仓库根目录开始!
# 从克隆的仓库根目录开始!!
# 从克隆的仓库根目录开始!!!
# 从huggingface下载mzwing/DeepSeek-V2-Lite-Chat-GGUF
mkdir DeepSeek-V2-Lite-Chat-GGUF
cd DeepSeek-V2-Lite-Chat-GGUF
wget https://huggingface.co/mzwing/DeepSeek-V2-Lite-Chat-GGUF/resolve/main/DeepSeek-V2-Lite-Chat.Q4_K_M.gguf -O DeepSeek-V2-Lite-Chat.Q4_K_M.gguf
cd .. # 返回仓库根目录
# 开始本地聊天
python -m ktransformers.local_chat --model_path deepseek-ai/DeepSeek-V2-Lite-Chat --gguf_path ./DeepSeek-V2-Lite-Chat-GGUF
# 如果看到 "OSError: 无法连接到 'https://huggingface.co' 加载此文件",请尝试:
# GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/deepseek-ai/DeepSeek-V2-Lite
# python ktransformers.local_chat --model_path ./DeepSeek-V2-Lite --gguf_path ./DeepSeek-V2-Lite-Chat-GGUF
它具有以下参数:
--model_path
(必需):模型名称(如 "deepseek-ai/DeepSeek-V2-Lite-Chat",将自动从 Hugging Face 下载配置)。或者如果你已经有本地文件,可以直接使用该路径初始化模型。注意:目录中不需要 .safetensors 文件。我们只需要配置文件来构建模型和分词器。
--gguf_path
(必需):包含 GGUF 文件的目录路径,可以从 Hugging Face 下载(目前我们只支持 q4_k_m 和 q8_0,更多格式即将推出)。--optimize_rule_path
(除 Qwen2Moe 和 DeepSeek-V2 外必需):包含优化规则的 YAML 文件路径。ktransformers/optimize/optimize_rules 目录中预先编写了两个规则文件,用于优化 DeepSeek-V2 和 Qwen2-57B-A14,这两个是最先进的 MoE 模型。--max_new_tokens
:整数(默认为 1000)。生成的最大新 token 数。--cpu_infer
:整数(默认为 10)。用于推理的 CPU 数量。理想情况下应设置为(总核心数 - 2)。
支持的模型
模型名称 | 模型大小 | 显存 | 最小内存 | 推荐内存 |
---|---|---|---|---|
DeepSeek-V2-q4_k_m | 133G | 24G | 136G | 192G |
Qwen2-57B-A14B-Instruct-q4_k_m | 33G | 8G | 34G | 64G |
DeepSeek-V2-Lite-q4_k_m | 9.7G | 3G | 13G | 16G |
更多模型即将推出。请告诉我们你最感兴趣的模型。
请注意,在使用 DeepSeek 和 QWen 时,你需要遵守它们各自的模型许可。
点击显示如何运行其他示例
- Qwen2-57B
pip install flash_attn # 适用于 Qwen2
mkdir Qwen2-57B-GGUF && cd Qwen2-57B-GGUF
wget https://huggingface.co/Qwen/Qwen2-57B-A14B-Instruct-GGUF/resolve/main/qwen2-57b-a14b-instruct-q4_k_m.gguf?download=true -O qwen2-57b-a14b-instruct-q4_k_m.gguf
cd ..
python -m ktransformers.local_chat --model_name Qwen/Qwen2-57B-A14B-Instruct --gguf_path ./Qwen2-57B-GGUF
# 如果看到 "OSError: 无法连接到 'https://huggingface.co' 加载此文件",请尝试:
# GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/Qwen/Qwen2-57B-A14B-Instruct
# python ktransformers/local_chat.py --model_path ./Qwen2-57B-A14B-Instruct --gguf_path ./DeepSeek-V2-Lite-Chat-GGUF
- DeepseekV2
mkdir DeepSeek-V2-Chat-0628-GGUF && cd DeepSeek-V2-Chat-0628-GGUF
# 下载权重
wget https://huggingface.co/bartowski/DeepSeek-V2-Chat-0628-GGUF/resolve/main/DeepSeek-V2-Chat-0628-Q4_K_M/DeepSeek-V2-Chat-0628-Q4_K_M-00001-of-00004.gguf -o DeepSeek-V2-Chat-0628-Q4_K_M-00001-of-00004.gguf
wget https://huggingface.co/bartowski/DeepSeek-V2-Chat-0628-GGUF/resolve/main/DeepSeek-V2-Chat-0628-Q4_K_M/DeepSeek-V2-Chat-0628-Q4_K_M-00002-of-00004.gguf -o DeepSeek-V2-Chat-0628-Q4_K_M-00002-of-00004.gguf
wget https://huggingface.co/bartowski/DeepSeek-V2-Chat-0628-GGUF/resolve/main/DeepSeek-V2-Chat-0628-Q4_K_M/DeepSeek-V2-Chat-0628-Q4_K_M-00003-of-00004.gguf -o DeepSeek-V2-Chat-0628-Q4_K_M-00003-of-00004.gguf
wget https://huggingface.co/bartowski/DeepSeek-V2-Chat-0628-GGUF/resolve/main/DeepSeek-V2-Chat-0628-Q4_K_M/DeepSeek-V2-Chat-0628-Q4_K_M-00004-of-00004.gguf -o DeepSeek-V2-Chat-0628-Q4_K_M-00004-of-00004.gguf
cd ..
python -m ktransformers.local_chat --model_name deepseek-ai/DeepSeek-V2-Chat-0628 --gguf_path ./DeepSeek-V2-Chat-0628-GGUF
# 如果看到 "OSError: 无法连接到 'https://huggingface.co' 加载此文件",请尝试:
# GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/deepseek-ai/DeepSeek-V2-Chat-0628
# python -m ktransformers.local_chat --model_path ./DeepSeek-V2-Chat-0628 --gguf_path ./DeepSeek-V2-Chat-0628-GGUF
模型名称 | 权重下载链接 |
---|---|
Qwen2-57B | Qwen2-57B-A14B-gguf-Q4K-M |
DeepseekV2-coder | DeepSeek-Coder-V2-Instruct-gguf-Q4K-M |
DeepseekV2-chat | DeepSeek-V2-Chat-gguf-Q4K-M |
DeepseekV2-lite | DeepSeek-V2-Lite-Chat-GGUF-Q4K-M |
RESTful API 和 Web 界面
不启动网站:
ktransformers --model_path deepseek-ai/DeepSeek-V2-Lite-Chat --gguf_path /path/to/DeepSeek-V2-Lite-Chat-GGUF --port 10002
使用网站启动:
ktransformers --model_path deepseek-ai/DeepSeek-V2-Lite-Chat --gguf_path /path/to/DeepSeek-V2-Lite-Chat-GGUF --port 10002 --web True
如果你想使用transformers启动服务器,model_path应包含safetensors
ktransformers --type transformers --model_path /mnt/data/model/Qwen2-0.5B-Instruct --port 10002 --web True
通过网址 http://localhost:10002/web/index.html#/chat 访问网站:
关于RESTful API服务器的更多信息可以在这里找到。你也可以在这里找到一个与Tabby集成的示例。
📃 简要注入教程
KTransformers的核心是一个用户友好的、基于模板的注入框架。 这允许研究人员轻松地用优化变体替换原始的torch模块。它还简化了组合多个优化的过程,允许探索它们的协同效应。
鉴于vLLM已经是大规模部署优化的优秀框架,KTransformers特别专注于资源有限的本地部署。我们特别关注异构计算机会,如量化模型的GPU/CPU卸载。例如,我们支持高效的Llamafile和Marlin内核,分别用于CPU和GPU。更多详情可以在这里找到。
使用示例
要使用提供的内核,用户只需创建一个基于YAML的注入模板,并在使用Transformers模型之前添加对`optimize_and_load_gguf`的调用。with torch.device("meta"):
model = AutoModelForCausalLM.from_config(config, trust_remote_code=True)
optimize_and_load_gguf(model, optimize_rule_path, gguf_path, config)
...
generated = prefill_and_generate(model, tokenizer, input_tensor.cuda(), max_new_tokens=1000)
在这个例子中,首先在meta设备上初始化AutoModel以避免占用任何内存资源。然后,optimize_and_load_gguf
遍历模型的所有子模块,匹配YAML规则文件中指定的规则,并用指定的高级模块替换它们。
注入后,原始的generate
接口仍然可用,但我们还提供了一个兼容的prefill_and_generate
方法,它可以启用进一步的优化,如CUDAGraph,以提高生成速度。
如何自定义你的模型
这里给出了以DeepSeek-V2为例的详细注入和多GPU使用教程。
以下是一个YAML模板示例,用于将所有原始Linear模块替换为Marlin,这是一个先进的4位量化内核。
- match:
name: "^model\\.layers\\..*$" # 正则表达式
class: torch.nn.Linear # 仅匹配同时匹配名称和类的模块
replace:
class: ktransformers.operators.linear.KTransformerLinear # 优化的量化数据类型内核
device: "cpu" # 初始化时加载此模块的设备
kwargs:
generate_device: "cuda"
generate_linear_type: "QuantizedLinearMarlin"
YAML文件中的每条规则都有两部分:match
和replace
。match
部分指定应该被替换的模块,replace
部分指定要注入模型的模块以及初始化关键字。
你可以在ktransformers/optimize/optimize_rules目录中找到用于优化DeepSeek-V2和Qwen2-57B-A14(两个最先进的MoE模型)的示例规则模板。这些模板用于驱动local_chat.py
演示。
如果你对我们的设计原则和注入框架的实现感兴趣,请参考设计文档。
致谢和贡献者
KTransformer的开发基于Transformers提供的灵活多变的框架。我们还受益于先进的内核,如GGUF/GGML、Llamafile和Marlin。我们计划通过上游我们的修改来回馈社区。
KTransformer由来自清华大学MADSys小组的贡献者和Approaching.AI的成员积极维护和开发。我们欢迎新的贡献者加入我们,使KTransformer更快、更易用。