ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Meshery 设计实战:在 GKE 上以 NVIDIA A100 80GB GPU 运行 JAX 多节点分布式「Hello World」

Meshery 设计实战:在 GKE 上以 NVIDIA A100 80GB GPU 运行 JAX 多节点分布式「Hello World」 Meshery 设计实战在 GKE 上以 NVIDIA A100 80GB GPU 运行 JAX 多节点分布式「Hello World」【免费下载链接】mesheryMeshery, the cloud native manager项目地址: https://gitcode.com/GitHub_Trending/me/meshery本篇基于 Meshery 官方 Catalog 中的部署设计Deployment Design「JAX Hello World using NVIDIA GPUs A100-80GB on GKE」讲解如何把一套 JAX 多机多卡分布式训练示例以可视化 Design 的形式托管在 Meshery 中并在 Google Kubernetes EngineGKE的 A2 系列节点NVIDIA A100 80GB Tensor Core GPU上完成部署。读完本文你将掌握该 Design 中每个 Kubernetes 组件Indexed Job、GPU 资源声明、Headless Service的作用与协作方式并能使用mesheryctl design命令将其导入、查看并应用到自己的集群。背景为什么要在 GKE 上跑 JAX 多节点任务JAX 是一个快速发展的 Python 高性能数值计算与机器学习ML研究库广泛应用于大语言模型、药物发现、物理 ML、强化学习和神经图形学等领域。它对开发者与研究者极具吸引力一方面提供易用的 NumPy 风格 API内置自动微分auto differentiation与优化能力另一方面仅需少量代码即可在多节点、多 GPU 系统上发起分布式处理并通过 NVIDIA GPU 上 XLA 优化的内核获得加速性能。然而「少量代码就能分布式」的背后是集群层面繁琐的准备工作需要为每个训练进程分配 GPU 资源、让各进程通过 DNS 互相发现、指定协调者coordinator端口并保证进程间网络可达。本目录条目所描述的 Design正是把这一类集群级配置以声明式、可复用的方式固化下来它在 4 个节点上运行一个简单的 Hello World 应用每个节点 8 个进程、使用 8 张 GPU即共 32 个训练进程、32 张 A100 GPU。该设计的目录条目文档位于 docs/catalog/deployment/8b041687-3c09-4cfd-8613-cf326a54e1b2.md可执行的完整设计定义位于 design.yml。设计文件整体结构该设计遵循 Meshery 设计格式schemaVersion: designs.meshery.io/v1beta1由Components组件与Relationships关系两部分构成。设计中的组件全部来自kubernetes模型类型为 deployment兼容目标为kubernetes。整体组成如下组件Kubernetes 类型作用defaultNamespacev1部署的目标命名空间job-name主 JobJobbatch/v1定义jax-worker容器与分布式协调参数completionMode: Indexedjob-nameGPU 覆盖Jobbatch/v1追加 GPU 资源请求nvidia.com/gpu: 1与 GPU 污点容忍service-nameServicev1Headless ServiceclusterIP: None为进程间 DNS 发现提供稳定地址其配套的包元数据文件 artifacthub-pkg.yml 记录了该设计的版本0.0.1、描述、许可证Apache-2.0以及安装命令提示mesheryctl design import -f。逐个组件拆解1. Namespace部署边界设计中第一个组件是名为default的 Namespacekind: Namespace,version: v1。它界定了后续 Job 与 Service 的部署范围。该组件带有 Meshery 为 Kubernetes 组件注册的通用能力capabilities例如 Performance Test性能测试、Workload Configuration工作负载配置、Labels and Annotations Configuration 以及 Relationships 查看等说明在 Meshery UI 中你可以直接对该组件发起这些操作。2. 主 Job定义 JAX 分布式协调逻辑核心组件是一个batch/v1类型的 Job它定义了训练容器jax-workerspec: template: spec: subdomain: headless-svc containers: - name: jax-worker image: gcr.io/PROJECT/jax/hello:latest command: [python, train.py] args: - --num_processes - WILL_BE_REPLACED - --job_name - WILL_BE_REPLACED - --sub_domain - WILL_BE_REPLACED - --coordinator_port - WILL_BE_REPLACED ports: - containerPort: 1234 restartPolicy: Never completions: 1 parallelism: 1 backoffLimit: 1 completionMode: Indexed这段配置对应 JAX 分布式初始化jax.distributed.initialize所需的关键参数理解它们是把任务跑起来的前提--num_processes参与训练的总进程数。按目录条目的说明4 节点 × 8 进程 32此处应替换为32。--job_name作业名用于在集群内区分不同的训练作业。--sub_domain子域名与 Pod 模板中的subdomain: headless-svc对应是进程间通过 DNS 互相发现的依据。--coordinator_port协调者监听端口与容器声明的containerPort: 1234一致train.py内部会据此建立 gRPC 通信。WILL_BE_REPLACED是设计作者留下的占位符实际部署前必须替换为真实值——这也正是「模板化设计」的典型用法。镜像gcr.io/PROJECT/jax/hello:latest同样包含占位符PROJECT需要替换为你自己的 GCR 项目名该镜像用于在每台 A100 节点上启动 JAX 训练进程。3. GPU 覆盖 Job请求与容忍 A100 GPU第二个 Job 组件是对上一步的增强/覆盖在 Meshery 中以独立组件形式存在通过 Relationships 关联它向 Pod 模板追加 GPU 资源声明与污点容忍containers: - name: jax-worker resources: limits: nvidia.com/gpu: 1 tolerations: - key: nvidia.com/gpu effect: NoSchedule operator: Existsnvidia.com/gpu: 1通过 NVIDIA Device Plugin 暴露的扩展资源声明每个jax-worker容器需要 1 张 GPU。调度器会据此将 Pod 放置到具备可用 A100 GPU 的 A2 节点上。容忍tolerationsGKE 的 GPU 节点通常带有nvidia.com/gpu: NoSchedule污点只有声明了对应容忍的 Pod 才允许被调度上去operator: Exists表示只要污点键存在即容忍无需匹配具体值。4. Headless Service进程间 DNS 发现最后是v1类型的 Service其配置极其精简却至关重要spec: selector: job-name: job-name clusterIP: NoneclusterIP: None表示这是一个 Headless Service。Kubernetes 不会为其分配 ClusterIP而是为每个匹配的 Pod 生成独立的 DNS 记录。selector: {job-name: job-name}选中该 Job 产生的所有 Pod。配合主 Job 中 Pod 模板的subdomain: headless-svc每个jax-workerPod 都可以通过pod-name.headless-svc.namespace.svc.cluster.local形式的稳定域名被其他节点上的进程解析到。这正是 JAX 多节点协调中「进程之间如何找到彼此」的实现机制--sub_domain指向的就是这个 headless-svc。Relationships组件之间如何被串起来与三个组件同级的还有一组 RelationshipsschemaVersion: relationships.meshery.io/v1alpha3它们描述了组件间的关联语义Meshery 在部署与清理时会据此推导正确的处理顺序与依赖关系hierarchical parentinventoryJob/PodTemplate 与 Namespace 之间的父子归属关系——组件所属的命名空间由 Namespace 组件决定通过mutatorRef/mutatedRef把命名空间注入各组件配置。hierarchical siblingmatchlabelsJob 与 Service 之间基于标签的兄弟关系Service 通过job-name: job-name选择器与 Job 产生的 Pod 关联。关系还带有approved/deleted状态说明设计在保存与迭代过程中关系会被重新评估。这些关系体现了 Meshery 设计的核心思想设计是描述性、声明式的组件是构建块关系是它们之间的语义连接详见 Designs 概念文档。部署到 GKE A2 节点前置条件与注意事项目录条目的 patternCaveats 明确提醒「确保网络配置正确并且每个资源都应用了正确的注解」Ensure networking is setup properly and correct annotation are applied to each resource。结合设计内容部署前应确认以下几点节点池集群需包含使用 A2 超算系列机型、配备 A100 80GB GPU 的节点池GKE 中 A2 机型即面向 A100 的节点池。GPU 驱动与 Device PluginGKE 默认节点池可开启 GPU 驱动安装Driver/Device Plugin 就绪后nvidia.com/gpu扩展资源才会在节点上可见Job 才能被调度。网络与注解headless-svc 依赖集群内 DNSCoreDNS正常工作若启用了网络策略或 Service Mesh需要保证 1234 等协调端口在 Pod 之间可达并按设计提示为资源补充正确的注解。替换占位符将PROJECT镜像仓库项目与四个WILL_BE_REPLACED参数替换为真实值后再行部署。从仓库中的 Deployment Engine 概念文档 可以推断该设计的履约路径其全部组件都来自kubernetes模型注册者registrant是已连接的 Kubernetes 集群本身不对外暴露可供 Meshery 调用的网络端口因此这些组件会由 Meshery Server 通过进程内的 Kubernetes 客户端直接应用到所选集群Path A无需 Meshery Adapter 参与。这是大多数 Catalog 中纯 Kubernetes 设计的典型履约方式。使用 mesheryctl 导入并管理该设计该目录条目的设计文件以标准 YAML 格式存放你可以用 Meshery CLI 将其导入自己的 Meshery 实例。mesheryctl design import支持从本地文件系统路径或远程 URL 导入 Helm Chart、Kubernetes Manifest、Docker Compose 或 Meshery 设计详见 mesheryctl design import 命令参考# 导入 Meshery 设计source-type 为 design可省略 mesheryctl design import -f design.yml -s design -n jax-hello-gke # 从本地文件导入并自定义名称 mesheryctl design import -f design.yml -n design-name导入后按 Catalog 概念文档 所列的 CLI 用法还可以这样管理设计# 查看/列出设计 mesheryctl design list mesheryctl design view [design name | ID] # 应用部署设计到当前连接的集群 mesheryctl design apply --file design.yml # 删除设计 mesheryctl design delete --file design.yml如果你从 design.yml 下载文件到本地即可直接执行上面的导入命令。设计被导入后即成为你账号下的可部署单元可在 Meshery UI 中以可视化画布形式查看组件与关系再一键部署到所选环境。延伸从设计到模式Patterns值得说明的是本目录条目被标记为type: deployment其内容是完整的、可直接部署的设计。而 Meshery 生态中还区分了更高一层的抽象——Patterns模式Pattern 是模板化的设计把复杂设计封装为单一可复用组件隐藏底层复杂度便于在团队内传播最佳实践。根据仓库中的 Patterns 概念文档Patterns 是规划中的路线图特性目标版本 v0.9.0。在此之前Catalog 中的设计如本文介绍的 JAX 部署设计正是共享与复用基础设施配置的主要载体你可以在 Catalog 概念文档 中了解将设计发布到 Catalog 的完整审批流程提交 → 管理员审阅 → 校验 → 发布并触发 GitHub Workflow 同步到 Meshery.io。小结「JAX Hello World using NVIDIA GPUs A100-80GB on GKE」这一 Catalog 设计以四个 Kubernetes 组件加一组关系完整描述了在 GKE A2 节点上运行 32 进程 JAX 分布式任务所需的一切Indexed Job 定义分布式协调参数GPU 资源声明与污点容忍保证 Pod 落到 A100 节点Headless Service 提供进程间 DNS 发现。通过mesheryctl design import将其导入 Meshery你可以在可视化画布上审视其结构替换占位符后一键部署——这套「以设计为单位的声明式部署」工作流也正是 Meshery 作为云原生管理器管理 GPU 训练工作负载的典型范式。【免费下载链接】mesheryMeshery, the cloud native manager项目地址: https://gitcode.com/GitHub_Trending/me/meshery创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进