跳转到主要内容

提升CPU平台上大型语言模型推理性能。

项目描述

xFasterTransformer

英文 | 简体中文

xFasterTransformer 是针对 X86 平台上的大型语言模型(LLM)的非常优化的解决方案,类似于 GPU 平台上的 FasterTransformer。xFasterTransformer 能够在多个套接字和节点上进行分布式操作,以支持较大模型的推理。此外,它提供了从高级到低级接口的 C++ 和 Python API,使其易于采用和集成。

目录

模型概述

大型语言模型(LLMs)发展非常迅速,并且在许多人工智能场景中得到更广泛的应用。xFasterTransformer 是一种优化方案,用于在 Xeon 上使用主流和流行的 LLM 模型进行 LLM 推理。xFasterTransformer 充分利用 Xeon 平台的硬件能力,在单插槽和多插槽/多节点上实现 LLM 推理的高性能和高可扩展性。

xFasterTransformer 为最终用户提供了 C++ 和 Python 的一系列 API,以便直接将 xFasterTransformer 集成到自己的解决方案或服务中。还提供了各种示例代码,以演示使用方法。还提供了基准测试代码和脚本,供用户展示性能。还提供了流行 LLM 模型的 Web 示例。

模型支持矩阵

模型 框架 分布
PyTorch C++
ChatGLM
ChatGLM2
ChatGLM3
GLM4
Llama
Llama2
Llama3
百川
百川2
QWen
QWen2
SecLLM(YaRN-Llama)
优化
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

注意!!!:在多级别模式下运行时,如果发生 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,因此 xFT 需要 torch==2.3.0+cpu.cxx11.abi,在 torch-whl-list 中。

安装依赖库

请安装 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 的格式兼容。

  1. 首先下载 huggingface 格式的模型。

  2. 之后,使用 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(多级别)
    安装 oneCCL 并设置环境。请参考准备环境

xFasterTransformer 的 Python API 与 transformers 类似,也支持 transformers 的流式输出功能。在示例中,我们使用 transformers 对输入提示进行编码,生成 token ids。

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 轮辐包,请运行 export $(python -c 'import xfastertransformer as xft; print(xft.get_env())')
  • 成功从源代码构建 xFasterTransformer 后,libiomp5.so 文件将位于 3rdparty/mkl/lib 目录中。

单 rank

FasterTransformer 将自动检查 MPI 环境,或者您可以使用 SINGLE_INSTANCE=1 环境变量强制禁用 MPI。

多 ranks

命令行

使用 MPI 以多进程模式运行时,请首先安装 oneCCL。

  • 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
      
  • 以下是本地的一个示例。

    # 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。
对于 Slaves,在加载模型后,只需执行 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。
对于 Slaves,由于 Master 的值将被同步,因此可以向 model.config()model.input 输入任何值。

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} 表示 hugo 模型目录。此演示还支持多 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-xftvllm。尽管包名不同,但它们实际上会互相覆盖。

兼容 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 作为 slave,并保持 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 中的 xFasterTransformerFastChat 的服务 以获取更多详细信息。

MLServer

提供 MLServer 的一个示例服务,支持 REST 和 gRPC 接口以及自适应批处理功能,可以在运行时将推理请求分组在一起。

基准测试

提供基准测试脚本,以快速获取模型推理性能。

  • 准备模型.
  • 安装依赖项,包括 oneCCL 和 Python 依赖项。
  • 进入 benchmark 文件夹并运行 run_benchmark.sh。有关更多信息,请参阅基准 README

注意!!! 系统和CPU配置可能不同。为了获得最佳性能,请根据您的测试环境尝试修改 OMP_NUM_THREADS、数据类型和内存节点数(使用 numactl -H 检查内存节点)。

支持

已接受论文

如果xFasterTransformer对您的研究有所帮助,请引用

@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的不同版本可能会更改某些变量的名称。

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码发行

本版本没有提供源分布文件。请参阅生成分布存档的教程

构建的分布

xfastertransformer-1.8.1-py3-none-any.whl (39.5 MB 查看哈希值)

上传时间 Python 3

由以下支持