正常运行通义千问会提示安装flash-attention
以获得更快的推理速度,缺少这个包并不影响模型运行。
事实证明安装之后对于推理速度的提升也很小(5%),网上说对于微调训练的速度提升比较大,因为是在内网环境下,安装还费了一番周折。本人环境
这种情况比较简单,但是需要有cuda的devel环境,而不仅仅是runtime环境。
内网环境无法直接安装flash-attn,从github下载最新的代码,根据自己的环境下载flash-attn的whl包。
# 安装依赖
pip install packaging ninja
# 安装flash-attn
pip install ./flash_attn-2.2.0+cu118torch2.0cxx11abiFALSE-cp38-cp38-linux_x86_64.whl
# 编译安装ayer_norm和rotary
cd ./csrc/layer_norm && python setup.py install
cd ./csrc/rotary && python setup.py install
注意版本问题,编译安装这两个对于cuda版本、显卡要求比较严格,版本不匹配会出现不支持的架构等问题。
直接贴本人运行大模型和百度飞桨NLP专用镜像的Dockerfile,按照自己的需求修改。
# devel,cudnn
FROM nvidia/cuda:11.8.0-cudnn8-devel-ubuntu20.04
LABEL author="huangchunfeng"
WORKDIR /root
RUN mkdir /root/.pip
# 指定内网apt源
ADD ./sources.list /etc/apt
# 内网pip源
ADD ./pip.conf /root/.pip
# 安装python依赖
RUN apt-get update && apt-get install -y \
wget \
build-essential \
libssl-dev \
zlib1g-dev \
libncurses5-dev \
libncursesw5-dev \
libreadline-dev \
libsqlite3-dev \
libgdbm-dev \
libdb5.3-dev \
libbz2-dev \
libexpat1-dev \
liblzma-dev \
libffi-dev \
libgdbm-compat-dev
COPY ./Python-3.8.18.tgz /root/Python-3.8.18.tgz
RUN tar xzvf /root/Python-3.8.18.tgz -C /root
# 编译python并设置为默认解释器
RUN cd /root/Python-3.8.18 \
&& ./configure --enable-optimizations --with-ensurepip=install \
&& make -j $(nproc) \
&& make altinstall \
&& update-alternatives --install /usr/bin/python python /usr/local/bin/python3.8 1 \
&& update-alternatives --install /usr/bin/pip pip /usr/local/bin/pip3.8 1 \
&& rm -rf /root/Python-3.10.18.tgz /root/Python-3.10.18
RUN pip install transformers uvicorn fastapi tiktoken transformers_stream_generator sentencepiece
RUN pip install packaging ninja torch==2.0.1+cu118
COPY './flash_attn-2.2.0+cu118torch2.0cxx11abiFALSE-cp38-cp38-linux_x86_64.whl' /root
RUN pip install ./flash_attn-2.2.0+cu118torch2.0cxx11abiFALSE-cp38-cp38-linux_x86_64.whl
COPY ./csrc /root/csrc
ENV CUDA_HOME=/usr/local/cuda-11.8
# 编译安装,比较耗时
RUN cd ./csrc/layer_norm && python setup.py install
RUN cd ./csrc/rotary && python setup.py install
RUN pip install paddlepaddle-gpu==2.5.0.post117
RUN pip install paddlenlp
RUN pip install LAC
RUN pip install vllm loguru
RUN rm -rf ./csrc /root/.cache
国产开源项目,github地址
C++重写了一些算子,支持量化加速。
github地址
提高整体吞吐量,单batch效果不明显,预先分配大量显存,提高推理速度。
比较新的的vllm对qwen的支持更好,一行命令启动后,调用时需要额外指定两个参数
启动命令
python -m vllm.entrypoints.openai.api_server --model /Qwen-7B-Chat --served-model-name qwen-7b --trust-remote-code
调用参数
{
"model":"qwen-7b",
"max_tokens":1024, // 调大点
"stop":["<|im_end|>"],
"messages":[
{"role":"system", "content":"You are a helpful assitant."},
{"role":"user", "content":"你好"}
]
}
在浏览器端,使用EventSource对象处理event-stream数据。
在服务器端,使用requests和aiohttp读取event-stream流。
使用requests
import requests
response = requests.get("http://127.0.0.1:8000/v1/chat/completions", stream=True,
json={'model': 'qwen-7b', 'messages': [{'role': 'user', 'content': '你好'}], 'stream': True})
while True:
chunk = response.raw._fp.read1()
if not chunk:
break
print(chunk)
使用aiohttp
import asyncio
import aiohttp
async def main():
async with aiohttp.ClientSession() as session:
async with session.get("http://127.0.0.1:8000/v1/chat/completions", chunked=True,
json={'model': 'qwen-7b', 'messages': [{'role': 'user', 'content': '你好'}],
'stream': True}) as response:
async for chunk in response.content.iter_any():
print(chunk.decode())
本文在国产化和非国产化软硬件环境下对系统分别进行了部署,测试验证通过,并对性能进行了对比分析。两套环境的软硬件情况如下表所示。
国产化环境 | 非国产化环境 | |
---|---|---|
CPU | Hygon C86 7381 32-core Processor,32核128线程 | 13th Gen Intel® Core™ i9-13900K,24核32线程 |
GPU | DCU Z100L,32G显存 | RTX A6000,48G显存 |
OS | 银河麒麟V10(SP3) | Ubuntu20.04,Linux version 5.15.0-79-generic |
GPU Toolkit | DTK23.04 | CUDA11.8 |
Pytorch | 曙光pytorch1.10 | pytorch2.1.2+cu118 |
vllm | 0.2.7(适配rocm) | 0.2.7+cu118 |
在两套环境下针对不同数据类型、不同推理加速框架,对清华的ChatGLM2-6B,阿里的Qwen-7B-Chat和Qwen-14B-Chat进行单个batch的测试,记录生成token/字符的速度如下表所示,不同的测试用例可能会有不同的结果。
环境 | 数据类型 | 推理加速 | ChatGLM2-6B | Qwen-7B-Chat | Qwen-14B-Chat |
---|---|---|---|---|---|
国产化 | float16 | 无 | 9.2/14.7 | 6.4/10.2 | 4.1/6.2 |
国产化 | float16 | fastllm | 24.9/40.7 | 18.4/29.0 | 12.5/20.04 |
国产化 | int8 | fastllm | 26.9/43.7 | 20.7/33.2 | 12.4/19.7 |
非国产化 | float16 | vllm | 51.9/86.5 | 43.4/67.4 | 24.2/35.1 |
fastllm和vllm是两套大模型推理加速框架,能够提升多种模型的推理速度,截至2024年2月20日,国产化环境适配了fastllm但没有适配vllm。
从上表可以看出,国产化环境的计算速度相比非国产化环境仍有较大差距。经int8量化,fastllm加速后模型的推理速度提升明显,Qwen-7B输出速度达到20.7token/s(33.2字符/每秒),在不考虑并发的情况下,该速度可以被用户接受。
有上一节单batch下的测试结果,综合考虑模型能力和推理速度,确定了使用的模型,量化参数和加速框架,国产化环境下分别是Qwen-7B-Chat,int8和fastllm,非国产化环境下分别是Qwen-7B-Chat和vllm。
本问答系统的响应耗时主要在大模型生成回答部分,检索耗时相对可忽略不计,所以对并发情况下模型服务的吞吐量、负载能力等进行了测试,国产化环境和非国产化环境结果分别如表x.x和x.x所示。
Batch | Latancy/s | Request throughput/s | Input token throughput/s | Output token throughput/s | Mean TTFT/ms | P99 TTFT/ms | Mean TPOT/ms | P99 TPOT/ms |
---|---|---|---|---|---|---|---|---|
1 | 2.75 | 0.36 | 381.25 | 5.10 | 2108.29 | 2108.29 | 196.13 | 196.13 |
4 | 12.65 | 0.32 | 182.03 | 12.88 | 3403.15 | 5379.25 | 362.75 | 560.57 |
8 | 22.23 | 0.36 | 187.06 | 13.41 | 7187.45 | 10908.13 | 634.55 | 1058.37 |
16 | 54.26 | 0.29 | 109.30 | 19.91 | 10710.53 | 19530.09 | 838.36 | 1731.22 |
64 | 112.80 | 0.57 | 111.72 | 24.13 | 35700.00 | 72476.08 | 4461.3 | 44129.61 |
128 | Out of memory |
Batch | Latancy/s | Request throughput/s | Input token throughput/s | Output token throughput/s | Mean TTFT/ms | P99 TTFT/ms | Mean TPOT/ms | P99 TPOT/ms |
---|---|---|---|---|---|---|---|---|
1 | 0.51 | 1.96 | 2053.85 | 27.46 | 3.96 | 3.96 | 36.14 | 36.14 |
4 | 2.63 | 1.52 | 874.99 | 72.57 | 78.86 | 213.67 | 39.29 | 51.71 |
8 | 2.95 | 2.72 | 1411.23 | 109.97 | 292.65 | 483.54 | 49.53 | 72.77 |
16 | 6.23 | 2.57 | 951.59 | 188.71 | 299.82 | 559.30 | 49.72 | 89.84 |
64 | 8.93 | 7.17 | 1410.84 | 335.86 | 681.81 | 942.69 | 171.15 | 1977.13 |
128 | 30.18 | 4.24 | 711.37 | 215.61 | 1430.70 | 4702.94 | 218.55 | 2154.55 |
各指标含义如下表所示
指标 | 含义 |
---|---|
Batch | 并发数 |
Latancy | 完成所有请求的时延,单位:秒 |
Request throughput | 平均每秒处理的请求数 |
Input token throughput | 平均每秒处理输入的token数 |
Output token throughput | 平均每秒输出的token数 |
Mean TTFT(Time To First Token) | 从发起请求到输出第一个token的平均时延,单位:毫秒 |
P99 TTFT | 从发起请求到输出第一个token时延的99分位数,单位:毫秒 |
Mean TPOT(Time Per Output Token) | 输出每个token平均耗时,单位:毫秒 |
P99 TPOT | 输出每个token的耗时的99分位数,单位:毫秒 |
本次测试使用的用例比较贴合实际情况,让大模型结合较长段落回答问题,所以结果中平均每秒处理的输入token数较大。
从各项指标可以看出,国产化显卡DCUZ00L的算力还不足,软硬件适配程度不够,导致并发情况下吞吐量小,响应时间偏大。非国产化环境下使用vllm进行推理加速,并发情况下吞吐量提升明显,batch在8到16时,处理完所有请求的时间在2到3秒,是比较理想的情况。
尽管vllm支持多卡并行,但算力资源有限,本文并未对多卡并行的性能进行测试。