随着大模型参数规模的不断增长,在有限的算力资源下,提升模型的推理速度逐渐变为一个重要的研究方向。常用的推理加速框架包含lmdeploy、FasterTransformer和vLLM等。

一.lmdeploy推理部署

  lmdeploy由上海人工智能实验室开发,推理使用C++/CUDA,对外提供python/gRPC/http接口和WebUI界面,支持tensor parallel分布式推理、支持fp16/weightint4/kv cache int8量化。lmdeploy支持transformer结构(例如LLaMA、LLaMa2、InternLM、Vicuna等),目前支持fp16,int8和int4。

1.fp16推理

  安装预编译的Python包,即python3 -m pip install lmdeploy。把模型转成lmdeploy 推理格式,假设huggingface版LLaMa2模型已下载到/models/llama-2-7b-chat目录,结果会存到workspace文件夹,如下所示:

python3 -m lmdeploy.serve.turbomind.deploy llama2 /models/llama-2-7b-chat

  在命令行中测试聊天效果,如下所示:

python3 -m lmdeploy.turbomind.chat ./workspace
...
double enter to end input >>> who are you
...
Hello! I'm just an AI assistant ...

  也可以用gradio启动WebUI来聊天,如下所示:

python3 -m lmdeploy.serve.gradio.app ./workspace

  lmdeploy同样支持原始的facebook模型格式、支持70B模型分布式推理,用法查看lmdeploy 官方文档

2.kv cache int8量化

  lmdeploy实现了kv cache int8量化,同样的显存可以服务更多并发用户。首先计算模型参数,结果是pth格式,保存到临时目录minmax,如下所示:

mkdir minmax
python3 -m lmdeploy.lite.apis.calibrate \
  --model /models/llama-2-7b-chat \  # huggingface llama2 模型。也支持 llama/vicuna/internlm/baichuan 等
  --calib_dataset 'c4' \             # 校准数据集,支持 c4, ptb, wikitext2, pileval
  --calib_samples 128 \              # 校准集的样本数,如果显存不够,可以适当调小
  --calib_seqlen 2048 \              # 单条的文本长度,如果显存不够,可以适当调小
  --work_dir minmax \                # 保存 pth 格式量化统计参数和量化后权重的文件夹

  然后用minmax目录里的参数,计算量化参数,保存到fp16转换好的workspace/triton_models/weights下,如下所示:

python3 -m lmdeploy.lite.apis.kv_qparams \ 
  --work_dir minmax \                                  # 上一步计算的 minmax 结果
  --turbomind_dir ./workspace/triton_models/weights \  # 结果保存目录
  --kv_sym False \                                     # 用非对称量化
  --num_tp 1                                           # tensor parallel GPU 个数

  修改推理配置,开启kv cache int8。编辑workspace/triton_models/weights/config.ini,如下所示:

(1)把use_context_fmha改为0,表示关闭flashattention

(2)把quant_policy设为4,表示打开kv cache量化

  最终执行测试即可,如下所示:

python3 -m lmdeploy.turbomind.chat ./workspace

  点击这里查看kv cache int8量化实现公式、精度和显存测试报告。

3.weight int4量化

  lmdeploy基于AWQ 算法实现了weight int4量化,相对fp16版本,速度是3.16倍、显存从16G降低到6.3G。这里有AWQ算法优化好llama2原始模型,直接下载。如下所示:

git clone https://huggingface.co/lmdeploy/llama2-chat-7b-w4

  对于自己的模型,可以用auto_awq工具来优化,如下所示:

# 计算量化参数
python3 -m lmdeploy.lite.apis.calibrate \
  --model $HF_MODEL \                # huggingface 模型位置
  --calib_dataset 'c4' \             # 校准数据集,支持 c4, ptb, wikitext2, pileval
  --calib_samples 128 \              # 校准集的样本数,如果显存不够,可以适当调小
  --calib_seqlen 2048 \              # 单条的文本长度,如果显存不够,可以适当调小
  --work_dir $WORK_DIR \             # 保存 Pytorch 格式量化统计参数和量化后权重的文件夹

# 量化模型
python3 -m lmdeploy.lite.apis.auto_awq \
  --model $HF_MODEL \                # huggingface 模型位置
  --w_bits 4 \                       # 权重量化的 bit 数
  --w_group_size 128 \               # 权重量化分组统计尺寸
  --work_dir $WORK_DIR \             # 上一条命令保存参数的目录

  执行以下命令,即可在终端与模型对话,如下所示:

## 转换模型的layout,存放在默认路径 ./workspace 下
python3 -m lmdeploy.serve.turbomind.deploy \
    --model-name llama2 \
    --model-path ./llama2-chat-7b-w4 \
    --model-format awq \
    --group-size 128

## 推理
python3 -m lmdeploy.turbomind.chat ./workspace

  点击这里查看weight int4量化的显存和速度测试结果。额外说明,weight int4和kv cache int8二者并不冲突、可以同时打开,节约更多显存。

二.FasterTransformer推理部署

  FasterTransformer由NVIDIA开发,采用C++/CUDA编写,支持分布式推理,transformer编码器和解码器均可进行加速。通过FasterTransformer和Triton加速LLama2模型推理,目前支持FP16或者Int8推理,Int4目前还不支持。

1.镜像构建

  准备环境变量,如下所示:

export BUILD_DICTIONARY="/data/build"
export TRITON_VERSION=23.04

(1)构建镜像

cd $BUILD_DICTIONARY
git clone https://github.com/Rayrtfr/fastertransformer_backend.git 
cd $BUILD_DICTIONARY/fastertransformer_backend
export TRITON_VERSION=23.04
docker build --build-arg TRITON_VERSION=${TRITON_VERSION} -t triton_ft_backend:${TRITON_VERSION}-v-1 -f docker/Dockerfile-1 .
docker build --build-arg TRITON_VERSION=${TRITON_VERSION} -t triton_ft_backend:${TRITON_VERSION} -f docker/Dockerfile-2 .
docker build --build-arg TRITON_VERSION=${TRITON_VERSION} -t triton_ft_backend:${TRITON_VERSION}-final -f docker/Dockerfile-3 .

  TRITON_VERSION=23.04这个镜像需的GPU的驱动版本是Driver Version: 535.54.03,如果GPU的驱动不是这个版本,需要https://docs.nvidia.com/deeplearning/triton-inference-server/release-notes/rel-22-12.html#rel-22-12找到cuda driver对应版本的triton-inference-server。

(2)启动容器

# 启动容器
export TRITON_VERSION=23.04

# 注意需要 BUILD_DICTIONARY 挂载到容器里面
docker run -idt --gpus=all --net=host  --shm-size=4G --name triton_ft_backend_pure \
  -v $BUILD_DICTIONARY:$BUILD_DICTIONARY \
  -p18888:8888 -p18000:8000 -p18001:8001 -p18002:8002 triton_ft_backend:${TRITON_VERSION}-final  bash 

2.容器内操作

  下面介绍一下Llama2-Chinese-13b-Chat模型的权重转换成FasterTransformer格式。Llama2-Chinese-7b-Chat也是类似的方式。

(1)转换权重,权重转换成FasterTransformer格式

cd $BUILD_DICTIONARY
git clone https://github.com/Rayrtfr/FasterTransformer.git
cd $BUILD_DICTIONARY/FasterTransformer
mkdir models && sudo chmod -R 777 ./*

python3 ./examples/cpp/llama/huggingface_llama_convert.py \
-saved_dir=./models/llama \
-in_file=/path/FlagAlpha/Llama2-Chinese-13b-Chat \
-infer_gpu_num=1 \
-weight_data_type=fp16 \
-model_name=llama

(2)修改模型配置

  编辑config.pbtxt文件,如下所示:

mkdir $BUILD_DICTIONARY/triton-model-store/
cd $BUILD_DICTIONARY/triton-model-store/
cp -r $BUILD_DICTIONARY/fastertransformer_backend/all_models/llama $BUILD_DICTIONARY/triton-model-store/

# 修改 triton-model-store/llama/fastertransformer/config.pbtxt
parameters {
  key: "tensor_para_size"
  value: {
    string_value: "1"
  }
}
## 修改 model_checkpoint_path 为上面转换之后的路径
parameters {
  key: "model_checkpoint_path"
  value: {
    string_value: "/ft_workspace/FasterTransformer/models/llama/1-gpu/"
  }
}
## 模型使用int8推理需要加一下面的配置
parameters { 
  key: "int8_mode" 
  value: { 
    string_value: "1"
  } 
}

  修改model.py文件,如下所示:

# 修改这两个文件
triton-model-store/llama/preprocess/1/model.py
triton-model-store/llama/postprocess/1/model.py
# 检查 这个路径为tokenier对应的路径
self.tokenizer = LlamaTokenizer.from_pretrained("/path/FlagAlpha/Llama2-Chinese-13b-Chat")

(3)编译FasterTransformer Library

  同一类型的模型,编译一次就行了。编译之前检查FasterTransformer/examples/cpp/llama/llama_config.ini,如下所示:

# 单卡推理这里是1,多卡可以改成卡的数目
tensor_para_size=1
model_dir=/mnt/data/wuyongyu/train/FasterTransformer/models/llama/1-gpu/

  编译FasterTransformer,如下所示:

cd $BUILD_DICTIONARY/FasterTransformer
mkdir build && cd build
git submodule init && git submodule update
pip3 install fire jax jaxlib transformers
cmake -DSM=86 -DCMAKE_BUILD_TYPE=Release -DBUILD_PYT=ON -DBUILD_MULTI_GPU=ON -D PYTHON_PATH=/usr/bin/python3 ..
make -j12
make install

3.启动triton server

  同样在上面的容器内操作,如下所示:

CUDA_VISIBLE_DEVICES=0 /opt/tritonserver/bin/tritonserver  --model-repository=$BUILD_DICTIONARY/triton-model-store/llama/

  输出如下所示:

I0717 17:17:14.670037 70681 grpc_server.cc:2450] Started GRPCInferenceService at 0.0.0.0:8001
I0717 17:17:14.670495 70681 http_server.cc:3555] Started HTTPService at 0.0.0.0:8000
I0717 17:17:14.713000 70681 http_server.cc:185] Started Metrics Service at 0.0.0.0:8002

  启动client测试

python3 $BUILD_DICTIONARY/fastertransformer_backend/inference_example/llama/llama_grpc_stream_client.py

三.vLLM推理部署

  vllm同样是GPU推理的方案,它由加州大学伯克利分校开发,核心技术是PageAttention,吞吐量比HuggingFace Transformers高出24倍。相较与FasterTrainsformer,vLLM更加的简单易用,不需要额外进行模型的转换,支持fp16推理。特点:快速的推理速度,高效的kv cache,连续的batch请求推理,优化cuda算子,支持分布式推理。

1.安装vllm

vllm安装命令,如下所示:

git clone https://github.com/vllm-project/vllm
cd vllm && python setup.py install

2.启动测试server

  下载13B模型或者7B模型到特定目录。

(1)单卡推理

  编辑single_gpus_api_server.sh里面model为上面的7B或者13B模型的下载路径。启动测试server,如下所示:

# multi_gpus_api_server.sh 里面的CUDA_VISIBLE_DEVICES指定了要使用的GPU卡
bash single_gpus_api_server.sh

(2)多卡推理

  13B模型,70B模型推荐多卡推理。编辑multi_gpus_api_server.sh里面model为上面的13B模型的下载路径。启动测试server,如下所示:

# multi_gpus_api_server.sh 里面的CUDA_VISIBLE_DEVICES指定了要使用的GPU卡
# tensor-parallel-size 指定了卡的个数
bash multi_gpus_api_server.sh

3.启动client测试

python client_test.py

参考文献:

[1]https://github.com/FlagAlpha/Llama2-Chinese/tree/main/inference-speed/GPU/lmdeploy_example

[2]https://github.com/FlagAlpha/Llama2-Chinese/tree/main/inference-speed/GPU/FasterTransformer_example

[3]https://github.com/FlagAlpha/Llama2-Chinese/blob/main/inference-speed/GPU/vllm_example/README.md

Llama2-Chinese项目:5-推理加速的更多相关文章

  1. BootCDN 开源项目免费 CDN 加速服务,Jquery插件库

    2017-11-17  19:38:32 免费好用的在线 css js 文件引用 BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务 Jquery插件库 .

  2. 释放至强平台 AI 加速潜能 汇医慧影打造全周期 AI 医学影像解决方案

    基于英特尔架构实现软硬协同加速,显著提升新冠肺炎.乳腺癌等疾病的检测和筛查效率,并帮助医疗科研平台预防"维度灾难"问题 <PAGE 1 LEFT COLUMN: CUSTOM ...

  3. Paddle Inference推理部署

    Paddle Inference推理部署 飞桨(PaddlePaddle)是集深度学习核心框架.工具组件和服务平台为一体的技术先进.功能完备的开源深度学习平台,已被中国企业广泛使用,深度契合企业应用需 ...

  4. LabVIEW开放神经网络交互工具包【ONNX】,大幅降低人工智能开发门槛,实现飞速推理

    前言 前面给大家介绍了自己开发的LabVIEW AI视觉工具包,后来发现有一些onnx模型无法使用opencv dnn加载,且速度也偏慢,所以就有了今天的onnx工具包,如果你想要加载更多模型,追求更 ...

  5. 【YOLOv5】手把手教你使用LabVIEW ONNX Runtime部署 TensorRT加速,实现YOLOv5实时物体识别(含源码)

    前言 上一篇博客给大家介绍了LabVIEW开放神经网络交互工具包[ONNX],今天我们就一起来看一下如何使用LabVIEW开放神经网络交互工具包实现TensorRT加速YOLOv5. 以下是YOLOv ...

  6. Windows10下yolov8 tensorrt模型加速部署【实战】

    Windows10下yolov8 tensorrt模型加速部署[实战] TensorRT-Alpha基于tensorrt+cuda c++实现模型end2end的gpu加速,支持win10.linux ...

  7. Win10下yolov8 tensorrt模型加速部署【实战】

    Win10下yolov8 tensorrt模型加速部署[实战] TensorRT-Alpha基于tensorrt+cuda c++实现模型end2end的gpu加速,支持win10.linux,在20 ...

  8. 英特尔与 Facebook 合作采用第三代英特尔® 至强® 可扩展处理器和支持 BFloat16 加速的英特尔® 深度学习加速技术,提高 PyTorch 性能

    英特尔与 Facebook 曾联手合作,在多卡训练工作负载中验证了 BFloat16 (BF16) 的优势:在不修改训练超参数的情况下,BFloat16 与单精度 32 位浮点数 (FP32) 得到了 ...

  9. 【模型推理】量化实现分享一:详解 min-max 对称量化算法实现

      欢迎关注我的公众号 [极智视界],回复001获取Google编程规范   O_o   >_<   o_O   O_o   ~_~   o_O   大家好,我是极智视界,本文剖析一下 m ...

  10. AI应用开发实战 - 手写算式计算器

    扩展手写数字识别应用 识别并计算简单手写数学表达式 主要知识点 了解MNIST数据集 了解如何扩展数据集 实现手写算式计算器 简介 本文将介绍一例支持识别手写数学表达式并对其进行计算的人工智能应用的开 ...

随机推荐

  1. 【createWrapper】根据条件类创建查询wrapper

    前几天写一个有几十个字段的查询wrapper,写得我心烦意乱.然后就琢磨了一下能不能只传一个条件类对像就能创建对应的wrapper.去看了下mybatis-plus的文档没看到合适的api,有一个创建 ...

  2. EMC ndmp NAS

    NAS 是带存储系统的专用高性能文件服务器.它可提供文件级数据访问和共享. NAS 使用网络和文件共享协议,包括用于数据传输的 TCP/IP 以及用于远程文件服务的 CIFS 和 NFS. 最简单的备 ...

  3. Vue 3 中用组合式函数和 Shared Worker 实现后台分片上传(带哈希计算)

    01. 背景 最近项目需求里有个文件上传功能,而客户需求里的文件基本上是比较大的,基本上得有 1 GiB 以上的大小,而上传大文件尤其是读大文件,可能会造成卡 UI 或者说点不动的问题.而用后台的 W ...

  4. acwing第75场周赛

    这次题比较水,但是还是没能ak,自己小结一下吧 第一道题就是自己枚举相加就行 第二道题是一个多关键字排序,wa了几次,是因为优先级有两个是相同的需要特判一下,然后可以把字符转化为数字的优先级,我用了一 ...

  5. QT(8)-QSpinBox

    QSpinBox 1 介绍 QSpinBox 是 Qt 中的一种数字输入控件,支持整数和浮点数输入.它允许用户通过上下箭头或键盘输入来选择数字.您可以设置最小值.最大值和步长,以限制用户输入的范围.Q ...

  6. 测试技术:开源测试工具 jenkins、Sonar

    http://www.cnblogs.com/itech/archive/2011/11/23/2260009.html Jenkins入门总结 基于 Jenkins 快速搭建持续集成环境 https ...

  7. JAVA多线程(3)——如何加锁

    1.加锁不正确导致数据不一致:m1执行过程中,m2(未加synchronized)可以执行,因为m2不用获得锁就可以执行 1 public class TT implements Runnable { ...

  8. JAVA 类显式加载

    类显式加载 1.Class.forName("classloader.Dog");  方式加载   Example1 1 package classloader; 2 3 publ ...

  9. 手撕Vuex-模块化共享数据上

    前言 好,经过上一篇的介绍,实现了 Vuex 当中的 actions 方法,接下来我们来实现 Vuex 当中的模块化共享数据(modules). modules 方法用于模块化共享数据,那么什么叫模块 ...

  10. 一张图搞懂sql执行顺序

    冲浪时发现一张很有意思的图,细分了一个长sql语句的执行顺序