ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

GPUStack 集成 DigitalOcean:云端 GPU Droplet 集群的创建、自动配置与安全缩容指南

GPUStack 集成 DigitalOcean:云端 GPU Droplet 集群的创建、自动配置与安全缩容指南 后端人工智能模型推理服务集群管理可观测性【免费下载链接】gpustackA GPU cluster manager for high-performance AI model serving (vLLM, SGLang) and on-demand SSH-accessible GPU instances.项目地址https://gitcode.com/gh_mirrors/gp/gpustack点击查看免费下载本指南围绕 GPUStack 的 DigitalOcean 云提供商集群展开从准备 Personal Access Token、配置--server-external-url到通过 Web 控制台创建云凭证、Worker Pool再到理解 droplet 的 cloud-init 自动初始化过程与安全缩容步骤。读完本文你将掌握如何在 GPUStack 中按需拉起 DigitalOcean GPU 工作节点将其纳入统一集群调度并安全地销毁不再需要的 droplet。文中涉及的底层实现均可在 cloud_providers/digital_ocean.py 等源码中逐一印证。背景GPUStack 如何利用云提供商扩展集群GPUStack 支持多种集群形态Docker与Kubernetes属于自托管Self-Host方式而DigitalOcean与SHUIHUA FUTURE则属于云提供商Cloud Provider方式。当创建一个 DigitalOcean 集群时GPUStack 会调用 DigitalOcean API 自动创建 worker即 droplet并将它们加入 GPUStack 集群随后即可在这些节点上部署模型实例。从源码看云提供商的抽象定义在 cloud_providers/abstract.py其生命周期注释清晰说明了调用顺序create_ssh_key—— 在云侧注册 SSH 公钥create_instance—— 携带已创建的 SSH 密钥创建实例wait_for_started—— 等待实例启动wait_for_public_ip—— 等待公网 IP 分配可选create_volumes_and_attach—— 创建并挂载卷delete_instance—— 销毁实例可选delete_ssh_key—— 删除 SSH 密钥DigitalOcean 的具体实现位于 cloud_providers/digital_ocean.py通过官方异步 SDKpydo.aio.Client与https://api.digitalocean.com通信。该客户端将 droplet 的new/active状态映射为 GPUStack 的created/running状态并在启动与公网 IP 分配上分别做轮询等待默认每 15 秒探测一次最多 20 次重试超时抛出TimeoutError。准备工作Token、权限与 Server URL创建 Personal Access Token首先需要注册 DigitalOcean 账号并在其 API 页面创建一个 Personal Access TokenPAT。创建完成后在 GPUStack 的Cloud Credentials页面填入该 Token即可让 GPUStack 以该账号身份调用 DigitalOcean API。注意Token 的作用域必须设置为Full Access。如果使用 Custom Scopes 自定义权限可能会在删除 droplet 时遇到失败。原因在于 GPUStack 销毁 droplet 时调用的是droplets.destroy_with_associated_resources_dangerous见 digital_ocean.py该接口需要较完整的删除权限权限不足会导致清理不彻底。配置--server-external-url启动 GPUStack Server 时必须指定--server-external-url参数。该参数用于在 droplet 创建并启动 worker 后配置 worker 的--server-url——即 droplet 内的 worker 进程通过该地址回连 GPUStack Server API。如果 Server 运行在反向代理之后请务必把代理地址填进去确保公网上的 droplet 能通过该地址访问 GPUStack Server API。该参数在 cmd/start.py 中定义可通过命令行参数--server-external-url或环境变量SERVER_EXTERNAL_URL设置其帮助文本明确说明External URL of the server. Should be set if the server is behind a reverse proxy.当服务器位于反向代理后时应设置。此外start.py 还提供了--trusted-hosts参数作为反向代理场景的补充用于放行X-Forwarded-Host头未设置时由--server-external-url推导两者都未设置时默认*仅在服务器只能通过可信代理访问时才建议如此。创建 DigitalOcean 集群完整步骤可参考 创建 DigitalOcean 集群核心流程如下。第一步创建云凭证Cloud Credential在 GPUStack 的Cloud Credentials页面创建一个 DigitalOcean 云凭证填入上一步生成的 PAT。凭证模型定义在 schemas/clusters.py 中每个凭证归属于一个组织Orgkey与secret分别用于调用云厂商 API。从工厂注册代码cloud_providers/common.py可以看到DigitalOcean 凭证使用credential.secret即 PAT作为 token 构造DigitalOceanClient认证方式为在请求头注入Authorization: Bearer token见 digital_ocean.py。第二步创建集群并选择云提供商进入集群创建页面在Cloud Provider中选择DigitalOcean然后填写Name必填、选择刚创建的云凭证并选择一个支持 GPU Droplet 的区域在此步骤中还需配置GPUStack Server URL即新创建的 droplet 可访问的 GPUStack Server 地址——这正是准备阶段--server-external-url所配置的地址。点击Next进入 Worker Pool 创建环节。第三步创建 Worker PoolWorker Pool 是云端 worker 的批量定义。需要填写以下字段Name—— 池名称Replicas—— 期望的 worker 数量即 droplet 数量Batch Size—— 批量创建的上限控制并发开通数量避免一次性创建过多 droplet 触发限流Instance Type—— DigitalOcean 术语中的 droplet size实例规格选择包含 GPU 的规格接着选择OS ImageWorker Pool 的数据结构定义在 schemas/clusters.py除上述字段外还支持Labels与Volumes。Replicas允许为 0ge0用于先定义池、后续再扩容。支持的操作系统镜像与驱动引导目前仅支持Nvidia 系列 GPU DropletAMD GPU Droplet 经常不可用且只支持Debian 系操作系统。分两种情况Nvidia AI/ML Ready推荐基于 Ubuntu 22.04已预装驱动、CUDA 与 container-toolkit无需额外安装任何软件包Debian 发行版通过 cloud-init 引导安装nvidia-open驱动、CUDA 12.8 与 nvidia-container-toolkit 1.17.8-1Ubuntu 发行版通过 cloud-init 引导安装nvidia-driver-570驱动、CUDA 12.8 与 nvidia-container-toolkit 1.17.8-1。这些版本的判断逻辑与安装命令可在 cloud_providers/user_data.py 中看到镜像 slug 以gpu开头视为 AI/ML Ready 镜像此时只做驱动 setup不重新安装否则若发行版为debian/ubuntu则走install_driver路径——追加build-essential、dkms、linux-headers-generic、curl等包通过 NVIDIA 官方 CUDA 仓库与nvidia-container-toolkit仓库安装指定版本驱动与工具并注册 DKMS 自动编译服务。驱动安装完成后会触发一次重启power_state: reboot重启后由post-reboot.service拉起 worker 容器。Labels 与 VolumesWorker Pool 支持设置Labels和Volumes来定制 worker 的形态Labels会以key:value形式作为 droplet 的 tags 传入 DigitalOcean 创建请求同时 GPUStack 侧也保留cluster_id、worker_id等内部标签见 digital_ocean.py 与 common.pyVolumes会创建 DigitalOcean Block Storage 卷并挂载到 droplet。卷的校验逻辑在 digital_ocean.pysize_gb必须大于 0format仅支持ext4与xfs卷名最长 60 字符源码会追加 worker id 以保证唯一性见 schemas/clusters.py。重要提醒为 droplet 创建并挂载的卷不会自动挂载进 worker 容器。如有需要可以修改 droplet 内的/opt/gpustack-run-worker.sh脚本该脚本由 cloud-init 生成负责docker run拉起 worker 容器见 user_data.py在docker run命令中追加-v参数以按需挂载卷。全部配置完成后点击Save保存集群。等待 Worker 完成供给Provisioning保存集群后前往Workers页面即可看到 DigitalOcean worker 的供给进度。整个供给过程包含以下步骤创建 SSH 密钥GPUStack 生成密钥对并通过 DigitalOceanssh_keysAPI 注册公钥默认 ED25519 算法见 common.pyworker 记录其external_id携带 SSH 密钥创建 droplet调用droplets.create请求体包含 name、image、size、region、ssh_keys、user_data 与 tags见 digital_ocean.py等待 droplet 启动轮询 droplet 状态直至active等待分配公网 IP从 droplet 网络信息中解析类型为public的 IPv4 地址创建卷并挂载到 droplet若 Worker Pool 配置了 Volumesworker 进入Initialized状态等待 worker 容器启动并连接 Server。供给过程中 worker 的状态机在 server/controllers.py 中定义PENDING池创建的初始状态→PROVISIONING开始供给→PROVISIONED供给完成等待注册→ 注册后变为Ready异常则进入ERROR。供给的并发受Batch Size约束——控制器仅在正在供给的 worker 数量小于 batch_size时才继续创建新实例见 controllers.py。值得留意的是cloud-init 的runcmd中会通过 DigitalOcean 元数据服务169.254.169.254写入两份关键文件见 digital_ocean.py/var/lib/gpustack/external_id—— droplet 的 ID用于 GPUStack 关联云实例与 worker/var/lib/gpustack/advertise_address—— droplet 的公网 IP作为 worker 的对外宣告地址。当 worker 达到Ready状态后就可以在其上部署模型了安全缩容 DigitalOcean Worker当一个 DigitalOcean worker 不再需要时请按以下顺序安全销毁对应的 droplet调整 Worker Pool 的副本数将Replicas调整为希望保留的 worker 数量。注意这一步不会自动删除任何 worker只是停止继续供给新的 droplet确认待删除的 worker 上没有部署模型实例Worker Pool 的运维入口位于Clusters页可直接在 worker 列修改副本数或通过Edit按钮调整Name、Replica、Batch Size与Labels见 cluster-management.md按需删除 worker删除后对应的 droplet 会被一并销毁。销毁走的是destroy_with_associated_resources_dangerous接口见 digital_ocean.py这会连带清理 droplet 的关联资源——这也是前文强调 PAT 必须具有 Full Access 权限的原因。补充Worker 与 Server 的连接模式DigitalOcean worker 部署在公网GPUStack Server 需要通过网络回连到这些 worker 才能转发推理请求。连接模式由 worker 的proxy_mode选项控制可在集群的 Worker Configuration YAML 中预设共三种direct—— Server 与网关直连 worker 的宣告地址与端口开销最低但要求 worker 对 Server 直接可达worker—— 请求经由 worker 内置的 HTTP 反向代理转发到本地推理进程Server 仍需可达 worker但只需暴露 worker 端口tunnel—— worker 只建立一条出站WebSocket 连接到 ServerServer 仅通过该隧道访问 worker适用于 worker 无法接受 Server 入站连接的场景如防火墙或 NAT 之后。默认情况下Server 内嵌 worker 使用direct独立 worker 使用worker。对于公网 droplet 场景通常可以直接使用默认模式若你的网络环境特殊可在 Worker Configuration YAML 中设置为tunnel。DigitalOcean worker 通过--server-external-url配置的地址回连 Server因此请确保该地址从 droplet 所在网络可达。总结通过 GPUStack 的 DigitalOcean 云提供商支持你可以用 PAT 建立云凭证选择 GPU 区域与实例规格以 Worker Pool 方式批量开通 GPU droplet依赖 cloud-init 自动完成驱动、CUDA、container-toolkit 的安装与 worker 容器拉起实现开机即就绪借助 Labels 与 Volumes 定制节点形态并在 droplet 内修改/opt/gpustack-run-worker.sh实现卷的按需挂载通过调整副本数与删除 worker 的方式安全缩容避免残留计费资源。需要深入了解的读者可继续阅读 cluster-management.md 中关于 Worker Pool 运维、Worker Configuration YAML 与连接模式的完整说明或直接研读 cloud_providers/digital_ocean.py 与 cloud_providers/user_data.py 的源码实现。赞分享后端人工智能模型推理服务集群管理可观测性【免费下载链接】gpustackA GPU cluster manager for high-performance AI model serving (vLLM, SGLang) and on-demand SSH-accessible GPU instances.项目地址https://gitcode.com/gh_mirrors/gp/gpustack点击查看免费下载相关推荐DigitalOcean Kubernetes 集群自动扩缩容实战autoscaler 项目 DigitalOcean Cloud Provider 接入与配置指南DigitalOcean Kubernetes 集群自动扩缩容实战autoscaler 项目 DigitalOcean Cloud Provider 接入与配弹性伸缩云原生容器编排GPUStack 使用 Kubernetes 集群添加 GPU 集群完整指南GPUStack 使用 Kubernetes 集群添加 GPU 集群完整指南 本教程介绍如何在 GPUStack 中将一个自建 Kubernetes 集群本教后端人工智能模型推理服务集群管理可观测性GPUStack 集群管理完全指南从 Docker Worker 到 Kubernetes 与云厂商集群GPUStack 集群管理完全指南从 Docker Worker 到 Kubernetes 与云厂商集群 GPUStack 将 GPU 资源组织为 集群Cl后端人工智能模型推理服务集群管理可观测性上一篇如何在5分钟内绘制专业电路图Draw.io ECE库完整指南下一篇OptiScaler 完全教程替换游戏上采样器并接入帧生成创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表