如何使用K3s和vLLM引擎在單個NVIDIA Jetson AGX Orin Developer上部署LLM模型
llm或大型語言模型由于能夠生成類似人類的文本而在各個領域具有廣泛的應用。在現(xiàn)實場景中有效地部署它們帶來了獨特的挑戰(zhàn)。這些模型需要大量的計算資源、無縫的可伸縮性和高效的流量管理,以滿足生產(chǎn)環(huán)境的需求。這就是Kubernetes變得至關重要的地方。輕量級Kubernetes發(fā)行版在本地開發(fā)中越來越受歡迎,例如K3s、K3d、Kind、Minikube和microk8在這種情況下特別有用。這些工具的目的相似。他們在一臺機器上管理Kubernetes。
在這篇博文中,您將學習如何開始使用k3s Kubernetes集群在NVIDIA Jetson AGX Orin開發(fā)工具包上運行LLM。K3s是一個官方的云原生計算基金會沙盒項目,它帶來了一個輕量級的、完全兼容的Kubernetes發(fā)行版,專為在資源有限的生產(chǎn)環(huán)境中使用而設計,針對ARM64進行了優(yōu)化,使其成為小規(guī)模和邊緣部署的理想選擇,如NVIDIA Jetson AGX Orin開發(fā)工具包。
下圖顯示了您在閱讀本文后將獲得的目標基礎設施。
我相信K3s使GPU直通到集群更容易,因為它可能只需要依賴Nvidia CUDA和Docker。為了實現(xiàn)這一點,默認的Docker運行時位于/etc/docker/daemon.Json需要修改。帶有NVIDIA運行時支持的Docker安裝說明可在NVIDIA Jetson AI實驗室獲得:
在開始本教程之前,請確保您具有Kubernetes的基本知識。必須熟悉kubectl、部署、服務和pod。
使用Docker Runtime安裝K3s
使用Docker作為容器運行時安裝K3s,并使kubecconfig文件可讀。
并完成了!您已經(jīng)在本地安裝了Kubernetes集群。只需要一行代碼,就可以運行一個K3s集群(包括負載平衡器、入口、存儲類、coreDNS等)。這也將自動在NVIDIA Jetson AGX Orin上安裝kubectl。
安裝完成后,可以通過運行以下命令來驗證集群的狀態(tài):
輸出應該是一個集群節(jié)點列表,目前只有一個,或者運行:
為了有效地管理Kubernetes應用程序,您可以安裝Helm,它是Kubernetes的包管理器。創(chuàng)建一個shell腳本(例如,install_helm.sh),內(nèi)容如下:
保存此腳本并使用命令執(zhí)行:
要驗證Kubernetes環(huán)境并可能訪問pod中的GPU資源,請創(chuàng)建一個名為test的YAML文件。Yaml具有以下規(guī)格:
使用以下命令將此配置應用到Kubernetes集群:
一旦pod轉(zhuǎn)換到Running狀態(tài),您可以獲得對容器的交互式shell訪問,以執(zhí)行具有CUDA支持的Python代碼:
執(zhí)行以下命令,確認圖形處理器已被識別。
輸出Orin確認容器內(nèi)的PyTorch環(huán)境可以成功檢測和利用NVIDIA Jetson AGX Orin的GPU。既然已經(jīng)創(chuàng)建了集群,就可以部署運行vLLM的Kubernetes Pod了。
部署vLLM生產(chǎn)棧
vLLM生產(chǎn)堆棧是構(gòu)建在vLLM之上的推理堆棧的開源參考實現(xiàn)。我們將創(chuàng)建一個Kubernetes部署和服務來管理和公開LLM應用程序。
首先,我們需要為專門為NVIDIA Jetson AGX Orin Developer Kit的arm64架構(gòu)設計的vLLM路由器創(chuàng)建一個自定義Docker映像。
創(chuàng)建一個Dockerfile,內(nèi)容如下:
導航到包含Dockerfile的目錄,在終端中執(zhí)行以下命令來構(gòu)建Docker鏡像:
生成的Docker映像將被標記為vLLM -router-arm64,并可用于在NVIDIA Jetson AGX Orin上部署vLLM路由器。最后,將其推送到容器注冊表(如Docker Hub)。
然后,克隆vLLM生產(chǎn)棧存儲庫:
添加vLLM Helm存儲庫:
幸運的是,已經(jīng)存在vLLM的容器映像,因此您不必擔心自己構(gòu)建Dockerfile。
在使用Helm部署vLLM生產(chǎn)堆棧時,需要修改這些值。使用自定義的ARM64路由器映像。在你的值中找到routerSpec部分。Yaml文件(在tutorial /assets/values-02-basic-config中)。Yaml或您的自定義配置),并更新如下:
我們將使用vLLM在Kubernetes集群上部署一個LLM模型(meta-llama/Llama-3.2-1B-Instruct)。
使用Helm安裝vLLM堆棧:
您應該看到指示成功部署Helm圖表的輸出:
現(xiàn)在已經(jīng)部署了帶有兩個副本的Kubernetes部署,因此您可以開始測試它是否有效。
檢查Kubernetes集群中pod的狀態(tài):
您應該看到vLLM路由器和服務引擎的pod處于運行狀態(tài)。你可以檢查路由器pod的日志,以確保它正確運行并服務API請求:
要從Kubernetes集群外部訪問vLLM路由器,可能需要使用端口轉(zhuǎn)發(fā)或負載平衡器公開服務。端口轉(zhuǎn)發(fā)示例如下:
現(xiàn)在可以向vLLM路由器API發(fā)送請求。
您應該收到一個JSON響應,其中列出了vLLM堆棧提供的可用模型:
部署完成后,你可以像這樣發(fā)送一個測試請求:
以下輸出顯示了模型響應的示例:
它像預期的那樣工作?,F(xiàn)在讓我們使用jtop監(jiān)控解決方案檢查內(nèi)存消耗情況。
要擴展副本的數(shù)量,請更新replicaccount的值。并重新部署Helm圖表。擴展副本的數(shù)量可以提高性能和可用性,但監(jiān)控資源消耗并確保Kubernetes集群有足夠的資源來適應增加的負載是至關重要的。
將replicaccount設置為3后的輸出示例:
高內(nèi)存使用率可能導致性能下降,甚至出現(xiàn)內(nèi)存不足(OOM)錯誤,從而導致pod崩潰。內(nèi)存消耗為
在將replicaccount更新為4并重新部署后,使用kubectl get pods檢查pod可能會顯示由于CPU資源不足而導致掛起的pod:
在您的值中縮放replicaccount時。您正在指示Kubernetes為您的vLLM部署創(chuàng)建更多實例(pod)。每個pod都需要CPU和內(nèi)存資源。
使用兩個副本部署Llama 3.1 8B指令模型
本演練演示了如何在Kubernetes集群上部署強大的Llama 3.1 8B指令語言模型,利用vLLM推理引擎進行高效服務
現(xiàn)在部署已經(jīng)啟動并運行,讓我們發(fā)送一個測試請求,以確保模型正常工作。
如果請求成功,您將收到一個類似于以下內(nèi)容的JSON響應:
現(xiàn)在可以使用監(jiān)視工具(如jtop)驗證內(nèi)存消耗情況。
恭喜你!您已經(jīng)使用vLLM在Kubernetes集群上成功地部署了Llama 3.1 8B指令語言模型和兩個副本。這種設置提供了一種可伸縮的、可能更具彈性的推理服務。
卸載堆疊,使用命令:
使用Grafana和Prometheus監(jiān)控和記錄
監(jiān)視和日志記錄對于維護和排除LLM應用程序的故障至關重要。Prometheus是一個收集和存儲時間序列數(shù)據(jù)的開源監(jiān)控和警報工具,而Grafana是一個流行的數(shù)據(jù)可視化平臺,允許您創(chuàng)建交互式儀表板和可視化。
導航到observability文件夾。然后運行安裝腳本:
安裝輸出:
已成功安裝kube-prometheus-stack。將Grafana儀表板端口轉(zhuǎn)發(fā)到本地node-port:
轉(zhuǎn)發(fā)普羅米修斯儀表板:
現(xiàn)在你可以瀏覽Grafana Dashboard了。
通過組合這些工具,您可以對Kubernetes集群的性能和健康狀況獲得有價值的見解,從而更容易識別和排除問題,包括自動伸縮、監(jiān)控和服務發(fā)現(xiàn),并且您的設置可以有效地處理實際需求。
本文編譯自hackster.io