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

相关文章

  • 吴裕雄–天生自然 Tensorflow卷积神经网络:花朵图片识别

    import os import numpy as np import matplotlib.pyplot as plt from PIL import Image, ImageChops from skimage import color,data,transform,io #获取所有数据文件夹名称 fileList = os.listdir(“F:\\d…

    2023年4月8日
    00
  • cs231n—卷积网络可视化,deepdream和风格迁移

    本课介绍了近年来人们对理解卷积网络这个“黑盒子”所做的一些可视化工作,以及deepdream和风格迁移。   1 卷积网络可视化   1.1 可视化第一层的滤波器  我们把卷积网络的第一层滤波器权重进行可视化(权重值缩放到0~255之间)可以发现: 第一层的滤波器可以看做模版匹配,那么它寻找的模式就是一些边和线。也就是说,当滤波器滑动到边和线的时候,会有较大…

    2023年4月6日
    00
  • 卷积编码器—Verilog代码

    卷积编码器—Verilog代码 module conv_encoder( input wire clk, input wire aclr, input wire data_in, input wire nd, output reg [1:0] data_out_v, output reg rdy ); reg [6:1] shift_reg; alway…

    卷积神经网络 2023年4月8日
    00
  • CNN卷积层基础:特征提取+卷积核+反向传播

    本篇介绍卷积层的线性部分 一、与全连接层相比卷积层有什么优势? 卷积层可以节省参数,因为卷积运算利用了图像的局部相关性——分析出一小片区域的特点,加上Pooling层(汇集、汇聚),从附近的卷积结果中再采样选择一些高价值的信息,让特征向少而精的方向前进。 全连接层相当于考虑全局(整张图像)的特征   二、卷积的另一种解释 傅里叶变换:将数据从空间域的展示形式…

    卷积神经网络 2023年4月7日
    00
  • 手写数字识别-卷积神经网络cnn(06-2)

    卷积和池化在深度学习中的作用是对图像和文本信息提取特征的常用方式,特别是在分类领域 卷积:通过不同的卷积核与图像或文本数据矩阵 进行矩阵相乘,得到不同特征的若干组训练特征数据 池化:池化通常有两种最大池化(max-pooling)和平均池化,最大池化就是在一块矩阵区域(比如2X2,4个像素点),取最大的那个值作为输出,平均池化就是取四个像素点的平均值作为输出…

    2023年4月8日
    00
  • 1×1卷积核作用

    1. 实现跨通道的交互和信息整合 对于某个卷积层,无论输入图像有多少个通道,输出图像通道数总是等于卷积核数量! 对多通道图像做1×1卷积,其实就是将输入图像于每个通道乘以卷积系数后加在一起,即相当于把原图像中本来各个独立的通道“联通”在了一起。 2. 进行卷积核通道数的降维和升维 进行降维和升维引起人们重视的(可能)是在GoogleNet里。对于每一个inc…

    2023年4月8日
    00
  • nn.ConvTranspose2d 逆卷积 反卷积

    本文转摘于如下链接:逆卷积的详细解释ConvTranspose2d(fractionally-strided convolutions) https://www.cnblogs.com/wanghui-garcia/p/10791328.htmlpytorch官方手册:https://pytorch.org/docs/stable/nn.html?highl…

    2023年4月8日
    00
  • 可变形卷积 deformable convolution 学习记录

    Deformable ConvNets v1:论文地址:https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch工程地址:https://github.com/felixlaumon/deform-conv 论文地址: Deformable ConvNets v2: More Deform…

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