torch.backends.cudnn.enabled = False会引起CUDA out of memory和CUDA error: an illegal memory access was

本文探讨了一个关于PyTorch中torch.backends.cudnn.enabled=False设置导致CUDA内存溢出的问题。作者发现即使batch_size较小,特定操作也会触发内存问题,并通过版本切换和代码注释验证了问题来源。文章建议理解cuDNN的非确定性和如何平衡可复现性和效率。

        一般来说,题目所示这种问题都是由batch_size的设置引起的,修改batch_size之后就能有效解决。但是,我今天遇到一种情况,这个问题不是由batch_size引起的,而是由torch.backends.cudnn.enabled = False这个设置引起的。

        torch.backends.cudnn.enabled = False这个设置主要用于实验过程的可复现,具体的实验过程可复现代码设置如下:

import numpy as np
import torch
from torch.backends import cudnn
import random
import os

print(torch.__version__)

def set_seed(seed):
    torch.manual_seed(seed)
    torch.cuda.manual_seed(seed)
    torch.cuda.manual_seed_all(seed)  # if you are using multi-GPU.
    np.random.seed(seed)  # Numpy module.
    random.seed(seed)  # Python random module.
    os.environ['PYTHONHASHSEED'] = str(seed)
 
    torch.use_deterministic_algorithms(True)
    torch.backends.cudnn.enabled = False # ----》引起问题的代码行
    torch.backends.cudnn.benchmark = False #禁用benchmark,保证可复现
    #torch.backends.cudnn.benchmark = True #恢复b
### `torch.backends.cudnn.benchmark = cudnn_benchmark` `torch.backends.cudnn.benchmark` 是一个布尔型的配置选项。当设置为 `True` 时,在每次运行网络时,CUDNN 会在开始时进行一系列的基准测试,然后选择它认为在当前硬件上运行速度最快的卷积算法。当设置为 `False` 时,CUDNN 会使用默认的卷积算法。 在模型输入尺寸固定的情况下,将 `torch.backends.cudnn.benchmark` 设置为 `True` 可以显著提高训练速度,因为它可以找到最优的卷积算法。但如果模型的输入尺寸是动态变化的,每次都进行基准测试会带来额外的开销,反而会降低性能。 示例代码: ```python import torch # 假设 cudnn_benchmark 是一个布尔变量 cudnn_benchmark = True torch.backends.cudnn.benchmark = cudnn_benchmark ``` ### `torch.backends.cuda.matmul.allow_tf32 = False` TF32(TensorFloat-32)是 NVIDIA GPU 上一种新的数据格式,它在精度上介于 FP32(单精度浮点数) FP16(半精度浮点数)之间,并且在某些情况下可以提供比 FP32 更快的矩阵乘法运算速度。 `torch.backends.cuda.matmul.allow_tf32` 控制是否允许在 CUDA 矩阵乘法中使用 TF32 数据格式。当设置为 `False` 时,禁止使用 TF32 数据格式,强制使用 FP32 进行矩阵乘法运算,这样可以保证计算的精度,但可能会降低计算速度。 示例代码: ```python import torch torch.backends.cuda.matmul.allow_tf32 = False ``` ### `torch.backends.cudnn.allow_tf32 = False` 与 `torch.backends.cuda.matmul.allow_tf32` 类似,`torch.backends.cudnn.allow_tf32` 控制是否允许在 CUDNN 卷积操作中使用 TF32 数据格式。当设置为 `False` 时,禁止使用 TF32 数据格式,强制使用 FP32 进行卷积运算,以保证计算的精度,但可能会牺牲一定的计算速度。 示例代码: ```python import torch torch.backends.cudnn.allow_tf32 = False ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值