目前主流的大模型部署框架以llama.cpp、Ollama和Vllm为主,其各自项目在Github上的Stars增长曲线如下所示。其中Ollama的Stars增长曲线是断档式领先,而llama.cpp和Vllm的Stars增长曲线则相对平缓,处于一个稳步增长的趋势。
所以会呈现出这种现状,其实与各个框架的定位有本质的区别。首先,llama.cpp是使用没有任何依赖关系的纯 C/C++ 实现,性能很高,可定制化和优化项非常多,但也因为底层是C语言,直接导致上手难度极高。Ollama之所以能够受到最多开发者的关注,一个最根本的原因就是其部署和使用太简单了,兼容多种操作系统,且都提供了一键安装、单命令启动的快捷方式,可以极大降低初学者使用开源大模型的门槛,同时Ollama框架提供原生REST API和OpenAI API兼容性,也可以非常轻松的接入到其他的客户端中。
Vllm框架整体概览
Ollama的优势在于其简洁性,Vllm则是优先考虑性能和可扩展性的大模型部署框架,其核心的优化点在高效内存管理、持续批处理功能和张量并行性,从而在生产环境中的高吞吐量场景中表现极佳,同时这也是为什么Vllm框架是目前最适用于企业真实生产环境部署的根本原因。、
其Gtihub开源地址为:https://github.com/vllm-project/vllm
主要特性为:
- 高级 GPU 优化:利用
CUDA和PyTorch最大限度地提高GPU利用率,从而实现更快的推理速度。Ollama其实是对CPU-GPU的混合应用,但vllm是针对纯GPU的优化。 - 高级内存管理:通过
PagedAttention算法实现对KV cache的高效管理,减少内存浪费,从而优化大模型的运行效率。 - 批处理功能:支持连续批处理和异步处理,从而提高多个并发请求的吞吐量。
- 安全特性:内置
API密钥支持和适当的请求验证,不像其他完全跳过身份验证的框架。 - 易用性:
vLLM与HuggingFace模型无缝集成,支持多种流行的大型语言模型,并兼容OpenAI的API服务器。
vllm框架主要支持纯文本和多模态两种模式的模型,其中对支持的纯文本类语言模型可以在这里看到:https://docs.vllm.ai/en/latest/models/supported_models.html#supported-text-models
其次是多模态模型,Vllm框架目前已经支持文本、图片、视频和音频四种模态的输入输出格式兼容规范,但是多模态模型官方并没有给出具体的模型列表,所以这里我们要进入到源码中对模型的集成文件中去匹配:https://github.com/vllm-project/vllm/tree/main/vllm/model_executor/models
Linux部署Vllm
首先需要重点说明的是:Vllm框架仅支持Linux操作系统,官方并没有提供Windows的兼容版本。同时除了有操作的限制,对运行的Python版本也要求在Python 3.8~Python 3.12之间。这两个条件限制为部署Vllm的先决条件,即必须满足才可以顺利使用Vllm启动大模型并提供推理服务。
- 首先需要安装conda
- 创建conda的虚拟环境,可以使用"conda create --name vllm python=3.12"
- 安装vllm,可以使用"pip install vllm"
- 查看vllm版本号,可以使用"pip show vllm"
在安装完成Vllm框架后,就可以开始进行大模型推理服务的启动和调用了。Vllm框架提供了两种启动并调用大模型生成推理服务的方式,分别是离线推理和在线推理。其中:
- 离线推理: 离线推理类似于使用
Pytorch模块一样,当我们需要使用大模型生成推理服务时,先加载模型,然后使用输入数据运行该模型,并获取输出结果。 - 在线推理: 在线推理类似于有一个服务器,可以先启动大模型,然后等待来自客户端的请求,一旦接收到请求,就会使用大模型生成推理服务,并返回结果,并且可以同时处理多个请求。
这是两种不同推理方式最本质的区别,毫无疑问在线推理是更加符合实际生产环境的。但为了帮助大家更好的理解Vllm框架,这里我们还是先从离线推理开始讲解,然后再重点讲解在线推理。
Vllm离线推理
from vllm import LLM # 加载模型 llm = LLM(model="deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B") # 传输数据 outputs = llm.generate("你好,我是guslegend") # 获取结果 for output in outputs: prompt = output.prompt generated_text = output.outputs[0].text print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")我们就以DeepSeek-R1-Distill-Qwen-32B大模型为例,默认情况下,LLM(model="deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B")这行命令的执行逻辑是:先检测当前服务器中是否存在deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B的模型权重,如果存在则直接加载该目录下的模型权重,否则会从Hugging Face上下载大模型权重。其存在的主要问题是:国内的服务器是没有办法访问Hugging Face网站的,所以一定会报错。因此,国内的开发者需要采用更有效的方式来确保大模型权重的正确下载,即使用国内镜像源ModelScope来执行模型权重的本地化存储。
首先我们需要安装ModelScope:"pip install modelscope"
接下来回到Linux服务器中,通过vim新建一个model_download.py文件:vim model_download.py
然后,按i键进入编辑模式,将复制的代码粘贴到文件中:
from modelscope import snapshot_download # model_dir = snapshot_download('deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B', cache_dir='/root/autodl-tmp', revision='master') model_dir = snapshot_download('deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B', cache_dir='/home/08_vllm', revision='master')注意,这里cache_dir参数指定的路径是模型权重存储的路径,这里我们指定为/home/08_vllm目录,即模型权重会存储到该目录下。
修改完成后,按Esc键退出编辑模式,再按Shift+:键进入命令模式,输入wq保存并退出。执行如下命令,运行model_download.py文件:" python model_download.py"
耐心等待模型权重下载完成即可。待下载完成后,可以看到/home/08_vllm目录下会多出一个deepseek-ai文件夹,里面存放的就是DeepSeek-R1-Distill-Qwen-1.5B大模型的权重文件。如下图所示:
按照上述流程中model_download.py下载模型的方式,可以允许我们随意下载任意在ModelScope中托管的模型权重至本地,因此这里依次下载了Qwen2.5系列和DeepSeek R1系列的不同尺寸的模型,大家也可以根据自己的需求灵活选择模型。
至此,大模型权重就已经下载完成了。接下来,我们需要做的是配置一个可以加载服务器虚拟环境(即上一步创建的vllm虚拟环境)的Python IDF解释器。这一步就会根据大家实际的开发情况产生不同的配置方法,总的来说会分成以下两种情况:
- 部署大模型的服务器和你要执行代码调用的
Python IDE是同一台服务器,则可以直接选择到对应的虚拟环境并执行代码; - 部署大模型的服务器和你要执行代码调用的
Python IDE不是同一台服务器,则需要通过SSH连接到部署大模型的服务器,然后选择到对应的虚拟环境并执行代码。
同一台服务器的情况非常简单,直接打开Python IDE,选择到对应的虚拟环境并执行代码即可。这里重点介绍第二种情况,即部署大模型的服务器和你要执行代码调用的Python IDE不是同一台服务器。同时这也是最常见的企业开发环境。
这类情况用最通俗的理解是:我们把大模型部署在了局域网/租赁的云服务器中,希望可以在本地电脑上执行代码调用模型服务。这类情况我们要做如下配置:(以Jupyter Notebook为例):
首先进入在局域网/租赁的云服务器的Linux服务器中,在vllm虚拟环境中安装ipykernel和jupyter包,执行如下命令:" pip install ipykernel jupyter"
安全起见,对连接时的密码进行加密处理,否则明文写在配置文件中,容易造成数据安全风险,依次执行如下操作:
from jupyter_server.auth import passwd passwd()完成密码加密后,执行如下命令生成Jupyter Lab 的配置文件(jupyter_lab_config.py):" jupyter lab --generate-config"
使用Vim编辑器,找到如下配置,执行修改:
c.ServerApp.allow_origin = '*' c.ServerApp.allow_remote_access = True c.ServerApp.ip = '0.0.0.0' c.ServerApp.open_browser = False c.ServerApp.password = '加密后的密码'(上一步复制的加密串) c.ServerApp.port = 8002全部配置完成后,在服务器端启动Jupyter Lab服务,通过如下命令后台启动:
nohup jupyter lab --allow-root > jupyterlab.log 2>&1 &
然后,将虚拟环境的Kernel写入Jupyter Lab,执行如下命令,创建一个ipykernel内核:
python -m ipykernel install --user --name vllm --display-name "vllm"