分布式训练training-operator和pytorch-distributed RANK变量不统一解决

  1. 分布式训练training-operator
    分布式训练(Distributed Training)是针对大规模深度学习模型训练的改进,通过将计算操作分发到多台机器上,同时利用网络通信技术实现模型参数共享和梯度信息传递,提高训练效率。在Kubernetes平台上,可以利用training-operator这一工具来实现分布式训练。下面是具体操作步骤:

1)创建Kubernetes集群

2)安装training-operator

kubectl apply -f https://raw.githubusercontent.com/kubeflow/kubeflow/1.2-branch/bootstrap/config/crd/applications/app.k8s.io_v1beta1_trainingjobs.yaml
kubectl apply -f https://raw.githubusercontent.com/kubeflow/kubeflow/1.2-branch/bootstrap/config/default_ns/upstream-images/training-controller-configmap.yaml
kubectl apply -f https://raw.githubusercontent.com/kubeflow/kubeflow/1.2-branch/bootstrap/config/default_ns/upstream-images/pytorch-operator.yaml

3)创建PyTorch分布式训练Job

apiVersion: "kubeflow.org/v1"
kind: "TrainingJob"
metadata:
  name: "pytorch-dist"
spec:
  pyTorchJob:
    chief:
      replicas: 1
      restartPolicy: OnFailure
      template:
        spec:
          containers:
            - image: "pytorch/pytorch:1.6.0-cuda10.1-cudnn7-runtime"
              name: pytorch
              command:
                - "python"
              args:
                - "-m"
                - "torch.distributed.launch"
                - "--nproc_per_node=2"
                - "--nnodes=1"
                - "--node_rank=0"
                - "--master_addr=$(KUBERNETES_SERVICE_HOST)"
                - "--master_port=2222"
                - "/home/pytorch/train.py"

上述配置中定义了一个名为“pytorch-dist”的分布式训练任务,其中包含一个主节点和一个工作节点,每个节点有2个处理器核心,共同训练一个PyTorch深度学习模型。

  1. pytorch-distributed RANK变量不统一解决
    在PyTorch distributed训练中,每个进程都有一个唯一的rank变量,用于在分布式环境中标识进程的唯一身份。然而,在一些情况下,可能会出现多个进程拥有相同的rank值的情况,这会导致分布式训练失败。下面是解决方案:

1)检查每个进程的作者和主机名是否唯一,如果不唯一可以通过以下命令进行修改:

import socket
import os
os.environ['HOSTNAME'] = socket.gethostname()

以上代码将hostname设置为当前进程所在主机的主机名。

2)如果上述方法无法解决问题,可以通过设置进程的启动端口号来保证rank值唯一,如下:

def next_free_port():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(('localhost', 0))
    addr, port = s.getsockname()
    s.close()
    return port

# 获取空闲端口号
port = next_free_port()

# 通过设置环境变量PYTORCH_DIST_INIT_METHOD来设置节点之间的初始化方式
os.environ['PYTORCH_DIST_INIT_METHOD'] = 'tcp://127.0.0.1:{}'.format(port)

以上代码获取一个空闲的端口号,通过环境变量PYTORCH_DIST_INIT_METHOD将该端口号作为初始化方式之一。这样,即使多个进程拥有相同的rank值,也能保证每个进程的初始化方式是唯一的,避免分布式训练失败的问题。

示例说明:

示例1:假设在一个由2个进程组成的分布式训练任务中,每个进程的作者和主机名均相同。这时可以通过设置进程的启动端口号来保证rank值唯一:

import socket
import os

# 设置hostname
os.environ['HOSTNAME'] = socket.gethostname()

# 获取空闲端口号
def next_free_port():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(('localhost', 0))
    addr, port = s.getsockname()
    s.close()
    return port
port = next_free_port()

# 设置环境变量PYTORCH_DIST_INIT_METHOD
os.environ['PYTORCH_DIST_INIT_METHOD'] = 'tcp://127.0.0.1:{}'.format(port)

# 启动分布式训练任务
...

示例2:假设在一个由4个进程组成的分布式训练任务中,每个进程的作者和主机名均相同。这时可以通过设置进程的启动端口号来保证rank值唯一:

import socket
import os

# 设置hostname
os.environ['HOSTNAME'] = socket.gethostname()

# 获取空闲端口号
def next_free_port():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(('localhost', 0))
    addr, port = s.getsockname()
    s.close()
    return port

# 设置环境变量PYTORCH_DIST_INIT_METHOD
os.environ['PYTORCH_DIST_INIT_METHOD'] = 'tcp://127.0.0.1:{}'.format(next_free_port())

# 启动分布式训练任务
...

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:分布式训练training-operator和pytorch-distributed RANK变量不统一解决 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月16日

相关文章

  • 详解使用Pytorch Geometric实现GraphSAGE模型

    我们来详细讲解一下使用 Pytorch Geometric 实现 GraphSAGE 模型的完整攻略。 1. 什么是 GraphSAGE 模型? GraphSAGE 是一个用于图像分类的模型,其主要思想是对于每一个节点,利用其周围的节点的嵌入向量来产生一个向量来描述该节点。这个向量可以作为分类器的输入。为了实现这个思想,GraphSAGE模型主要包含两个部分…

    卷积神经网络 2023年5月15日
    00
  • 第三周学习进度–卷积神经网络简单实践猫狗识别

    本周主要构件了一个卷积神经网络的模型,主要用以识别对应图片的种类,并且能够对图片进行预测 以下就是实现从网上爬取图片之后并识别毫不相干的从百度上查找的猫和狗图片的种类 首先从网上爬取一些图片到本地的文件夹当中,并对图片进行对应标签的标记。 我在网上选取了一些猫和狗的图片,   对爬取的图片进行标记,猫的图片标记A,狗的图片标记B    将对应图片的名称标记到…

    2023年4月8日
    00
  • CUDA并行算法系列之FFT快速卷积

    卷积定义 在维基百科上,卷积定义为: 离散卷积定义为: [ 0, 1, 2, 3]和[0, 1, 2]的卷积例子如下图所示: Python实现(直接卷积) 根据离散卷积的定义,用Python实现: def conv(a, b): N = len(a) M = len(b) YN = N + M – 1 y = [0.0 for i in range(YN)]…

    2023年4月6日
    00
  • [文献阅读]基于卷积神经网络的高光谱图像深度特征提取与分类

    使用3-D CNN提取空-谱信息 主要内容 基于CNN设计了三种FE(Feature Extraction) 结构,分别提取空间,光谱和空-谱特征。其中设计了3-D CNN能够有效的提取空-谱特征,提高了分类的效果。 在训练过程中使用L2 正则化,和 Dropout 来解决训练样本太少导致的过拟合问。题 在影像预处理过程中使用了一种虚拟样本来创造训练样本。 …

    2023年4月6日
    00
  • 3-4 卷积的滑动窗口实现

    假设对象检测算法输入一个 14×14×3 的图像,图像很小。在这里过滤器大小为 5×5,数量是 16, 14×14×3 的图像在过滤器处理之后映射为 10×10×16。然后通过参数为 2×2 的最大池化操作,图像减小到 5×5×16。然后添加一个连接 400 个单元的全连接层,接着再添加一个全连接层,最后通过 softmax 单元输出。这里用 4 个数字来表…

    2023年4月8日
    00
  • CNN中feature map、卷积核、卷积核个数、filter、channel的概念解释,以及CNN 学习过程中卷积核更新的理解

    具体可以看这篇文章,写的很详细。https://blog.csdn.net/xys430381_1/article/details/82529397

    卷积神经网络 2023年4月6日
    00
  • 图卷积网络GCN代码分析(Tensorflow版)

    2019年09月08日 18:27:55 yyl424525 阅读数 267更多 分类专栏: 深度学习   版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/yyl424525/article/details/100634211   文章目录 代码分析 `…

    2023年4月6日
    00
  • TensorFlow卷积神经网络实现手写数字识别以及可视化

    边学习边笔记 https://www.cnblogs.com/felixwang2/p/9190602.html 1 # https://www.cnblogs.com/felixwang2/p/9190602.html 2 # TensorFlow(十):卷积神经网络实现手写数字识别以及可视化 3 4 import tensorflow as tf 5 f…

    卷积神经网络 2023年4月6日
    00
合作推广
合作推广
分享本页
返回顶部