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

yizhihongxing
  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卷积神经网络实现手写数字识别以及可视化

    边学习边笔记 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
  • [PyTorch 学习笔记] 3.2 卷积层

    本章代码:https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson3/nn_layers_convolution.py 这篇文章主要介绍了 PyTorch 中常用的卷积层,包括 3 个部分。 卷积有一维卷积、二维卷积、三维卷积。一般情况下,卷积核在几个维度上滑动,就是几维卷积。比如在图…

    2023年4月8日
    00
  • 2019双十一看AI国货—讯飞录音笔SR501勇攀新高峰

    2019双十一看AI国货—讯飞录音笔SR501勇攀新高峰 概述 讯飞录音笔SR501是一款搭载了人工智能技术的便携式录音笔。它拥有着清晰的录音效果和多种语音识别功能,如语音转写和语音翻译等,非常适合学习和工作场合使用。在2019年双十一期间,讯飞录音笔SR501的促销力度非常大,本攻略将提供详细的购买指南。 地点选择 讯飞录音笔SR501在双十一期间能够享受…

    卷积神经网络 2023年5月15日
    00
  • TensorFLow 数学运算的示例代码

    下面是详细讲解“TensorFlow 数学运算的示例代码”的完整攻略,包含两条示例说明。 示例一 1. 代码 import tensorflow as tf a = tf.constant(6.5) b = tf.constant(3.4) c = tf.add(a, b) d = tf.subtract(a, b) with tf.Session() as…

    卷积神经网络 2023年5月15日
    00
  • 卷积神经网络之AlexNet网络模型学习 卷积神经网络之AlexNet网络模型学习

      ImageNet Classification with Deep Convolutional Neural Networks 论文理解  在ImageNet LSVRC-2010上首次使用大型深度卷积神经网络,并获得很好的成果。 数据集:ILSVRC使用ImageNet的一个子集,1000个类别每个类别大约1000张图像。总计,大约120万训练图像,5…

    卷积神经网络 2023年4月6日
    00
  • 基于Python的卷积神经网络和特征提取

    用户1737318发表于人工智能头条订阅 224 在这篇文章中: Lasagne 和 nolearn 加载MNIST数据集 ConvNet体系结构与训练 预测和混淆矩阵 过滤器的可视化 Theano层的功能和特征提取 作者:Christian S.Peron 译者:刘帝伟 摘要:本文展示了如何基于nolearn使用一些卷积层和池化层来建立一个简单的ConvN…

    2023年4月8日
    00
  • 「笔记」多项式任意长度循环卷积

    我们知道\(FFT\)是一个循环卷积。本质上的离散傅里叶变换满足的是这个性质: \[c_k=\sum\limits_{i,j}[i+j=k(mod\ n)]a_ib_j \] 但是由于我们做的长度足够大(\(n\)足够大)所以这种循环卷积卷不回去。这导致我们只能做特定长度的\(FFT,n=2^w\)如果我们需要做任意长度循环卷积呢? 其实稍微推推式子就可以了…

    卷积神经网络 2023年4月7日
    00
  • python神经网络VGG16模型复现及其如何预测详解

    下面是关于Python神经网络VGG16模型复现及其如何预测的攻略,包含两个示例说明。 示例1:使用Keras库复现VGG16模型 以下是一个使用Keras库复现VGG16模型的示例: from keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D, Flat…

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