基于Truss+Docker+Kubernetes把开源模型Falcon-7B送上云端(译)(下)

简介: 基于Truss+Docker+Kubernetes把开源模型Falcon-7B送上云端(译)(下)


步骤4:将模型部署到生产环境中



我在这里使用“生产”这个词算是相当松散的表达方式。我们将在Kubernetes中运行我们的模型,因为在此环境里可以轻松地扩展和处理可变数量的流量。


话虽如此,Kubernetes提供了很多配置,如网络策略、存储、配置映射、负载平衡、机密管理等。


尽管Kubernetes是为“扩展”和运行“生产”工作负载而构建的,但您需要的许多生产级配置并不是现成可用的。涵盖那些高级的Kubernetes主题的讨论超出了本文的范围,也偏离了我们在这里试图实现的目标。因此,对于这篇博客文章,我们将创建一个基础类型的最小集群。


事不宜迟,让我们抓紧着手创建我们的集群!


先决条件:


  1. 拥有创建了一个项目的对应的谷歌云端账户
  2. 在您的计算机上安装成功gcloud CLI
  3. 请确保您有足够

79dd421ea4498d4d66687ee672e78cc3.png


创建我们的GKE集群


我们将使用谷歌的Kubernetes引擎来创建和管理我们的集群。下面了解一些重要信息:

谷歌的Kubernetes引擎不是免费的。谷歌不会允许我们免费使用功能强大的GPU。话虽如此,我们正在创建一个功能较弱的GPU的单节点集群。这个实验的花费不应该超过1到2美元。

以下是我们将要运行的Kubernetes集群的配置:


  • 1个节点,标准Kubernetes集群
  • 1个Nvidia T4 GPU
  • n1-standard-4机器(4 vCPU,15GB内存)
  • 所有这些都将在一个Spot实例上运行


注意:如果您在另一个地区,并且无法访问完全相同的资源,请随时进行修改。


创建集群的步骤:


1.前往谷歌云控制台,搜索名为Kubernetes Engine的服务:

428eff7afc0fff30557991851dd4cf2a.png


2.单击“创建(CREATE)”按钮:

  • 确保您正在创建一个标准集群,而不是自动驾驶(autopilot)型集群。它应该在页面顶部显示“创建一个Kubernetes集群(Create a kubernetes cluster)”。


3.集群基础:

  • 在“集群基础(Cluster basics)”选项卡中,我们不想做太多更改。只需给集群一个名称。您不需要更改区域或控制平面。

1d379726b57c8a67408742fb1b449d2d.png


4.单击“默认池(default-pool)”选项卡并将节点数更改为1。

5d6bbccf123ccf3526bd1fe0337fff24.png


5.在“默认池(default-pool)”选项卡下,单击左侧边栏中的“节点(Nodes)”选项卡:

  • 将机器配置(General purpose)从通用更改为GPU
  • 选择英伟达T4作为GPU类型,并将数量设置1
  • 启用GPU分时消费(Time-sharing)方式(即使我们不会使用此功能)
  • 将每个GPU的最大共享客户端数设置为8
  • 对于机器类型,选择n1-standard-4(4 vCPU,15 GB内存)
  • 将引导磁盘大小更改为50
  • 向下滚动到最底部,选中上面写着:启用现场虚拟机上的节点(Enable nodes on spot VMs)

a670dee86f2b439b6198a2f4520ad180.pngimage.pngimage.png


配置好集群后,继续往下进行,创建此群集。


谷歌需要几分钟的时间来设置一切。在您的集群启动并运行后,我们需要连接到此群集。为此,打开您的终端并运行以下命令:


gcloud config set compute/zone us-central1-c
gcloud container clusters get-credentials gpu-cluster-1


如果您使用了不同的集群名称区域,请相应地更新这些区域。要检查我们是否已连接,请运行以下命令:

kubectl get nodes


您应该看到1个节点出现在您的终端中。尽管我们的集群有GPU,但它缺少一些我们必须安装的Nvidia驱动程序。值得庆幸的是,安装它们是一件很容易的事情。运行以下命令即可安装驱动程序:

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml


庆祝一下吧,我们终于准备好部署我们的模型了。


部署模型


为了将我们的模型部署到集群上,我们需要创建一个Kubernetes部署。Kubernetes部署允许我们管理容器化模型的实例。在此,我不会深入讨论Kubernetes或如何编写yaml文件,因为这超出了本文主题的范围。


您需要创建一个名为truss-falcon-deployment.yaml的文件。打开该文件并粘贴以下内容:

apiVersion: apps/v1
kind: Deployment
metadata:
 name: truss-falcon-7b
 namespace: default
spec:
 replicas: 1
 selector:
 matchLabels:
 component: truss-falcon-7b-layer
 template:
 metadata:
 labels:
 component: truss-falcon-7b-layer
 spec:
 containers:
 - name: truss-falcon-7b-container
 image: <your_docker_id>/falcon-7b-model:latest
 ports:
 - containerPort: 8080
 resources:
 limits:
 nvidia.com/gpu: 1
---
apiVersion: v1
kind: Service
metadata:
 name: truss-falcon-7b-service
 namespace: default
spec:
 type: ClusterIP
 selector:
 component: truss-falcon-7b-layer
 ports:
 - port: 8080
 protocol: TCP
 targetPort: 8080


发生了什么:

  • 我们告诉Kubernetes,我们想用我们的falcon-7b-model映像创建pods。确保将替换为实际id。如果您没有创建自己的Docker映像,而想使用我的,请将其替换为以下内容:htrivedi05/truss-falcon-7b:latest。
  • 我们通过设置资源限制nvidia.com/GPU:1来启用容器的GPU访问。这告诉Kubernetes只为我们的容器请求一个GPU。
  • 为了与我们的模型交互,我们需要创建一个将在8080端口上运行的Kubernetes服务。


通过在终端中运行以下命令来创建部署:

kubectl create -f truss-falcon-deployment.yaml


如果运行该命令:

kubectl get deployments


你应该看到类似下面这样的显示内容:

1. NAME READY UP-TO-DATE AVAILABLE AGE
2. truss-falcon-7b 0/1 1 0 8s


部署将需要几分钟时间才能更改为就绪状态。记住,每次容器重新启动时,模型都必须从HuggingFace页面下载。您可以通过运行以下命令来检查容器的进度:

kubectl get pods
kubectl logs truss-falcon-7b-8fbb476f4-bggts


相应地更改吊舱名称。

您需要在日志中查找以下内容:

  • 查找打印语句THE DEVICE INFERENCE IS RUNNING ON IS: cuda。这确认了我们的容器已正确连接到GPU。


接下来,您应该看到一些关于正在下载的模型文件的打印语句。

Downloading (…)model.bin.index.json: 100%|██████████| 16.9k/16.9k [00:00<00:00, 1.92MB/s]
Downloading (…)l-00001-of-00002.bin: 100%|██████████| 9.95G/9.95G [02:37<00:00, 63.1MB/s]
Downloading (…)l-00002-of-00002.bin: 100%|██████████| 4.48G/4.48G [01:04<00:00, 69.2MB/s]
Downloading shards: 100%|██████████| 2/2 [03:42<00:00, 111.31s/it][01:04<00:00, 71.3MB/s]


下载模型并创建微服务后,您应该在日志末尾看到以下输出:

{"asctime": "2023-06-29 21:40:40,646", "levelname": "INFO", "message": "Completed model.load() execution in 330588 ms"}


根据此消息,我们可以确认模型已加载并准备好进行推理任务了。


模型推理


我们不能直接调用模型;相反,我们必须调用模型的服务。

运行以下命令即可获取服务的名称:

kubectl get svc


输出结果如下:

AME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.80.0.1 <none> 443/TCP 46m
truss-falcon-7b-service ClusterIP 10.80.1.96 <none> 8080/TCP 6m19s


我们想调用的是truss-falcon-7b服务。为了使服务可访问,我们需要使用以下命令将其端口转发:

kubectl port-forward svc/truss-falcon-7b-service 8080


输出如下:

1. Forwarding from 127.0.0.1:8080 -> 8080
2. Forwarding from [::1]:8080 -> 8080


很漂亮,我们的模型在127.0.0.1:8080作为REST API端点提供。打开任何一个Python脚本,如main.py,并运行以下代码:

import requests
data = {"prompt": "Whats the most interesting thing about a falcon?"}
res = requests.post("http://127.0.0.1:8080/v1/models/model:predict", jsnotallow=data)
print(res.json())


输出如下:

{'data': {'generated_text': 'Whats the most interesting thing about a falcon?\nFalcons are known for their incredible speed and agility in the air, as well as their impressive hunting skills. They are also known for their distinctive feathering, which can vary greatly depending on the species.'}}


哇!我们已经成功地将Falcon 7B模型容器化,并将其作为生产中的微服务成功部署!

您可以随意使用不同的提示来查看模型返回的内容。


关闭集群


一旦你在Falcon 7B上玩得很开心,你可以通过运行以下命令删除你的部署:

kubectl delete -f truss-falcon-deployment.yaml


接下来,转到谷歌云中的Kubernetes引擎,删除Kubernete集群。

注:除非另有说明;否则,本文中所有图片均由作者本人提供。


结论



尽管运行和管理像ChatGPT这样的生产级模型并不容易;但是,随着时间的推移,开发人员可以更好地将自己的模型部署到云中。


在这篇博客文章中,我们谈到了在基本层级上将LLM部署到生产中所需的所有内容。归纳起来,我们首先需要使用Truss打包模型,然后使用Docker将其容器化,最后使用Kubernetes将其部署在云中。我知道要作详细介绍会涉及到很多内容,虽然这不是世界上最容易做的事情,但我们还是做到了。


最后,我希望你能从这篇博文中学到一些有趣的东西。感谢阅读!


多看看优秀的工具


太空电梯、MOSS、ChatGPT等,都预兆着2023年注定不会是平凡的一年。任何新的技术都值得推敲,我们应要有这种敏感性。


这几年隐约碰过低代码,目前比较热门,很多大厂都相继加入。


低代码平台概念:通过自动代码生成和可视化编程,只需要少量代码,即可快速搭建各种应用。


到底啥是低代码,在我看来就是拖拉拽,呼呼呼,一通操作,搞出一套能跑的系统,前端,后端,数据库,一把完成。当然这可能是最终目标。


链接:www.jnpfsoft.com/?csdn,如果你感兴趣,也体验一下。


JNPF的优势就在于它能生成前后台代码,提供了极大的灵活性,能够创建更复杂、定制化的应用。它的架构设计也让开发者无需担心底层技术细节,能够专注于应用逻辑和用户体验的开发。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
16天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
156 77
|
3天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
27 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
27天前
|
Kubernetes 监控 云计算
Docker与Kubernetes的协同工作
Docker与Kubernetes的协同工作
|
27天前
|
运维 Kubernetes Docker
深入理解容器化技术:Docker与Kubernetes的协同工作
深入理解容器化技术:Docker与Kubernetes的协同工作
47 1
|
27天前
|
Kubernetes 开发者 Docker
Docker与Kubernetes的协同工作
Docker与Kubernetes的协同工作
|
1天前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
3天前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
18 2
|
15天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。
|
1月前
|
Kubernetes 监控 Cloud Native
Kubernetes集群的高可用性与伸缩性实践
Kubernetes集群的高可用性与伸缩性实践
73 1
|
2月前
|
JSON Kubernetes 容灾
ACK One应用分发上线:高效管理多集群应用
ACK One应用分发上线,主要介绍了新能力的使用场景