提升大型语言模型在CPU平台上的推理性能。
项目描述
xFasterTransformer
xFasterTransformer是针对X86平台上的大型语言模型(LLM)的优化解决方案,类似于GPU平台上的FasterTransformer。xFasterTransformer能够在多个插槽和节点上以分布式模式运行,以支持更大模型的推理。此外,它提供了从高级到低级的C++和Python API,使其易于采用和集成。
目录
模型概述
大型语言模型(LLM)发展非常迅速,在许多AI场景中得到更广泛的应用。xFasterTransformer是针对Xeon平台上主流和流行LLM模型进行推理的优化解决方案。xFasterTransformer充分利用了Xeon平台的硬件能力,在单插槽和多个插槽/多个节点上实现了LLM推理的高性能和高可扩展性。
xFasterTransformer为最终用户提供了一系列API,包括C++和Python,以便用户能够直接将其集成到自己的解决方案或服务中。同时,还提供了多种示例代码以展示使用方法。还提供了基准代码和脚本,供用户展示性能。还提供了流行LLM模型的Web演示。
模型支持矩阵
模型 | 框架 | 分布 | |
---|---|---|---|
PyTorch | C++ | ||
ChatGLM | ✔ | ✔ | ✔ |
ChatGLM2 | ✔ | ✔ | ✔ |
ChatGLM3 | ✔ | ✔ | ✔ |
GLM4 | ✔ | ✔ | ✔ |
Llama | ✔ | ✔ | ✔ |
Llama2 | ✔ | ✔ | ✔ |
Llama3 | ✔ | ✔ | ✔ |
百川 | ✔ | ✔ | ✔ |
百川2 | ✔ | ✔ | ✔ |
QWen | ✔ | ✔ | ✔ |
QWen2 | ✔ | ✔ | ✔ |
SecLLM(YaRN-Llama) | ✔ | ✔ | ✔ |
Opt | ✔ | ✔ | ✔ |
Deepseek-coder | ✔ | ✔ | ✔ |
gemma | ✔ | ✔ | ✔ |
gemma-1.1 | ✔ | ✔ | ✔ |
codegemma | ✔ | ✔ | ✔ |
支持的数据类型列表
- 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在C++和PyTorch中的实际API使用示例。
安装
从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
注意!!!:如果在多rank模式下运行时出现bus error,请增大--shm-size
。默认docker将共享内存大小限制为64MB,而我们的实现使用多个共享内存以实现更好的性能。
从源码构建
准备环境
手动
-
PyTorch v2.3(当使用PyTorch API时是必需的,但使用C++ API时不需要。)
pip install torch --index-url https://download.pytorch.org/whl/cpu
-
对于GPU,由于DPC++需要ABI=1,因此xFastTransformer需要从torch==2.3.0+cpu.cxx11.abi在torch-whl-list中,因为需要ABI=1。
安装依赖库
请安装libnuma包
- CentOS: yum install libnuma-devel
- Ubuntu: apt-get install libnuma-dev
如何构建
- 使用'CMake'
# Build xFasterTransformer git clone https://github.com/intel/xFasterTransformer.git xFasterTransformer cd xFasterTransformer git checkout <latest-tag> # Please make sure torch is installed when run python example mkdir build && cd build cmake .. make -j
- 使用
python setup.py
# Build xFasterTransformer library and C++ example. python setup.py build # Install xFasterTransformer into pip environment. # Notice: Run `python setup.py build` before installation! 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}")'
PS:由于模型文件和
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
PS:由于模型文件和transformers
版本之间可能存在潜在的兼容性问题,请选择合适的transformers
版本。 - oneCCL(用于多rank)
安装oneCCL并设置环境。请参阅准备环境。
xFasterTransformer的Python API与transformers类似,也支持transformers的流式输出。在示例中,我们使用transformers将输入提示编码为token id。
import xfastertransformer
from transformers import AutoTokenizer, TextStreamer
# Assume huggingface model dir is `/data/chatglm-6b-hf` and converted model dir is `/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 token ids for prompt "Once upon a time, there existed a little girl who liked to have adventures."
std::vector<int> input(
{3393, 955, 104, 163, 6, 173, 9166, 104, 486, 2511, 172, 7599, 103, 127, 17163, 7, 130001, 130004});
// Assume converted model dir is `/data/chatglm-6b-xft`.
xft::AutoModel model("/data/chatglm-6b-xft", xft::DataType::bf16);
model.config(/*max length*/ 100, /*num beams*/ 1);
model.input(/*input token ids*/ input, /*batch size*/ 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的python wheel包,请运行
export $(python -c 'import xfastertransformer as xft; print(xft.get_env())')
。 - 成功从源代码构建xFasterTransformer后,
libiomp5.so
文件将位于3rdparty/mkl/lib
目录中。
单级
更快的Transformer将自动检查MPI环境,或者您可以使用SINGLE_INSTANCE=1
环境变量强制禁用MPI。
多级
命令行
使用MPI以多rank模式运行,请首先安装oneCCL。
-
- 如果您已从源代码构建了xfastertransformer,则编译时oneCCL将安装在第3方。
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将安装在第3方。
-
以下是一个本地示例。
# or export LD_PRELOAD=libiomp5.so manually 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
可以获取进程的rank,model.rank == 0
是Master。
对于从属进程,加载模型后,唯一需要做的事情是model.generate()
。输入和生成配置将自动同步。
model = xfastertransformer.AutoModel.from_pretrained("/data/chatglm-6b-xft", dtype="bf16")
# Slave
while True:
model.generate()
C++
model.getRank()
可以获取进程的rank,model.getRank() == 0
是Master。
对于从属进程,可以将任何值输入到model.config()
和model.input
,因为Master的值将被同步。
xft::AutoModel model("/data/chatglm-6b-xft", xft::DataType::bf16);
// Slave
while (1) {
model.config();
std::vector<int> input_ids;
model.input(/*input token ids*/ input_ids, /*batch size*/ 1);
while (!model.isDone()) {
model.generate();
}
}
Web演示
在repo中提供了一个基于Gradio的Web演示,现在支持ChatGLM、ChatGLM2和Llama2模型。
- 准备模型.
- 安装依赖项
pip install -r examples/web_demo/requirements.txt
PS:由于模型文件和transformers
版本之间可能存在潜在的兼容性问题,请选择合适的transformers
版本。 - 运行对应于模型的脚本。在Web服务器启动后,在浏览器中打开输出URL以使用演示。请指定模型和分词器目录的路径以及数据类型。
transformer
的分词器用于编码和解码文本,因此${TOKEN_PATH}
表示huggingface模型目录。此演示也支持多rank。
# Recommend preloading `libiomp5.so` to get a better performance.
# or LD_PRELOAD=libiomp5.so manually, `libiomp5.so` file will be in `3rdparty/mkl/lib` directory after build xFasterTransformer.
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!
# Preload libiomp5.so by following cmd or LD_PRELOAD=libiomp5.so manually
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
对于多rank模式,请使用python -m vllm.entrypoints.slave
作为从属进程,并确保从属进程的参数与Master一致。
# Preload libiomp5.so by following cmd or LD_PRELOAD=libiomp5.so manually
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
提供了一个支持REST和gRPC接口以及自适应批处理功能的MLServer示例服务,该功能可以在运行时将推理请求分组在一起。
基准测试
提供了基准测试脚本,以便快速获取模型推理性能。
注意!!!:系统和CPU配置可能不同。为了获得最佳性能,请根据您的测试环境尝试修改OMP_NUM_THREADS、数据类型和内存节点数量(使用numactl -H
检查内存节点)。
支持
- xFasterTransformer电子邮件: xft.maintainer@intel.com
- xFasterTransformer 微信
接受论文
- ICLR'2024在有限的/低资源设置中的实际ML: LLMs在CPU上的分布式推理性能优化
- ICML'2024野外的基础模型: LLMs在CPU上的推理性能优化
- IEEE ICSESS 2024:大型语言模型推理的一体化方法
如果xFastTransformer对您的研究有用,请引用
@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上运行?
A: No. xFasterTransformer需要支持AMX和AVX512指令集,这些指令集在Intel® Core™ CPU上不可用。 -
Q: xFasterTransformer能在Windows系统上运行吗?
A:目前没有对Windows的原生支持,所有兼容性测试都是在Linux上进行的,因此建议使用Linux。 -
Q: 在通过oneAPI安装最新版本的oneCCL后,为什么在多级模式运行程序时程序会冻结或出现错误?
A:请尝试将oneAPI降级到2023.x版本或以下,或者使用提供的脚本从源代码安装oneCCL。 -
Q:为什么使用两个CPU插槽运行程序的性能远低于在单个CPU插槽上运行?
A:以这种方式运行会导致程序进行大量不必要的跨插槽通信,从而严重影响性能。如果需要进行跨插槽部署,请考虑在每个插槽上运行一个级别多级模式。 -
Q:在单级别运行时性能正常,但为什么在使用MPI运行多个级别时性能非常慢且CPU利用率非常低?
A:这是因为通过MPI启动的程序读取OMP_NUM_THREADS=1
,无法从环境中正确检索适当的值。需要根据实际情况手动设置OMP_NUM_THREADS
的值。 -
Q:为什么在转换已支持的模型时仍然遇到错误?
A:尝试将transformer
降级到适当的版本,例如requirements.txt
中指定的版本。这是因为不同的Transformer版本可能会更改某些变量的名称。
项目详情
xfastertransformer_gnr-1.8.1-py3-none-any.whl的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | e93376b699277e1dee6c4e3740cbda3bc1e6008cd8209f92093212cc43e083c5 |
|
MD5 | 86d8d4061fd866c06c1d3e41b65c08a0 |
|
BLAKE2b-256 | 3cbf4e61b1c8f0533f66f51a95efbea00a26c57b0700485916fe1553ab63c245 |