首页 > 其他分享 >安装并运行pytorch报错“核心已转储”

安装并运行pytorch报错“核心已转储”

时间:2024-05-30 22:45:39浏览次数:32  
标签:args default torch 转储 pytorch train 报错 cuda test

1 问题和解决概要

主机环境:Ubuntu20.04,RTX3090,GPU Driver Version 525.89.02

问题:用anaconda创建虚拟环境python3.10,安装pytorch2.2.2-cu118和对应torchvision后,训练模型出现报错:“核心已转储”。

定位和解决:

  1. 查阅资料,确认driver支持cuda-11.8,主机安装cuda-11.8后编译一个sample也正常。
  2. 用一个network sample来验证pytorch的有效性(因为常规import torch之后print都正常),代码见下。确定是安装的pytorch或者torchvision问题。
  3. 尝试了Python3.8和Python3.10(均无效),尝试了带cu118的torch2.2.2和torch2.2.1(均无效),尝试了带cu117的torch2.0.1(有效)。

【疑问】理论上带cu118的torch应该都可以正常运行,但实际上无效,后退一个cuda版本至cu117就有效,原因不明!

下面是train network sample代码,验证安装的pytorch和torchvison是否真正可用

    import argparse
    import torch
    import torch.nn as nn
    import torch.nn.functional as F
    import torch.optim as optim
    from torchvision import datasets, transforms
    from torch.optim.lr_scheduler import StepLR
    
    class Net(nn.Module):
        def __init__(self):
            super(Net, self).__init__()
            self.conv1 = nn.Conv2d(1, 32, 3, 1)
            self.conv2 = nn.Conv2d(32, 64, 3, 1)
            self.dropout1 = nn.Dropout(0.25)
            self.dropout2 = nn.Dropout(0.5)
            self.fc1 = nn.Linear(9216, 128)
            self.fc2 = nn.Linear(128, 10)
    
        def forward(self, x):
            x = self.conv1(x)
            x = F.relu(x)
            x = self.conv2(x)
            x = F.relu(x)
            x = F.max_pool2d(x, 2)
            x = self.dropout1(x)
            x = torch.flatten(x, 1)
            x = self.fc1(x)
            x = F.relu(x)
            x = self.dropout2(x)
            x = self.fc2(x)
            output = F.log_softmax(x, dim=1)
            return output
    
    def train(args, model, device, train_loader, optimizer, epoch):
        model.train()
        for batch_idx, (data, target) in enumerate(train_loader):
            data, target = data.to(device), target.to(device)
            optimizer.zero_grad()
            output = model(data)
            loss = F.nll_loss(output, target)
            loss.backward()
            optimizer.step()
            if batch_idx % args.log_interval == 0:
                print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
                    epoch, batch_idx * len(data), len(train_loader.dataset),
                    100. * batch_idx / len(train_loader), loss.item()))
                if args.dry_run:
                    break
    
    def test(model, device, test_loader):
        model.eval()
        test_loss = 0
        correct = 0
        with torch.no_grad():
            for data, target in test_loader:
                data, target = data.to(device), target.to(device)
                output = model(data)
                test_loss += F.nll_loss(output, target, reduction='sum').item()  # sum up batch loss
                pred = output.argmax(dim=1, keepdim=True)  # get the index of the max log-probability
                correct += pred.eq(target.view_as(pred)).sum().item()
    
        test_loss /= len(test_loader.dataset)
    
        print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
            test_loss, correct, len(test_loader.dataset),
            100. * correct / len(test_loader.dataset)))
    
    def main():
        # Training settings
        parser = argparse.ArgumentParser(description='PyTorch MNIST Example')
        parser.add_argument('--batch-size', type=int, default=64, metavar='N',
                            help='input batch size for training (default: 64)')
        parser.add_argument('--test-batch-size', type=int, default=1000, metavar='N',
                            help='input batch size for testing (default: 1000)')
        parser.add_argument('--epochs', type=int, default=14, metavar='N',
                            help='number of epochs to train (default: 14)')
        parser.add_argument('--lr', type=float, default=0.01, metavar='LR',
                            help='learning rate (default: 1.0)')
        parser.add_argument('--gamma', type=float, default=0.7, metavar='M',
                            help='Learning rate step gamma (default: 0.7)')
        parser.add_argument('--no-cuda', action='store_true', default=False,
                            help='disables CUDA training')
        parser.add_argument('--no-mps', action='store_true', default=False,
                            help='disables macOS GPU training')
        parser.add_argument('--dry-run', action='store_true', default=False,
                            help='quickly check a single pass')
        parser.add_argument('--seed', type=int, default=1, metavar='S',
                            help='random seed (default: 1)')
        parser.add_argument('--log-interval', type=int, default=10, metavar='N',
                            help='how many batches to wait before logging training status')
        # parser.add_argument('--save-model', action='store_true', default=False,
        #                     help='For Saving the current Model')
        args = parser.parse_args()
        use_cuda = not args.no_cuda and torch.cuda.is_available()
        use_mps = not args.no_mps and torch.backends.mps.is_available()
    
        torch.manual_seed(args.seed)
    
        if use_cuda:
            device = torch.device("cuda")
        elif use_mps:
            device = torch.device("mps")
        else:
            device = torch.device("cpu")
    
        train_kwargs = {'batch_size': args.batch_size}
        test_kwargs = {'batch_size': args.test_batch_size}
        if use_cuda:
            cuda_kwargs = {'num_workers': 1,
                           'pin_memory': True,
                           'shuffle': True}
            train_kwargs.update(cuda_kwargs)
            test_kwargs.update(cuda_kwargs)
    
        transform=transforms.Compose([
            transforms.ToTensor(),
            transforms.Normalize((0.1307,), (0.3081,))
            ])
        dataset1 = datasets.MNIST('./data', train=True, download=True,
                           transform=transform)
        dataset2 = datasets.MNIST('./data', train=False,
                           transform=transform)
        train_loader = torch.utils.data.DataLoader(dataset1,**train_kwargs)
        test_loader = torch.utils.data.DataLoader(dataset2, **test_kwargs)
    
        model = Net().to(device)
        optimizer = optim.Adadelta(model.parameters(), lr=args.lr)
    
        scheduler = StepLR(optimizer, step_size=1, gamma=args.gamma)
        for epoch in range(1, args.epochs + 1):
            train(args, model, device, train_loader, optimizer, epoch)
            test(model, device, test_loader)
            scheduler.step()
    
        # if args.save_model:
        #     torch.save(model.state_dict(), "mnist_cnn.pt")
    
    if __name__ == '__main__':
        main()

2 具体过程

2.1 背景

为了使用lightning框架,environment.yaml中建议pytorch=2.*

dependencies:
  - python=3.10
  - pytorch=2.*
  - torchvision=0.*
  - lightning=2.*

而台式机上pytorch都是1.12及以下,因此需重新安装Pytorch环境。

2.2 确认GPU Driver和cuda版本对应

  1. nvidia-smi查询 GPU Driver Version: 525.89.02
  2. 确认驱动支持cuda11.8,参考:cuda-compatibility,以及cuda toolkit docs

2.3 主机安装cuda11.8,以及对应的cudnn8.9.7,验证是否正常

【这个实验中pytorch自带了cuda runtime,所以其实并不需要主机上单独安装】

安装cuda11.8和对应的cudnn8.9.7:

  1. 下载并安装cuda-11.8;

  2. /usr/local/cuda链接至cuda-11.8,配置~/.bashrc环境,可参考多个cuda和cudnn版本切换

    当前主机中有三个cuda,如下:

确认cuda正常:

方法1:nvcc --version

方法2:编译并运行cuda自带的samples(由于/usr/local/cuda-11.8文件夹中没有samples,因此去其他版本cuda中测一下)

cd /usr/local/cuda-11.3/samples/1_Utilities/deviceQuery
sudo make
sudo ./deviceQuery

出现下面输出,确认cuda11.8正常。

2.4 离线安装pytorch和torchvision,验证是否正常

  1. Anaconda创建python-3.10环境:conda create -n py310 python=3.10
  2. 官网确认版本PyTorch和torchvision对应关系
# CUDA 11.8
pip install torch==2.2.2 torchvision==0.17.2 --index-url https://download.pytorch.org/whl/cu118
  1. 在Pytorch版本archive【这里】下载对应版本,对应python3.10版本和cuda11.8版本.
  1. 下载后直接pip安装
pip install torch-2.2.2+cu118-cp310-cp310-linux_x86_64.whl -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install torchvision-0.17.2+cu118-cp310-cp310-linux_x86_64.whl -i https://pypi.tuna.tsinghua.edu.cn/simple
  1. 验证Pytorch和torchvison是否可用,代码见第一部分问题和解决概要。

    结果报错“核心已转储”。

2.5 问题解决

新建python3.10虚拟环境,下载pytorch带cuda11.7的版本并重新安装。验证OK。

【疑问】查阅资料可知该GPU driver支持cuda-11.8,且主机安装的cuda-11.8也验证正常,因此理论上带cu118的torch应该都可以正常运行,但实际上无效,后退一个cuda版本至cu117就有效,原因不明!

标签:args,default,torch,转储,pytorch,train,报错,cuda,test
From: https://www.cnblogs.com/inchbyinch/p/18223367

相关文章

  • 用Pytorch搭建一个简单的CNN(MNIST数据集—十分类问题)
    文章目录前言一、MNIST数据集二、使用步骤1.基本库的导入和随机种子的设定2.MINIST数据集的下载、保存与加载可视化某一批图像数据3.用pytorch搭建CNNCNN的主体部分:由卷积模块和全连接组成。4.训练CNN并保存损失最小的模型网络参数的定义:每一轮训练的主体部分:4.测试训练......
  • 新版Python安装,新手入门必看,报错分析
    第一次接触Python的朋友,可能会在安装的过程中遇到很多问题,下面会详细的指出可能出现的各种状况、以及应对方法,让新入行的朋友也可上手安装,并且完成第一个Helloworld代码。【Python安装】一、打开python官网点击下载搜索并打开官网进入页面后点击导航中的Downloads进入下载......
  • PyTorch学习(8):PyTorch中Tensor的合并于拆分(torch.cat, torch.stack, torch.trunk, tor
    1.写在前面       在使用PyTorch执行深度学习开发时,经常会用到对Tensor的合并于拆分操作。如我们在使用CSP时,有时候会需要将Tensor拆分成两部分,其中一部分进行进行CrossStage操作,另一部分执行多重卷积操作,这个时候我们就会用到四个典型的接口,分别是torch.cat,torch......
  • SQL Server报错:数据库"YourDatabaseName"的事务日志已满,原因为"LOG_BACKUP"
      通过以下代码可以收缩日志,执行完后就不报错了。--设置简单模式USE[master]GOALTERDATABASEYourDatabaseNameSETRECOVERYSIMPLEWITHNO_WAITGOALTERDATABASEYourDatabaseNameSETRECOVERYSIMPLEGO--设置压缩后的日志大小为2M,可自定义USEY......
  • 【Spring Security】Error:A granted authority textual representation is required
     Security出错了! 分析:Debug跑后 排查是Security中的UserDetails.getAuthorities()在创建SimpleGrantedAuthorityauthority时,所传递的授权信息是空的,导致SimpleGrantedAuthorityauthority出现异常;报出Agrantedauthoritytextualrepresentationisreq......
  • 关于Interrupted system call 报错
    Socket编程或者其他的一些慢速系统调用中,我们经常会碰到“interruptedsystemcall”的问题。这些系统调用包括:长时间读取磁盘,等待网络连接i.e.Accept,阻塞的系统调用,i.e.Read/Writeepoll_wait/kevent这是因为系统调用在执行过程中有可能收到来自外部的信号中断,那么该系......
  • python爬虫不报错也不出结果?
    刚学爬虫对着视频想爬个网络小说但是代码写完不报错也不出结果,大佬们帮忙看看啥情况importreimportrequestsfromlxmlimportetreeheaders={"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/125.0.0......
  • pytorch基本操作
    Referredtohttps://www.bilibili.com/video/BV17X4y1H7dK/?spm_id_from=333.337.search-card.all.click&vd_source=d312c66700fc64b66258a994f0a117adimporttorchimportnumpyasnptorch.cuda.is_available()True1BasicOperation1.1createtensor#from......
  • transformer的Pytorch简易实现
    Transformer(Pytorch)fromscratchcodebyTaeHwanJung(JeffJung)@graykode,DerekMiller@dmmiller612,modifiedbyshwei;modifiedagainbyLittleHenryReference:https://blog.csdn.net/BXD1314/article/details/126187598?spm=1001.2014.3001.5506https://bl......
  • 普通程序员深度学习教程(fastai及PyTorch)1深度学习快速入门-1简介
    1深度学习快速入门本章介绍深度学习背后的关键概念,并在不同的任务中训练我们的第一个模型。如果你不是技术或数学专业出身,也没有关系,我们从工程应用的角度入手,而不是数学科学。1.1深度学习没那么难多数深度学习不需要:高深的数据基础,实际高中数学已经够用大量数据:实际最低小......