【Pytorch】PytorchCPU版或GPU报错异常处理(10X~4090D)

本文详细描述了如何在PyTorch中处理从CPU切换到GPU时遇到的报错,包括检查设备、版本兼容性、conda环境设置和错误排查步骤,以确保正确安装GPU版本并避免常见问题。
部署运行你感兴趣的模型镜像

Pytorch为CPU版或GPU使用报错异常处理

最新买的4090d到货啦!开始快乐输出o( ̄▽ ̄)ブ
在进行实验时想把cpu版的yolov5使用gpu来跑,结果出了巨多麻烦!
首先是切换成gpu,把pytorch及yolov5全套都安装完毕后,就只剩最后一步了
打开train.py 搜索找到device,大概在400~500行之间将default参数改为device = “0”,注意加引号,后边代表的是不写就默认用cpu(慢的要死真的还容易炸掉),写0是使用1个gpu,10X的4G也挺难绷,但是跑是没问题,4090的24G相对很棒,但尺寸or参数太大还是会炸,而且会炸出来奇怪的异常,且按下不表。
改完后然后直接运行train.py,在输出阶段如果可以看到显卡型号和GPU,说明已经成功调用GPU了
在这里插入图片描述那运算速度相当快:
在这里插入图片描述
但是!在此之前结果出现了错误,一大堆奇怪的报错

0.检查阶段

查看是否能使用gpu

import torch
torch.device('cpu'), torch.device('cuda'), torch.device('cuda:1') # 分别是访问CPU,访问第0个GPU,访问第1个GPU。第 𝑖 块GPU( 𝑖 从0开始)
print(torch.cuda.device_count()) # 查询可用gpu的数量。
print(torch.cuda.is_available())# 查询gpu是否可用

看torch版本

import torch
print(torch.__version__)

1. 在conda虚拟环境中安装了torch

一般命令都可以正常使用,但是使用cuda的命令torch.cuda.is_available()则输出False。
该问题的根本原因是CUDA环境与Torch版本不匹配,因此最直接的解决方式就是使用官方推荐的版本进行适配。
查看本机安装的cuda版本,在虚拟环境下一定以nvcc -V查到的版本为主

nvcc -V

有些人可能只是cudatoolkit版本对不上,如果运气好,只针对cudatoolkit进行版本匹配即可完成,

2.卸载cpuonly

1.用conda list 看看有没有cpuonly这个包,有的话删掉,这个包是装不上gpu版本的罪魁祸首。
conda uninstall cpuonly
2.装pytorch cudatoolkit(新建一个anaconda环境,或者把环境清空,注意版本号不要写错,清华源不是很智能,一定要加上详细的版本号搭配)

conda install python==3.12
conda install pytorch==2.2.2 cudatoolkit==11.8.0
附注:pip安装方式
pip install torch==2.2.2+cu121 torchvision==0.17.2+cu121 torchaudio==2.2.2+cu121 -f https://download.pytorch.org/whl/torch_stable.html

3.从tsinghua清华源安装不完善误为cpu版本

如果想要新建环境的话直接换源处理
1.可能因conda换源的不完善
下面是完整的国内清华源文件.condarc内容,打开你的电脑里的.condarc文件直接复制就行。
ubuntu 的话命令行 sudo vim ~/.condarc可以直接打开编辑,win10的话一般在C:\Users\用户名下面。

channels:
  - defaults
show_channel_urls: true
channel_alias: http://mirrors.tuna.tsinghua.edu.cn/anaconda
default_channels:
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2

  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
custom_channels:
  conda-forge: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  msys2: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  bioconda: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  menpo: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  simpleitk: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

2. 在conda 里搜寻可以安装的pytorch版本
更新最新版的,选择是pytorch2.2.2,python3.12,cudatoolkit11.8的搭配。

conda search pytorch

3. 选择直接安装这三个包。
注意cudatoolkit版本号可能需要精确到比如11.8才会安装的比较顺利。可以conda search cudatoolkit来查看当前库里能安装的cudatoolkit版本。

conda search cudatoolkit
conda install python==3.12
conda install pytorch==2.2.2 cudatoolkit==11.8

然后编写python代码测试下看看显卡能不能用,命令行里可以先输入python进入代码编写模式。返回Ture的话代表安装gpu版本成功。

import torch
print(torch.cuda.is_available())

4.用tsinghua清华源安装成cpu错误版本

如果发现是CPU,并且在发现前已经执行类似于下载了大量依赖,不想再重新弄的

pip install -r requirements.txt  -i https://pypi.tuna.tsinghua.edu.cn/simple 

把已经安装好的cpu版本手动替换成gpu版本。

1.没有安pytorch的话不论cpugpu首先是下载,执行官方给的建议方式:
Start Locally | PyTorch
2.如果默认是用清华源下载的话可能会推送cpu版本的pytorch
3.我们可以先下载cpu的版本,然后手动替换成gpu版本。
安装完cpu版本后用import torch 实验一下,不报错的话说明cpu版本安装成功,报错的话则不能进行下一步。

import torch

4.去清华镜像下载离线安装包
不报错证明ok,那么conda成功安装完cpu的版本后,去conda清华源找到对应的pytorch gpu版本(cuda版本)
清华大学开源软件镜像站
清华源conda 安装gpu版本的pytorch总是推送cpu版本解决办法
网站资源包比较多,可以用Ctrl+F搜索,找pytorch以及附属包点下载
5.离线安装
下载完成后,激活conda 环境, cd 到下载的文件目录,安装

conda install --offline pytorch-2.10.0-py3.6_cuda10.2_cudnn7.6.5_0.tar.bz2
conda install --offline torchaudio-0.10.0-py36_cu102.tar.bz2
conda install --offline torchvision-0.11.0-py36_cu102.tar.bz2

6.验证检查
conda list,查看是否已经被替换。替换完成就行了,不要在用conda install pytorch torchvision torchaudio cudatoolkit=10.2 指令下载了,因为conda 还是会推送cpu的包,会被替换掉。。。。。。
在这里插入图片描述
换之前,用import torch不报错,但显示无GPU可跑,仔细一看是CPU!根本跑不动一点
在这里插入图片描述
可能的报错情况:pytorch和CUDA版本不一致,不是最新的,直接卡住import torch,第一步就报错(见下方介绍),处理方法为全更新到最新 or 找适配cuda的pytorch版本
在这里插入图片描述
安装最新的后终于能够跑起来,不知道安装什么才匹配的不妨多下载几个试试

在这里插入图片描述
安装的是上面↑这些,失败的是下面↓这些(版本不匹配)
在这里插入图片描述

5.conda中torch/vision/cudatoolkit版本与本机cuda版本不配套

会爆出连import torch都打不开的情况,错误描述:

OSError: 
[WinError 126] 找不到指定的模块。Error loading 
“D:\Anaconda3\envs\MyCode\Lib\site-packages\torch\lib\caffe2_detectron_ops_gpu.dll” 
or one of its dependencies

首先可以考虑的是安装Microsoft Visual C++ Redistributable。
如果依旧未能解决。这个error提示的是找不到caffe2_detectron_ops_gpu.dll,这个文件尾缀前面加了gpu,也许是之前未安装cudatoolkit的缘故。
使用官网给的命令,重新把缺少的cudatoolkit和其他包安装一下。

conda install pytorch torchvision torchaudio cudatoolkit=10.2 -c pytorch

注意安装的时候也是版本对应。

6.总结

通过以上应用基本上能够解决Pytorch因为清华源错误安装成为CPU版本,或者其他原因想换成GPU版本的难题。
也能适用于一些GPU版本下显示无法使用GPU,检验得到false,甚至import torch报错根本进不去检测页面的问题。
换到GPU上用4090d跑是真的迅速又开心!希望大家的烦恼也能顺利解决√

嘛,如果对您有帮助的话就开心的复制吧,整理不易转载请注明qwq!
如果有更好的建议或意见欢迎补充!
我是亓云鹏(亓Qí),努力与大家一同分享算法的快乐!

每博一图(1/1)↓
在这里插入图片描述
Reference:
清华源conda 安装gpu版本的pytorch总是推送cpu版本解决办法

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

<think>首先,用户的问题是关于PyTorchGPU训练时程序卡住的可能原因和解决方法。用户提到了一些引用,但这些都是示例,不是直接相关的。我需要基于我的知识来回答。 关键点: - 用户说:"我想在使用PyTorch进行多GPU训练时遇到程序卡住的问题,希望找到原因和解决方案" - 引用[1]提到NCCL操作失败超时,导致整个进程终止。 - 引用[2]提到在GPU上计loss时卡住,可能由于显存不足。 - 引用[3]提到多线程并行导致GPU利用率100%并卡住。 所以,我需要覆盖常见原因和解决方案。 常见原因: 1. **NCCL通信问题**:NCCL(NVIDIA Collective Communications Library)用于多GPU通信。问题可能包括网络问题、驱动程序不兼容超时。 2. **显存不足**:如果GPU内存不足,程序可能卡住崩溃。 3. **死锁同步问题**:在多线程多进程环境中,代码可能有死锁。 4. **驱动程序本问题**:PyTorchCUDA、cuDNNNCCL本不兼容。 5. **硬件问题**:如GPU故障。 6. **数据加载瓶颈**:如果数据加载跟不上,GPU可能闲置卡住。 解决方案: 1. **检查显存使用**:使用`nvidia-smi`监控GPU内存。如果不足,减少批次大小使用梯度累积。 2. **更新驱动程序和库**:确保PyTorchCUDA、NCCL等是最新兼容本。 3. **设置NCCL超时**:在PyTorch中,可以设置环境变量如`NCCL_BLOCKING_WAIT=1``NCCL_ASYNC_ERROR_HANDLING=1`来调试。 4. **使用较小的模型数据**:测试简化本以隔离问题。 5. **检查死锁**:确保代码中没有不正确的同步点。 6. **单GPU测试**:先在单个GPU上运行以确认问题是否多GPU特定。 7. **日志和调试**:添加日志语句使用调试工具。 回答结构: - 以清晰的方式组织,逐步解决问题。 - 使用中文。 - 在行内数学表达式使用$...$,独立公式使用$$...$$(但在这个问题中可能不需要太多数学)。 - 生成相关问题。 - 自然地添加引用标识(基于提供的引用)。 引用标识: - 引用[^1]:NCCL操作失败。 - 引用[^2]:显存不足导致卡住。 - 引用[^3]:多线程问题。 在回答中,我可以提到这些作为参考。 最终回答结构: 1. **引言**:确认问题。 2. **可能原因**:列出并解释常见原因。 3. **解决方案**:提供逐步解决方法。 4. **生成相关问题**:在末尾添加相关问题。 生成相关问题: - 基于主题,如: 1. 如何监控PyTorch训练中的GPU使用情况? 2. PyTorchGPU训练的最佳实践是什么? 3. 如何处理显存溢出错误?</think>### PyTorchGPU训练程序卡住的原因及解决方法 在使用PyTorch进行多GPU训练时,程序卡住是一个常见问题,通常由通信问题、资源不足代码同步错误引起。以下我将基于常见原因和解决方案,逐步分析并提供可靠建议。回答参考了相关引用(如NCCL失败、显存不足和多线程问题),并结合PyTorch最佳实践。 --- ### 一、可能原因分析 程序卡住的核心问题往往源于多GPU环境下的异步操作资源竞争。以下是常见原因: 1. **NCCL通信失败超时**:PyTorch使用NCCL库处理多GPU通信。如果网络不稳定、驱动程序不兼容操作超时,程序可能卡住并最终报错(如引用[^1]所述)。数学上,NCCL通信延迟可建模为随机变量$T_d$,其中$P(T_d > \tau) > 0$表示超时概率($\tau$为超时阈值)[^1]。 2. **GPU显存不足**:当多个进程同时竞争有限显存时,程序可能在计密集操作(如loss计)时卡住(如引用[^2]所述)。显存需求可表示为$M_{\text{total}} = B \times (M_{\text{model}} + M_{\text{data}})$,其中$B$是批次大小,$M_{\text{model}}$是模型参数大小,$M_{\text{data}}$是数据大小。如果$M_{\text{total}} > \text{可用显存}$,程序会停滞[^2]。 3. **多线程死锁同步问题**:PyTorch的多进程并行(如`DataParallel``DistributedDataParallel`)可能导致线程竞争。例如,资源锁未正确释放时,GPU利用率可能达100%并卡住(如引用[^3]所述)。这类似于死锁条件:$\exists \text{线程 } T_i, T_j \text{ 满足 } T_i \text{ 等待 } T_j \text{ 释放资源 } R_k$[^3]。 4. **其他原因**: - **库本不兼容**:PyTorchCUDA、cuDNNNCCL本冲突。 - **数据加载瓶颈**:数据预处理(如DataLoader)速度慢于GPU,导致GPU闲置。 - **硬件问题**:GPU故障散热不良。 --- ### 二、解决方法 按照从简单到复杂的顺序,逐步排查和解决: #### 步骤1: 检查显存和资源使用 - **监控工具**:运行`nvidia-smi -l 1`实时查看GPU显存和利用率。如果显存接近100%,减少批次大小使用梯度累积(累积多个小批次再更新梯度)。 ```python # 示例:梯度累积代码 optimizer.zero_grad() for i, (inputs, labels) in enumerate(data_loader): outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() # 累积梯度 if (i+1) % accumulation_steps == 0: optimizer.step() optimizer.zero_grad() ``` - **优化显存**:使用混合精度训练(`torch.cuda.amp`)激活检查点(`torch.utils.checkpoint`)来降低$M_{\text{total}}$[^2]。 #### 步骤2: 调试NCCL通信问题 - **设置超时环境变量**:在训练脚本中添加以下行,避免无限等待。 ```bash export NCCL_BLOCKING_WAIT=1 # 强制同步操作,便于检测超时 export NCCL_ASYNC_ERROR_HANDLING=1 # 启用异步错误处理 ``` - **更新库**:确保PyTorchCUDA和NCCL本兼容。例如,使用PyTorch官方推荐的组合(如PyTorch 1.9+ with CUDA 11.x)。 - **简化测试**:先在单GPU上运行代码,确认无问题后,再扩展到多GPU。这能隔离问题是否源于通信[^1]。 #### 步骤3: 修复死锁和同步问题 - **避免阻塞操作**:确保`DataLoader`的`num_workers`设置合理(通常设为CPU核心数)。例如: ```python train_loader = DataLoader(dataset, batch_size=32, shuffle=True, num_workers=4) ``` - **使用DistributedDataParallel (DDP)**:相比`DataParallel`,DDP更高效且不易死锁。示例代码: ```python import torch.distributed as dist dist.init_process_group(backend='nccl', init_method='env://') model = torch.nn.parallel.DistributedDataParallel(model) ``` - **添加日志**:在关键位置(如loss计前后)打印日志,定位卡住点[^3]。 #### 步骤4: 其他通用措施 - **降低模型复杂度**:临时使用更小模型数据集测试。 - **检查硬件**:确保GPU散热良好,无硬件故障。 - **更新PyTorch**:使用最新稳定(如PyTorch 2.0+),修复已知bug。 --- ### 三、预防措施 - **最佳实践**:始终在代码中添加异常处理(如`try-except`块),并使用`torch.cuda.synchronize()`确保操作完成。 - **性能分析**:工具如PyTorch ProfilerNsight Systems可分析GPU利用率。 - **参考文档**:PyTorch官方多GPU训练指南提供了详细优化建议。 通过以上步骤,大多数卡住问题可解决。如果问题持续,提供更多上下文(如错误日志)可进一步诊断[^1][^2][^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值