【引子】“千里之行,始于足下”,边走边记,这是大模型系列文字的第38篇文字了。
部署是大模型应用从开发环境迁移到生产环境的最后一步。这一步至关重要,因为任何应用都要最终为用户提供服务,除非你坐而论道,弄的是实验室里的玩具。
大模型应用的部署关注点如下:
一般地,部署一个大模型应用会遵循如下步骤。
使用大型数据集训练或微调 LLM,并使用单独的验证集验证其性能。我们要确保模型已经学习了数据中的底层模式,并很好地推广到未见数据。常见的工具包括 TensorFlow, PyTorch以及Hugging Face Transformers.
对模型训练或微调完成后,需要对模型进行序列化,即将经过训练的模型转换为可移植格式。这是为了可以在不同的环境中轻松地保存、传输和加载模型。例如 在 PyTorch 中,可以使用 torch.save(model.state_dict(), 'model.pth')
。
在 GitLab 上创建和设置一个存储库,提供一个集中的版本控制系统来管理和跟踪对代码和模型文件的更改。同时,使用 Git 跟踪更改并与其他人协作, 有助于维护修改的历史记录,并在必要时进行回滚。
关于Git 的使用在网络上已经有很多资源,也可以参考《老码眼中的Git》。
Docker 是一个容器化部署和管理应用程序的平台。容器是轻量级、可移植且自给自足的环境,它们将应用程序及其依赖项和配置文件打包在一起。这样可以确保应用程序在从开发人员的本地机器到生产服务器的不同环境中一致地运行。
一般地,使用 Docker 将大模型应用容器化的步骤:
docker build -t my-llm-app .
docker run -p 6000:80 my-llm-app
docker tag your-llm-app your-dockerhub-username/your-llm-app
docker push your-dockerhub-username/your-llm-app
自动化构建、测试和部署过程对于维护高质量的软件至关重要。Jenkins 是一个广泛使用的开源自动化服务器,它使开发人员能够可靠、高效地构建、测试和部署他们的应用程序,通过设置 Jenkins 服务器,可以实现持续集成(CI)和持续交付(CD)实践。
Jenkins 流水线是一套插件,下面是如何创建一个简单流水线的步骤:
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
}
}
}
}
2.将 Jenkinsfile 添加到项目存储库的根目录中
3.在Jenkins创建一个新的流水线任务,并运行。Jenkins 会执行Jenkinsfile中定义的步骤。
当然,也可以使用其他工具构建CI/CD流水线,例如,GitLab CI支持基于 YAML 的流水线定义并提供健壮的 CI/CD 功能;CircleCI一个基于云的 CI/CD 工具,以其速度和易于安装而闻名,还支持基于 YAML 的配置,并与 GitHub 和 Bitbucket 很好地集成;Travis CI是另一个与 GitHub 集成的基于云的 CI/CD 工具,使用一个。Yml 文件来定义构建流水线,并且在开源社区中很流行。
K8S 是一个开源平台,旨在自动部署、扩展和操作容器化应用程序。它将组成应用程序的容器分组为逻辑单元,以便于管理和发现。K8S集群可以管理应用容器的部署、扩展和操作,确保它们在各种环境中高效可靠地运行。K8S还抽象了底层的基础结构,提供了一个统一的 API 来管理应用程序的生命周期。
一般地,我们需要创建一个 K8S集群来编排容器化应用程序,并管理应用程序容器的部署、缩放和操作。例如,我们是Google Kubernetes Engine 来创建这个集群,首先下载安装Google Cloud SDK,并完成授权,并完成集群创建:
gcloud auth login
gcloud config set project [MYPROJECT_ID]
gcloud container clusters create my-llm-cluster --zone target_zone --num-nodes 3
接下来,获取K8S的证书,将 kubectl 配置为使用新集群的凭据。
gcloud container clusters get-credentials llm-cluster --zone target_zone
然后,定义在 K8S上部署应用程序的配置。部署配置指定如何部署应用程序,包括副本数量、要使用的容器映像和要公开的端口。服务配置定义应用程序如何与其他组件和外部用户交互。
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的服务配置示例:my_service.yaml :
apiVersion: v1
kind: Service
metadata:
name: my-llm-service
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 80
selector:
app: my-llm-app
然后,使用 K8S配置文件部署应用程序。使用 kubectl,可以应用配置文件来创建并管理 K8S资源。这将使部署过程自动化,从而使应用程序易于管理和扩展。
应用部署配置:
kubectl apply -f my_llm_app_deployment.yaml
应用服务配置:
kubectl apply -f service.yaml
最后,确认部署是否成功。
kubectl get deployments
kubectl get services
这些命令列出了部署和服务,以验证应用程序是否正确运行并能够公开使用。
设置监控工具,如 Prometheus、 Grafana 和 ELK,对于跟踪应用程序的性能和健康状况至关重要。通过提供实时指标和警报,我们快速识别和解决问题,从而确保大模型应用的平稳运行。这些工具收集并可视化数据,能够理解应用程序的行为,检测异常,并维护高可用性和性能。
定期更新和维护大模型应用确保了它们与最新的改进和修复保持同步。这包括定期更新依赖关系、应用安全补丁以及用新数据优化的模型。例行维护保持了应用程序的最佳性能,降低了漏洞的风险,并适应不断变化的需求,确保了可靠和高效的用户体验。
在生产环境中部署大模型应用涉及到几个关键步骤,从模型准备和版本控制到使用 K8S 进行容器化部署。通过利用像 Gitlab、 Jenkins、 Docker 和 K8S 这样的工具,我们可以创建一个健壮的、可伸缩的和可维护的部署流水线,确保了大模型应用在生产环境中可靠地为用户提供服务,从而提供有价值的见解和服务。
部署过程中的每个工具和步骤都有替代方案,工具的选择取决于具体需求和优先事项。理解这些工具以及每个步骤背后的原因能帮助我们做出明智的决策,并成功地在生产环境中部署大模型。