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翻译整理,转载请标明出处