Win11下PyTorch多GPU训练代码报错os.getuid()的替代方案咨询
Windows 11下PyTorch多GPU训练中替代
os.getuid()的方案 原代码通过os.getuid()生成端口以避免孤儿进程冲突,但该方法仅支持类Unix系统,Windows下会触发AttributeError: module 'os' has no attribute 'geteuid'错误,以下是几种可行的替代方案:
方案1:用进程ID(os.getpid())替代用户ID
Windows系统支持os.getpid()获取当前进程ID,同样能通过哈希生成唯一端口,保留原逻辑的随机性:
import os import argparse port = 2 ** 15 + 2 ** 14 + hash(os.getpid()) % 2 ** 14 parser = argparse.ArgumentParser() parser.add_argument( "--dist-url", default=f"tcp://127.0.0.1:{port}" )
方案2:直接指定固定端口
适合本地测试场景,使用PyTorch分布式训练常用的默认端口(如29500),若有残留进程会直接提示端口占用,方便排查:
import argparse parser = argparse.ArgumentParser() parser.add_argument( "--dist-url", default="tcp://127.0.0.1:29500" )
方案3:自动获取可用端口
通过socket模块自动查找系统空闲端口,彻底避免端口冲突问题,适合频繁启动训练任务的场景:
import socket import argparse def get_free_port(): with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind(('', 0)) # 绑定到随机可用端口 return s.getsockname()[1] port = get_free_port() parser = argparse.ArgumentParser() parser.add_argument( "--dist-url", default=f"tcp://127.0.0.1:{port}" )
内容的提问来源于stack exchange,提问作者zhang zhang
相关产品推荐
相关产品推荐

