The client socket has failed to connect to X (errno: 99 - Cannot assign requested address).

这篇具有很好参考价值的文章主要介绍了The client socket has failed to connect to X (errno: 99 - Cannot assign requested address).。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在跑DDP模型时遇到了如下问题.
[W socket.cpp:558] [c10d] The client socket has failed to connect to [localhost]:12355 (errno: 99 - Cannot assign requested address).
测试用的代码如下:

from datetime import datetime
import argparse
import torchvision
import torchvision.transforms as transforms
import torch
import torch.nn as nn
import torch.distributed as dist
from tqdm import tqdm
import torch.multiprocessing as mp
import os


# TCP模式启动很好理解,需要在bash中独立的启动每一个进程,并为每个进程分配好其rank序号。缺点是当进程数多的时候启动比较麻烦。
class ConvNet(nn.Module):
    def __init__(self, num_classes=10):
        super(ConvNet, self).__init__()
        self.layer1 = nn.Sequential(
            nn.Conv2d(1, 16, kernel_size=5, stride=1, padding=2),
            nn.BatchNorm2d(16),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2))
        self.layer2 = nn.Sequential(
            nn.Conv2d(16, 32, kernel_size=5, stride=1, padding=2),
            nn.BatchNorm2d(32),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2))
        self.fc = nn.Linear(7 * 7 * 32, num_classes)

    def forward(self, x):
        out = self.layer1(x)
        out = self.layer2(out)
        out = out.reshape(out.size(0), -1)
        out = self.fc(out)
        return out


def train(gpu, args):
    # ---------------------------- 改动之处1  DDP的初始化----------------------------
    os.environ['MASTER_ADDR'] = args.master_addr
    os.environ['MASTER_PORT'] = args.master_port
    # dist.init_process_group(backend='nccl', init_method=args.init_method, rank=gpu, world_size=args.world_size)
    dist.init_process_group(backend='nccl', rank=gpu, world_size=args.world_size)
    # ------------------------------------------------------------------------------
    model = ConvNet()
    model.cuda(gpu)
    # ---------------------------- 改动之处2  包装模型-------------------------------
    model = nn.SyncBatchNorm.convert_sync_batchnorm(model)  # 转换为同步BN层
    model = nn.parallel.DistributedDataParallel(model, device_ids=[gpu])  # 包装模型
    # ------------------------------------------------------------------------------

    criterion = nn.CrossEntropyLoss().to(gpu)
    optimizer = torch.optim.SGD(model.parameters(), 1e-4)

    train_dataset = torchvision.datasets.MNIST(root='./data',
                                               train=True,
                                               transform=transforms.ToTensor(),
                                               download=True)
    # --------------------------- 改动之处3  Sampler的使用----------------------------
    train_sampler = torch.utils.data.distributed.DistributedSampler(
        train_dataset)  # , num_replicas=args.world_size, rank=gpu)
    # -------------------------------------------------------------------------------
    train_loader = torch.utils.data.DataLoader(dataset=train_dataset,
                                               batch_size=args.batch_size,
                                               shuffle=False,  # 这里的shuffle变为了False
                                               num_workers=2,
                                               pin_memory=True,
                                               sampler=train_sampler)

    start = datetime.now()
    total_step = len(train_loader)
    for epoch in range(args.epochs):
        # -------------------------- 改动之处4  在每个epoch开始前打乱数据顺序-------------------------
        train_loader.sampler.set_epoch(epoch)
        # ------------------------------------------------------------------------------------------
        model.train()
        for i, (images, labels) in enumerate(tqdm(train_loader)):
            images = images.to(gpu)
            labels = labels.to(gpu)
            # ---------------- 改动之处5  控制前向过程中是否使用半精度计算,可不加-------------------------
            with torch.cuda.amp.autocast(enabled=args.use_mix_precision):
                outputs = model(images)
                loss = criterion(outputs, labels)
            # ------------------------------------------------------------------------------------------
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
            # ----------------------- 改动之处6  只让rank0进程打印输出结果-----------------------------
            if (i + 1) % 1000 == 0 and gpu == 0:
                print(f'Epoch [{epoch + 1}/{args.epochs}], Step [{i + 1}/{total_step}], Loss: {loss.item()}')
            # ----------------------------------------------------------------------------------------

    # ----------------------- 改动之处7  清理进程--------------------------------
    dist.destroy_process_group()
    if gpu == 0:
        print("Training complete in: " + str(datetime.now() - start))
    # --------------------------------------------------------------------------


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('-g', '--gpuid', default=0, type=int,
                        help="which gpu to use")
    parser.add_argument('-e', '--epochs', default=2, type=int,
                        metavar='N',
                        help='number of total epochs to run')
    parser.add_argument('-b', '--batch_size', default=4, type=int,
                        metavar='N',
                        help='number of batchsize')

    # ------------------------------- 改动之处 ---------------------------------
    parser.add_argument('--master_addr', default='localhost',
                        help='master address')
    parser.add_argument('--master_port', default='12355',
                        help='master port')
    # parser.add_argument('-r', '--rank', default=0, type=int,
    #                     help='rank of current process')
    parser.add_argument('--world_size', default=2, type=int,
                        help="world size")
    parser.add_argument('--use_mix_precision', default=False,  # 这个不加也没事
                        action='store_true', help="whether to use mix precision")
    # ------------------------------------------------------------------------------
    args = parser.parse_args()
    # train(args.gpuid, args)
    mp.spawn(train, nprocs=args.world_size, args=(args,))


if __name__ == '__main__':
    main()
# 运行方法:直接run

上述代码直接运行会报上述的问题,但是好像不会影响运行(?)
一开始我还以为是端口被占用了,经过检查发现并没有问题,猜测可能是多线程运行导致程序出了问题
同时我发现在如下地方加入一行print()代码就不会报这个错误。

def train(gpu, args):
	print("test")  # 随便打印什么都行
    # ---------------------------- 改动之处1  DDP的初始化----------------------------
    os.environ['MASTER_ADDR'] = args.master_addr
    os.environ['MASTER_PORT'] = args.master_port
    # dist.init_process_group(backend='nccl', init_method=args.init_method, rank=gpu, world_size=args.world_size)
    dist.init_process_group(backend='nccl', rank=gpu, world_size=args.world_size)

更新

好像不大对,加上这个打印有时候也会报错,但是报错频率明显下降,好怪,重新思考一下这个问题

def train(gpu, args):
    # ---------------------------- 改动之处1  DDP的初始化----------------------------
    print(f"{gpu} 11111")
    os.environ['MASTER_ADDR'] = args.master_addr
    os.environ['MASTER_PORT'] = args.master_port
    # os.environ['MASTER_ADDR'] = "localhost"
    # os.environ['MASTER_PORT'] = "12355"
    # dist.init_process_group(backend='nccl', init_method=args.init_method, rank=gpu, world_size=args.world_size)
    print(f"{gpu} 22222")
    # time.sleep(3)
    dist.init_process_group(backend='nccl', rank=gpu, world_size=args.world_size)
    print(f"{gpu} 33333")

加上GPU的编号(实验环境是双卡),发现这种情况下会正常运行,也就是说GPU0先启动
the client socket has failed to connect to,深度学习,python,人工智能
出现这种情况,当GPU1先启动时,就会报这个错误,那我们的目标就是让线程1晚点启动
the client socket has failed to connect to,深度学习,python,人工智能
思路已经明确了,让0号线程先于1号线程启动

def train(gpu, args):
    # ---------------------------- 改动之处1  DDP的初始化----------------------------
    # 让线程1先休眠1秒,确保线程0先启动
    if gpu == 1:
        time.sleep(1)
    print(f"{gpu} 11111")
    os.environ['MASTER_ADDR'] = args.master_addr
    os.environ['MASTER_PORT'] = args.master_port
    # os.environ['MASTER_ADDR'] = "localhost"
    # os.environ['MASTER_PORT'] = "12355"
    # dist.init_process_group(backend='nccl', init_method=args.init_method, rank=gpu, world_size=args.world_size)
    print(f"{gpu} 22222")
    # time.sleep(3)
    dist.init_process_group(backend='nccl', rank=gpu, world_size=args.world_size)
    print(f"{gpu} 33333")

问题得以解决,但是中间原理貌似不是很明白文章来源地址https://www.toymoban.com/news/detail-669285.html

到了这里,关于The client socket has failed to connect to X (errno: 99 - Cannot assign requested address).的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • permission denied while trying to connect to the Docker daemon socket 错误

    安装 docker 执行错误如下: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get “http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json”: dial unix /var/run/docker.sock: connect: permission denied 解决方法: docker.sock 文件的权限问题,可以重置其权限: 之后就正常了

    2024年02月13日
    浏览(44)
  • Mac下ERROR: Cannot connect to the Docker daemon

    在Mac系统的中, 如果实际已经安装docker并且已经启动了. 但执行 docker info 时 报错: ERROR: Cannot connect to the Docker daemon at unix:///Users/qq/.orbstack/run/docker.sock. Is the docker daemon running? 这有可能是由于安装的是 docker Desktop, 它的docker.sock文件是在 ~/.docker/run/docker.sock 位置. 只需要将执行下

    2024年03月17日
    浏览(65)
  • docker启动报错:Cannot connect to the Docker daemon

    Couldn’t connect to Docker daemon at http+docker://localunixsocket - is it running? 解决方式:正确的是将当前用户加入docker组 解决步骤 Cannot connect to the Docker daemon at unix:///var/run/docker.sock 设置 daemon.json ,没有的话创建,位置 /etc/dockerdaemon.json ,设置为国内源 重新加载

    2024年02月09日
    浏览(58)
  • (转)java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.

    jar包下载方式 官网地址:MySQL :: Download Connector/J,如果你打不开官网,在下面我为你准备了直接下载jar包的链接地址。 在选择操作系统时,此处选择platform independent(独立于平台)。   8.0版本的jar包下载地址,点击直接下载。 https://dev.mysql.com/get/Downloads/Connector-J/mysql-connect

    2023年04月26日
    浏览(46)
  • 屏蔽socket 实例化时,握手阶段报错信息WebSocket connection to ‘***‘ failed

    事情起因是这样的: 我们网站是需要socket链接实行实时推送服务,有恶意竞争对手通过抓包或者断网,获取到了我们的socket链接地址,那么他就可以通过java写一个脚本无限链接这个socket地址。形成dos攻击。使socket服务器资源耗尽,造成服务器瘫痪。 。而又因为这个错误是再

    2024年02月12日
    浏览(43)
  • docker: permission denied while trying to connect to the Docker daemon socket at

    今天执行docker时候报错,docker: permission denied while trying to connect to the Docker daemon socket atXXX 因为是我新装的docker,没有执行过什么任务 可能属于新装docker都会有的一些问题 一开始是报错 : docker: Cannot connect to the Docker daemon at unix:xxx 意思是无法连接docker,检查一下docker 服务是

    2024年02月04日
    浏览(58)
  • 【docker问题】permission denied while trying to connect to the Docker daemon socket at unix

    permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get \\\"http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json\\\": dial unix /var/run/docker.sock: connect: permission denied 配置VScode docker 插件  

    2024年02月02日
    浏览(49)
  • [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

    如果你的node.js提示: [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client 那么,代表你返回了结果,但是最后你又不小心再返回了一次。通常是由于方法没有进行等待,或者多条件判断缺漏造成的。 情况一:返回机制问题 通过success/error模式来返回结果,取消最终的

    2024年02月10日
    浏览(54)
  • Unable to connect to the server: x509: certificate has expired or is not yet valid

    手动更新所有证书,执行命令 更新用户配置 用更新后的admin.conf替换/root/.kube/config文件 k8s解决证书过期官方文档:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/ 帮助文档: https://www.cnblogs.com/00986014w/p/13095628.html

    2024年02月04日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包