使用基于英特尔CPU的c8i实例部署ChatGLM2-6B

更新时间:
复制 MD 格式
一键部署
我的部署

本文以搭建AI对话机器人为例,介绍如何使用基于英特尔CPUc8i实例,基于xFasterTransformer框架单机部署ChatGLM2-6B语言模型。

背景信息

ChatGLM2-6B中英对话大模型

ChatGLM2-6B是开源中英双语对话模型ChatGLM-6B的第二代版本,在保留了初代模型对话流畅、部署门槛较低等众多优秀特性的基础上,ChatGLM2-6B具有更强大的性能、更长的上下文、更高效的推理等特性。

阿里云第八代Intel CPU实例

阿里云八代实例(g8i/c8i/r8i/hfc8i/hfg8i/hfr8i)采用Intel® Xeon® Emerald Rapids或者Intel® Xeon® Sapphire Rapids,该实例支持使用新的AMX(Advanced Matrix Extensions)指令来加速AI任务。相比于上一代实例,八代实例在Intel® AMX的加持下,推理和训练性能大幅提升。

xFasterTransformer

xFasterTransformer是由Intel官方开源的推理框架,为大语言模型(LLM)在CPU X86平台上的部署提供了一种深度优化的解决方案,支持多CPU节点之间的分布式部署方案,使得超大模型在CPU上的部署成为可能。此外,xFasterTransformer提供了C++和Python两种API接口,涵盖了从上层到底层的接口调用,易于用户使用并将xFasterTransformer集成到自有业务框架中。xFasterTransformer目前支持的模型如下:

Models

Framework

Distribution

Pytorch

C++

ChatGLM

ChatGLM2

ChatGLM3

Llama

Llama2

Baichuan

QWen

SecLLM(YaRN-Llama)

Opt

xFasterTransformer支持多种低精度数据类型来加速模型部署。除单一精度以外,还支持混合精度,以更充分地利用CPU的计算资源和带宽资源,从而提高大语言模型的推理速度。以下是xFasterTransformer支持的单一精度和混合精度类型:

  • FP16

  • BF16

  • INT8

  • W8A8

  • INT4

  • NF4

  • BF16_FP16

  • BF16_INT8

  • BF16_W8A8

  • BF16_INT4

  • BF16_NF4

  • W8A8_INT8

  • W8A8_int4

  • W8A8_NF4

重要
  • 阿里云不对第三方模型“ChatGLM2-6B”的合法性、安全性、准确性进行任何保证,阿里云不对由此引发的任何损害承担责任。

  • ChatGLM2-6B的代码依照Apache-2.0协议开源,ChatGLM2-6B模型权重的使用遵循Model License。您应自觉遵守第三方模型的用户协议、使用规范和相关法律法规,并就使用第三方模型的合法性、合规性自行承担相关责任。

  • ChatGLM2-6B模型权重对学术研究完全开放,免费商用请需填写商业授权申请。本文所示的模型下载仅作为演示,阿里云不对由此引发的任何损害承担责任。

创建ECS实例

  1. 前往实例创建页

  2. 按照界面提示完成参数配置,创建一台ECS实例。

    需要注意的参数如下,其他参数的配置,请参见自定义购买实例

    • 实例:ChatGLM2-6B大概需要16 GiB内存,为了保证模型运行的稳定,实例规格至少需要选择ecs.c8i.4xlarge(32 GiB内存)。

    • 镜像:Alibaba Cloud Linux 3.2104 LTS 64位。

    • 公网IP:选中分配公网IPv4地址,带宽计费模式选择按使用流量,带宽峰值设置为100 Mbps。以加快模型下载速度。

    • 系统盘:ChatGLM2-6B模型数据下载、转换和运行过程中需要占用38 GiB的存储空间,为了保证模型顺利运行,建议系统盘设置为100 GiB。

  3. 添加安全组规则。

    ECS实例安全组的入方向添加安全组规则并放行22端口和7860端口(22端口用于访问SSH服务,7860端口用于访问WebUI页面)。具体操作,请参见添加安全组规则

安装模型所需容器环境

  1. 远程连接该ECS实例。

    具体操作,请参见使用Workbench登录Linux实例

  2. 安装并启动Docker。

    具体操作,请参见Alibaba Cloud Linux 3实例中安装Docker

  3. 获取并运行Intel xFasterTransformer容器。

    sudo docker pull intel/xfastertransformer:1.3.1
    sudo docker run -it --name xFT -h xFT --privileged --shm-size=16g --network host -v /mnt:/mnt -w /mnt/xFasterTransformer intel/xfastertransformer:1.3.1

    当出现类似如下信息时,表示已获取并成功运行xFasterTransformer容器。

    [ecs-user@iZ2zeb16jjz xxx ~]$ sudo docker pull intel/xfastertransformer:1.3.1
    1.3.1: Pulling from intel/xfastertransformer
    df2fac849a45: Pull complete
    3bb6bedb0d39: Pull complete
    835b24f77466: Pull complete
    6b0e454047b1: Pull complete
    9e44a44e2c9e: Pull complete
    1bf21f422f88: Pull complete
    afd79455bacf: Pull complete
    43108065c9e6: Pull complete
    6afbdced9f70: Pull complete
    af1f8308af03: Pull complete
    315d558533af: Pull complete
    15d21a253a14: Pull complete
    b4a79fb1620e: Pull complete
    9e4b3e35e158: Pull complete
    afb69a4ac294: Pull complete
    3c62864266ba: Pull complete
    923b0f5c2911: Pull complete
    913a43a29dc5: Pull complete
    e239b5ababe1: Pull complete
    Digest: sha256:ba47ef632d26055255a9b75e614fb92dbfa6874355e1f2axxx
    Status: Downloaded newer image for intel/xfastertransformer:1.3.1
    docker.io/intel/xfastertransformer:1.3.1
    [ecs-user@iZ2zeb16jjzaoc xxx ~]$ sudo docker run -it --name xFT -h xFT --privileged --shm-size=16g --network host -v /mnt:/mnt -w /mnt/xFasterTransformer intel/xfastertransformer:1.3.1
    重要

    后续操作都需要在容器中运行,如果退出了容器,可以通过以下命令启动并再次进入容器的Shell环境。

    sudo docker start xFT
    sudo docker exec -it xFT bash
  4. (可选)更新xFasterTransformer脚本代码。

    xFasterTransformer镜像中已包含对应版本的脚本代码,可以更新升级到最新的测试脚本。

    apt update
    apt install -y git
    cd /root/xFasterTransformer
    git pull

准备模型数据

  1. 在容器中安装依赖软件。

    apt update
    apt install -y wget git git-lfs vim tmux
  2. 启用Git LFS。

    下载预训练模型需要Git LFS的支持。

    git lfs install
  3. 创建并进入模型数据目录。

    mkdir /mnt/data
    cd /mnt/data
  4. 创建一个tmux session。

    tmux
    重要

    下载预训练模型耗时较长,且成功率受网络情况影响较大,建议在tmux session中下载,以避免ECS断开连接导致下载模型中断。

  5. 下载ChatGLM2-6B预训练模型。

    git clone --depth 1 https://www.modelscope.cn/ZhipuAI/chatglm2-6b.git /mnt/data/chatglm2-6b
  6. 转换模型数据。

    由于下载的模型数据是HuggingFace格式,需要转换成xFasterTransformer格式。生成的模型文件夹为/mnt/data/chatglm2-6b-xft

    python -c 'import xfastertransformer as xft; xft.ChatGLM2Convert().convert("/mnt/data/chatglm2-6b")'
    说明

    不同的模型数据使用的Convert类不同,xFasterTransformer支持以下模型转换类:

    • LlamaConvert

    • ChatGLMConvert

    • ChatGLM2Convert

    • ChatGLM3Convert

    • OPTConvert

    • BaichuanConvert

    • QwenConvert

运行模型进行AI对话

Web页面中进行对话

  1. 在容器中,分别执行以下命令,安装WebUI相关依赖软件。

    cd /root/xFasterTransformer/examples/web_demo
    pip install -r requirements.txt
  2. 执行以下命令,启动WebUI。

    OMP_NUM_THREADS=$(($(lscpu | grep "^CPU(s):" | awk '{print $NF}') / 2)) LD_PRELOAD=libiomp5.so GRADIO_SERVER_NAME="0.0.0.0" numactl -C $(seq -s, 0 2 $(($(lscpu | grep "^CPU(s):" | awk '{print $NF}') - 2))) -m 0 python ChatGLM2.py -t /mnt/data/chatglm2-6b -m /mnt/data/chatglm2-6b-xft -d bf16

    当出现如下信息时,表示WebUI服务启动成功。

    [INFO] xfastertransformer is installed, using pip installed package.
    [INFO] SINGLE_INSTANCE MODE.
    Running on local URL:  http://0.0.0.0:7860
    To create a public link, set `share=True` in `launch()`.
  3. 在浏览器地址栏输入http://<ECS公网IP地址>:7860,进入Web页面。

    页面展示 xFasterTransformer ChatGLM2 聊天界面,包含 Chatbot 对话区域、Input 文本输入框和橙色 Submit 按钮,右侧显示 LatencyThroughput 性能指标以及 Batch size 参数控件,底部有 Clear History 按钮。

  4. 在页面对话框中,输入对话内容,然后单击Submit,即可进行AI对话。

    对话完成后,页面右侧会显示推理性能指标,包括 Latency(延迟)和 Throughput(吞吐量)。可通过 Batch size 控件调整批处理大小,单击 Clear History 清除对话记录。

在实例终端进行对话

执行以下命令,启动AI对话程序。

cd /root/xFasterTransformer/examples/pytorch
OMP_NUM_THREADS=$(($(lscpu | grep "^CPU(s):" | awk '{print $NF}') / 2)) LD_PRELOAD=libiomp5.so numactl -C $(seq -s, 0 2 $(($(lscpu | grep "^CPU(s):" | awk '{print $NF}') - 2))) -m 0 python demo.py -t /mnt/data/chatglm2-6b -m /mnt/data/chatglm2-6b-xft -d bf16 --chat true

程序启动后,在终端中进行对话,示例输出:

Please enter the prompt: 请介绍下阿里云。
==========================================
阿里云是阿里巴巴集团旗下的云计算部门,提供了一系列的云计算产品和服务,帮助企业和政府机构实现数字化转型和云计算化。以下是阿里云的一些介绍:
1. 服务范围:阿里云提供了一系列的云计算产品和服务,包括计算、存储、数据库、网络、安全、人工智能等,可以满足不同规模和需求的企业和政府机构的云计算需求.
2. 技术领先:阿里云在云计算技术方面拥有众多领先的技术,如飞天操作系统。
====================Performance====================
Execution time: xxx s
Latency:        xxx ms/token
Throughput:     xxx tokens/s
Please enter the prompt:

Benchmark模型性能

运行benchmark脚本时默认使用的是假模型数据,因此不需要准备模型数据。您执行以下指令来测试模型性能。

cd /root/xFasterTransformer/benchmark
XFT_CLOUD_ENV=1 bash run_benchmark.sh -m chatglm2-6b -d bf16 -bs 1 -in 32 -out 32 -i 10

通过调整运行参数,来测试指定场景下的性能数据:

  • -d 或 --dtype选择模型量化类型:

    • bf16 (default)

    • bf16_fp16

    • int8

    • bf16_int8

    • fp16

    • bf16_int4

    • int4

    • bf16_nf4

    • nf4

    • bf16_w8a8

    • w8a8

    • w8a8_int8

    • w8a8_int4

    • w8a8_nf4

  • -bs或--batch_size选择batch size大小,默认为1。

  • -in或--input_tokens选择输入长度,自定义长度请在prompt.json中配置对应的prompt,默认为32。

  • -out或--output_tokens选择生成长度,默认为32。

  • -i或--iter选择迭代次数,迭代次数越大,等待测试结果的时间越长,默认为10次。

运行结果展示如下:

root@xFT:~/xFasterTransformer# cd /root/xFasterTransformer/benchmark
root@xFT:~/xFasterTransformer/benchmark# XFT_CLOUD_ENV=1 bash run_benchmark.sh -m chatglm2-6b -d bf16 -bs 1 -in 32 -out 32 -i 10
You are using model chatglm2-6b, dtype bf16, batch size 1, input tokens 32, output tokens 32, beam width 1 and iteration 10 on 1 sockets system.
General Test mode:
        The mapping method for CPU IDs in the cloud server environment is different,
        for example, (0,1), (2,3), (...) where consecutive pairs of CPU IDs belong
        to a single physical core. In this mapping relationship,
        you can enable `export XFT_CLOUD_ENV=1` to bind to the correct physical core.
OMP_NUM_THREADS: 8
Run command line: numactl -C 0,2,4,6,8,10,12,14 -m 0 python /root/xFasterTransformer/benchmark/benchmark.py     --token_path /root/xFasterTransformer/benchmark/../examples/model_config/chatglm2-6b/     --model_path /root/xFasterTransformer/benchmark/../examples/model_config/chatglm2-6b/     --prompt_path /root/xFasterTransformer/benchmark/prompt.json     --model_name chatglm2-6b     --dtype bf16     --batch_size 1     --token_in 32     --token_out 32
    --beam_width 1    --iteration 10    --warmup 2
[INFO] xfastertransformer is installed, using pip installed package.
[INFO] XFT_FAKE_MODEL is enabled. Using `export XFT_FAKE_LOAD_INFO=1` for more details.
[INFO] SINGLE_INSTANCE MODE.
======start=======
上古时, 女娲娘娘炼石补天, 采来三万六千五百零一块顽石, 只剩下一块未用
Input token Length is 32
Batch_size: 1
Max_len: 64
==========================================================
Start benchmark:
iteration 0 :
iteration 1 :
iteration 2 :
iteration 3 :
iteration 4 :
iteration 5 :
iteration 6 :
iteration 7 :
iteration 8 :
iteration 9 :
==========================================chatglm2-6b Final Performance==============================================
Inference Avg Latency:    xxx ms
First token Avg Latency:       xxx ms
Next token Max Latency:   xxx ms
Next token Min Latency:   xxx ms
Next token P90 Latency:   xxx ms
Next token Avg Latency:   xxx ms
Next token Latency:       xxx ms
Throughput without 1st token:  xxx tokens