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