NSDT工具推荐Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - AI模型在线查看 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 - 3D道路快速建模

自然语言处理 (NLP) 已取得显着发展,大型语言模型 (LLM) 处于尖端应用的最前沿。 它们理解和生成类人文本的能力已经彻底改变了各个行业。 有效部署和测试这些LLM对于发挥其能力至关重要。

OpenLLM是一个用于在生产中操作大型语言模型 (LLM) 的开源平台。 它允许你在任何开源 LLM 上运行推理、对其进行微调、轻松部署和构建强大的 AI 应用程序。

这篇博文探讨了在 Kubernetes 基础设施上使用 OpenLLM 框架部署 LLM 模型。 为了演示的目的,我使用了由 RTX 3060 GPU 和 Intel i7 12700K 处理器组成的硬件设置,我们深入研究了实现最佳性能的技术方面。

1、环境搭建和Kubernetes配置

在深入 Kubernetes 上的 LLM 部署之前,我们需要确保环境设置正确并且 Kubernetes 集群已准备好运行。

1.1 准备 Kubernetes 集群

设置 Kubernetes 集群需要定义工作节点、网络和编排器。 确保你已安装 Kubernetes 并配置集群。 这可以通过 kubeadm、minikube 等工具、Google Kubernetes Engine (GKE) 和 Amazon EKS 等托管服务来实现。

如果使用kind cluster,则可以按如下方式创建集群:

kind create cluster

1.2 安装依赖项和资源

在集群中,安装必要的依赖项,例如 NVIDIA GPU 驱动程序、CUDA 库和 Kubernetes GPU 支持。 这些组件对于实现 GPU 加速和最大化 LLM 性能至关重要。

要在你的系统上使用 CUDA,需要安装以下软件:

  • 支持 CUDA 的 GPU
  • 具有 gcc 编译器和工具链的受支持的 Linux 版本
  • NVIDIA 开发者门户网站上的 CUDA Toolkit 12.2

2、使用 OpenLLM 加载LLM模型

OpenLLM 支持各种最先进的 LLM,包括 Llama 2、StableLM、Falcon、Dolly、Flan-T5、ChatGLM 和 StarCoder。 它还提供灵活的 API,允许你使用一个命令通过 RESTful API 或 gRPC 为 LLM 提供服务,或者通过 WebUI、CLI、我们的 Python/Javascript 客户端或任何 HTTP 客户端进行查询。

OpenLLM 的一些主要功能:

  • 支持各种最先进的LLM
  • 为 LLM 提供灵活的 API
  • 与其他强大的工具集成
  • 便于使用
  • 开源

要使用 OpenLLM,你需要在系统上安装 Python 3.8(或更高版本)和 pip。 我们强烈建议使用虚拟环境(如 conda)来防止包冲突。

可以使用 pip 安装 OpenLLM,如下所示:

pip install openllm

要验证它是否安装正确,请运行:

openllm -h

要启动 LLM 服务器,例如启动预训练Transformer模型,执行以下操作:

openllm start opt

2.1 选择LLM模型

OpenLLM 框架支持各种预训练的 LLM 模型,例如 GPT-3、GPT-2 和 BERT。 为你的应用程序选择大型语言模型 (LLM) 时,需要考虑的主要因素是:

  • 模型大小 - GPT-3 等较大的模型具有更多参数,可以处理更复杂的任务,而 GPT-2 等较小的模型更适合更简单的用例。
  • 架构 - 针对 GPT-3 等生成式 AI 或理解(例如 BERT)进行优化的模型与不同的用例保持一致。
  • 训练数据——更多高质量、多样化的数据带来更好的泛化能力。
  • 微调 - 可以针对特定领域的数据进一步训练预训练模型以提高性能。
  • 与用例对齐 - 验证特定应用程序和数据的潜在模型,以确保复杂性和功能的正确平衡。

理想的LLM在复杂性、数据要求、计算资源和整体能力方面满足你的需求。 彻底评估选项以选择最合适的。 在本演示中,我们将使用具有 3B 参数的 Dolly-2 模型。

2.2 将选定的模型加载到容器中

容器化增强了可重复性和可移植性。 将你的 LLM 模型、OpenLLM 依赖项和其他相关库打包到 Docker 容器中。 这确保了不同部署之间的一致的运行时环境。

借助 OpenLLM,你可以使用 build 命令轻松为特定模型(例如 dolly-v2-3b)构建 Bento。

openllm build dolly-v2 --model-id databricks/dolly-v2-3b

在此演示中,我们使用 BentoML,它是一个 MLOps 平台,也是 OpenLLM 项目背后的父组织。 一个Bento,在 BentoML 中,是分发单位。 它打包程序的源代码、模型、文件、工件和依赖项。

要容器化你的 Bento,请运行以下命令:

bentoml containerize <name:version> -t dolly-v2-3b:latest --opt progress=plain

这会生成一个与 OCI 兼容的 docker 镜像,可以部署在 docker 运行的任何地方。

你将能够在 $BENTO_HOME\bentos\stabilityai-stablelm-tuned-alpha-3b-service$id\env\docker 中找到 docker 映像。

3、使用 Kubernetes 进行模型推理

高效执行模型推理并在需要时进行扩展是基于 Kubernetes 的 LLM 部署的关键因素。 Kubernetes 的可靠性和可扩展性功能可以帮助有效地扩展生产用例的模型。

3.1 运行LLM模型推理

  • Pod 通信:在 Pod 内设置通信协议以管理模型输入和输出。 这可能涉及 RESTful API 或基于 gRPC 的通信。

OpenLLM 默认情况下在端口 3000 上运行一个 gRPC 服务器。我们可以有一个部署文件,如下所示:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: dolly-v2-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: dolly-v2
  template:
    metadata:
      labels:
        app: dolly-v2
    spec:
      containers:
        - name: dolly-v2
          image: dolly-v2-3b:latest
          imagePullPolicy: Never
          ports:
            - containerPort: 3000

注意:我们假设该映像在本地可用,名称为 dolly-v2-3b,并带有最新标签。 如果将映像推送到存储库,请确保删除 imagePullPolicy 行,并在存储库是私有存储库时将凭据作为机密提供给存储库。

  • 服务:使用服务公开部署,以便在多个 Pod 之间均匀分配传入的推理请求。

我们在 Kubernetes 集群中设置了一个 LoadBalancer 类型的服务,该服务在端口 80 上公开。如果你使用 Ingress,那么它将是 ClusterIP 而不是 LoadBalancer。

apiVersion: v1
kind: Service
metadata:
  name: dolly-v2-service
spec:
  type: LoadBalancer
  selector:
    app: dolly-v2
  ports:
    - name: http
      port: 80
      targetPort: 3000

3.2 水平缩放和自动缩放

  • Pod 水平自动扩展 (HPA):配置 HPA 以根据 CPU 或自定义指标自动调整 Pod 数量。 这确保了最佳的资源利用率。

我们可以为 CPU 配置声明一个 HPA yaml,如下所示:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: dolly-v2-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: dolly-v2-deployment
  minReplicas: 1
  maxReplicas: 10
  targetCPUUtilizationPercentage: 60

对于 GPU 配置,要在 Kubernetes 中收集 GPU 指标,请按照此博客安装 DCGM 服务器。

安装DCGM服务器后,我们可以使用以下命令为GPU内存创建HPA:

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: dolly-v2-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1beta1
    kind: Deployment
    name: dolly-v2-deployment
  minReplicas: 1
  maxReplicas: 10
  metrics:
    - type: Object
      object:
        target:
          kind: Service
          name: dolly-v2-deployment # kubectl get svc | grep dcgm
        metricName: DCGM_FI_DEV_MEM_COPY_UTIL
        targetValue: 80
  • 集群自动扩展:启用集群级自动扩展来管理多个节点上的资源可用性,以适应不同的工作负载。 以下是在 Kubernetes 中配置集群自动缩放的关键步骤:

安装集群自动缩放器插件:

kubectl apply -f https://github.com/kubernetes/autoscaler/releases/download/v1.20.0/cluster-autoscaler-component.yaml

通过在集群配置中设置最小/最大节点来配置自动缩放。

注释要自动缩放的节点组:

kubectl annotate node POOL_NAME cluster-autoscaler.kubernetes.io/safe-to-evict=true

部署支持自动扩展的应用程序,例如基于 HPA 的部署。 当 Pod 不可调度时,自动缩放器将缩放节点池。

根据需要配置自动伸缩参数:

  • 使用 --scale-down-delay 调整放大/缩小延迟
  • 使用 --scale-down-unneeded-time 设置缩小不需要的时间
  • 使用 --max-node-provision-time 限制缩放速度

监控集群自动缩放事件:

kubectl get events | grep ClusterAutoscaler

4、Kubernetes 环境中 LLM 的性能分析

评估 Kubernetes 环境中 LLM 部署的性能涉及延迟测量和资源利用率评估。

4.1 延迟评估

  • 测量延迟:使用 kubectl exec 或自定义脚本等工具来测量 pod 处理输入提示并生成响应所需的时间。 请参阅下面的 python 脚本来确定 GPU 的延迟指标。

用于测试延迟和令牌/秒的 Python 程序。

import torch
from transformers import AutoModelForCausalLM

model_name = "databricks/dolly-v2-3b"
model = AutoModelForCausalLM.from_pretrained(model_name).cuda()
text = "Sample text for benchmarking"
input_ids = model.tokenizer(text, return_tensors="pt").input_ids.cuda()
reps =100
times = []

for i in range(reps):
    start = torch.cuda.Event(enable_timing=True)
    end = torch.cuda.Event(enable_timing=True)
    # Start timer
    start.record()
    # Model inference
    outputs = model(input_ids).logits
    # End timer
    end.record()
    # Sync and get time
    torch.cuda.synchronize()
    times.append(start.elapsed_time(end))

# Calculate TPS
tokens = len(text.split())
tps = (tokens * reps) / sum(times)
# Calculate latency
latency = sum(times) / reps * 1000 # in ms
print(f"Avg TPS: {tps:.2f}")
print(f"Avg Latency: {latency:.2f} ms")
  • 使用 Aviary 比较延迟:

对于想要开始使用 LLM 或想要提高基于 LLM 的应用程序的性能和可扩展性的开发人员来说,Aviary 是一个有价值的工具。 它易于使用并提供了许多功能,使其成为初学者和经验丰富的开发人员的绝佳选择。

4.2 资源利用率和可扩展性洞察

  • 监控资源消耗:利用 Kubernetes 仪表板或 Prometheus 和 Grafana 等监控工具来观察 Pod 之间的资源使用模式。
  • 可扩展性分析:分析Kubernetes如何根据需求动态调整资源,保证资源效率和应用响应能力。

5、结束语

我们试图进行深入的技术分析,证明利用 Kubernetes 进行 LLM 部署的巨大价值。 通过结合 GPU 加速、专用库和 Kubernetes 编排功能,LLM 可以在性能显着提高的情况下进行大规模部署。 特别是,与仅使用 CPU 的变体相比,支持 GPU 的 Pod 延迟降低了 2 倍以上,推理吞吐量提高了近一倍。 Kubernetes 自动缩放还允许 Pod 按需水平缩放,因此查询量可以在不影响响应能力的情况下增加。

总体而言,此分析的结果验证了 Kubernetes 是大规模部署 LLM 的最佳选择。 Kubernetes 上的软件和硬件优化之间的协同作用释放了LLM在现实世界 NLP 用例中的真正潜力。


原文链接:Deploy LLM models on Kubernetes using OpenLLM

BimAnt翻译整理,转载请标明出处