部署是大模型應(yīng)用從開發(fā)環(huán)境遷移到生產(chǎn)環(huán)境的最后一步。這一步至關(guān)重要,因?yàn)槿魏螒?yīng)用都要最終為用戶提供服務(wù),除非你坐而論道,弄的是實(shí)驗(yàn)室里的玩具。
大模型應(yīng)用的部署關(guān)注點(diǎn)如下:
- 可伸縮性: 可伸縮性指的是系統(tǒng)處理不斷增加的工作量的能力,或者為了適應(yīng)這種增長(zhǎng)而擴(kuò)大其潛力的能力。在生產(chǎn)環(huán)境中,大模型應(yīng)用必須能夠處理來(lái)自用戶的潛在的大量請(qǐng)求。例如,在一個(gè)聊天機(jī)器人服務(wù)中,它可能需要每天處理數(shù)千或數(shù)百萬(wàn)次查詢。
- 可靠性: 可靠性確保系統(tǒng)在規(guī)定的時(shí)間內(nèi)始終如一地發(fā)揮其預(yù)期功能而不發(fā)生故障。無(wú)論負(fù)載如何,無(wú)論底層基礎(chǔ)設(shè)施發(fā)生什么變化,大模型應(yīng)用都應(yīng)該提供一致的性能。這涉及到監(jiān)控以及優(yōu)化響應(yīng)時(shí)間和吞吐量。
- 可維護(hù)性: 可維護(hù)性是指為了修正缺陷、提高性能或適應(yīng)變化的環(huán)境而維護(hù)系統(tǒng)的容易程度。模型需要定期更新,包括新數(shù)據(jù)、改進(jìn)的算法或錯(cuò)誤修復(fù)。一個(gè)維護(hù)良好的部署流水線可以確保這些更新可以在沒(méi)有重大停機(jī)或人工干預(yù)的情況下推出。
- 用戶訪問(wèn): 用戶訪問(wèn)是指最終用戶與大模型應(yīng)用交互并利用其功能的能力。部署使得最終用戶可以訪問(wèn)大模型應(yīng)用,無(wú)論他們是內(nèi)部利益相關(guān)者還是外部客戶。
一般地,部署一個(gè)大模型應(yīng)用會(huì)遵循如下步驟。
1. 模型準(zhǔn)備
使用大型數(shù)據(jù)集訓(xùn)練或微調(diào) LLM,并使用單獨(dú)的驗(yàn)證集驗(yàn)證其性能。我們要確保模型已經(jīng)學(xué)習(xí)了數(shù)據(jù)中的底層模式,并很好地推廣到未見數(shù)據(jù)。常見的工具包括 TensorFlow, PyTorch以及Hugging Face Transformers。
對(duì)模型訓(xùn)練或微調(diào)完成后,需要對(duì)模型進(jìn)行序列化,即將經(jīng)過(guò)訓(xùn)練的模型轉(zhuǎn)換為可移植格式。這是為了可以在不同的環(huán)境中輕松地保存、傳輸和加載模型。例如 在 PyTorch 中,可以使用 torch.save(model.state_dict(), 'model.pth')。
2. 設(shè)置版本控制
在 GitLab 上創(chuàng)建和設(shè)置一個(gè)存儲(chǔ)庫(kù),提供一個(gè)集中的版本控制系統(tǒng)來(lái)管理和跟蹤對(duì)代碼和模型文件的更改。同時(shí),使用 Git 跟蹤更改并與其他人協(xié)作, 有助于維護(hù)修改的歷史記錄,并在必要時(shí)進(jìn)行回滾。
圖片
關(guān)于Git 的使用在網(wǎng)絡(luò)上已經(jīng)有很多資源,也可以參考《老碼眼中的Git》。
3. 使用 Docker 實(shí)現(xiàn)容器化
Docker 是一個(gè)容器化部署和管理應(yīng)用程序的平臺(tái)。容器是輕量級(jí)、可移植且自給自足的環(huán)境,它們將應(yīng)用程序及其依賴項(xiàng)和配置文件打包在一起。這樣可以確保應(yīng)用程序在從開發(fā)人員的本地機(jī)器到生產(chǎn)服務(wù)器的不同環(huán)境中一致地運(yùn)行。
一般地,使用 Docker 將大模型應(yīng)用容器化的步驟:
- 安裝 Docker: 確保系統(tǒng)上安裝了 Docker。您可以從 Docker 的官方網(wǎng)站下載并安裝 Docker。
- 創(chuàng)建 Dockerfile: Dockerfile 是一個(gè)文本文檔,其中包含組裝 Docker 映像的指令。
- 構(gòu)建 Docker 映像: 使用 Docker Build 命令從 Dockerfile 創(chuàng)建 Docker 映像。此映像包含應(yīng)用程序及其所有依賴項(xiàng)。例如,docker build -t my-llm-app .
- 運(yùn)行 Docker容器: 使用 Docker Run 命令從 Docker 映像創(chuàng)建并啟動(dòng)一個(gè)容器。例如,docker run -p 6000:80 my-llm-app
- 驗(yàn)證容器: 確保容器正在運(yùn)行,并且應(yīng)用程序是可訪問(wèn)的。打開網(wǎng)頁(yè)瀏覽器,瀏覽 http://localhost:6000以驗(yàn)證應(yīng)用程序是否正確運(yùn)行。
- 將 Docker 映像推送到注冊(cè)倉(cāng)庫(kù): 為了讓其他人可以使用生成的 Docker 映像,您可以將其推送到自有的 Docker 倉(cāng)庫(kù)。例如:
docker tag your-llm-app your-dockerhub-username/your-llm-app
docker push your-dockerhub-username/your-llm-app
4. 基于Jenkins建立 CI/CD 流水線
自動(dòng)化構(gòu)建、測(cè)試和部署過(guò)程對(duì)于維護(hù)高質(zhì)量的軟件至關(guān)重要。Jenkins 是一個(gè)廣泛使用的開源自動(dòng)化服務(wù)器,它使開發(fā)人員能夠可靠、高效地構(gòu)建、測(cè)試和部署他們的應(yīng)用程序,通過(guò)設(shè)置 Jenkins 服務(wù)器,可以實(shí)現(xiàn)持續(xù)集成(CI)和持續(xù)交付(CD)實(shí)踐。
Jenkins 流水線是一套插件,下面是如何創(chuàng)建一個(gè)簡(jiǎn)單流水線的步驟:
- 創(chuàng)建一個(gè) Jenkinsfile: 這個(gè)文件使用一個(gè)基于 Groovy 的領(lǐng)域特定語(yǔ)言(DSL)來(lái)定義 CI/CD 流水線。例如:
pipeline {
agent any
stages {
stage('Build') {
steps {
echo 'Building...'
sh 'make' // replace with your build command
}
}
stage('Test') {
steps {
echo 'Testing...'
sh 'make test' // replace with your test command
}
}
stage('Deploy') {
steps {
echo 'Deploying...'
sh 'make deploy' // replace with your deploy command
}
}
}
}
- 將 Jenkinsfile 添加到項(xiàng)目存儲(chǔ)庫(kù)的根目錄中。
- 在Jenkins創(chuàng)建一個(gè)新的流水線任務(wù),并運(yùn)行。Jenkins 會(huì)執(zhí)行Jenkinsfile中定義的步驟。
當(dāng)然,也可以使用其他工具構(gòu)建CI/CD流水線,例如,GitLab CI支持基于 YAML 的流水線定義并提供健壯的 CI/CD 功能;CircleCI一個(gè)基于云的 CI/CD 工具,以其速度和易于安裝而聞名,還支持基于 YAML 的配置,并與 GitHub 和 Bitbucket 很好地集成;Travis CI是另一個(gè)與 GitHub 集成的基于云的 CI/CD 工具,使用一個(gè)。Yml 文件來(lái)定義構(gòu)建流水線,并且在開源社區(qū)中很流行。
5. 通過(guò)K8S部署
K8S 是一個(gè)開源平臺(tái),旨在自動(dòng)部署、擴(kuò)展和操作容器化應(yīng)用程序。它將組成應(yīng)用程序的容器分組為邏輯單元,以便于管理和發(fā)現(xiàn)。K8S集群可以管理應(yīng)用容器的部署、擴(kuò)展和操作,確保它們?cè)诟鞣N環(huán)境中高效可靠地運(yùn)行。K8S還抽象了底層的基礎(chǔ)結(jié)構(gòu),提供了一個(gè)統(tǒng)一的 API 來(lái)管理應(yīng)用程序的生命周期。
一般地,我們需要?jiǎng)?chuàng)建一個(gè) K8S集群來(lái)編排容器化應(yīng)用程序,并管理應(yīng)用程序容器的部署、縮放和操作。例如,我們是Google Kubernetes Engine 來(lái)創(chuàng)建這個(gè)集群,首先下載安裝Google Cloud SDK,并完成授權(quán),并完成集群創(chuàng)建:
gcloud auth login
gcloud config set project [MYPROJECT_ID]
gcloud container clusters create my-llm-cluster --zone target_zone --num-nodes 3
接下來(lái),獲取K8S的證書,將 kubectl 配置為使用新集群的憑據(jù)。
gcloud container clusters get-credentials llm-cluster --zone target_zone
然后,定義在 K8S上部署應(yīng)用程序的配置。部署配置指定如何部署應(yīng)用程序,包括副本數(shù)量、要使用的容器映像和要公開的端口。服務(wù)配置定義應(yīng)用程序如何與其他組件和外部用戶交互。
K8S部署配置示例:myllmapp_deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: llm-app-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-llm-app
template:
metadata:
labels:
app: my-llm-app
spec:
containers:
- name: my-llm-app
image: my-dockerhub-username/my-llm-app:latest
ports:
- containerPort: 80
K8S的服務(wù)配置示例:my_service.yaml :apiVersion: v1kind: Servicemetadata:name: my-llm-servicespec:type: LoadBalancerports:- port: 80targetPort: 80selector:app: my-llm-app然后,使用 K8S配置文件部署應(yīng)用程序。使用 kubectl,可以應(yīng)用配置文件來(lái)創(chuàng)建并管理 K8S資源。這將使部署過(guò)程自動(dòng)化,從而使應(yīng)用程序易于管理和擴(kuò)展。
應(yīng)用部署配置:
kubectl apply -f my_llm_app_deployment.yaml
應(yīng)用服務(wù)配置:kubectl apply -f service.yaml。
最后,確認(rèn)部署是否成功。
kubectl get deployments
kubectl get services
這些命令列出了部署和服務(wù),以驗(yàn)證應(yīng)用程序是否正確運(yùn)行并能夠公開使用。
6. 監(jiān)控和維護(hù)
設(shè)置監(jiān)控工具,如 Prometheus、 Grafana 和 ELK,對(duì)于跟蹤應(yīng)用程序的性能和健康狀況至關(guān)重要。通過(guò)提供實(shí)時(shí)指標(biāo)和警報(bào),我們快速識(shí)別和解決問(wèn)題,從而確保大模型應(yīng)用的平穩(wěn)運(yùn)行。這些工具收集并可視化數(shù)據(jù),能夠理解應(yīng)用程序的行為,檢測(cè)異常,并維護(hù)高可用性和性能。
圖片
定期更新和維護(hù)大模型應(yīng)用確保了它們與最新的改進(jìn)和修復(fù)保持同步。這包括定期更新依賴關(guān)系、應(yīng)用安全補(bǔ)丁以及用新數(shù)據(jù)優(yōu)化的模型。例行維護(hù)保持了應(yīng)用程序的最佳性能,降低了漏洞的風(fēng)險(xiǎn),并適應(yīng)不斷變化的需求,確保了可靠和高效的用戶體驗(yàn)。
小結(jié)
在生產(chǎn)環(huán)境中部署大模型應(yīng)用涉及到幾個(gè)關(guān)鍵步驟,從模型準(zhǔn)備和版本控制到使用 K8S 進(jìn)行容器化部署。通過(guò)利用像 Gitlab、 Jenkins、 Docker 和 K8S 這樣的工具,我們可以創(chuàng)建一個(gè)健壯的、可伸縮的和可維護(hù)的部署流水線,確保了大模型應(yīng)用在生產(chǎn)環(huán)境中可靠地為用戶提供服務(wù),從而提供有價(jià)值的見解和服務(wù)。
部署過(guò)程中的每個(gè)工具和步驟都有替代方案,工具的選擇取決于具體需求和優(yōu)先事項(xiàng)。理解這些工具以及每個(gè)步驟背后的原因能幫助我們做出明智的決策,并成功地在生產(chǎn)環(huán)境中部署大模型。