基于 Docker 及 Kubernetes 部署 vLLM:开启机器学习模型服务的新篇章

在当今数字化浪潮中,机器学习模型的高效部署与管理成为众多开发者和企业关注的焦点。vLLM 作为一款性能卓越的大型语言模型推理引擎,其在 Docker 及 Kubernetes 上的部署方式如何呢?本文将深入探讨如何在 Docker 及 Kubernetes 集群中部署 vLLM,充分挖掘其潜力,助力机器学习模型服务的高效开展。

本文分两部分,第一部分介绍 Docker 部署;第二部分介绍基于 Kubernetes 部署。

基于 Docker 部署 vLLM

vLLM作为一款优秀的开源语言模型推理引擎,其在Docker容器中的部署方式为我们提供了一种高效、灵活且可扩展的解决方案。第一部分将深入探讨vLLM的Docker部署方法。

vLLM官方Docker镜像:便捷高效的起点

vLLM团队在Docker Hub上提供了官方Docker镜像vllm/vllm-openai,这为我们快速搭建OpenAI兼容服务器提供了极大的便利。其基本使用命令如下:

docker run --runtime nvidia --gpus all \-v ~/.cache/huggingface:/root/.cache/huggingface \--env "HUGGING_FACE_HUB_TOKEN=<secret>" \-p 8000:8000 \--ipc=host \vllm/vllm-openai:latest \--model mistralai/Mistral-7B-v0.1

此命令中,--runtime nvidia--gpus all参数确保了NVIDIA GPU资源的充分利用;-v参数将本地Hugging Face缓存目录挂载到容器中,便于模型文件的共享与复用;--env参数用于设置环境变量,此处为Hugging Face Hub的认证令牌,保障模型下载的安全性与合法性;-p 8000:8000实现了宿主机与容器的端口映射,使外部能够访问模型服务;--ipc=host标志允许容器访问宿主机的共享内存,这对于vLLM基于PyTorch的进程间通信、尤其是张量并行推理过程至关重要。

值得一提的是,此镜像同样适用于其他容器引擎如Podman。在使用Podman时,命令略有调整:

podman run --gpus all \-v ~/.cache/huggingface:/root/.cache/huggingface \--env "HUGGING_FACE_HUB_TOKEN=$HF_TOKEN" \-p 8000:8000 \--ipc=host \vllm/vllm-openai:latest \--model mistralai/Mistral-7B-v0.1

这里使用$HF_TOKEN变量替代了直接的令牌值,体现了环境变量在不同系统间的适配性与灵活性。

自定义Docker镜像:满足个性化需求的进阶之路

尽管官方镜像功能强大,但在某些场景下,我们可能需要自定义镜像以满足特定需求。例如,当需要添加可选依赖项时,可基于官方镜像构建新的Dockerfile:

FROM vllm/vllm-openai:v0.9.0# e.g. install the `audio` optional dependencies
# NOTE: Make sure the version of vLLM matches the base image!
RUN uv pip install --system vllm[audio]==0.9.0

此Dockerfile以vLLM 0.9.0版本镜像为基础,通过uv pip命令安装了音频处理相关的可选依赖。这为在语音识别、语音合成等多模态任务中应用vLLM提供了可能。

若要使用Hugging Face Transformers库的开发版本,亦可通过自定义Dockerfile实现:

FROM vllm/vllm-openai:latestRUN uv pip install --system git+https://github.com/huggingface/transformers.git

该命令从GitHub源代码仓库安装最新的Transformers库,使我们能够第一时间体验到最新的模型架构与算法优化。

从源码构建Docker镜像:深度定制与优化的关键

对于追求极致性能与功能定制的用户,从源码构建Docker镜像是不二之选。vLLM提供了详细的Dockerfile,位于项目根目录的docker文件夹中。构建命令如下:

# optionally specifies: --build-arg max_jobs=8 --build-arg nvcc_threads=2
DOCKER_BUILDKIT=1 docker build . \--target vllm-openai \--tag vllm/vllm-openai \--file docker/Dockerfile

这里,--target参数指定了构建目标阶段,--tag为生成的镜像指定标签,便于后续管理和使用。DOCKER_BUILDKIT=1启用Docker的现代化构建工具,提升构建效率与性能。

在构建过程中,可根据实际需求添加构建参数。例如,若仅针对当前机器的GPU类型进行构建,可添加--build-arg torch_cuda_arch_list="",使vLLM自动检测并优化CUDA架构配置。对于使用Podman的用户,可能需要添加--security-opt label=disable以禁用SELinux标签,解决潜在的权限问题。

Arm64架构支持:拓展应用场景的前沿探索

随着Arm架构在服务器领域的崛起,vLLM也在积极探索其在Arm64平台(如Nvidia Grace-Hopper)上的应用。尽管目前仍处于实验阶段,但已取得显著进展。构建Arm64镜像的命令如下:

# Example of building on Nvidia GH200 server. (Memory usage: ~15GB, Build time: ~1475s / ~25 min, Image size: 6.93GB)
python3 use_existing_torch.py
DOCKER_BUILDKIT=1 docker build . \--file docker/Dockerfile \--target vllm-openai \--platform "linux/arm64" \-t vllm/vllm-gh200-openai:latest \--build-arg max_jobs=66 \--build-arg nvcc_threads=2 \--build-arg torch_cuda_arch_list="9.0 10.0+PTX" \--build-arg vllm_fa_cmake_gpu_arches="90-real"

此命令中,--platform "linux/arm64"明确指定了目标平台,--build-arg参数用于优化构建过程中的各项配置。然而,由于Arm64构建涉及多个模块的编译,整个过程可能较为耗时且占用大量内存资源。建议在构建前合理设置max_jobsnvcc_threads参数,以平衡构建速度与系统资源占用。

对于在非Arm主机上进行交叉编译的需求,可通过QEMU实现。首先运行以下命令注册QEMU用户静态处理器:

docker run --rm --privileged multiarch/qemu-user-static --reset -p yes

完成QEMU配置后,即可在x86_64等非Arm主机上使用--platform "linux/arm64"标志构建Arm64镜像,为跨平台部署vLLM提供了可能。

使用自定义镜像:从构建到应用的闭环

构建完成自定义镜像后,使用方法与官方镜像类似:

docker run --runtime nvidia --gpus all \-v ~/.cache/huggingface:/root/.cache/huggingface \-p 8000:8000 \--env "HUGGING_FACE_HUB_TOKEN=<secret>" \vllm/vllm-openai <args...>

其中,vllm/vllm-openai应替换为自定义镜像的标签名称。这一步骤标志着从镜像构建到实际应用的闭环形成,使我们能够将定制化的vLLM部署到生产环境中,为各类人工智能应用提供强大的语言模型支持。

在特定版本(0.4.1和0.4.2)中,由于库文件权限问题,可能需要调整环境变量VLLM_NCCL_SO_PATH以确保正常运行。

上面是基于 Docker 的部署,那在 Kubernetes 中如何部署 vllm 呢?

基于 Kubernetes 部署 vLLM

vLLM 在 Kubernetes 上的部署方式更适合云上或分布式运行。这部分将介绍如何在 Kubernetes 集群中部署 vLLM。

部署方式概览

部署 vLLM 于 Kubernetes 上,主要有两种方式:CPU 部署和 GPU 部署 。CPU 部署虽性能较 GPU 稍逊,但能满足日常演示与测试需求;而 GPU 部署则凭借强劲的并行计算能力,为模型推理提供强大动力,保障模型高效、快速响应。

除基础部署外,vLLM 还支持通过多种工具在 Kubernetes 上进行部署,如 Helm、InftyAI/llmaz、KServe、kubernetes-sigs/lws、meta-llama/llama-stack、substratusai/kubeai、vllm-project/aibrix 以及 vllm-project/production-stack 等。这些工具的引入,进一步丰富了部署手段,满足不同用户在实际应用场景下的多样化需求。

CPU 部署实践

进行 CPU 部署时,首先需创建 Kubernetes PVC(PersistentVolumeClaim)和 Secret,用于下载及存储 Hugging Face 模型 。具体操作如下 :

cat <<EOF |kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: vllm-models
spec:accessModes:- ReadWriteOncevolumeMode: Filesystemresources:requests:storage: 50Gi
---
apiVersion: v1
kind: Secret
metadata:name: hf-token-secret
type: Opaque
data:token: $(HF_TOKEN)
EOF

完成上述配置后,启动 vLLM 服务器,创建 Kubernetes Deployment 和 Service :

cat <<EOF |kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:name: vllm-server
spec:replicas: 1selector:matchLabels:app.kubernetes.io/name: vllmtemplate:metadata:labels:app.kubernetes.io/name: vllmspec:containers:- name: vllmimage: vllm/vllm-openai:latestcommand: ["/bin/sh", "-c"]args: ["vllm serve meta-llama/Llama-3.2-1B-Instruct"]env:- name: HUGGING_FACE_HUB_TOKENvalueFrom:secretKeyRef:name: hf-token-secretkey: tokenports:- containerPort: 8000volumeMounts:- name: llama-storagemountPath: /root/.cache/huggingfacevolumes:- name: llama-storagepersistentVolumeClaim:claimName: vllm-models
---
apiVersion: v1
kind: Service
metadata:name: vllm-server
spec:selector:app.kubernetes.io/name: vllmports:- protocol: TCPport: 8000targetPort: 8000type: ClusterIP
EOF

部署完成后,可通过查看服务器日志验证其是否成功启动。执行命令 kubectl logs -l app.kubernetes.io/name=vllm,若日志显示类似以下内容,则表明服务器已正常运行:

INFO:     Started server process [1]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

GPU 部署实践

GPU 部署能显著提升模型推理效率,在开始之前,需确保 Kubernetes 集群已配备 GPU。以下是具体部署步骤:

(一)创建 PVC、Secret 及 Deployment

PVC 用于存储模型缓存,可按需选择存储方式,如 hostPath 等。Secret 仅在访问受限模型时才需配置,若无需使用受限模型,此步骤可跳过。以 NVIDIA GPU 为例,Deployment 配置如下 :

apiVersion: apps/v1
kind: Deployment
metadata:
name: mistral-7b
namespace: default
labels:app: mistral-7b
spec:
replicas: 1
selector:matchLabels:app: mistral-7b
template:metadata:labels:app: mistral-7bspec:volumes:- name: cache-volumepersistentVolumeClaim:claimName: mistral-7b- name: shmemptyDir:medium: MemorysizeLimit: "2Gi"containers:- name: mistral-7bimage: vllm/vllm-openai:latestcommand: ["/bin/sh", "-c"]args: ["vllm serve mistralai/Mistral-7B-Instruct-v0.3 --trust-remote-code --enable-chunked-prefill --max_num_batched_tokens 1024"]env:- name: HUGGING_FACE_HUB_TOKENvalueFrom:secretKeyRef:name: hf-token-secretkey: tokenports:- containerPort: 8000resources:limits:cpu: "10"memory: 20Gnvidia.com/gpu: "1"requests:cpu: "2"memory: 6Gnvidia.com/gpu: "1"volumeMounts:- mountPath: /root/.cache/huggingfacename: cache-volume- name: shmmountPath: /dev/shmlivenessProbe:httpGet:path: /healthport: 8000initialDelaySeconds: 60periodSeconds: 10readinessProbe:httpGet:path: /healthport: 8000initialDelaySeconds: 60periodSeconds: 5

对于 AMD GPU,如 MI300X,其 Deployment 配置略有不同,以下是示例:

apiVersion: apps/v1
kind: Deployment
metadata:
name: mistral-7b
namespace: default
labels:app: mistral-7b
spec:
replicas: 1
selector:matchLabels:app: mistral-7b
template:metadata:labels:app: mistral-7bspec:volumes:- name: cache-volumepersistentVolumeClaim:claimName: mistral-7b- name: shmemptyDir:medium: MemorysizeLimit: "8Gi"hostNetwork: truehostIPC: truecontainers:- name: mistral-7bimage: rocm/vllm:rocm6.2_mi300_ubuntu20.04_py3.9_vllm_0.6.4securityContext:seccompProfile:type: UnconfinedrunAsGroup: 44capabilities:add:- SYS_PTRACEcommand: ["/bin/sh", "-c"]args: ["vllm serve mistralai/Mistral-7B-v0.3 --port 8000 --trust-remote-code --enable-chunked-prefill --max_num_batched_tokens 1024"]env:- name: HUGGING_FACE_HUB_TOKENvalueFrom:secretKeyRef:name: hf-token-secretkey: tokenports:- containerPort: 8000resources:limits:cpu: "10"memory: 20Gamd.com/gpu: "1"requests:cpu: "6"memory: 6Gamd.com/gpu: "1"volumeMounts:- name: cache-volumemountPath: /root/.cache/huggingface- name: shmmountPath: /dev/shm

更全面的示例及相关步骤、yaml 文件可从 https://github.com/ROCm/k8s-device-plugin/tree/master/example/vllm-serve 获取。

(二)创建 Service

为了使外部能访问部署的 vLLM 服务,需创建 Kubernetes Service 。以下是 Service 配置示例:

apiVersion: v1
kind: Service
metadata:name: mistral-7bnamespace: default
spec:ports:- name: http-mistral-7bport: 80protocol: TCPtargetPort: 8000
selector:app: mistral-7b
sessionAffinity: None
type: ClusterIP

(三)部署与测试

完成配置后,使用 kubectl apply -f <filename> 命令应用部署和 Service 配置 。执行以下命令进行测试:

curl http://mistral-7b.default.svc.cluster.local/v1/completions \-H "Content-Type: application/json" \-d '{"model": "mistralai/Mistral-7B-Instruct-v0.3","prompt": "San Francisco is a","max_tokens": 7,"temperature": 0}'

若服务部署成功,将收到 vLLM 模型返回的响应。

总结

vLLM的Docker部署方法丰富多样,从官方镜像的快速应用到自定义镜像的深度定制,再到Arm64架构的前沿探索,为我们提供了全方位的技术解决方案。在科研与实际应用中,合理选择与优化部署策略,将有助于充分发挥vLLM的性能优势,比如单机、简单、高效等。

基于 Kubernetes 部署 vLLM,能充分利用 GPU 资源,实现机器学习模型服务的高效扩展与管理。无论是科研探索还是企业生产场景,这一部署方案都展现出巨大潜力和应用价值。希望本文的介绍能为您提供有益参考,助力大家在实际项目中更好地利用 vLLM 进行模型服务部署,推动机器学习技术在各行业的广泛应用与创新发展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92242.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92242.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工业互联网六大安全挑战的密码“解法”

目录 工业互联网密码技术应用Q&A Q1&#xff1a;设备身份认证与接入控制 Q2&#xff1a;通信数据加密与完整性保护 Q3&#xff1a;远程安全访问 Q4&#xff1a;平台与数据安全 Q5&#xff1a;软件与固件安全 Q6&#xff1a;日志审计与抗抵赖 首传信安-解决方案 总…

基于springboot的在线问卷调查系统的设计与实现(源码+论文)

一、开发环境 1 Java语言 Java语言是当今为止依然在编程语言行业具有生命力的常青树之一。Java语言最原始的诞生&#xff0c;不仅仅是创造者感觉C语言在编程上面很麻烦&#xff0c;如果只是专注于业务逻辑的处理&#xff0c;会导致忽略了各种指针以及垃圾回收这些操作&#x…

民法学学习笔记(个人向) Part.1

民法学学习笔记(个人向) Part.1有关民法条文背后的事理、人心、经济社会基础&#xff1b;民法的结构民法学习的特色就是先学最难的民法总论&#xff0c;再学较难的物权法、合同法等&#xff0c;最后再学习最简单的婚姻、继承、侵权部分。这是一个由难到易的过程&#xff0c;尤为…

ElasticSearch Doc Values和Fielddata详解

一、Doc Values介绍倒排索引在搜索包含指定 term 的文档时效率极高&#xff0c;但在执行相反操作&#xff0c;比如查询一个文档中包含哪些 term&#xff0c;以及进行排序、聚合等与指定字段相关的操作时&#xff0c;表现就很差了&#xff0c;这时候就需要用到 Doc Values。倒排…

【C语言】解决VScode中文乱码问题

文章目录【C语言】解决VScode中文乱码问题弹出无法写入用户设置的处理方法弹出无法在只读编辑器编辑的问题处理方法【C语言】解决VScode中文乱码问题 &#x1f4ac;欢迎交流&#xff1a;在学习过程中如果你有任何疑问或想法&#xff0c;欢迎在评论区留言&#xff0c;我们可以共…

MySQL笔记4

一、范式1.概念与意义范式&#xff08;Normal Form&#xff09;是数据库设计需遵循的规范&#xff0c;解决“设计随意导致后期重构困难”问题。主流有 三大范式&#xff08;1NF、2NF、3NF&#xff09;&#xff0c;还有进阶的 BCNF、4NF、5NF 等&#xff0c;范式间是递进依赖&am…

切比雪夫不等式的理解以及推导【超详细笔记】

文章目录参考教程一、意义1. 正态分布的 3σ 法则2. 不等式的含义3. 不等式的意义二、不等式的证明1. 马尔科夫不等式马尔可夫不等式证明(YYY 为非负随机变量 &#xff09;2. 切比雪夫不等式推导参考教程 一个视频&#xff0c;彻底理解切比雪夫不等式 一、意义 1. 正态分布的…

Spring Boot Jackson 序列化常用配置详解

一、引言在当今的 Web 开发领域&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;已然成为数据交换的中流砥柱。无论是前后端分离架构下前后端之间的数据交互&#xff0c;还是微服务架构里各个微服务之间的通信&#xff0c;JSON 都承担着至关重要的角色 。它…

Jetpack ViewModel LiveData:现代Android架构组件的核心力量

引言在Android应用开发中&#xff0c;数据管理和界面更新一直是开发者面临的重大挑战。传统的开发方式常常导致Activity和Fragment变得臃肿&#xff0c;难以维护&#xff0c;且无法优雅地处理配置变更&#xff08;如屏幕旋转&#xff09;。Jetpack中的ViewModel和LiveData组件正…

Python数据分析案例79——基于征信数据开发信贷风控模型

背景 虽然模型基本都是表格数据那一套了&#xff0c;算法都没什么新鲜点&#xff0c;但是本次数据还是很值得写个案例的&#xff0c;有征信数据&#xff0c;各种&#xff0c;个人&#xff0c;机构&#xff0c;逾期汇总..... 这么多特征来做机器学习模型应该还不错。本次带来&…

板凳-------Mysql cookbook学习 (十二--------3_2)

3.3链接表 结构 P79页 用一个类图来表示EmployeeNode类的结构&#xff0c;展示其属性和关系&#xff1a; plaintext ----------------------------------------- | EmployeeNode | ----------------------------------------- | - emp_no: int …

深度学习图像预处理:统一输入图像尺寸方案

在实际训练中&#xff0c;最常见也最简单的做法&#xff0c;就是在送入网络前把所有图片「变形」到同一个分辨率&#xff08;比如 256256 或 224224&#xff09;&#xff0c;或者先裁剪&#xff0f;填充成同样大小。具体而言&#xff0c;可以分成以下几类方案&#xff1a;一、图…

pytest-log

问题1&#xff1a;我们在运行测试用例的时候如何记录测试的log&#xff0c;如何使用&#xff1f;问题2&#xff1a;我写的函数&#xff0c;为了方便log记录&#xff0c;但是在pytest运行时&#xff0c;会兼容pytest且不会重复记录&#xff0c;怎么解决&#xff1f;1、pytest有内…

在安卓源码中添加自定义jar包给源码中某些模块使用

一、具体步骤 1. 准备目录与 Jar 包 在vendor下 创建新的模块目录&#xff0c;放入demo.jar 包&#xff1a; demojar/ # 模块目录 ├── Android.bp # 编译配置文件 └── demo.jar 2. 编写 Android.bp 配置 Android.bp 示例配置&#xff1a; java_import {…

buntu 22.04 上离线安装Docker 25.0.5(二)

以下有免费的4090云主机提供ubuntu22.04系统的其他入门实践操作 地址&#xff1a;星宇科技 | GPU服务器 高性能云主机 云服务器-登录 相关兑换码星宇社区---4090算力卡免费体验、共享开发社区-CSDN博客 兑换码要是过期了&#xff0c;可以私信我获取最新兑换码&#xff01;&a…

初探 Web 环境下的 LLM 安全:攻击原理与风险边界

文章目录前言1 什么是大型语言模型&#xff08;LLM&#xff09;&#xff1f;1.1 LLM的核心特征1.2 LLM在Web场景中的典型应用2 LLM攻击的核心手段&#xff1a;提示注入与权限滥用3 LLM与API集成的安全隐患&#xff1a;工作流中的漏洞节点3.1 LLM-API集成的典型工作流3.2 工作流…

【新手向】PyTorch常用Tensor shape变换方法

【新手向】PyTorch常用Tensor shape变换方法 前言 B站UP主科研水神大队长的视频中介绍了“缝合模块”大法&#xff0c;其中专门强调了“深度学习 玩的就是shape”。受此启发&#xff0c;专门整理能够调整tensor形状的几个内置函数&#xff0c;方便以后更好地调整PyTorch代码中的…

React 18 vs Vue3:状态管理方案深度对比

🔥 背景: React有Redux、Zustand、Jotai等方案 Vue有Pinia、Vuex 4.x 如何选择适合项目的方案? 🔍 核心对比: 维度 React (Redux Toolkit) Vue3 (Pinia) 类型安全 ✅ 需手动配置TS ✅ 自动类型推导 代码量 较多(需写action) 较少(类似Vuex 5) 响应式原理 不可变数据…

UE5网络联机函数

Find Sessions Create Session Join Session Destroy Session Steam是p2p直接联机 一、steam提供的测试用AppId AppId是steam为每一款游戏所设定的独有标识&#xff0c;每一款要上架steam的游戏都会拥有独一无二的AppId。不过为了方便开发者测试&#xff0c;steam提供了游…

Spring Boot 监控:AOP vs Filter vs Java Agent

01前言 在 高并发 微服务 中&#xff0c; 传统 手动埋点&#xff08;System.currentTimeMillis()&#xff09;就像用体温计量火箭速度——代码侵入、重复劳动、维护爆炸。 下文是无侵入、高精度、全链路 监控 API 耗时&#xff0c;全程不碰业务代码的方案&#xff01; 02实战&…