分布式训练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日

相关文章

  • fc全连接层的作用、卷积层的作用、pooling层、激活函数的作用

    fc:1.起到分类器的作用。对前层的特征进行一个加权和,(卷积层是将数据输入映射到隐层特征空间)将特征空间通过线性变换映射到样本标记空间(也就是label)   2.1*1卷积等价于fc;跟原feature map一样大小的卷积也等价于fc,也就是输入是一个5*3*3的feature map,用一个3x3x5的卷积去计算就是fc    3.全连接层参数冗余,…

    2023年4月8日
    00
  • tensorflow 实现自定义layer并添加到计算图中

    下面是关于如何实现自定义 layer 并添加到 tensorflow 计算图中的攻略: 1. 创建自定义 layer 类 我们可以通过继承 tensorflow.keras.layers.Layer 类来创建自己的 layer 类。这里假设我们要创建一个简单的全连接层,以下是代码示例: import tensorflow as tf class MyDens…

    卷积神经网络 2023年5月15日
    00
  • 用PyTorch微调预训练卷积神经网络

    转自:http://ruby.ctolib.com/article/wiki/77331 Fine-tune pretrained Convolutional Neural Networks with PyTorch. Features Gives access to the most popular CNN architectures pretrained…

    卷积神经网络 2023年4月8日
    00
  • 卷积操作的维度

    常见的库如opencv, theano等的卷积操作方法(cv2.filter2D, theano.tensor.nnet.conv2d)都有带有\(2d\), 这个2d代表什么呢? # 卷积操作的维度进行conv操作时, 它的前进方向的维度就是conv操作的维度. 例如最常见的图片conv操作只沿长与宽两个方向进行, 所以是$2D$的conv. 若conv操…

    卷积神经网络 2023年4月8日
    00
  • 卷积神经网络CNN经典模型整理Lenet,Alexnet,Googlenet,VGG,Deep Residual Learning(转)

    参考:http://blog.csdn.net/xbinworld/article/details/45619685

    卷积神经网络 2023年4月8日
    00
  • 卷积到底有什么作用?如何做到特征提取?

    [学习笔记] 经过前面的神经网络的基础学习,终于进入我们这章的核心部分,卷积神经网络(CNN, Convolutional Neural Networks)。很多同学学了半天卷积神经网络,但一直有一个最最根本的问题没有搞懂,他也知道怎么做卷积了,也知道怎么做池化了,就是不知道在为什 么这么干?马克-to-win @ 马克java社区:一直云里雾里的。一般的视…

    卷积神经网络 2023年4月8日
    00
  • 使用Pytorch如何完成多分类问题

    使用PyTorch完成多分类问题的攻略分为以下几个步骤: 1.准备数据集 数据集的准备分为两部分:数据的获取和数据的预处理。 数据的获取可以是通过爬虫获取或者是通过下载公开数据集进行获取。在这里我们以下载公开数据集为例,使用的是MNIST手写数字数据集。 import torch import torchvision.transforms as transf…

    卷积神经网络 2023年5月15日
    00
  • 卷积神经网络的变种: PCANet

    前言:昨天和大家聊了聊卷积神经网络,今天给大家带来一篇论文:pca+cnn=pcanet.现在就让我带领大家来了解这篇文章吧。 论文:PCANet:A Simple Deep Learning Baseline for Image Classification 论文地址:https://core.ac.uk/download/pdf/25018742.pdf…

    2023年4月6日
    00
合作推广
合作推广
分享本页
返回顶部