FastChat 集成 xFasterTransformer:在 Intel CPU 上加速大模型推理的完整实践
【免费下载链接】FastChatAn open platform for training, serving, and evaluating large language models. Release repo for Vicuna and Chatbot Arena.项目地址: https://gitcode.com/GitHub_Trending/fa/FastChat
本文围绕 FastChat 仓库中的 xFasterTransformer 集成方案展开:如何安装 Intel 的 xFasterTransformer 推理框架、准备模型权重、配置--enable-xft/--xft-max-seq-len/--xft-dtype三个核心参数,并在 CLI 与 model worker 两种形态下(含 numactl 与 MPI 多路并行策略)跑通 CPU 推理。读完本文,你将掌握 FastChat 中 xFT 推理链路从参数解析到底层generate_stream_xft流式生成的完整调用链,以及多插槽服务器上的 NUMA 调优方法。
一、xFasterTransformer 是什么,FastChat 为什么集成它
xFasterTransformer 是 Intel 推出的针对 CPU 优化的 Transformer 推理框架。FastChat 将其定制集成进来,核心目标只有一个:在 Intel CPU 上提供更快的推理速度。对于没有 GPU、或希望在 CPU 集群上部署 Vicuna / ChatGLM 等模型的团队,这是一条比纯 PyTorch CPU 推理更快的路径。
FastChat 中的集成由三块代码构成,后文会逐一展开:
- fastchat/modules/xfastertransformer.py:定义
XftConfig配置数据类与load_xft_model模型加载入口; - fastchat/model/model_xfastertransformer.py:实现
generate_stream_xft流式生成函数; - fastchat/model/model_adapter.py:注册
--enable-xft等命令行参数,并负责模型加载与生成函数的分发。
二、安装 xFasterTransformer
xFasterTransformer 是一个独立的 pip 包,不在 FastChat 的默认依赖中,需要单独安装:
pip install xfastertransformer安装细节(支持的 CPU 指令集、平台要求等)请参考 xFasterTransformer 官方文档的安装章节。安装完成后,FastChat 侧无需任何额外配置,只要启动时加上--enable-xft即可启用。
源码层面的印证在 fastchat/modules/xfastertransformer.py 的load_xft_model中:加载时会先import xfastertransformer,若导入失败会打印Error: Failed to load xFasterTransformer.并直接sys.exit(-1)退出,这正是未安装该包时的表现。
三、准备模型权重
xFasterTransformer 需要专用格式转换后的权重,不能直接使用 Hugging Face 原始目录。以 ChatGLM 为例,转换命令为:
python ./tools/chatglm_convert.py -i ${HF_DATASET_DIR} -o ${OUTPUT_DIR}其中-i是 Hugging Face 模型目录,-o是转换后的输出目录;其他模型的转换脚本类似,详见 xFasterTransformer 官方文档的 "Prepare Model" 章节。后续所有 FastChat 命令中的--model-path都应指向转换后的目录(例如chatglm2_6b_cpu)。
四、三个核心参数详解
FastChat 暴露了三个 xFT 专用参数,其定义统一位于 fastchat/model/model_adapter.py 的add_model_args中,因此 CLI 和 model worker 均可使用:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
--enable-xft | flag | False | 启用 xFasterTransformer 推理框架。未指定时xft_config为None,走普通 PyTorch 加载路径 |
--xft-max-seq-len | int | 4096 | 模型可处理的最大 token 长度,包含输入 token 长度。对应XftConfig.max_seq_len |
--xft-dtype | str | None | xFT 计算用的数据类型,可选fp16、bf16、int8、bf16_fp16、bf16_int8。混合类型如bf16_fp16表示首 token 用 bfloat16、后续 token 用 float16 |
--xft-dtype未指定时的行为值得注意:fastchat/modules/xfastertransformer.py 中,若data_type为空则回退为bf16_fp16——即参数帮助文本所述"CPU 上首个 token 用 bfloat16、后续 token 用 float16"的默认策略。各数据类型在不同 CPU 平台上的支持情况,请参照 xFasterTransformer 官方的 Data Type Support 说明。
XftConfig的完整默认值(fastchat/modules/xfastertransformer.py)还包括beam_width=1、num_return_sequences=1、padding=True、early_stopping=False等,这些字段最终会透传给底层生成接口(见第六节)。
五、CLI 方式启动:单核、numactl 与 MPI 三种策略
5.1 最简启动(fp16)
# 使用 float16 在全部 CPU 上运行推理 python3 -m fastchat.serve.cli \ --model-path /path/to/models \ --enable-xft \ --xft-dtype fp165.2 多插槽服务器上使用 numactl
在多路(multi-socket)服务器上,将进程绑定到单个 NUMA 节点并本地分配内存可以减少跨插槽内存访问,官方推荐的命令如下:
# 绑定 numanode 0,数据类型 bf16_fp16(首 token 用 bfloat16,其余 token 用 float16) numactl -N 0 --localalloc \ python3 -m fastchat.serve.cli \ --model-path /path/to/models/chatglm2_6b_cpu/ \ --enable-xft \ --xft-dtype bf16_fp165.3 使用 MPI 在两个插槽上并行推理
xFasterTransformer 支持通过 MPI 把模型切分到两个 socket 上并行计算。官方文档给出的双路启动方式(冒号分隔两组进程):
# 在 numanode 0 和 1 上各启动一个进程,数据类型 bf16_fp16 OMP_NUM_THREADS=$CORE_NUM_PER_SOCKET LD_PRELOAD=libiomp5.so mpirun \ -n 1 numactl -N 0 --localalloc \ python -m fastchat.serve.cli \ --model-path /path/to/models/chatglm2_6b_cpu/ \ --enable-xft \ --xft-dtype bf16_fp16 : \ -n 1 numactl -N 1 --localalloc \ python -m fastchat.serve.cli \ --model-path /path/to/models/chatglm2_6b_cpu/ \ --enable-xft \ --xft-dtype bf16_fp16其中OMP_NUM_THREADS需设置为每插槽的物理核心数,LD_PRELOAD=libiomp5.so用于统一 OpenMP 运行库。MPI 模式在代码中确有对应处理:load_xft_model 在model.model.rank > 0时会让非 rank-0 进程进入while True: model.model.generate()循环挂起等待——因为只有 rank 0 负责向 FastChat 返回 token,其余进程只参与分布式前向计算。
一个容易踩的坑:xFasterTransformer 目前仅支持 CPU。在 fastchat/serve/cli.py 与 fastchat/serve/model_worker.py 中都可以看到,启用--enable-xft后若--device不是cpu,FastChat 会打印xFasterTransformer now is only support CPUs. Reset device to CPU并自动把设备重置为 CPU,无需手动指定。
六、源码级原理:xFT 在 FastChat 中的完整调用链
结合仓库源码,可以还原--enable-xft之后的完整执行路径:
1. 参数解析与配置构建。CLI 入口 fastchat/serve/cli.py 检测到args.enable_xft后,构造XftConfig(max_seq_len=args.xft_max_seq_len, data_type=args.xft_dtype)并作为xft_config传入chat_loop。
2. 模型加载分派。load_model 中,xFT 分支优先于常规 HuggingFace 加载路径:
elif xft_config: model, tokenizer = load_xft_model(model_path, xft_config) return model, tokenizerload_xft_model 内部做三件事:用 Hugging FaceAutoTokenizer(padding_side="left"、trust_remote_code=True)加载分词器;调用xfastertransformer.AutoModel.from_pretrained(model_path, dtype=data_type)加载模型;最后把二者封装为XftModel。
3. 生成函数路由。get_generate_stream_function 通过模型类型字符串做分派:
model_type = str(type(model)).lower() is_xft = "xft" in model_type ... elif is_xft: return generate_stream_xft即只要加载出的模型对象类型名包含xft,推理就自动切换到 xFT 专用的流式生成器。
4. 流式生成实现。generate_stream_xft 的工作方式与普通 PyTorch 路径明显不同:
- 它用
tokenizer(prompt, padding=model.config.padding)直接得到input_ids,并以max_length = max_new_tokens + input_echo_len作为生成长度上限——这与--xft-max-seq-len的语义呼应:最大序列长度包含输入 token; - 采样参数中,
repetition_penalty被映射为 xFT 的length_penalty,num_beams/num_return_sequences/early_stopping均取自XftConfig; - 生成在独立
Thread中调用model.model.generate,配合 transformers 的TextIteratorStreamer实现逐 token 流式输出;源码中temperature与top_p目前以注释形式占位(unused now, and placehold for future),意味着该路径暂不走这些采样参数; - 每个 yield 的 chunk 都携带
prompt_tokens/completion_tokens/total_tokens的 usage 统计,结束时根据是否达到max_new_tokens返回finish_reason为length或stop。
七、以 model worker 形式部署
在 FastChat 的 controller/worker 架构下,xFasterTransformer 同样通过三个参数启用,启动命令与 CLI 完全对称:
# 默认配置加载模型(最大序列长度 4096) python3 -m fastchat.serve.model_worker \ --model-path /path/to/models \ --enable-xft \ --xft-dtype bf16_fp16多插槽服务器上同样建议配合 numactl:
# 绑定 numanode 0,数据类型 bf16_fp16 numactl -N 0 --localalloc python3 -m fastchat.serve.model_worker \ --model-path /path/to/models \ --enable-xft \ --xft-dtype bf16_fp16MPI 双插槽版本:
# 在 numanode 0 和 1 上各运行一个 worker,数据类型 bf16_fp16 OMP_NUM_THREADS=$CORE_NUM_PER_SOCKET LD_PRELOAD=libiomp5.so mpirun \ -n 1 numactl -N 0 --localalloc python -m fastchat.serve.model_worker \ --model-path /path/to/models \ --enable-xft \ --xft-dtype bf16_fp16 : \ -n 1 numactl -N 1 --localalloc python -m fastchat.serve.model_worker \ --model-path /path/to/models \ --enable-xft \ --xft-dtype bf16_fp16实现上,fastchat/serve/model_worker.py 的create_model_worker与 CLI 使用完全相同的XftConfig构建逻辑,再把xft_config透传给ModelWorker构造函数(model_worker.py);多模型场景下 fastchat/serve/multi_model_worker.py 也有相同的 xFT 分支。
八、实践要点小结
- 平台前提:xFasterTransformer 面向 Intel CPU(AVX512/AMX 等指令集收益最大),设备固定为 CPU,FastChat 会自动纠正非 CPU 的
--device; - 权重必须转换:先用 xFasterTransformer 的 convert 脚本把 HF 权重转为专用格式,
--model-path指向转换结果; - 参数语义:
--xft-max-seq-len(默认 4096)是含输入在内的总长上限;--xft-dtype缺省回退为bf16_fp16; - NUMA 调优:单路用
numactl -N <node> --localalloc,双路用mpirun冒号分隔两组进程并预设OMP_NUM_THREADS; - 采样限制:从 generate_stream_xft 的占位注释看,该路径当前未启用
temperature/top_p,主要受repetition_penalty(映射为 length_penalty)与XftConfig中的 beam 相关字段控制,选型时需注意与普通 CPU 推理路径的行为差异。
【免费下载链接】FastChatAn open platform for training, serving, and evaluating large language models. Release repo for Vicuna and Chatbot Arena.项目地址: https://gitcode.com/GitHub_Trending/fa/FastChat
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考