基于 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
英文地址,請注明出處:http://en.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實戰&…