通过vLLM框架进行大模型推理
1. vLLM简介(摘自vLLM官方文档)
vLLM 是一个快速且易于使用的 LLM 推理和服务库
1.1 vLLM 的速度很快
- 吞吐量大
- 使用 PagedAttention 高效管理attention的键值对缓存
- 连续批处理传入请求
- 使用 CUDA/HIP 快速执行模型
- 支持量化模型:GPTQ、AWQ、SqueezeLLM
- 优化的 CUDA 内核
1.2 vLLM 灵活且利于使用
- 与主流的 HuggingFace 模型无缝集成
- 高吞吐量服务与各种解码算法,包括并行采样、波束搜索等
- 对分布式推理的张量并行支持
- 流式输出
- 提供兼容OpenAI的api接口服务
- 支持 NVIDIA GPU 和 AMD GPU
2. 本次工作前提
- 有一块GPU的电脑(本人使用的是RTX4080 16GB)
- 电脑已经安装Docker应用
3. 主要步骤
3.1 从GitHub上克隆vLLM仓库到本地
git clone https://github.com/vllm-project/vllm.git
这里可能下载不成功,可以选择多试几次,直到下载成功为止。或者通过复制下载压缩包的链接,在github加速下载的网页中下载。
3.2 进入vLLM目录修改Dockerfile文件
- vLLM官方文档中有建议直接拉取NVIDIA PyTorch的官方镜像,但拉取那个镜像涉及到nvidia账号注册、密钥登录等问题,最重要的是还是会遇到网络问题。所以采用dockerfile去创建镜像
进入vLLM目录后可以看到有个Dockerfile文件,因为网络环境原因和后面方便使用我们需要修改几个地方
pip下载镜像源的添加。因为国内的网络问题,我们需要在每一句pip install的后边指定一下从镜像源去下载,这里以清华镜像源为例
-i https://pypi.tuna.tsinghua.edu.cn/simple
容器进入点的修改。为了方便我们建立容器后进去进行其他工作,而不只是用vLLM起一个模型的推理服务,我们需要修改一下Dockerfile文件中的最后一行的ENTRYPOINT的参数,将其改为
ENTRYPOINT ["/bin/bash"]
3.3 构建Docker镜像
在vLLM项目文件夹路径下通过下面这行命令构建镜像(vllmimage:0.1.0可以自行修改,vllmimage指的是镜像名,但请注意镜像名只能小写,0.1.0指的是镜像的tag,这里用作记录版本号)
docker build -t vllmimage:0.1.0 .
构建完毕
输入docker images查看镜像
docker images
3.4创建并进入容器
输入下面这行命令创建并启动docker容器,启用全部gpu,容器名称为vllm,映射端口80:80
docker run -it --gpus all --name vllm -p 80:80 vllmimage:0.1.0
这就是进来了,在该路径下输入下启动openai_api接口的帮助命令就可以看到以下结果,说明vllm是已经装好并且可以使用的(虽然还没加载模型推理,有点不严谨)
python3 -m vllm.entrypoints.openai.api_server --help
3.5 下载模型
我们从魔搭社区下载模型,这里以Yi-6B-Chat为例
vLLM支持从modelscope下载模型,只需要在vLLM容器中运行下面命令即可
pip install modelscope -i https://pypi.tuna.tsinghua.edu.cn/simple
VLLM_USE_MODELSCOPE=True python3 -m vllm.entrypoints.openai.api_server \
--model 01ai/Yi-6B-Chat \
--trust-remote-code \
--host 0.0.0.0 \
--port 80 \
--tensor-parallel-size 1 \
--served-model-name Yi-6B-Chat \
--gpu-memory-utilization 0.95
这里需要耐心等待模型下载完毕并且加载完毕,需要注意的是如果是多卡推理,需要将–tensor-parallel-size参数改为卡数,这里我们只使用一张卡,所以为1。不改的话会默认为1
后面如果想换别的地方下的模型来玩的话可以将–model后参数改为模型路径就行,同时注意将环境变量中的VLLM_USE_MODELSCOPE改为False,不然会无法加载本地模型,它会将本地路径拼上魔搭社区地址去下载模型
export VLLM_USE_MODELSCOPE=False
这样就算是启动完成了
下面我们尝试一下调用,首先打开浏览器,并在地址栏中输入
http://localhost/docs#/
然后就可以看到FastApi的接口文档,然后在第一个post接口中大胆输入并发送就可以了
{
"model": "Yi-6B-Chat",
"messages": [
{
"role": "user",
"content": "我是撒比,你是谁?"
}
],
"stop_token_ids": [7]
}
返回结果: