使用pytorch_npu多卡训练时遇到报错:please report a bug to PyTorch. Could not compute stream ID for*** on device -1 (something ha
收藏回复举报
使用pytorch_npu多卡训练时遇到报错:please report a bug to PyTorch. Could not compute stream ID for*** on device -1 (something ha
t('forum.solved') 已解决
新人帖
发表于2024-10-08 17:05:45
0 查看

使用npu多卡训练时遇到报错,这是我的代码:

 

import os  

import random 

import time 

import cv2 

import numpy as np 

import logging 

import argparse 

import torch_npu 

#自动映射cuda API到npu的代码 

from torch_npu.contrib import transfer_to_npu 

 

#os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" 

#os.environ["CUDA_VISIBLE_DEVICES"] = '0'  #只让设备0可见 

from torch.utils.data import DataLoader, DistributedSampler 

import torch 

import torch.backends.cudnn as cudnn 

import torch.nn as nn 

import torch.nn.functional as F 

import torch.nn.parallel 

import torch.optim 

import torch.utils.data 

import torch.multiprocessing as mp 

import torch.distributed as dist 

from tensorboardX import SummaryWriter 

 

# import sys 

# sys.path.append("..") 

# print(sys.path) 

 

# print(os.getcwd()) 

 

import sys 

sys.path.append('/home/ma-user/work/ASGNet-main') 

from model import * 

from util import dataset 

from util import transform, config 

from util.util import AverageMeter, poly_learning_rate, intersectionAndUnionGPU 

 

cv2.ocl.setUseOpenCL(False) 

cv2.setNumThreads(0) 

 

def get_parser(): 

    parser = argparse.ArgumentParser(description='PyTorch Semantic Segmentation') 

    parser.add_argument('--config', type=str, default='config/ade20k/ade20k_pspnet50.yaml', help='config file') 

    parser.add_argument("--local_rank", type=int, required=True, help='local rank for DistributedDataParallel') 

    #parser.add_argument("--local-rank", "--local_rank", type=int) 

    parser.add_argument('opts', help='see config/ade20k/ade20k_pspnet50.yaml for all options', default=None, nargs=argparse.REMAINDER) 

    args = parser.parse_args() 

    assert args.config is not None 

    cfg = config.load_cfg_from_cfg_file(args.config) 

    if args.opts is not None: 

        cfg = config.merge_cfg_from_list(cfg, args.opts) 

    cfg.LOCAL_RANK = args.local_rank 

    return cfg 

 

def get_logger(): 

    logger_name = "main-logger" 

    logger = logging.getLogger(logger_name) 

    logger.setLevel(logging.INFO) 

    handler = logging.StreamHandler() 

    fmt = "[%(asctime)s %(levelname)s %(filename)s line %(lineno)d %(process)d] %(message)s" 

    handler.setFormatter(logging.Formatter(fmt)) 

    logger.addHandler(handler) 

    return logger 

 

def worker_init_fn(worker_id): 

    random.seed(args.manual_seed + worker_id)    #在多进程数据加载时,根据传入的worker_id和手动设置的种子值来初始化随机数生成器。 

 

# def main_process(): 

#     return not args.multiprocessing_distributed or (args.multiprocessing_distributed and args.rank % args.ngpus_per_node == 0)   #如果没有使用多进程分布式训练或者在多进程分布式训练中当前进程的rank与每个节点的 GPU 数量取余为 0,则为主进程 

 

def main(): 

    args = get_parser() 

    if 'RANK' in os.environ and 'WORLD_SIZE' in os.environ: 

        rank = int(os.environ["RANK"]) 

        world_size = int(os.environ['WORLD_SIZE']) 

        print(f"RANK and WORLD_SIZE in environ: {rank}/{world_size}") 

    else: 

        rank = -1 

        world_size = -1 

   # args.LOCAL_RANK=int(os.environ["LOCAL_RANK"])  

    torch_npu.npu.set_device(args.LOCAL_RANK)  #换个方法设置device  like npu:0 

    #torch_npu.npu.set_device("npu:{}".format(args.LOCAL_RANK))  

    torch.distributed.init_process_group(backend='hccl', world_size=world_size, rank=rank) 

     

     

    device = torch.device('npu:{}'.format(args.LOCAL_RANK)) 

    # torch.distributed.barrier() 

     

 

    assert args.classes > 1 

    assert args.zoom_factor in [1, 2, 4, 8] 

    assert (args.train_h - 1) % 8 == 0 and (args.train_w - 1) % 8 == 0 

    # os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" 

    # os.environ["CUDA_VISIBLE_DEVICES"] = ','.join(str(x) for x in args.train_gpu) 

    if args.manual_seed is not None: 

        cudnn.benchmark = False 

        cudnn.deterministic = True 

        torch_npu.npu.manual_seed(args.manual_seed) 

        np.random.seed(args.manual_seed) 

        torch.manual_seed(args.manual_seed) 

        torch_npu.npu.manual_seed_all(args.manual_seed) 

        random.seed(args.manual_seed) 

    ### multi-processing training is deprecated 

    # if args.dist_url == "env://" and args.world_size == -1: 

    #     args.world_size = int(os.environ["WORLD_SIZE"]) 

    # args.distributed = args.world_size > 1 or args.multiprocessing_distributed 

    # args.ngpus_per_node = len(args.train_gpu) 

    # if len(args.train_gpu) == 1: 

    #     args.sync_bn = False    # sync_bn is deprecated  

    #     args.distributed = False 

    #     args.multiprocessing_distributed = False 

    # if args.multiprocessing_distributed: 

    #     args.world_size = args.ngpus_per_node * args.world_size 

    #     mp.spawn(main_worker, nprocs=args.ngpus_per_node, args=(args.ngpus_per_node, args)) 

    # else: 

    #     main_worker(args.train_gpu, args.ngpus_per_node, args) 

    args.ngpus_per_node = len(args.train_gpu) 

     

    

    main_worker(args.train_gpu, args.ngpus_per_node, args,device) 

 

def main_worker(gpu, ngpus_per_node, argss,device): 

    global args 

    args = argss 

    BatchNorm = nn.BatchNorm2d 

 

    criterion = nn.CrossEntropyLoss(ignore_index=args.ignore_label) 

    model = eval(args.arch).Model(args) 

    model.npu() 

报错如下:cke_16205.png

我要发帖子