TrainingOperator--PyTorchJob实现机制分析

2023-10-31

前言

Pytorch分布式训练(一)_chenxy02的博客-CSDN博客 可知Pytorch分布式训练实现进程间寻址,主要依靠以下 四个参数:

  • MASTER_ADDR
  • MASTER_PORT
  • WORLD_SIZE
  • RANK

MASTER_PORT和MASTER_ADDR的目的是告诉进程组中负责进程通信协调的核心进程的IP地址和端口。 RANK参数是该进程的id,WORLD_SIZE是说明进程组中进程的个数。
 

从上一篇博客我们可以想到 手工启动分布式训练 有以下缺点:

1、得手工在多个节点上启动多个 python脚本,配置不同的 rank等参数

2、如果是在K8S上起多个 pod 进行分布式训练 ,还得解决IP不确定的问题

3、难以满足用户想在特定情景下动态伸缩节点数的要求

带着这三个问题,我们来解析一下 PyTorchJob (training-operator实现的CRD之一) 的实现机制。

Training-operator 介绍

代码仓库GitHub - kubeflow/training-operator: Training operators on Kubernetes.

如下,Training-operator 提供各位了 各种 K8S 的 custom resources。 使得在 K8S 上进行 TensorFlow/PyTorch/Apache MXNet/XGBoost/MPI/Paddle 框架的分布式训练变得容易。

Training-operator 安装

由 training-operator 在 v1.6 之后才支持 PaddlePaddle,这里我们安装 v1.6.0 版本。

# 在线安装
kubectl apply -k "github.com/kubeflow/training-operator/manifests/overlays/standalone?ref=v1.6.0"

# 离线安装则提前下好training-operator的项目代码,以及镜像 kubeflow/training-operator:v1-5a5f92d

检查安装结果

PytorchJob 入门使用

apply 一个 kind 为 PyTorchJob 的 yaml ,如下:

kubectl apply -n kubeflow -f <<EOF
apiVersion: "kubeflow.org/v1"
kind: PyTorchJob
metadata:
  name: pytorch-simple-001
  namespace: kubeflow
spec:
  pytorchReplicaSpecs:
    Master:
      replicas: 1
      restartPolicy: OnFailure
      template:
        spec:
          containers:
            - name: pytorch
              image: kubeflowkatib/pytorch-mnist:v1beta1-45c5727
              imagePullPolicy: Always
              command:
                - "python3"
                - "/opt/pytorch-mnist/mnist.py"
                - "--epochs=1"
    Worker:
      replicas: 2
      restartPolicy: OnFailure
      template:
        spec:
          containers:
            - name: pytorch
              image: kubeflowkatib/pytorch-mnist:v1beta1-45c5727
              imagePullPolicy: Always
              command:
                - "python3"
                - "/opt/pytorch-mnist/mnist.py"
                - "--epochs=1"
EOF

正常情况下,我们会看到三个running的pod,如下:

 训练完成后,Pod 的状态变成 Completed,如下:

PytorchJob 源码分析

关于 traning-operator 所使用的脚手架工具 kubebuilder 的代码结构可参见 Kubeflow--TFJob实现机制分析_chenxy02的博客-CSDN博客 , 这里我们直接看PyTorchJob的调谐方法 Reconcile()

代码地址:pkg/controller.v1/pytorch/pytorchjob_controller.go

其中,r.ReconcileHPA(pytorchjob) 会根据 pytorchjob.spec.elasticPolicy 字段,对训练任务进行动态扩缩容。利用此,也便可以解决 上述第三个问题——“在特定情景下动态伸缩节点数”。

接下来 我们进到 r.ReconcileJobs(pytorchJob, ……)方法,看一下 PyTorchJob 怎么解决上述前两个问题。在 ReconcileJobs() 方法中调用了 ReconcilePods()方法负责调谐出Pod,pod的数量由 pytorchjob.spec.pytorchReplicaSpecs 决定。

代码地址:github.com/kubeflow/common/pkg/controller.v1/common/pod.go

进入到 jc.createNewPod() 可以发现,training-operator是通过 jc.Controller.SetClusterSpec()方法,根据不同分布式训练框架的需要,为训练容器注入相应的配置。

代码地址:github.com/kubeflow/common/pkg/controller.v1/common/pod.go

代码地址:pkg/controller.v1/pytorch/pytorchjob_controller.go

进入在setPodEnv() 便可以看到 training-operator是怎么为pytorch分布式训练的容器注入所需的 MASTER_PORT、MASTER_ADDR、WORLD_SIZE、RANK 等环境变量。

至此,便解决了上述第一个问题—— “启动多个 python脚本,配置不同的 rank值”

至于上述第二个问题——"多个 pod 进行分布式训练 ,IP不确定的问题"。则是通过为每一个训练节点创建一个Services,通过记录集群内域名来解决。详见:jc.Controller.ReconcileServices方法(代码地址:github.com/kubeflow/common/pkg/controller.v1/common/job.go)

概念对齐

最后我们再对齐一下 WORLD_SIZE、RANK 这两个PyTorchJob自动生成的环境变量该怎么理解。

在多机单进程训练的时候, RANK确实可以是PyTorch官方的对rank的解释(代表该进程在 分布式训练中的序号),WORLD_SIZE 也确定是代表 rank的总数量。

在多机多进程训练则有些不一样,我们先回顾一下,手工做多机多卡(多训练进程)训练是怎么做的。

 在这里,RANK 则对应的是 node_rank (训练节点的序号),WORLD_SIZE则对应的是 nnode (节点的总数)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TrainingOperator--PyTorchJob实现机制分析 的相关文章

随机推荐

  • D3DCompiler_47.dll丢失怎么解决-D3DCompiler_47.dll丢失怎么办

    d3dcompiler47dll丢失怎么解决 很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑的该dll文件没有或者损坏了 这时你只需下载这个d3dcom
  • 大数据从入门到精通(超详细版)之HDFS详解,学不会算我输!!!

    前言 嗨 各位小伙伴 恭喜大家学习到这里 不知道关于大数据前面的知识遗忘程度怎么样了 又或者是对大数据后面的知识是否感兴趣 本文是 大数据从入门到精通 超详细版 的一部分 小伙伴们如果对此感谢兴趣的话 推荐大家按照大数据学习路径开始学习哦
  • eProsima Fast DDS Documentation翻译

    eProsima Fast DDS Documentation eProsima Fast DDS 是 DDS Data Distribution Service 协议的一个C 语言实现版本 该协议由 Object Management G
  • wind matlab接口函数,使用wind量化接口函数wss时出现问题'CWSSService: repeated windcodes.'...

    我之前运行了一次程序 是可以运行的 在把MATLAB关掉一次后 再打开运行 从WIND中下载的数据中只有这一句提示 本来应该是下载某年某月末所有非ST 非停牌 上市超过六个月的A股的收盘价和PE值的 代码如下 load mydata mat
  • Python爬虫(入门+进阶)学习笔记 2-5 Scrapy的中间件

    上一节我们学习怎么去保存爬取的结果 然而大多数时候裸奔的请求很容易被网站反爬技术识别 导致并不能获取到我们想要的数据 我们该怎么做呢 中间件就可以帮你解决这些事 下载中间件 Downloader middlewares Scrapy框架中的
  • spring-jms

    为什么要在博客上总结一下 那么多优秀的博客 网站上的都很清楚 这就好比老师的板书写的再好 和你半毛钱关系没有 总结理解消化为自己的东西才有用 如果看了就能记住能懂 那人人都是专家 因此总结 归纳尤为重要 百度百科给出的 定义 JMS Jav
  • vtk vs2015 win10 64bit 编译注意事项

    记录几个凌乱的关键点 事先安装Qt 我得是5 8版本 需要官网注册之类的 1 关于Python 编译带tcl java python的 vtk 需要很多繁琐的步骤 记录整个过程太恐怖了 vtk暂时不支持python3 支持的还是python
  • XSS Payload绕过云锁学习

    前言 对于我这个菜鸟来说 我通过谷歌百度学习到很多前辈的资料 甚至每句话都是他的指导 我也很感激前辈的为我们铺设的道路 让我们更快的成长起来 我也乐于分享 可能有些知识点过于单调或者久远 请见谅 WAF 前几天花了10买了一个月的服务器 换
  • springboot注解@Order的使用

    使用order属性 设置该类在spring容器中的加载顺序 例如有三个类 Order1 Order2 Order3 其中Order1类如下 Component 把类交给spring容器管理 Order 1 使用order属性 设置该类在sp
  • scanf函数返回值的具体应用

    scanf函数返回值的具体应用 include
  • 小程序动态图片加载失败替换本地图片

    希望效果图 前言 写一个新闻列表 一个页面里就有几十条数据 虽然分页查询 但图片有时候还会加载失败 网速 图片大小等原因 下面说说我的思路 我把新闻列表封装成了一个子组件 1 在子组件标签image中放入error事件 传入index 2
  • 华为8年软件测试工程师感悟 功能测试如何体现自己的价值?

    无论在那个行业都有新人 而每个新人在刚入行时都会经历迷茫到精进的过程 大多数的测试人员也是如此 毕竟谁也不是一开始就是行业大佬 接下来 针对题主提出的问题以及描述的所处情况给大家讲一讲测试新人入行初期如何去摆脱迷茫做好自我提升 PS 这里有
  • Linux学习(十):查看文件系统(dumpe2fs)

    b 列出保留为坏道的部分 一般用不到 h 仅列出superblock的数据 不会列出其他的区块内容 1 找出我的根目录磁盘文件名 并查看文件系统的相关信息 ps df 调出目前挂载的设备 ps Filesystem volume name
  • suse linux下修复文件系统,Suse 11 下一次文件系统修复的案例 .

    操作系统 Suse Linux 11 文件系统 ext3 错误现象 X日 接到告警 检查文件系统 dev sda1发现写入报只读 检查IP存储有告警 随即umount img 但卸载后无法正常挂载 fdisk l显示IO错误 重启应用服务器
  • 如何判断文件是否读到文件结尾

    二进制文件 头文件 include define feof stream stream gt flag IOEOF feof 函数用来检测当前文件流上的文件结束标识 判断是否读到了文件结尾 其原型为 int feof FILE stream
  • 1. Ubuntu 20.04 初始化root密码

    1 以普通用户登录系统 创建root用户的密码 在终端输入命令 sudo passwd root 然后输入设置的密码 输入两次 这样就完成了设置root用户密码了 注意Linux系统下密码是没有回显的
  • servlet.Ajax实现上传文件进度条

    这里关于servlet如何上传文件就先不说了 将如何得到已经上传的文件数据的百分比 首先我们先写一个类这个类要实现ProgressListener这个接口 实现里面的update 方法 代码如下 package com test servl
  • 关于使用2d照片进行3d建模

    转载感言 作者一句业余 搞得弟兄们面红耳赤了 感谢作者的可行性分析 Autodesk 的 123D Catch 让我们能够很简单的根据一组照片构建3D物体 你只需要从各个角度拍摄希望建模的物体 然后通过 123D Catch 将照片上传到
  • Git拒绝在变基上合并不相关的历史

    问 在 git rebase origin development 期间 Git 显示以下错误消息 fatal refusing to merge unrelated histories Error redoing merge 1234de
  • TrainingOperator--PyTorchJob实现机制分析

    前言 由 Pytorch分布式训练 一 chenxy02的博客 CSDN博客 可知Pytorch分布式训练实现进程间寻址 主要依靠以下 四个参数 MASTER ADDR MASTER PORT WORLD SIZE RANK MASTER