使用第八代Intel实例部署Qwen-7B-Chat

更新时间:
复制 MD 格式

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

背景信息

千问-7B(Qwen-7B-Chat)

千问-7B(Qwen-7B)是阿里云研发的千问大模型系列的70亿参数规模模型。Qwen-7B是基于Transformer的大语言模型,在超大规模的预训练数据上进行训练得到。预训练数据类型多样,覆盖广泛,包括大量网络文本、专业书籍、代码等。同时,在Qwen-7B 的基础上,使用对齐机制打造了基于大语言模型的AI助手Qwen-7B-Chat。

阿里云第八代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

重要

Qwen-7B-Chat的代码依照LICENSE开源,免费商用需填写商业授权申请。您应自觉遵守第三方模型的用户协议、使用规范和相关法律法规,并就使用第三方模型的合法性、合规性自行承担相关责任。

步骤一:创建ECS实例

  1. 前往实例创建页

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

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

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

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

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

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

  3. 添加安全组规则。

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

步骤二:安装模型所需容器环境

  1. 远程连接该ECS实例。

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

  2. 安装并启动Docker。

    具体操作,请参见安装并使用DockerDocker Compose

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

    sudo docker pull registry.openanolis.cn/openanolis/xfastertransformer:1.7.3-23
    sudo docker run -it --name xFT -h xFT --privileged --shm-size=16g --network host -v /mnt:/mnt -w /mnt/xFasterTransformer registry.openanolis.cn/openanolis/xfastertransformer:1.7.3-23

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

    [ecs-user@iZuf6epjbtjc          ~]$ sudo docker pull registry.openanolis.cn/openanolis/xfastertransformer:1.7.3-23
    1.7.3-23: Pulling from openanolis/xfastertransformer
    a8ede12a3939: Pull complete
    9999739bce1f: Pull complete
    cb62f821a6d8: Pull complete
    ac8ed0e35b17: Pull complete
    5183b0b1eb1d: Pull complete
    375bd19cec22: Pull complete
    b0fec068aed0: Pull complete
    ebf0c1febfdb: Pull complete
    317c71eed5ce: Pull complete
    36095701a3ad: Pull complete
    f1b77b925530: Pull complete
    4f4fb700ef54: Pull complete
    4d755c4a190d: Pull complete
    Digest: sha256:e88c4b325a824046ff5d57402aaeb896bec2d129925e960ac93
    Status: Downloaded newer image for registry.openanolis.cn/openanolis/xfastertransformer:1.7.3-23
    registry.openanolis.cn/openanolis/xfastertransformer:1.7.3-23
    [ecs-user@iZuf6epjbtj          ~]$ sudo docker run -it --name xFT -h xFT --privileged --shm-size=16g --network host -v /mnt:/mnt -w /mnt/xFasterTransformer registry.openanolis.cn/openanolis/xfastertransformer:1.7.3-23
    
    :: initializing oneAPI environment ...
       bash: BASH_VERSION = 5.2.15(1)-release
       args: Using "$@" for setvars.sh arguments:
    :: ccl -- latest
    :: compiler -- latest
    :: mpi -- latest
    :: tbb -- latest
    
    :: oneAPI environment initialized ::
    
    [root@xFT xFasterTransformer]#
    重要

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

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

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

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

步骤三:准备模型数据

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

    yum update -y
    yum 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. 下载Qwen-7B-Chat预训练模型。

    git clone https://www.modelscope.cn/qwen/Qwen-7B-Chat.git /mnt/data/qwen-7b-chat
    重要

    在执行git clone命令后,Git将通过Git LFS开始下载仓库及其所有大文件。这个过程可能需要几分钟到几小时不等,具体取决于模型大小和网络条件,请您耐心等待。

    当出现如下信息时,表示预训练模型已下载成功。

    [root@xFT /]# git clone https://www.modelscope.cn/qwen/Qwen-7B-Chat.git /mnt/data/qwen-7b-chat
    Cloning into '/mnt/data/qwen-7b-chat'...
    remote: Enumerating objects: 551, done.
    remote: Counting objects: 100% (53/53), done.
    remote: Compressing objects: 100% (27/27), done.
    remote: Total 551 (delta 28), reused 50 (delta 26), pack-reused 498
    Receiving objects: 100% (551/551), 16.47 MiB | 21.62 MiB/s, done.
    Resolving deltas: 100% (292/292), done.
    Filtering content: 100% (8/8), 14.38 GiB | 11.14 MiB/s, done.
    [root@xFT /]#
  6. 转换模型数据。

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

    python -c 'import xfastertransformer as xft; xft.QwenConvert().convert("/mnt/data/qwen-7b-chat")'

    当出现如下信息时,表示模型转换成功。

    [root@xFT /]# python -c 'import xfastertransformer as xft; xft.QwenConvert().convert("/mnt/data/qwen-7b-chat")'
    Processing ...
    Found 8 model parts: ['model-00001-of-00008.safetensors', 'model-00002-of-00008.safetensors', 'model-00003-of-00008.safetensors', 'model-00004-of-00008.safetensors', 'model-00005-of-00008.safetensors', 'model-00006-of-00008.safetensors', 'model-00007-of-00008.safetensors', 'model-00008-of-00008.safetensors']
    /mnt/data/qwen-7b-chat-xft export successful!
    [root@xFT /]#
    说明

    不同的模型数据使用的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. 执行以下命令,升级gradio以避免与fastapi的冲突。

    pip install --upgrade gradio
  3. 执行以下命令,启动WebUI。

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

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

    root@xFT:~/xFasterTransformer/examples/web_demo# OMP_NUM_THREADS=$(($(lscpu | grep "^CPU(s):" | awk '{print $NF}') / 2)) GRADIO_SERVER_NAME="0.0.0.0" numactl -C $(seq -s, 0 2 $(($(lscpu | grep "^CPU(s):" | awk '{print $NF}') - 2))) -m 0 python Qwen.py -t /mnt/data/qwen-7b-chat -m /mnt/data/qwen-7b-chat-xft -d bf16
    [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()`.
  4. 在浏览器地址栏输入http://<ECS公网IP地址>:7860,进入Web页面。

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

在实例终端进行对话

执行以下命令,启动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/qwen-7b-chat -m /mnt/data/qwen-7b-chat-xft -d bf16 --chat true
root@xFT:/mnt/xFasterTransformer# 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/qwen-7b-chat -m /mnt/da
ta/qwen-7b-chat-xft -d bf16 --chat true
ERROR: ld.so: object 'libiomp5.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
ERROR: ld.so: object 'libiomp5.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
[INFO] xfastertransformer is installed, using pip installed package.
[INFO] SINGLE_INSTANCE MODE.

Please enter the prompt:你是谁?
==========================================================
我是来自阿里云的大规模语言模型,我叫通义千问。
======================Performance=========================
Execution time:          xxx s
Latency:          xxx ms/token
Throughput:          xxx tokens/s

Please enter the prompt: 请介绍下阿里云。
==========================================================
阿里云是阿里巴巴集团旗下的云计算服务提供商,提供包括计算、存储、数据库、网络、安全、大数据、人工智能等在内的面云计算服务。阿里云在全球范围内拥有多个数据中心,提供全球化的云计算服务,支持多种编程语言和开发框架,可以满足企业级客户的
不同需求。
======================Performance=========================
Execution time:          xxx s
Latency:          xxx ms/token
Throughput:          xxx tokens/s

Benchmark模型性能

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

cd /root/xFasterTransformer/benchmark
XFT_CLOUD_ENV=1 bash run_benchmark.sh -m qwen-7b -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次。

运行结果展示如下:

[Info] OMP_NUM_THREADS: 8
Run command line: mpirun    -n 1 bash run.sh 0 0 8 0
The folder '/data/models/Qwen-7B-Chat-xft' does not exist. Using fake weight!
[INFO] xfastertransformer is installed, using pip installed package.
[INFO] XFT_FAKE_MODEL is enabled. Using `export XFT_FAKE_LOAD_INFO=1` for more details.
=====start=======
[INFO] input argparse =  Namespace(batch_size=1, beam_width=1, chat=False, csv='', dtype='bf16', input_prompt=None, iteration=10, kv_cache_dtype='fp16', model_name='qwen-7b', model_path='/root/xFasterTransformer/benchmark/../examples/model_config/qwen-7b/', padding=False, prompt_path='/root/xFasterTransformer/benchmark/prompt.json', token_in='32', token_out=32, token_path='/root/xFasterTransformer/benchmark/../examples/model_config/qwen-7b/', warmup=2)
Once upon a time, there existed a little girl who liked to have adventures. She wanted to go to places and meet new people, and have fun.
Input token Length is 32
Batch_size: 1
Max_len: 64
======================================================
Start benchmark:
iteration 0 :
    Response: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
iteration 1 :
    Response: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
iteration 2 :
    Response: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
iteration 3 :
    Response: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
iteration 4 :
    Response: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
iteration 5 :
    Response: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
iteration 6 :
    Response: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
iteration 7 :
    Response: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
iteration 8 :
    Response: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
iteration 9 :
    Response: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

==============================qwen-7b Final Performance==============================
Inference Avg Latency:    xxx    ms
First token Avg Latency:      191.59 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:  5.95 tokens/s
================================================================================