xFasterTransformer 项目介绍
xFasterTransformer 是一种在 X86 平台上对大型语言模型(LLM)进行极致优化的解决方案。这与在 GPU 平台上的 FasterTransformer 类似。项目的设计允许其在多插槽和多节点上分布式工作,从而支持在更大模型上的推理。此外,xFasterTransformer 提供了 C++ 和 Python 的 API,从高级接口到低级接口,便于集成和使用。
项目概述
随着大型语言模型(LLM)的快速发展,它们在许多人工智能场景中的应用越来越广泛。xFasterTransformer 针对主流且流行的 LLM 模型在 Xeon 平台上进行了优化。它充分利用 Xeon 硬件的能力,实现单插槽和多插槽/多节点上的 LLM 推理的高性能和高可扩展性。
xFasterTransformer 提供了一系列 API,包括 C++ 和 Python,供终端用户将其直接集成到他们自己的解决方案或服务中。同时,xFasterTransformer 还提供了丰富的示例代码,展示了如何使用这些 API,并提供了基准测试代码和脚本以展示性能。此外,它还提供了流行 LLM 模型的网络演示。
模型支持矩阵
模型名称 | 框架支持 | C++ 支持 | 分布式支持 |
---|---|---|---|
ChatGLM | 支持 | 支持 | 支持 |
ChatGLM2 | 支持 | 支持 | 支持 |
ChatGLM3 | 支持 | 支持 | 支持 |
GLM4 | 支持 | 支持 | 支持 |
Llama | 支持 | 支持 | 支持 |
Llama2 | 支持 | 支持 | 支持 |
Llama3 | 支持 | 支持 | 支持 |
Baichuan | 支持 | 支持 | 支持 |
Baichuan2 | 支持 | 支持 | 支持 |
QWen | 支持 | 支持 | 支持 |
QWen2 | 支持 | 支持 | 支持 |
SecLLM(YaRN-Llama) | 支持 | 支持 | 支持 |
Opt | 支持 | 支持 | 支持 |
Deepseek-coder | 支持 | 支持 | 支持 |
gemma | 支持 | 支持 | 支持 |
gemma-1.1 | 支持 | 支持 | 支持 |
codegemma | 支持 | 支持 | 支持 |
数据类型支持列表
xFasterTransformer 支持多种数据类型,以适应不同的性能需求:
- FP16
- BF16
- INT8
- W8A8
- INT4
- NF4
- BF16_FP16
- BF16_INT8
- BF16_W8A8
- BF16_INT4
- BF16_NF4
- W8A8_INT8
- W8A8_int4
- W8A8_NF4
文档资源
xFasterTransformer的文档和Wiki提供了以下资源:
- xFasterTransformer 的介绍。
- C++ 和 PyTorch 接口的全面 API 参考。
- xFasterTransformer 的实际 API 使用示例。
安装指南
xFasterTransformer 提供了多种安装方式:
从 PyPI 安装
pip install xfastertransformer
使用 Docker 安装
docker pull intel/xfastertransformer:latest
运行 Docker 命令(假设模型文件在 /data/
目录):
docker run -it \
--name xfastertransformer \
--privileged \
--shm-size=16g \
-v /data/:/data/ \
-e "http_proxy=$http_proxy" \
-e "https_proxy=$https_proxy" \
intel/xfastertransformer:latest
注意:如果在多排名模式下运行时出现"总线错误",请增大 --shm-size
。默认的 Docker 会限制共享内存大小为 64MB,而我们的实现使用了许多共享内存以实现更好的性能。
从源码构建
准备环境
手动方式:
- PyTorch v2.3 (使用 PyTorch API 时需要安装,但使用 C++ API 时不需要)。
pip install torch --index-url https://download.pytorch.org/whl/cpu
对于 GPU,xFT 需要从 torch==2.3.0+cpu.cxx11.abi 获取 ABI=1,因为 DPC++ 需要 ABI=1。
安装依赖库
请安装 libnuma 包:
- CentOS:
yum install libnuma-devel
- Ubuntu:
apt-get install libnuma-dev
如何构建
使用 'CMake' 进行构建:
# 构建 xFasterTransformer
git clone https://github.com/intel/xFasterTransformer.git xFasterTransformer
cd xFasterTransformer
git checkout <latest-tag>
# 确保安装 torch,当运行 Python 示例时
mkdir build && cd build
cmake ..
make -j
使用 python setup.py
:
# 构建 xFasterTransformer 库和 C++ 示例。
python setup.py build
# 安装 xFasterTransformer 到 pip 环境。
# 注意:安装前请运行 `python setup.py build`!
python setup.py install
模型准备
xFasterTransformer 支持与 Huggingface 不同的模型格式,但它与 FasterTransformer 的格式兼容。
- 首先下载 Huggingface 格式的模型。
- 然后,使用 xfastertransformer 的模型转换模块将模型转换成 xFasterTransformer 格式。如果未提供输出目录,转换后的模型将被放置到
${HF_DATASET_DIR}-xft
。
python -c 'import xfastertransformer as xft; xft.LlamaConvert().convert("${HF_DATASET_DIR}","${OUTPUT_DIR}")'
备注:由于可能存在模型文件与 transformers
版本之间的兼容性问题,请选择合适的 transformers
版本。
支持的模型转换列表:
- LlamaConvert
- YiConvert
- GemmaConvert
- ChatGLMConvert
- ChatGLM2Convert
- ChatGLM4Convert
- OPTConvert
- BaichuanConvert
- Baichuan2Convert
- QwenConvert
- Qwen2Convert
- DeepseekConvert
API 使用
有关更多详细信息,请参阅 API 文档和示例。
Python API (PyTorch)
首先,请安装依赖项。
- Python 依赖项
pip install -r requirements.txt
备注:由于可能存在模型文件与 transformers
版本之间的兼容性问题,请选择合适的 transformers
版本。
- oneCCL(用于多排名)
安装 oneCCL 并设置环境。请参阅 准备环境。
xFasterTransformer 的 Python API 类似于 transformers,还支持 transformers 的 streamer 来实现流式输出。示例中,我们使用 transformers 将输入提示编码为 token ids。
import xfastertransformer
from transformers import AutoTokenizer, TextStreamer
# 假设 Huggingface 模型目录是 `/data/chatglm-6b-hf` 和转换后的模型目录是 `/data/chatglm-6b-xft`。
MODEL_PATH="/data/chatglm-6b-xft"
TOKEN_PATH="/data/chatglm-6b-hf"
INPUT_PROMPT = "Once upon a time, there existed a little girl who liked to have adventures."
tokenizer = AutoTokenizer.from_pretrained(TOKEN_PATH, use_fast=False, padding_side="left", trust_remote_code=True)
streamer = TextStreamer(tokenizer, skip_special_tokens=True, skip_prompt=False)
input_ids = tokenizer(INPUT_PROMPT, return_tensors="pt", padding=False).input_ids
model = xfastertransformer.AutoModel.from_pretrained(MODEL_PATH, dtype="bf16")
generated_ids = model.generate(input_ids, max_length=200, streamer=streamer)
C++ API
可以使用 SentencePiece 来标记和解标记文本。
#include <vector>
#include <iostream>
#include "xfastertransformer.h"
// ChatGLM 提示 "Once upon a time, there existed a little girl who liked to have adventures." 的 token ids
std::vector<int> input(
{3393, 955, 104, 163, 6, 173, 9166, 104, 486, 2511, 172, 7599, 103, 127, 17163, 7, 130001, 130004});
// 假设转换后的模型目录是 `/data/chatglm-6b-xft`。
xft::AutoModel model("/data/chatglm-6b-xft", xft::DataType::bf16);
model.config(/*最大长度*/ 100, /*光束数*/ 1);
model.input(/*输入 token ids*/ input, /*批量大小*/ 1);
while (!model.isDone()) {
std::vector<int> nextIds = model.generate();
}
std::vector<int> result = model.finalize();
for (auto id : result) {
std::cout << id << " ";
}
std::cout << std::endl;
如何运行
建议预加载 libiomp5.so
以获得更好的性能。
- [推荐方式] 如果安装了 xfastertransformer's Python wheel 包,则运行
export $(python -c 'import xfastertransformer as xft; print(xft.get_env())')
。 libiomp5.so
文件在成功构建 xFasterTransformer 后会在3rdparty/mkl/lib
目录中。
单排名运行
FasterTransformer 将自动检查 MPI 环境,或者可以使用 SINGLE_INSTANCE=1
环境变量强制停用 MPI。
多排名运行
命令行
使用 MPI 在多排名模式下运行,请先安装 oneCCL。
-
- 如果您已从源码构建 xfastertransformer,oneCCL 在编译时已安装在 3rdparty 中。
source ./3rdparty/oneccl/build/_install/env/setvars.sh
- [推荐方式] 使用提供的脚本从源码构建。
cd 3rdparty sh prepare_oneccl.sh source ./oneccl/build/_install/env/setvars.sh
- 通过安装 Intel® oneAPI Base Toolkit 安装 oneCCL。(注意:推荐使用 2023.x 及以下版本。) 并通过以下命令设置环境:
source /opt/intel/oneapi/setvars.sh
- 如果您已从源码构建 xfastertransformer,oneCCL 在编译时已安装在 3rdparty 中。
-
本地示例。
# 或者手动设置 export LD_PRELOAD=libiomp5.so export $(python -c 'import xfastertransformer as xft; print(xft.get_env())') OMP_NUM_THREADS=48 mpirun \ -n 1 numactl -N 0 -m 0 ${RUN_WORKLOAD} : \ -n 1 numactl -N 1 -m 1 ${RUN_WORKLOAD}
示例代码
有关更多详细信息,请参考示例。
Python
model.rank
可以获取进程的排名,model.rank == 0
是主节点。
对于从节点,在加载模型后,只需要调用 model.generate()
。输入和生成配置将自动同步。
model = xfastertransformer.AutoModel.from_pretrained("/data/chatglm-6b-xft", dtype="bf16")
# 从节点
while True:
model.generate()
C++
model.getRank()
可以获取进程的排名,model.getRank() == 0
是主节点。
对于从节点,可以输入任何值到 model.config()
和 model.input
,因为主节点的值将被同步。
xft::AutoModel model("/data/chatglm-6b-xft", xft::DataType::bf16);
// 从节点
while (1) {
model.config();
std::vector<int> input_ids;
model.input(/*输入 token ids*/ input_ids, /*批量大小*/ 1);
while (!model.isDone()) {
model.generate();
}
}
网络演示
项目仓库中提供了一个基于 Gradio 的网络 Demo。现在支持 ChatGLM、ChatGLM2 和 Llama2 模型。
-
准备模型。
-
安装依赖项
pip install -r examples/web_demo/requirements.txt
注意:由于可能存在模型文件与
transformers
版本之间的兼容性问题,请选择合适的transformers
版本。 -
运行与模型对应的脚本。网络服务器启动后,打开输出的 URL 即可使用该演示。请指定模型和标记器目录路径以及数据类型。
transformers
的标记器用于文本编码和解码,因此${TOKEN_PATH}
是 Huggingface 模型目录。本演示还支持多排名。
# 推荐预加载 `libiomp5.so` 以获得更好的性能。
# 或者手动设置 LD_PRELOAD=libiomp5.so,`libiomp5.so` 文件在成功构建 xFasterTransformer 后会在 `3rdparty/mkl/lib` 目录中。
export $(python -c 'import xfastertransformer as xft; print(xft.get_env())')
python examples/web_demo/ChatGLM.py \
--dtype=bf16 \
--token_path=${TOKEN_PATH} \
--model_path=${MODEL_PATH}
服务支持
vLLM
已创建 vLLM 的一个分支,以集成 xFasterTransformer 后端,并保持与官方 vLLM 的大多数功能兼容。详情请参见此链接。
安装
pip install vllm-xft
注意:请不要同时在环境中安装 vllm-xft
和 vllm
。虽然包名不同,但它们实际上会相互覆盖。
OpenAI 兼容服务器
注意:需要预加载 libiomp5.so!
# 通过以下命令预加载 libiomp5.so 或者手动设置 LD_PRELOAD=libiomp5.so
export $(python -c 'import xfastertransformer as xft; print(xft.get_env())')
python -m vllm.entrypoints.openai.api_server \
--model ${MODEL_PATH} \
--tokenizer ${TOKEN_PATH} \
--dtype bf16 \
--kv-cache-dtype fp16 \
--served-model-name xft \
--port 8000 \
--trust-remote-code
对于多排名模式,请将 python -m vllm.entrypoints.slave
用作从节点,并让从节点的参数与主节点保持一致。
# 通过以下命令预加载 libiomp5.so 或者手动设置 LD_PRELOAD=libiomp5.so
export $(python -c 'import xfastertransformer as xft; print(xft.get_env())')
OMP_NUM_THREADS=48 mpirun \
-n 1 numactl --all -C 0-47 -m 0 \
python -m vllm.entrypoints.openai.api_server \
--model ${MODEL_PATH} \
--tokenizer ${TOKEN_PATH} \
--dtype bf16 \
--kv-cache-dtype fp16 \
--served-model-name xft \
--port 8000 \
--trust-remote-code \
: -n 1 numactl --all -C 48-95 -m 1 \
python -m vllm.entrypoints.slave \
--dtype bf16 \
--model ${MODEL_PATH} \
--kv-cache-dtype fp16
FastChat
xFasterTransformer 是 FastChat 的官方推理后端。有关更多详情,请参阅 FastChat 中的 xFasterTransformer 和 FastChat 的服务。
MLServer
提供了一个MLServer 的示例服务,它支持 REST 和 gRPC 接口以及自适应批处理功能,可以动态组合推理请求。
基准测试
提供了基准测试脚本,以快速获取模型推理性能。
- 准备模型。
- 安装依赖项,包括 oneCCL 和 Python 依赖项。
- 进入
benchmark
文件夹并运行run_benchmark.sh
。更多信息请参见基准测试 README。
注意!!!:系统和 CPU 配置可能不同。为了获得最佳性能,请根据测试环境的实际情况尝试修改 OMP_NUM_THREADS、数据类型和内存节点号(使用 numactl -H
查看内存节点)。
技术支持
- xFasterTransformer 邮箱: xft.maintainer@intel.com
- xFasterTransformer 微信
已接受论文
- ICLR'2024 针对有限/低资源设置的实用机器学习:大型语言模型在 CPU 上分布式推理性能优化
- ICML'2024 关于野外的基础模型:大型语言模型在 CPU 上的推理性能优化
- IEEE ICSESS 2024: 全方位方法用于大型语言模型推理
如果 xFT 对您的研究有帮助,请引用:
@article{he2024distributed,
title={Distributed Inference Performance Optimization for LLMs on CPUs},
author={He, Pujiang and Zhou, Shan and Li, Changqing and Huang, Wenhuan and Yu, Weifei and Wang, Duyi and Meng, Chen and Gui, Sheng},
journal={arXiv preprint arXiv:2407.00029},
year={2024}
}
和
@inproceedings{he2024inference,
title={Inference Performance Optimization for Large Language Models on CPUs},
author={He, Pujiang and Zhou, Shan and Huang, Wenhuan and Li, Changqing and Wang, Duyi and Guo, Bin and Meng, Chen and Gui, Sheng and Yu, Weifei and Xie, Yi},
booktitle={ICML 2024 Workshop on Foundation Models in the Wild}
}
常见问题解答
-
问:xFasterTransformer 可以运行在 Intel® Core™ CPU 上吗? 答:不可以。xFasterTransformer 需要支持 AMX 和 AVX512 指令集,而这些指令集在 Intel® Core™ CPU 上并不可用。
-
问:xFasterTransformer 可以在 Windows 系统上运行吗? 答:没有对 Windows 的原生支持,且所有的兼容性测试只在 Linux 上进行,所以推荐使用 Linux。
-
问:为什么在通过 oneAPI 安装最新版 oneCCL 后运行多排名模式时程序会卡住或退出,并出现错误? 答:请尝试将 oneAPI 降级到 2023.x 或以下版本,或使用提供的脚本从源码安装 oneCCL。
-
问:为什么在使用两个 CPU 插槽运行程序时的性能明显低于在单个 CPU 插槽上运行时? 答:这样运行会导致程序进行许多不必要的跨插槽通信,严重影响性能。如果需要进行跨插槽部署,考虑在每个插槽上运行一个排名的多排名模式。
-
问:为什么在单排名运行时性能正常,但使用 MPI 运行多个排名时性能非常慢且CPU利用率非常低? 答:这是因为通过 MPI 启动的程序读取了
OMP_NUM_THREADS=1
,无法正确从环境中获取合适的值。需要根据实际情况手动设置OMP_NUM_THREADS
的值。 -
问:为什么在转换已支持的模型时仍然出现错误? 答:尝试将
transformer
降级到合适的版本,比如requirements.txt
中指定的版本。这是因为不同版本的 Transformer 可能会更改某些变量的名称。