30 分钟内在 AWS Kubernetes 上克隆 ChatGPT | 通过 Cluster.dev | 2023 年 12 月

在这篇博文中,我将演示如何使用 集群.dev 可以在 Kubernetes 集群之上简化在 AWS 云上通过聊天启动 Hugging Face LLM 之一,并使其做好生产准备。

除了模型、数据集和 Python 库之外,Hugging Face 还提供用于本地推理的 Docker 容器,包括以下项目 文本生成推理 (用于服务模型的 Docker 容器)和 Cat-UI (用于与模型进行交互式聊天的 Docker 映像,类似于 ChatGPT 的界面)。

虽然这对于本地部署和测试来说已经足够了,但将其快速部署到 Kubernetes 将需要相当大的努力和大量配置。

出于这个原因,我们决定为那些希望在其云帐户中部署 LLM 且无需费力处理复杂的基础设施开发和管理的用户简化此流程。

数据科学家通常使用 Python 来测试、微调和服务模型。 然而,在生产方面,DevOps 团队需要将其集成到基础设施代码中。 值得注意的是,与 SageMaker 相比,Kubernetes 的 GPU 节点成本降低了约 20%,并且具有更灵活的可扩展性。 Terraform 通常用于配置生产基础设施,并结合 Helm 将软件部署到 Kubernetes。

Cluster.dev 的开源框架专为需要用最少的命令和文档部署全面的基础设施和软件的场景而设计。 将其视为 Terraform 和 Helm 中的 InstallShield(下一步->下一步->安装),可以在您的云帐户上安装任何软件。 更多详细信息请参见 文档集群.dev

虽然我们将在这里演示使用 Amazon AWS 云和托管 EKS 的工作流程,但它可以适用于任何其他云提供商和 Kubernetes 版本。

先决条件

  • AWS 云帐户凭据。
  • AWS 配额 针对 g5 或其他所需类型的 GPU 实例请求的更改。
  • 集群.dev地形 安装。
  • 从 Hub 选择具有 .safetensors 权重的 Hugging Face 模型。 或者,您可以将模型上传到 S3 存储桶; 请参阅中的示例 引导程序.ipynb
  • Route53 DNS 区域(可选)。

创建一个 S3 Bucket 用于存储状态文件:

aws s3 mb s3://cdev-states

使用示例克隆存储库:

git clone https://github.com/shalb/cdev-examples/
cd cdev-examples/aws/eks-model/cluster.dev/

编辑配置文件

project.yaml — 作为项目的主要配置,定义基本的全局变量,如组织、区域、状态存储桶名称等。 它还方便了全局环境变量的设置。

backend.yaml — 配置 Cluster.dev 状态的后端,包括 Terraform 状态,并依赖于中指定的变量 project.yaml

stack-eks.yaml— 概述了 AWS 基础设施配置,包括 VPC、域和 EKS (Kubernetes) 设置。 详细信息可以在 堆栈文档

这里最重要的部分是 GPU 节点的配置。 指定其容量类型(ON_DEMAND、SPOT)、实例类型和自动缩放设置(最小/最大/所需)。 此外,如果需要,请设置磁盘大小和节点标签。 接下来要配置的关键设置是:

  cluster_name: k8s-model # change this to your cluster name
domain: cluster.dev # if you leave this domain it would be auto-delegated with the zone *.cluster_name.cluster.dev
eks_managed_node_groups:
gpu-nodes:
name: ondemand-gpu-nodes
capacity_type: ON_DEMAND
block_device_mappings:
xvda:
device_name: "/dev/xvda"
ebs:
volume_size: 120
volume_type: "gp3"
delete_on_termination: true
instance_types:
- "g5.xlarge"
labels:
gpu-type: "a10g"
max_size: 1
desired_size: 1
min_size: 0

您可以通过向此 YAML 添加类似的块来创建其他节点组。 请参阅相应的可用设置的完整列表 地形模块

stack-model.yaml — 描述 HF 模型堆栈,参考 中的模型堆栈模板 model-template文件夹并包含必要的 Nvidia 驱动程序的安装。

模型堆栈主要利用来自 Huggingface-模型 Helm 图表,我们已经准备好并继续开发。 检查默认值 值.yaml 查看可用图表选项的完整列表。 以下是您需要调整的主要配置:

  chart:
model:
organization: "HuggingFaceH4"
name: "zephyr-7b-beta"
init:
s3:
enabled: false # if set to false the model would be cloned directly from HF git space
bucketURL: s3://k8s-model-zephyr/llm/deployment/zephyr-7b-beta # see ../bootstrap.ipynb on how to upload model
huggingface:
args:
- "--max-total-tokens"
- "4048"
#- --quantize
#- "awq"
replicaCount: 1
persistence:
accessModes:
- ReadWriteOnce
storageClassName: gp2
storage: 100Gi
resources:
requests:
cpu: "2"
memory: "8Gi"
limits:
nvidia.com/gpu: 1
chat:
enabled: true

部署堆栈

完成设置后,您只需一个命令即可部署所有内容:

cdev apply

要创建的资源列表:

Plan results:
+----------------------------+
| WILL BE DEPLOYED |
+----------------------------+
| cluster.route53 |
| cluster.vpc |
| cluster.eks |
| cluster.eks-addons |
| cluster.kubeconfig |
| cluster.outputs |
| model.nvidia-device-plugin |
| model.model |
| model.outputs |
+----------------------------+

整个过程大约需要30分钟,观看视频了解一下:

让我们考虑一下可以在此堆栈顶部执行的一些任务。

与 Kubernetes 交互

kubeconfig 部署堆栈后获得的文件将使您能够授权集群、检查工作负载、日志等:

# First we need to export KUBECONFIG to use kubectl
export KUBECONFIG=`pwd`/kubeconfig
# Then we can examine workloads deployed in the `default` namespace, since we have defined it in the stack-model.yaml
kubectl get pod
# To get logs from model startup, check if the model is loaded without errors
kubectl logs -f
# To list services (should be model, chat and mongo if chat is enabled)
kubectl get svc
# Then you can port-forward the service to your host
kubectl port-forward svc/ 8080:8080
# Now you can chat with your model
curl 127.0.0.1:8080/generate
-X POST
-d '{"inputs":"Continue funny story: John decide to stick finger into outlet","parameters":{"max_new_tokens":1000}}'
-H 'Content-Type: application/json'

更改节点大小和类型

考虑这样一个场景,您有一个大型模型,需要使用大量实例为其提供服务,最好使用经济高效的现货实例。 要实现此目的,您只需更改节点组的类型:

    gpu-nodes:
name: spot-gpu-nodes
capacity_type: SPOT
block_device_mappings:
xvda:
device_name: "/dev/xvda"
ebs:
volume_size: 120
volume_type: "gp3"
delete_on_termination: true
instance_types:
- "g5.12xlarge"
labels:
gpu-type: "a10g"
max_size: 1
desired_size: 1
min_size: 0

进行更改后,通过运行应用它们 cdev apply

请记住,竞价实例可能并不总是在该区域可用。 如果无法满足现货请求,请在 EC2 -> Auto Scaling groups -> eks-spot-gpu-nodes -> Activity 下检查您的 AWS 控制台。 如果失败,考虑更改为 ON_DEMAND或调整清单中的instance_types,然后重新运行 cdev apply

改变型号

要更改模型,只需编辑其名称和组织即可。 然后通过运行应用更改 cdev apply

    model:
organization: "WizardLM"
name: "WizardCoder-15B-V1.0"

启用聊天 UI

要激活 Chat-UI,请设置 chart.chat.enable:true。 这将提供可以通过浏览器进行端口转发和访问的服务。 对于外部访问,包括入口配置,如示例中所示:

    chat:
enabled: true
modelConfig:
extraEnvVars:
- name: PUBLIC_ORIGIN
value: "http://localhost:8080"
ingress:
enabled: true
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
hosts:
- host: chat.k8s-model.cluster.dev
paths:
- path: /
pathType: Prefix
tls:
- hosts:
- chat.k8s-model.cluster.dev
secretName: huggingface-model-chat

如果您正在使用 cluster.dev 域与您的项目前缀(请确保它是唯一的),DNS区域将自动配置。 该域的 HTTPS 证书也会自动生成。 要监控进度,请使用以下命令: kubectl describe certificaterequests.cert-manager.io

如果您想公开您的模型的 API,请在相应的模型部分中配置 Ingress。

监控和指标

有关设置 Prometheus 和 Grafana 进行监控的说明,请参阅 引导程序.ipynb。 我们计划发布一个新的堆栈模板,通过单个选项启用监控。

在此 Loom 视频中,您可以看到 Grafana 的配置:

随意开始一个 讨论 在我们的 GitHub 存储库中。

运行 HF 模型的方法有很多种。 本文介绍了使用 Cluster.dev 作为基础设施安装程序在 AWS 云上启动带有聊天功能的 LLM 的场景。 我们相信,对于想要使用 IaC 方法为其组织快速部署其类似 ChatGPT 模型版本的精通 Kubernetes 用户来说,这将特别有用。

谢谢!
弗拉基米尔·察普,
首席技术官
集群.dev

1706358399
#分钟内在 #AWS #Kubernetes #上克隆 #ChatGPT #通过 #Cluster.dev #年 #月
2024-01-27 10:43:30

Leave a Reply

Your email address will not be published. Required fields are marked *

近期新闻​

编辑精选​