发行说明#

要查看 cuDNN 文档版本 8.5.0 - 8.6.7,请参阅cuDNN 文档归档

要查看 cuDNN 文档版本 9.0.0 及更高版本,请从左下角的导航选择器切换中选择一个版本。

另请参阅cuDNN frontend 发行说明

cuDNN 9.7.1#

这些是 NVIDIA cuDNN 后端 9.7.1 发行说明。这些发行说明包括之前 cuDNN 版本的修复,以及以下附加更改。

已修复的问题

以下问题已在此版本中修复

  • 已修复当 CUDNN_ATTR_ENGINE_GLOBAL_INDEX 设置为 12、13、63 或 72 时,导致 ConvolutionBwdFilter 操作产生不正确结果的问题。

  • 已修复当为隐藏层大小小于 32 的问题启用零中心 gamma 时,导致 Layer 和 RMS Normalization 反向引擎产生不准确结果的问题。

  • 已修复当多个线程并行执行执行计划时,导致通过 cublasLt 引擎路径的块缩放数据类型 MXFP8 和 NVFP4 的 Matmul 操作返回不正确结果的并发错误。

  • 已修复运行时融合引擎中的主机内存泄漏。

已知问题

  • 对于某些与卷积相关的工作负载,会进行内存分配,这些内存分配在进程终止之前不会释放。此内存泄漏不会随时间增长。

  • LayerNormRMSNorm 执行计划的运行时编译在计算能力为 12.0 的设备上可能会耗时较长。

  • 用于 cudnnBackendNormMode_tCUDNN_ADA_LAYER_NORM 枚举值当前返回 CUDNN_STATUS_NOT_SUPPORTED。计划在未来的版本中修复。

  • 模式为 CUDNN_RESAMPLE_MAXPOOLcudnnResampleMode_t 类型的操作节点不支持前向兼容模式下的序列化。计划在未来的版本中修复。

  • 对于 ConvolutionBwdData 操作,将 CUDNN_ATTR_ENGINE_GLOBAL_INDEX 设置为 82 可能会导致 CUDNN_STATUS_EXECUTION_FAILED 错误。计划在未来的版本中修复。

  • CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 6 与仅在 Blackwell 架构 GPU 上支持的窄精度格式一起使用,可能会导致 Layer 或 RMS Normalization 前向推理工作负载的数值输出不正确。计划在未来的版本中修复。

cuDNN 9.7.0#

这些是 NVIDIA cuDNN 后端 9.7.0 发行说明。这些发行说明包括之前 cuDNN 版本的修复,以及以下附加更改。

公告

此版本的 cuDNN 引入了对 CUDA 计算能力 12.0 和 10.0 的支持。

主要特性和增强功能

以下特性和增强功能已添加到此版本中

  • 已添加对 CUDA 计算能力 12.0 和 10.0 的支持。

  • 已为计算能力 10.0 添加了使用最新硬件功能的本机缩放点积注意力支持,支持 BF16、FP16 和 FP8 输入和输出张量。该支持与计算能力 9.0 对等,除了反向传播偏差梯度支持。

  • 已为计算能力 10.0 和 12.0 添加了使用最新硬件功能的本机 matmul 和卷积融合支持,支持 TF32、BF16、FP16、FP8、MXFP8、NVFP4 输入和输出张量。计算能力 10.0 和 12.0 的 Mainloop 融合和 Epilog 融合支持与计算能力 9.0 对等。

  • 已添加通过 cublasLt 引擎路径的 matmul 中对块缩放输入和输出数据类型 MXFP8 和 NVFP4 的支持。

  • Layer Normalization 和 RMS Normalization 融合支持已得到增强,以支持以下序言和尾声激活逐点融合:Relu、Tanh、Sigmoid、Elu、Gelu、Gelu Approx Tanh、Softplus、Swish。

  • 已引入块缩放量化和反量化操作,以支持微缩放数据格式,例如 MXFP8 和 NVFP4,特别适用于 matmul 和层归一化。

  • cuDNN 文档已得到广泛修订,以包含 cuDNN frontend 的文档,并将 cuDNN 后端的文档与 cuDNN frontend 的文档分开。

已修复的问题

以下问题已在此版本中修复

  • 已修复当在 Hopper GPU 架构上与 CUDNN_TENSOR_NCHW_VECT_C 布局中的张量一起使用时,可能导致 cudnnFusedOpsExecute() 产生 CUDNN_STATUS_INTERNAL_ERROR 的问题。

  • Instance norm 引擎现在在 cuDNN 的 GRAPH_JIT_ONLY 配置中受支持。

  • 早期 cuDNN 9 版本的文档错误地声明 ARMv8 (aarch64-jetson) 上支持 CUDA 11。文档已更新,以显示 cuDNN 9 仅在 ARMv8 (aarch64-jetson) 上支持 CUDA 12。

已知问题

  • 对于某些与卷积相关的工作负载,会进行内存分配,这些内存分配在进程终止之前不会释放。此内存泄漏不会随时间增长。

  • LayerNormRMSNorm 执行计划的运行时编译在计算能力为 12.0 的设备上可能会耗时较长。

  • 用于 cudnnBackendNormMode_tCUDNN_ADA_LAYER_NORM 枚举值当前返回 CUDNN_STATUS_NOT_SUPPORTED。计划在未来的版本中修复。

  • 当为隐藏层大小小于 32 的问题启用零中心 gamma 时,Layer 和 RMS Normalization 反向引擎可能会产生不准确的结果。计划在未来的版本中修复。

  • 模式为 CUDNN_RESAMPLE_MAXPOOLcudnnResampleMode_t 类型的操作节点不支持前向兼容模式下的序列化。计划在未来的版本中修复。

  • 对于 ConvolutionBwdFilter 操作,将 CUDNN_ATTR_ENGINE_GLOBAL_INDEX 设置为 12、13、63 或 72 会产生不正确的结果。用户应使用 cuDNN frontend 勘误表过滤器来阻止使用这些引擎。计划在下一个版本中修复。

  • 当多个线程并行执行执行计划时,通过 cublasLt 引擎路径的块缩放数据类型 MXFP8 和 NVFP4 的 Matmul 操作存在并发错误,从而导致不正确的结果。计划在即将发布的 cuDNN 9.7.1 版本中修复。

局限性

  • cuDNN 没有严格遵循开放计算项目 (OCP) 规范,来实现由新的块缩放量化和反量化操作启用的微缩放数据格式。特别是,为了计算块的缩放因子,cuDNN 将绝对最大值除以输出类型的最大可表示值,而不是计算指数的商。然后 cuDNN 向上舍入以获得缩放因子。与 OCP 建议的实现相比,这种行为是由观察到的更好的数值属性驱动的。

  • 在计算能力为 10.0 和 12.0 的设备上,专门的 ConvBNfprop 模式不支持先前在 9.0 设备上支持的模式,即

    • scale+bias+add+ReLU+Conv+GenStats (SBARCS)

    • scale+bias+add+ReLU+Conv+GenStats (DSBARCS)

兼容性

有关操作系统、CUDA、CUDA 驱动程序和 NVIDIA 硬件的最新兼容性软件版本,请参阅cuDNN 支持矩阵

已弃用和移除的特性

以下特性在 cuDNN 9.7.0 中已弃用

  • 以前,在前向兼容模式下,用户可以直接指定引擎配置,而无需查询 cuDNN 启发式方法,并且库将尝试支持指定的引擎配置。此特性现已弃用。因此,想要使用前向兼容特性的用户必须在前向兼容模式下调用启发式方法,并且仅使用启发式方法推荐的引擎配置。

cuDNN 9.6.0#

这些是 NVIDIA cuDNN 后端 9.6.0 发行说明。这些发行说明包括之前 cuDNN 版本的修复,以及以下附加更改。

公告

  • 为了在卷积模型上获得最佳性能,请将 CUDA 驱动程序版本升级到 12.6 Update 2 或更高版本。

主要特性和增强功能

以下特性和增强功能已添加到此版本中

  • 运行时融合引擎的编译时间在 NVIDIA Ampere、Ada 和 Hopper GPU 架构上得到了优化。

  • 除了 cuDNN 9.5.0 中支持的引擎外,Native CUDA Graph API 现在支持所有注意力运行时融合引擎。

  • 对具有序列打包布局的缩放点积注意力的支持已得到增强和优化,如下所示

    • 对于所有特性(例如 MQA 和 GQA),具有序列打包布局的缩放点积注意力的性能在正向和反向路径上都得到了提高。

    • 现在支持使用以下新 frontend API 的组查询注意力的打包工作区大小

    • sdpa_backward_attribute.set_max_total_seq_len_q

    • sdpa_backward_attribute.set_max_total_seq_len_kv

    此特性使用户在使用组查询注意力时能够显著减少内存使用量。

    • 现在支持表示为 CUDNN_DATA_INT64 数据类型的 Ragged 偏移。

  • Layer Norm 融合支持已得到增强,如下所示

    • 现在支持以下序言/尾声逐点融合:Abs、Ceil、Cos、Exp、Floor、Neg、Sin、Erf、Identity、Rsqrt、Log、Reciprocal、Tan、Add、Add Square、Max、Min、Mul、Sub、Div、Pow、Atan2、Mod。

    • 现在支持任意数量的序言/尾声融合,而以前仅支持一个序言/尾声融合。

    • 现在支持序言/尾声融合中的行广播、列广播和标量广播。

  • 在前向兼容模式下,错误状态报告和日志记录已得到改进。

已修复的问题
  • 此版本的 cuDNN 提供了针对 CUDA 12.6 Update 2 版本(即 CUDA cuBLAS 12.6.3.3)中 fp8 矩阵乘法问题的解决方法。这些问题导致 cuBLAS 将 fp8 矩阵乘法计算图返回为不受支持。

已知问题

  • 当与 CUDNN_TENSOR_NCHW_VECT_C 布局中的张量一起使用时,Hopper GPU 架构上的 cudnnFusedOpsExecute 可能会导致 CUDNN_STATUS_INTERNAL_ERROR。计划在未来的版本中修复。

  • Instance norm 引擎在 cuDNN 的 GRAPH_JIT_ONLY 配置中不受支持。计划在未来的版本中提供支持。

兼容性

有关操作系统、CUDA、CUDA 驱动程序和 NVIDIA 硬件的最新兼容性软件版本,请参阅cuDNN 支持矩阵

cuDNN 9.5.1#

这些是 NVIDIA cuDNN 9.5.1 发行说明。这些发行说明包括之前 cuDNN 版本的修复,以及以下附加更改。

已修复的问题

  • 现在必须将 CUDNN_ATTR_OPERATION_NORM_FWD_EPSILON_DESCCUDNN_ATTR_OPERATION_NORM_BWD_EPSILON_DESC 的属性 CUDNN_ATTR_TENSOR_IS_BY_VALUE 设置为 true

  • A100 GPU 上深度可分离卷积的 wgrad 性能已得到提高。

  • 对于 Ampere 和 Ada Lovelace 之前的 GPU 架构,norm 前向推理、norm 前向训练和 norm 反向操作的 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 1CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 2 可能会因 CUDNN_STATUS_ARCH_MISMATCH 而失败。在 cuDNN 9.5.0 中,返回的错误为 CUDNN_STATUS_EXECUTION_FAILED。计划在未来的版本中完全修复此问题。

  • 已修复操作图最终确定阶段期间的潜在挂起。

  • 已修复导致 cuDNN 在 Fused Flash Attention bprop 期间隐式期望 grad-output 和 output 具有相同步幅的问题。

已知问题

  • 当与 CUDNN_TENSOR_NCHW_VECT_C 布局中的张量一起使用时,Hopper GPU 架构上的 cudnnFusedOpsExecute 可能会导致 CUDNN_STATUS_INTERNAL_ERROR。计划在未来的版本中修复。

  • Instance norm 引擎在 cuDNN 的 GRAPH_JIT_ONLY 配置中不受支持。计划在未来的版本中提供支持。

兼容性

有关操作系统、CUDA、CUDA 驱动程序和 NVIDIA 硬件的最新兼容性软件版本,请参阅cuDNN 支持矩阵

cuDNN 9.5.0#

这些是 NVIDIA cuDNN 9.5.0 发行说明。这些发行说明包括之前 cuDNN 版本的修复,以及以下附加更改。

公告

  • 已引入新的 Native CUDA Graph API。对于选定的引擎,这允许直接构建表示执行计划的 CUDA 图(不要与 cuDNN 图混淆)。这是一种比使用 CUDA 图捕获更灵活的替代方案,因为它允许使用新的变体包指针更新现有的 CUDA 图。

主要特性和增强功能

以下特性和增强功能已添加到此版本中

  • 已引入 Stream-K flash attention,以加速 LLM 推理的解码阶段,其中 Hopper 和 Ampere GPU 的 Q 张量的序列长度都等于 1,平均速度提高了 200%。

  • cuDNN 的 GRAPH_JIT_ONLY 配置中对 Layer 和 RMS 归一化的支持已得到增强。

  • 在 cuDNN 的运行时融合引擎中,具有大 gemm-K 维度的 GEMM 融合和卷积权重梯度计算融合的性能得到了提高。

  • 对于 Hopper GPU,在 cuDNN 运行时融合 Flash Attention 引擎中添加了对所有 d 值小于或等于 256 且为 8 的倍数的 bprop 的融合 flash attention 支持。

  • FP16 和 BF16 缩放点积注意力引擎现在支持用于 Ragged 偏移的 int64_t 数据类型,Ragged 偏移用于打包序列张量布局。

  • FP16 和 BF16 缩放点积注意力引擎现在支持将 Ragged 偏移添加到 softmax_stats 张量。

  • 通过 cuBLASLt 引擎,对于所有支持的数据类型 - FP16、BF16、E4M3 和 E5M2 - 某些融合的矩阵乘法的性能已得到增强。新添加的引擎覆盖范围包括用于 dReLudGeLu 的尾声融合,以及可选的 dBias。这些反向传递融合消耗由相应的前向传递计算原语生成的辅助张量的输出。

  • 对于维度大于 8 的池化窗口,池化性能得到了显著提升。

已修复的问题

以下问题已在此版本中修复

  • 已修复运行时融合引擎中可能导致 Ampere、Ada Lovelace 和 Hopper GPU 上具有降采样混合输入的卷积 fprop 和卷积反向数据计算导致 IMA 的问题。

  • 已修复运行时融合引擎中可能导致 Hopper GPU 上具有通道广播主循环融合的分组卷积 fprop 和卷积反向数据计算获得不正确结果的问题。

  • 已修复运行时融合引擎中可能导致 Ampere、Ada Lovelace 和 Hopper GPU 上具有层缩减融合的卷积 fprop 和卷积反向数据计算,或具有标量或通道缩减融合的卷积反向权重获得不正确结果的问题。

  • 已修复运行时融合引擎中可能导致 Hopper GPU 上具有列或实例缩减融合的 matmul、卷积 fprop、卷积反向数据和卷积反向权重挂起的问题。

  • FP16 和 BF16 缩放点积注意力的零序列长度支持的回归(导致非法指令错误)现已修复。

  • 对于某些 ConvolutionBwdFilter 深度可分离卷积工作负载,cuDNN 以前可能会生成 racecheck hazard 警告。此错误已得到纠正。

已知问题

  • Instance norm 引擎在 cuDNN 的 GRAPH_JIT_ONLY 配置中不受支持。计划在未来的版本中提供支持。

  • 对于 Ampere 和 Ada Lovelace 之前的 GPU 架构,norm 前向推理、norm 前向训练和 norm 反向操作的 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 1CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 2 可能会因 CUDNN_STATUS_EXECUTION_FAILED 而失败。计划在未来的版本中修复。

兼容性

有关操作系统、CUDA、CUDA 驱动程序和 NVIDIA 硬件的最新兼容性软件版本,请参阅cuDNN 支持矩阵

局限性

  • 新的 Native CUDA Graph API 仅支持有限数量的引擎,预计未来版本将添加对更多引擎的支持。对于此特性的初始版本,支持选择卷积、matmul 和 pointwise 运行时融合模式。受支持的引擎具有行为注释 CUDNN_BEHAVIOR_NOTE_SUPPORTS_NATIVE_GRAPH_API。Native CUDA graph API 还要求 cuDNN 编译到 CUDA runtime 12.x 或更高版本。

  • 动态形状特性需要 CUDA runtime 12.x 或更高版本,因为当前支持此特性的底层引擎具有此要求。

cuDNN 9.4.0#

这些是 NVIDIA cuDNN 9.4.0 发行说明。这些发行说明包括之前 cuDNN 版本的修复,以及以下附加更改。

主要特性和增强功能

以下特性和增强功能已添加到此版本中

  • Paged attention 现在由新引入的分页缓存加载操作 CUDNN_BACKEND_OPERATION_PAGED_CACHE_LOAD_DESCRIPTOR 启用,Ampere 和 Hopper GPU 支持该操作。此操作可以与现有的 flash fprop attention 内核结合使用。Paged attention 通过将 K/V 缓存存储在非连续内存中,并使用页表重建它们,从而实现更高效的内存使用。有关更多信息,请参阅开发者指南、cudnn_graph 库中的 CUDNN_BACKEND_OPERATION_PAGED_CACHE_LOAD_DESCRIPTORPaged Attention paper

  • 提高了 Hopper 上缩放点积注意力的性能。加速可能在 5% 到 30% 之间变化,具体取决于层形状和输入数据类型。

  • 注意力内核的函数名称已得到增强,其中包含有关指令和内核类型的更多详细信息。例如,cudnn_generated_fort_native_sdpa_sm80_flash_fprop_wmma_f16_knob_32_64x64x64_4x1x1_kernel0_0

  • 提高了 Hopper 上具有可变序列长度的缩放点积注意力的性能。前向传递的内核执行时间现在与查询的实际序列长度成正比,而不是早期版本中查询的最大序列长度。

  • 动态形状与内核缓存作为一项新特性添加,以显著减少具有相同拓扑动态形状操作图的用例的执行计划最终确定时间。这是通过将先前编译的适用内核绑定到执行计划,而不是从头开始重新编译新内核来完成的。有关更多详细信息,请参阅API 参考中的 CUDNN_ATTR_EXECUTION_PLAN_KERNEL_CACHECUDNN_ATTR_OPERATIONGRAPH_IS_DYNAMIC_SHAPE_ENABLED

  • 通过 cuBLASLt 引擎,对于 E4M3 和 E5M2 数据类型,某些融合的矩阵乘法的性能已得到增强。新添加的引擎覆盖范围包括

    • 对 GEMM alpha 和 beta 比例因子的支持。

    • 用于 Bias 与 ReLu 和 GeLu 的尾声融合,以及用于反向传递所需的 ReLu 或 GeLu 辅助张量输出的尾声融合。

    • 用于输入矩阵 A 或 B 的 Bias 梯度的融合。

  • NVIDIA 的 Ampere、Ada 和 Hopper GPU 上具有大 K 维度的矩阵乘法的运行时融合引擎性能改进。

  • 为层归一化和 RMS 归一化添加了零中心 gamma 支持。

已修复的问题

以下问题已在此版本中修复

  • 通过在内核的 softmax 部分中使用更精确的数学运算,增强了缩放点积注意力 (SDPA) 的数值精度。

  • 在 cuDNN 9.3 中,包含 norm 前向推理操作的图将无法序列化。这已在 cuDNN 9.4 中修复。

已知问题

  • 通用运行时融合引擎支持面 70 不支持空间维度大于 32 的 convdgradwgrad 过滤器。

  • 具有可变序列长度的 FP16 和 BF16 缩放点积注意力 (SDPA) 引擎与 cuDNN 版本 9.3.0 相比存在回归,其中启用零序列长度值会导致非法指令错误。

  • 对于某些 ConvolutionBwdFilter 深度可分离卷积工作负载,cuDNN 可能会生成 racecheck hazard 警告。此问题在之前的 v9 版本中存在,将在未来的版本中修复。

兼容性

有关操作系统、CUDA、CUDA 驱动程序和 NVIDIA 硬件的最新兼容性软件版本,请参阅cuDNN 支持矩阵

cuDNN 9.3.0#

这些是 NVIDIA cuDNN 9.3.0 发行说明。这些发行说明包括之前 cuDNN 版本的修复,以及以下附加更改。

公告

cudnnBackendInitialize() 函数已被标记为已弃用。

主要特性和增强功能

以下特性和增强功能已添加到此版本中

  • cuDNN v8 卷积 API 已扩展为支持批量大小大于 2 Giga 元素的张量。

  • 具有可变序列长度的 FP16 和 BF16 缩放点积注意力 (SDPA) 支持零序列长度值。此特性允许使用动态批量大小,而无需重新编译。当查询序列长度和键/值序列长度均为零时,cuDNN 对批量执行空操作。

  • SM Carveout 的支持已扩展到 NVIDIA Ampere 和 Hopper GPU 上批归一化的后端 API。

  • 在检索 CUDNN_ATTR_ENGINEHEUR_RESULTS 属性期间生成的错误消息可以通过 cudnnGetLastErrorString() 函数访问。

  • 库的前向兼容性已得到增强,如下所示

    • 批量归一化和 Legacy API 中与归一化相关的 API 已实现前向兼容。

    • RNN API 已实现前向兼容。

    • 涉及分组卷积(即 G>1 的卷积)的融合模式已实现卷积前向操作的前向兼容。

  • 通过 cuBLASLt 引擎,对于 FP16 和 BF16 数据类型,某些融合的矩阵乘法的性能已得到增强。新添加的引擎覆盖范围包括

    • 对 GEMM alpha 和 beta 比例因子的支持

    • 用于 Bias 与 ReLu 和 GeLu 的尾声融合,以及用于反向传递所需的 ReLu 或 GeLu 辅助张量输出的尾声融合

    有关支持的数据类型的详细信息,请参阅 cuBLAS 文档中的 cublasLtMatmul()

  • 运行时融合引擎现在支持 NVIDIA 的 Ampere、Ada Lovelace 和 Hopper 架构上 matmul 和卷积的未完全打包的张量。

  • 执行计划的序列化和反序列化支持已扩展为支持所有归一化后端引擎,以避免重新编译运行时生成的内核。

  • Layer 和 RMS Normalization 现在在输出 FP8 数据类型的张量时支持可选的 amax。

已修复的问题

以下问题已在此版本中修复

  • 缩放点积注意力 (SDPA) 与 Ragged 偏移量在多次执行时不再表现出未定义的行为。之前,SDPA 与 Ragged 偏移量的连续运行可能会挂起或导致非法访问。

  • 与可变序列长度一起使用时,具有 Ragged 偏移量的 SDPA 不再导致无效的内存访问。

  • 已进行其他修复,以解决 FP16 和 BF16 SDPA fprop 中的数值问题,其中内核会在大型查询和键张量值的 softmax 统计张量中生成意外输出。cuDNN 9.2.1 中发布了部分修复,最新的修复提供了更完整的解决方案。

  • NVIDIA CUDA Toolkit 12.6 中的 cuBLASLt 库修复了 FP8 矩阵乘法的 e5m2 数据类型的错误。因此,从版本 12.6 开始,cuBLASLt 引擎在这种情况下重新启用 cuBLASLt。

  • cudnnReduceTensor() 函数现在可以在输入张量的数据类型与计算类型相同且格式不是 NCHW 时,正确地从输入张量中获取数据。

  • 当激活模式为 CUDNN_ACTIVATION_IDENTITY 时,或者计算图中没有激活节点时,使用 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 14 运行 conv-bias-act 融合不再生成不正确的结果。

  • 现在允许对 cudnnSoftmaxForward() 函数进行就地操作。

已知问题

  • 与 cuDNN 8.9.x 相比,在 Orin 卡上使用 NCHW 格式的几个卷积模型存在已知的性能回归。为了获得更好的性能,请切换到 NHWC 格式。

  • 对于 GEMM 的 cuDNN 运行时融合引擎,当批量大小大于 1 时,具有打包布尔数据类型的输出张量可能会返回不正确的结果。

  • 某些包含推理模式下的 norm 前向操作的图无法序列化。

兼容性

有关操作系统、CUDA、CUDA 驱动程序和 NVIDIA 硬件的最新兼容性软件版本,请参阅cuDNN 支持矩阵

已弃用和移除的特性

cuDNN 9.2.1#

这些是 NVIDIA cuDNN 9.2.1 发行说明。这些发行说明包括之前 cuDNN 版本的修复,以及以下附加更改。

主要特性和增强功能

以下特性和增强功能已添加到此版本中

  • 增强了具有大 gemm-k 维度的混合输入 matmul 运行时融合的启发式方法。

已修复的问题

以下问题已在此版本中修复

  • 修复了 FP16 和 BF16 融合 flash attention fprop 中的数值问题,其中内核会在大型查询和键张量值的 softmax 统计张量中生成意外输出。

  • 修复了 FP8 融合闪存注意力 fprop 中的一个功能性错误,该错误导致内核自 cuDNN 9.1.1 版本以来给出错误的结果。

  • 当卷积的 N、C 和 K 维度的乘积超过 int32_t 的最大值时,CUDNN_CONVOLUTION_BWD_FILTER_1X1_AS_GEMM_ENGINE 引擎可能会因越界内存访问而失败。此问题已修复。

已知问题

  • ConvBNwgrad 预编译引擎不支持 NVIDIA Hopper 上的 Cooperative Group Array = 3*3, 1*9 and 9*1

  • 当库在 compute-sanitizer 下进行测试时,用于卷积前向的 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 67 和用于带偏置和激活的卷积前向(ConvBiasAct 操作)的 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 51 可能会在竞争条件检查测试中失败。

  • 在图捕获模式下,使用 11.3 之前的 cuBlasLt 运行 cuDNN 可能会失败。

  • 对于 cudnnBackendNormMode_t 设置为 CUDNN_RMS_NORM 的 Norm Backward 操作,CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 3 与工具包 12.2 及 12.3 的 CUDA 次要版本不兼容。此引擎的用户应安装工具包附带的更新驱动程序。

  • 已知 cudnnNanPropagation_t 可能在 conv-bias-relu 融合中不受尊重。

  • 在此初始版本中,前向兼容性模式提供的支持存在一些注意事项。有关更多信息,请参阅 cuDNN 开发者指南

  • 对于 ConvBiasAct 操作,当在 CUDA 工具包版本 11.0.3 至 11.1 的系统上运行时,CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 39 可能会返回 CUDNN_STATUS_EXECUTION_FAILED。将 CUDA 工具包版本升级到 11.1 Update 1 或更高版本应能解决此问题。

  • ZLIB 版本 1.2.13 静态链接到 cuDNN Windows 动态库中。在未来的 cuDNN 版本中,将解决将 ZLIB 静态链接到其他平台的问题。

  • 在 H100 GPU 上,compute-sanitizer 工具在 cuDNN 多头注意力 API cudnnMultiHeadAttnForward() 调用的某些 cuBLAS 内核中标记了内存写入访问中的竞争条件。此问题发生在 CUDA 工具包 12.2 中,但在 CUDA 工具包 12.3 中已得到解决。

  • 当库在 compute sanitizer 下进行测试时,cuDNN 对 CUDA 工具包 12.1 中 cuBLAS 的使用可能会导致竞争条件检查失败。这些失败被认为是 cuBLAS 问题,目前正在调查中。此问题的解决方法是使用 CUDA 工具包 12.0 中的 cuBLAS。

  • CUDA 版本 11.7 及更早版本中 NVRTC 中的编译器错误导致在运行时融合引擎中计算布尔输入张量的逻辑运算时输出不正确。已集成一种解决方法以避免最常见的问题。但是,强烈建议更新到至少 CUDA 版本 11.7u1 以进行修复。具体而言,已知的失败案例是模式为 CUDNN_POINTWISE_LOGICAL_NOTCUDNN_POINTWISE_LOGICAL_ANDCUDNN_POINTWISE_LOGICAL_OR 的逐点运算在布尔张量上运行时。

  • 对于非零 beta 问题,用于卷积前向的 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 57 和用于卷积反向数据的 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 62 可能会出现性能下降。但是,cuDNN 启发式算法通常不推荐使用它们,因此可观察到的影响应该很小。

  • 在 AArch64 系统上托管的 Volta 兼容架构上使用 cudnnFusedOpsExecute() 时,如果 cudnnFusedOps_t 设置为 CUDNN_FUSED_SCALE_BIAS_ACTIVATION_WGRAD,则可能会生成不正确的结果。

  • 在 CUDA 11.7 中,当使用运行时融合引擎时,NVRTC 库可能会导致少量内存泄漏。此问题已在 CUDA 工具包 11.8 或更高版本中得到解决。

  • 与 2080 Ti 相比,某些卷积模型在 RTX 3090 上的性能较低。这包括 EfficientNet,性能差异高达 6 倍;UNet,性能差异高达 1.6 倍;以及 Tacotron,性能差异高达 1.6 倍。

  • 池化模式为 CUDNN_POOLING_AVGcudnnPoolingForward() 可能会为输出张量中超出 cudnnGetPoolingNdForwardOutputDim()cudnnGetPooling2dForwardOutputDim() 建议值的像素输出 NaN。

  • 当在 CUDNN_DATA_FLOAT 数据(输入和输出)上以数学类型 CUDNN_TENSOR_OP_MATH_ALLOW_CONVERSION 运行时,卷积(ConvolutionForwardConvolutionBackwardDataConvolutionBackwardFilter)可能会出现性能下降。

  • 与 cuDNN 8.1.0 相比,V100 和 NVIDIA A100 GPU 上的 FastPitch 和 WaveGlow 模型的某些 dgrad NHWC 配置存在已知的性能下降。

  • INT8 操作的数值行为(包括饱和行为、累加器数据类型等)尚未记录在案。

  • 在 NVIDIA Turing 架构上,PyTorch SSD 模型的推理存在已知的 25% 性能下降。

  • 与 cuDNN 8.0.5 相比,在 V100 上运行的 SSD 模型存在已知的约 17% 性能下降。

  • 用于卷积的基于 FFT 和 Winograd 的算法不支持图捕获。

  • 当运行某些滤波器大小为 1x1 的卷积时,存在已知的性能下降。严重程度因用户使用的 CUDA 工具包版本而异。

  • 当运行某些高分组计数的卷积时,存在已知的性能下降。在 V100 上,此问题更为严重。

  • 由于 NVIDIA CUDA 工具包 12.5 中提供的 cuBLASLt 中存在一个错误,通过 cuBLASLt 库路径对 FP8 矩阵乘法的支持仅限于 e4m3 数据类型。在修复 cuBLASLt 中的错误后,将在未来的 cuDNN 版本中添加对 e5m2 数据类型的支持。

兼容性

有关操作系统、CUDA、CUDA 驱动程序和 NVIDIA 硬件的最新兼容性软件版本,请参阅cuDNN 支持矩阵

局限性

  • 在 Windows 上禁用 CUDA 上下文抢占有时会导致卷积运行返回 CUDNN_INTERNAL_ERRORS。使用 cuDNN 时,请勿禁用 CUDA 上下文抢占。

  • 在 cuDNN 8.9.0 中,运行时融合引擎(使用 CUDNN_BEHAVIOR_NOTE_RUNTIME_COMPILATION)仅适用于 CUDA 工具包 11.8、12.0 和 12.1 中的 NVRTC。它们不能保证与未来的 CUDA 12.x 工具包前向兼容。

  • cudnnBackendFinalize()cudnnBackendExecute()CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR 上返回的状态可能会根据 cuDNN 动态依赖项的版本而更改。截至撰写本文时,已知只有 cuBLAS 会影响这些函数调用的返回状态。

  • cuDNN 卷积内核的功能支持标准不需要考虑填充。当正向卷积空间维度小于滤波器大小且填充非零但足以将空间维度扩展到或超出滤波器维度时,cuDNN 用户可能会看到意外的缺少问题支持。这在 INT8 卷积内核中很常见,但不限于此。

  • 在 cuDNN 中执行批量归一化时,如果输出张量步幅重叠,则允许操作继续进行,但是,不保证确定性结果。

  • 用于卷积反向数据(属于旧版 CUDNN_CONVOLUTION_BWD_DATA_ALGO_0 的一部分)的 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 25 不支持输出梯度张量的乘积 N*C*H*W 等于或超过 2^31 的张量。

  • 用于卷积反向数据(属于旧版 CUDNN_CONVOLUTION_BWD_DATA_ALGO_1 的一部分)的 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 1 不支持输出梯度张量的乘积 N*H*W 等于或超过 2^31 的张量。此问题一直存在于 cuDNN 的所有先前版本中,并且使用该引擎的用例将显示不正确的结果。

  • 运行时融合引擎仅在基于 CUDA 工具包 11.2 update 1 或更高版本构建的 cuDNN 版本中受支持;它还需要 CUDA 11.2 update 1 或更高版本中的 NVRTC。如果未满足此条件,将返回错误状态 CUDNN_STATUS_NOT_SUPPORTEDCUDNN_STATUS_RUNTIME_PREREQUISITE_MISSING

  • 必须将示例安装在可写位置,否则示例可能会崩溃。

  • 张量指针和滤波器指针至少需要 4 字节对齐,包括 cuDNN 库中的 INT8 数据。

  • cuDNN 中的某些计算选项需要在张量上增加对齐才能高性能运行。与往常一样,cuDNN 建议用户将张量对齐到 16 字节边界,这将足以满足 cuDNN 中任何计算选项的对齐要求。否则可能会导致 cuDNN 8.0.x 与 cuDNN v7.6 相比性能下降。

  • 对于某些算法,当计算以 float(32 位浮点数)进行,而输出为 FP16(半精度浮点数)时,不同算法之间的数值精度可能存在差异。cuDNN 8.0.x 用户可以定位后端 API 以程序化方式查询算法的数值注释以获取信息。在用户定位旧版 API 时,algo0 和 algo1 在某些情况下会降低精度累积。在所有情况下,即使这些数值差异可能出现在单元测试中,但已知它们不会影响训练精度。

  • 对于卷积反向数据和反向滤波器的 _ALGO_0 算法,在 Volta 之前的设备上不支持组大于 1 且维度 C、D(如果是 3D 卷积)、H 和 W 的乘积为奇数的分组卷积。为了防止仅在 Volta 及更高版本中具有 16 位版本的指令可能发生的非法内存访问,请将至少一个维度填充为偶数值。

  • 在 INT8x32 Tensor Core 情况下,cuDNN v7.6 支持的参数限制为 W >= (R-1) * dilationW && H >= (S-1) * dilationH,而在 cuDNN v8.0.x 中,不再支持 W == (R-1) * dilationW || H == (S-1) * dilationH 的情况。

  • 在后端 API 中,当输入图像的乘积(channels * height * width)超过 536,870,912(即 2^29)时,不支持 CUDNN_ATTR_ENGINE_GLOBAL_INDEX=1 的卷积前向引擎。

  • 当通道数超过 1024 时,cudnnSpatialTfSamplerBackward() 返回 CUDNN_STATUS_NOT_SUPPORTED

  • 使用图捕获时,用户应调用子库版本检查 API(例如,cudnnOpsVersionCheck()cudnnGraphVersionCheck())以在打开图捕获之前加载子库中的内核。cuDNN 9.0.0 中轮询资源使用情况(例如请求的工作区大小)的 API 并不总是与 CUDA 图捕获兼容。依赖于这些 API 与 CUDA 图捕获兼容的用户应首先在“预热”运行期间执行其工作负载,然后再尝试图捕获。

  • cuDNN 用户需要显式地将 cuBLAS 的依赖项添加到链接器命令中,以解决来自 cuDNN 静态库的未定义符号。

  • 从版本 8.1 开始,cuDNN 在 x86_64 架构上使用 AVX intrinsics;不支持 AVX intrinsics 的此架构用户可能会看到非法指令错误。

  • 空间持久批量归一化 API 仅适用于 Pascal 及更高版本架构。Pre-Pascal 架构返回 CUDNN_STATUS_ARCH_MISMATCH。受影响的 API 包括

  • 当使用兼容模式的旧版 11.x CUDA 工具包的应用程序使用 cuDNN 进行 compute-sanitizer 测试时,由于缺少函数,将会出现错误代码 500 的 cuGetProcAddress 失败。此错误可以忽略,或者使用 --report-api-errors no 选项来抑制,因为这是由于 CUDA 向后兼容性检查函数是否可与 CUDA 工具包组合使用。这些函数是在更高版本的 CUDA 中引入的,但在当前平台上不可用。缺少这些函数是无害的,不会引起任何功能问题。

  • 由于编译器限制,融合注意力力和闪存注意力运行时引擎已针对 NVRTC 11.8 禁用。

cuDNN 9.2.0#

这些是 NVIDIA cuDNN 9.2.0 发行说明。这些发行说明包括先前 cuDNN 版本的修复以及以下其他更改。

公告

  • 引入了 cuDNN 的 GRAPH_JIT_ONLY 配置,其中包括所有 JIT 引擎,同时删除了基于预编译内核的引擎。此配置显着减小了所需的二进制文件大小。它支持 NVIDIA Ampere 及更高版本的 GPU,涵盖了图 API 的大部分子集。有关更多信息,请参阅 cuDNN 开发者指南的 cuDNN 库配置 部分。

主要特性和增强功能

以下特性和增强功能已添加到此版本中

  • 已将对激活函数(如 CUDNN_POINTWISE_TANH_FWD)的支持添加到 Hopper GPU 上的融合闪存注意力 fpropbprop 中。此支持也已添加到 Ampere GPU 上的融合闪存注意力 fprop 中。有关更多信息,请参阅 cuDNN 开发者指南

  • cuDNN 中通过 cuBLASLt 库对矩阵乘法的支持已扩展到 FP8 数据类型。在此版本之前,此支持仅限于 FP16 数据类型。对于具有 FP8 数据类型以及关联的量化和反量化比例的 cuDNN 图,如果该图受 cuBLASLt 支持,则 cuDNN 启发式算法将首先在列表中返回使用 cuBLASLt 库的引擎。通过 cuBLASLt 的此支持不适用于 GRAPH_JIT_ONLY 配置。

  • INFO 级别日志记录中,为所有 cudnnBackend*() API 添加了返回的 cudnnStatus_t 错误代码日志记录。

  • INFO 级别日志记录中,为 CUDNN_BACKEND_OPERATIONGRAPH_DESCRIPTORCUDNN_BACKEND_ENGINECFG_DESCRIPTOR 上的 cudnnBackendFinalize() 添加了可视化图形信息的日志记录。

  • 您现在可以检查工作负载是否受支持,方法是完成 EngineConfig 的最终确定;以前需要完成 ExecutionPlan(使用 EngineConfig)以确定支持。此外,现在保证启发式查询返回的 EngineConfig 是可执行的。

  • 在运行时融合引擎中

    • 具有 FP32 和 FP8 输入数据类型的 ConvolutionBwdFilterConvolutionBwdData 现在在 NVIDIA Hopper 上支持 NHWC 输入张量布局。

    • 优化了 NVIDIA Ampere、NVIDIA Ada Lovelace 和 Hopper 上通道尺寸较窄的用例的 ConvolutionFwd 操作的性能。

    • 对于 Ampere 和 Ada 上具有主循环融合的所有 MatmulConvolutionFwd 用例,将输入张量对齐要求从 128 位放宽到 32 位。

    • 在 Ampere、Ada 和 Hopper 上,将输出对齐要求放宽到 8 位。

  • 融合批量归一化 + ReLU 图模式现在支持指定带有下限和上限剪裁的 ReLU。

  • 层和 RMS 归一化现在支持输出张量的 FP8 数据类型。

已修复的问题

以下问题已在此版本中修复

  • 层和 RMS 归一化现在支持 2D/3D 张量,并尝试从输入张量形状推断归一化维度。如果无法推断,则引擎默认为 2D/3D 张量对最后一个维度进行归一化,为 4D/5D 张量对除第一个维度以外的所有维度进行归一化。

  • cudnnCTCLoss() 现在支持在图捕获模式下执行。

  • 在以前的版本中,用于层和 RMS 归一化前向的运行时引擎(带有 CUDNN_BEHAVIOR_NOTE_RUNTIME_COMPILATION)在处理较大的隐藏尺寸时可能会编译缓慢。此编译缓慢问题已在此版本中得到修复。

已知问题

  • 当库在 compute-sanitizer 下进行测试时,用于卷积前向的 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 67 和用于带偏置和激活的卷积前向(ConvBiasAct 操作)的 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 51 可能会在竞争条件检查测试中失败。

  • 在图捕获模式下,使用 11.3 之前的 cuBlasLt 运行 cuDNN 可能会失败。

  • 对于 cudnnBackendNormMode_t 设置为 CUDNN_RMS_NORM 的 Norm Backward 操作,CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 3 与工具包 12.2 及 12.3 的 CUDA 次要版本不兼容。此引擎的用户应安装工具包附带的更新驱动程序。

  • 已知 cudnnNanPropagation_t 可能在 conv-bias-relu 融合中不受尊重。

  • 在此初始版本中,前向兼容性模式提供的支持存在一些注意事项。有关更多信息,请参阅 cuDNN 开发者指南

  • 对于 ConvBiasAct 操作,当在 CUDA 工具包版本 11.0.3 至 11.1 的系统上运行时,CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 39 可能会返回 CUDNN_STATUS_EXECUTION_FAILED。将 CUDA 工具包版本升级到 11.1 Update 1 或更高版本应能解决此问题。

  • ZLIB 版本 1.2.13 静态链接到 cuDNN Windows 动态库中。在未来的 cuDNN 版本中,将解决将 ZLIB 静态链接到其他平台的问题。

  • 在 H100 GPU 上,compute-sanitizer 工具在 cuDNN 多头注意力 API cudnnMultiHeadAttnForward() 调用的某些 cuBLAS 内核中标记了内存写入访问中的竞争条件。此问题发生在 CUDA 工具包 12.2 中,但在 CUDA 工具包 12.3 中已得到解决。

  • 当库在 compute sanitizer 下进行测试时,cuDNN 对 CUDA 工具包 12.1 中 cuBLAS 的使用可能会导致竞争条件检查失败。这些失败被认为是 cuBLAS 问题,目前正在调查中。此问题的解决方法是使用 CUDA 工具包 12.0 中的 cuBLAS。

  • CUDA 版本 11.7 及更早版本中 NVRTC 中的编译器错误导致在运行时融合引擎中计算布尔输入张量的逻辑运算时输出不正确。已集成一种解决方法以避免最常见的问题。但是,强烈建议更新到至少 CUDA 版本 11.7u1 以进行修复。具体而言,已知的失败案例是模式为 CUDNN_POINTWISE_LOGICAL_NOTCUDNN_POINTWISE_LOGICAL_ANDCUDNN_POINTWISE_LOGICAL_OR 的逐点运算在布尔张量上运行时。

  • 对于非零 beta 问题,用于卷积前向的 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 57 和用于卷积反向数据的 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 62 可能会出现性能下降。但是,cuDNN 启发式算法通常不推荐使用它们,因此可观察到的影响应该很小。

  • 在 AArch64 系统上托管的 Volta 兼容架构上使用 cudnnFusedOpsExecute() 时,如果 cudnnFusedOps_t 设置为 CUDNN_FUSED_SCALE_BIAS_ACTIVATION_WGRAD,则可能会生成不正确的结果。

  • 在 CUDA 11.7 中,当使用运行时融合引擎时,NVRTC 库可能会导致少量内存泄漏。此问题已在 CUDA 工具包 11.8 或更高版本中得到解决。

  • 与 2080 Ti 相比,某些卷积模型在 RTX 3090 上的性能较低。这包括 EfficientNet,性能差异高达 6 倍;UNet,性能差异高达 1.6 倍;以及 Tacotron,性能差异高达 1.6 倍。

  • 池化模式为 CUDNN_POOLING_AVGcudnnPoolingForward() 可能会为输出张量中超出 cudnnGetPoolingNdForwardOutputDim()cudnnGetPooling2dForwardOutputDim() 建议值的像素输出 NaN。

  • 当在 CUDNN_DATA_FLOAT 数据(输入和输出)上以数学类型 CUDNN_TENSOR_OP_MATH_ALLOW_CONVERSION 运行时,卷积(ConvolutionForwardConvolutionBackwardDataConvolutionBackwardFilter)可能会出现性能下降。

  • 与 cuDNN 8.1.0 相比,V100 和 NVIDIA A100 GPU 上的 FastPitch 和 WaveGlow 模型的某些 dgrad NHWC 配置存在已知的性能下降。

  • INT8 操作的数值行为(包括饱和行为、累加器数据类型等)尚未记录在案。

  • 在 NVIDIA Turing 架构上,PyTorch SSD 模型的推理存在已知的 25% 性能下降。

  • 与 cuDNN 8.0.5 相比,在 V100 上运行的 SSD 模型存在已知的约 17% 性能下降。

  • 用于卷积的基于 FFT 和 Winograd 的算法不支持图捕获。

  • 当运行某些滤波器大小为 1x1 的卷积时,存在已知的性能下降。严重程度因用户使用的 CUDA 工具包版本而异。

  • 当运行某些高分组计数的卷积时,存在已知的性能下降。在 V100 上,此问题更为严重。

  • 由于 NVIDIA CUDA 工具包 12.5 中提供的 cuBLASLt 中存在一个错误,通过 cuBLASLt 库路径对 FP8 矩阵乘法的支持仅限于 e4m3 数据类型。在修复 cuBLASLt 中的错误后,将在未来的 cuDNN 版本中添加对 e5m2 数据类型的支持。

兼容性

有关操作系统、CUDA、CUDA 驱动程序和 NVIDIA 硬件的最新兼容性软件版本,请参阅cuDNN 支持矩阵

局限性

  • 在 Windows 上禁用 CUDA 上下文抢占有时会导致卷积运行返回 CUDNN_INTERNAL_ERRORS。使用 cuDNN 时,请勿禁用 CUDA 上下文抢占。

  • 在 cuDNN 8.9.0 中,运行时融合引擎(使用 CUDNN_BEHAVIOR_NOTE_RUNTIME_COMPILATION)仅适用于 CUDA 工具包 11.8、12.0 和 12.1 中的 NVRTC。它们不能保证与未来的 CUDA 12.x 工具包前向兼容。

  • cudnnBackendFinalize()cudnnBackendExecute()CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR 上返回的状态可能会根据 cuDNN 动态依赖项的版本而更改。截至撰写本文时,已知只有 cuBLAS 会影响这些函数调用的返回状态。

  • cuDNN 卷积内核的功能支持标准不需要考虑填充。当正向卷积空间维度小于滤波器大小且填充非零但足以将空间维度扩展到或超出滤波器维度时,cuDNN 用户可能会看到意外的缺少问题支持。这在 INT8 卷积内核中很常见,但不限于此。

  • 在 cuDNN 中执行批量归一化时,如果输出张量步幅重叠,则允许操作继续进行,但是,不保证确定性结果。

  • 用于卷积反向数据(属于旧版 CUDNN_CONVOLUTION_BWD_DATA_ALGO_0 的一部分)的 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 25 不支持输出梯度张量的乘积 N*C*H*W 等于或超过 2^31 的张量。

  • 用于卷积反向数据(属于旧版 CUDNN_CONVOLUTION_BWD_DATA_ALGO_1 的一部分)的 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 1 不支持输出梯度张量的乘积 N*H*W 等于或超过 2^31 的张量。此问题一直存在于 cuDNN 的所有先前版本中,并且使用该引擎的用例将显示不正确的结果。

  • 运行时融合引擎仅在基于 CUDA 工具包 11.2 update 1 或更高版本构建的 cuDNN 版本中受支持;它还需要 CUDA 11.2 update 1 或更高版本中的 NVRTC。如果未满足此条件,将返回错误状态 CUDNN_STATUS_NOT_SUPPORTEDCUDNN_STATUS_RUNTIME_PREREQUISITE_MISSING

  • 必须将示例安装在可写位置,否则示例可能会崩溃。

  • 张量指针和滤波器指针至少需要 4 字节对齐,包括 cuDNN 库中的 INT8 数据。

  • cuDNN 中的某些计算选项需要在张量上增加对齐才能高性能运行。与往常一样,cuDNN 建议用户将张量对齐到 16 字节边界,这将足以满足 cuDNN 中任何计算选项的对齐要求。否则可能会导致 cuDNN 8.0.x 与 cuDNN v7.6 相比性能下降。

  • 对于某些算法,当计算以 float(32 位浮点数)进行,而输出为 FP16(半精度浮点数)时,不同算法之间的数值精度可能存在差异。cuDNN 8.0.x 用户可以定位后端 API 以程序化方式查询算法的数值注释以获取信息。在用户定位旧版 API 时,algo0 和 algo1 在某些情况下会降低精度累积。在所有情况下,即使这些数值差异可能出现在单元测试中,但已知它们不会影响训练精度。

  • 对于卷积反向数据和反向滤波器的 _ALGO_0 算法,在 Volta 之前的设备上不支持组大于 1 且维度 C、D(如果是 3D 卷积)、H 和 W 的乘积为奇数的分组卷积。为了防止仅在 Volta 及更高版本中具有 16 位版本的指令可能发生的非法内存访问,请将至少一个维度填充为偶数值。

  • 在 INT8x32 Tensor Core 情况下,cuDNN v7.6 支持的参数限制为 W >= (R-1) * dilationW && H >= (S-1) * dilationH,而在 cuDNN v8.0.x 中,不再支持 W == (R-1) * dilationW || H == (S-1) * dilationH 的情况。

  • 在后端 API 中,当输入图像的乘积(channels * height * width)超过 536,870,912(即 2^29)时,不支持 CUDNN_ATTR_ENGINE_GLOBAL_INDEX=1 的卷积前向引擎。

  • 当通道数超过 1024 时,cudnnSpatialTfSamplerBackward() 返回 CUDNN_STATUS_NOT_SUPPORTED

  • 使用图捕获时,用户应调用子库版本检查 API(例如,cudnnOpsVersionCheck()cudnnGraphVersionCheck())以在打开图捕获之前加载子库中的内核。cuDNN 9.0.0 中轮询资源使用情况(例如请求的工作区大小)的 API 并不总是与 CUDA 图捕获兼容。依赖于这些 API 与 CUDA 图捕获兼容的用户应首先在“预热”运行期间执行其工作负载,然后再尝试图捕获。

  • cuDNN 用户需要显式地将 cuBLAS 的依赖项添加到链接器命令中,以解决来自 cuDNN 静态库的未定义符号。

  • 从版本 8.1 开始,cuDNN 在 x86_64 架构上使用 AVX intrinsics;不支持 AVX intrinsics 的此架构用户可能会看到非法指令错误。

  • 空间持久批量归一化 API 仅适用于 Pascal 及更高版本架构。Pre-Pascal 架构返回 CUDNN_STATUS_ARCH_MISMATCH。受影响的 API 包括

  • 当使用兼容模式的旧版 11.x CUDA 工具包的应用程序使用 cuDNN 进行 compute-sanitizer 测试时,由于缺少函数,将会出现错误代码 500 的 cuGetProcAddress 失败。此错误可以忽略,或者使用 --report-api-errors no 选项来抑制,因为这是由于 CUDA 向后兼容性检查函数是否可与 CUDA 工具包组合使用。这些函数是在更高版本的 CUDA 中引入的,但在当前平台上不可用。缺少这些函数是无害的,不会引起任何功能问题。

  • 由于编译器限制,融合注意力力和闪存注意力运行时引擎已针对 NVRTC 11.8 禁用。

已弃用和移除的特性

以下功能在 cuDNN 9.2.0 中已删除

  • 版本 8.5.0 之前的 cuDNN 文档将从 Web 上删除。有关访问先前发布的文档,请参阅 文档存档 主题。

cuDNN 9.1.1#

这些是 NVIDIA cuDNN 9.1.1 发行说明。这些发行说明包括先前 cuDNN 版本的修复以及以下其他更改。

主要特性和增强功能

以下特性和增强功能已添加到此版本中

  • 将 NVIDIA Hopper GPU 上的 FP8 融合闪存注意力 fprop 的支持扩展到隐藏维度高达 256。

已修复的问题

以下问题已在此版本中修复

  • 在 NVIDIA Hopper 和 Ampere 架构上,当使用大于或等于 512k 的序列长度时,融合闪存注意力 bprop 将返回执行失败。此问题已修复。

  • 修复了版本 9.1.0 中混合输入精度矩阵乘法/卷积用例的启发式算法回归。

  • 在 NVIDIA Hopper 架构上,融合闪存注意力 bprop 可能会在版本 8.9.7 中导致不正确的结果;我们错过了在该版本中记录此问题。此问题已在版本 9.0.0 中修复。

  • 已更新层和 RMS 归一化的比例和偏差张量描述符检查,以要求以正确的顺序指定归一化维度。cuDNN 版本 9.0 及更早版本中缺少这些检查。

已知问题

  • 当库在 compute-sanitizer 下进行测试时,用于卷积前向的 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 67 和用于带偏置和激活的卷积前向(ConvBiasAct 操作)的 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 51 可能会在竞争条件检查测试中失败。

  • 在图捕获模式下,使用 11.3 之前的 cuBlasLt 运行 cuDNN 可能会失败。

  • 对于 cudnnBackendNormMode_t 设置为 CUDNN_RMS_NORM 的 Norm Backward 操作,CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 3 与工具包 12.2 及更高版本的 CUDA 次要版本不兼容。此引擎的用户应安装工具包附带的更新驱动程序。

  • 已知 cudnnNanPropagation_t 可能在 conv-bias-relu 融合中不受尊重。

  • 在此初始版本中,前向兼容性模式提供的支持存在一些注意事项。有关更多信息,请参阅 cuDNN 开发者指南

  • 对于 ConvBiasAct 操作,当在 CUDA 工具包版本 11.0.3 至 11.1 的系统上运行时,CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 39 可能会返回 CUDNN_STATUS_EXECUTION_FAILED。将 CUDA 工具包版本升级到 11.1 Update 1 或更高版本应能解决此问题。

  • ZLIB 版本 1.2.13 静态链接到 cuDNN Windows 动态库中。在未来的 cuDNN 版本中,将解决将 ZLIB 静态链接到其他平台的问题。

  • 在 H100 GPU 上,compute-sanitizer 工具在 cuDNN 多头注意力 API cudnnMultiHeadAttnForward() 调用的某些 cuBLAS 内核中标记了内存写入访问中的竞争条件。此问题发生在 CUDA 工具包 12.2 中,但在 CUDA 工具包 12.3 中已得到解决。

  • 当库在 compute sanitizer 下进行测试时,cuDNN 对 CUDA 工具包 12.1 中 cuBLAS 的使用可能会导致竞争条件检查失败。这些失败被认为是 cuBLAS 问题,目前正在调查中。此问题的解决方法是使用 CUDA 工具包 12.0 中的 cuBLAS。

  • CUDA 版本 11.7 及更早版本中 NVRTC 中的编译器错误导致在运行时融合引擎中计算布尔输入张量的逻辑运算时输出不正确。已集成一种解决方法以避免最常见的问题。但是,强烈建议更新到至少 CUDA 版本 11.7u1 以进行修复。具体而言,已知的失败案例是模式为 CUDNN_POINTWISE_LOGICAL_NOTCUDNN_POINTWISE_LOGICAL_ANDCUDNN_POINTWISE_LOGICAL_OR 的逐点运算在布尔张量上运行时。

  • 对于非零 beta 问题,用于卷积前向的 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 57 和用于卷积反向数据的 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 62 可能会出现性能下降。但是,cuDNN 启发式算法通常不推荐使用它们,因此可观察到的影响应该很小。

  • 在 AArch64 系统上托管的 Volta 兼容架构上使用 cudnnFusedOpsExecute() 时,如果 cudnnFusedOps_t 设置为 CUDNN_FUSED_SCALE_BIAS_ACTIVATION_WGRAD,则可能会生成不正确的结果。

  • 在 CUDA 11.7 中,当使用运行时融合引擎时,NVRTC 库可能会导致少量内存泄漏。此问题已在 CUDA 工具包 11.8 或更高版本中得到解决。

  • 与 2080 Ti 相比,某些卷积模型在 RTX 3090 上的性能较低。这包括 EfficientNet,性能差异高达 6 倍;UNet,性能差异高达 1.6 倍;以及 Tacotron,性能差异高达 1.6 倍。

  • 池化模式为 CUDNN_POOLING_AVGcudnnPoolingForward() 可能会为输出张量中超出 cudnnGetPoolingNdForwardOutputDim()cudnnGetPooling2dForwardOutputDim() 建议值的像素输出 NaN。

  • 当在 CUDNN_DATA_FLOAT 数据(输入和输出)上以数学类型 CUDNN_TENSOR_OP_MATH_ALLOW_CONVERSION 运行时,卷积(ConvolutionForwardConvolutionBackwardDataConvolutionBackwardFilter)可能会出现性能下降。

  • 与 cuDNN 8.1.0 相比,V100 和 NVIDIA A100 GPU 上的 FastPitch 和 WaveGlow 模型的某些 dgrad NHWC 配置存在已知的性能下降。

  • INT8 操作的数值行为(包括饱和行为、累加器数据类型等)尚未记录在案。

  • 在 NVIDIA Turing 架构上,PyTorch SSD 模型的推理存在已知的 25% 性能下降。

  • 与 cuDNN 8.0.5 相比,在 V100 上运行的 SSD 模型存在已知的约 17% 性能下降。

  • 用于卷积的基于 FFT 和 Winograd 的算法不支持图捕获。

  • 当运行某些滤波器大小为 1x1 的卷积时,存在已知的性能下降。严重程度因用户使用的 CUDA 工具包版本而异。

  • 当运行某些高分组计数的卷积时,存在已知的性能下降。在 V100 上,此问题更为严重。

兼容性

有关操作系统、CUDA、CUDA 驱动程序和 NVIDIA 硬件的最新兼容性软件版本,请参阅cuDNN 支持矩阵

局限性

  • 在 Windows 上禁用 CUDA 上下文抢占有时会导致卷积运行返回 CUDNN_INTERNAL_ERRORS。使用 cuDNN 时,请勿禁用 CUDA 上下文抢占。

  • 在 cuDNN 8.9.0 中,运行时融合引擎(使用 CUDNN_BEHAVIOR_NOTE_RUNTIME_COMPILATION)仅适用于 CUDA 工具包 11.8、12.0 和 12.1 中的 NVRTC。它们不能保证与未来的 CUDA 12.x 工具包前向兼容。

  • cudnnBackendFinalize()cudnnBackendExecute()CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR 上返回的状态可能会根据 cuDNN 动态依赖项的版本而更改。截至撰写本文时,已知只有 cuBLAS 会影响这些函数调用的返回状态。

  • cuDNN 卷积内核的功能支持标准不需要考虑填充。当正向卷积空间维度小于滤波器大小且填充非零但足以将空间维度扩展到或超出滤波器维度时,cuDNN 用户可能会看到意外的缺少问题支持。这在 INT8 卷积内核中很常见,但不限于此。

  • 在 cuDNN 中执行批量归一化时,如果输出张量步幅重叠,则允许操作继续进行,但是,不保证确定性结果。

  • 用于卷积反向数据(属于旧版 CUDNN_CONVOLUTION_BWD_DATA_ALGO_0 的一部分)的 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 25 不支持输出梯度张量的乘积 N*C*H*W 等于或超过 2^31 的张量。

  • 用于卷积反向数据(属于旧版 CUDNN_CONVOLUTION_BWD_DATA_ALGO_1 的一部分)的 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 1 不支持输出梯度张量的乘积 N*H*W 等于或超过 2^31 的张量。此问题一直存在于 cuDNN 的所有先前版本中,并且使用该引擎的用例将显示不正确的结果。

  • 运行时融合引擎仅在基于 CUDA 工具包 11.2 update 1 或更高版本构建的 cuDNN 版本中受支持;它还需要 CUDA 11.2 update 1 或更高版本中的 NVRTC。如果未满足此条件,将返回错误状态 CUDNN_STATUS_NOT_SUPPORTEDCUDNN_STATUS_RUNTIME_PREREQUISITE_MISSING

  • 必须将示例安装在可写位置,否则示例可能会崩溃。

  • 当 cuDNN 库使用 CUDA 工具包 10.2 或更高版本构建时,RNN 和多头注意力 API 调用可能会表现出不确定性行为。这是 cuBLAS 库中新的缓冲区管理和启发式算法的结果。如 结果可再现性 中所述,当通过同一 cuBLAS 句柄在多个 CUDA 流中启动 cuBLAS API 时,数值结果可能不确定。这是由默认配置中使用的两个缓冲区大小(16 KB 和 4 MB)引起的。

    当运行时无法使用更大的缓冲区大小时,可能会使用较小的缓冲区和不同的 GPU 内核,而不是等待释放该大小的缓冲区。内核选择可能会影响数值结果。用户可以通过在 CUBLAS_WORKSPACE_CONFIG 环境变量中设置单个缓冲区大小来消除 cuDNN RNN 和多头注意力 API 的不确定性行为,例如,:16:8 :4096:2

    第一个配置指示 cuBLAS 在 GPU 内存中分配八个 16 KB 的缓冲区,而第二个设置创建两个 4 MB 的缓冲区。cuBLAS 10.2 和 11.0 中的默认缓冲区配置为 :16:8:4096:2,即我们有两个缓冲区大小。在早期的 cuBLAS 库(例如 cuBLAS 10.0)中,它使用了 :16:8 不可调整的配置。当只有一种大小的缓冲区可用时,cuBLAS 调用的行为在多流设置中是确定性的。

  • 张量指针和滤波器指针至少需要 4 字节对齐,包括 cuDNN 库中的 INT8 数据。

  • cuDNN 中的某些计算选项需要在张量上增加对齐才能高性能运行。与往常一样,cuDNN 建议用户将张量对齐到 16 字节边界,这将足以满足 cuDNN 中任何计算选项的对齐要求。否则可能会导致 cuDNN 8.0.x 与 cuDNN v7.6 相比性能下降。

  • 对于某些算法,当计算以 float(32 位浮点数)进行,而输出为 FP16(半精度浮点数)时,不同算法之间的数值精度可能存在差异。cuDNN 8.0.x 用户可以定位后端 API 以程序化方式查询算法的数值注释以获取信息。在用户定位旧版 API 时,algo0 和 algo1 在某些情况下会降低精度累积。在所有情况下,即使这些数值差异可能出现在单元测试中,但已知它们不会影响训练精度。

  • 对于卷积反向数据和反向滤波器的 _ALGO_0 算法,在 Volta 之前的设备上不支持组大于 1 且维度 C、D(如果是 3D 卷积)、H 和 W 的乘积为奇数的分组卷积。为了防止仅在 Volta 及更高版本中具有 16 位版本的指令可能发生的非法内存访问,请将至少一个维度填充为偶数值。

  • 在 INT8x32 Tensor Core 情况下,cuDNN v7.6 支持的参数限制为 W >= (R-1) * dilationW && H >= (S-1) * dilationH,而在 cuDNN v8.0.x 中,不再支持 W == (R-1) * dilationW || H == (S-1) * dilationH 的情况。

  • 在 cuDNN 的先前版本中,某些卷积算法可以使用基于纹理的加载指令来提高性能,尤其是在较旧的硬件架构中。用户可以使用环境变量 CUDNN_TEXOFF_DBG 选择不使用纹理。在 cuDNN 8.x 中,此变量已删除。纹理加载默认情况下已关闭。希望继续使用基于纹理的加载的用户可以采用新的后端 API,并将引擎旋钮 CUDNN_KNOB_TYPE_USE_TEX 切换为 1,用于支持基于纹理的加载指令的引擎。

  • 在后端 API 中,当输入图像的乘积(channels * height * width)超过 536,870,912(即 2^29)时,不支持 CUDNN_ATTR_ENGINE_GLOBAL_INDEX=1 的卷积前向引擎。

  • 当通道数超过 1024 时,cudnnSpatialTfSamplerBackward() 返回 CUDNN_STATUS_NOT_SUPPORTED

  • 使用图捕获时,用户应调用子库版本检查 API(例如,cudnnOpsVersionCheck()cudnnGraphVersionCheck())以在打开图捕获之前加载子库中的内核。cuDNN 9.0.0 中轮询资源使用情况(例如请求的工作区大小)的 API 并不总是与 CUDA 图捕获兼容。依赖于这些 API 与 CUDA 图捕获兼容的用户应首先在“预热”运行期间执行其工作负载,然后再尝试图捕获。

  • cuDNN 用户需要显式地将 cuBLAS 的依赖项添加到链接器命令中,以解决来自 cuDNN 静态库的未定义符号。

  • 从版本 8.1 开始,cuDNN 在 x86_64 架构上使用 AVX intrinsics;不支持 AVX intrinsics 的此架构用户可能会看到非法指令错误。

  • 空间持久批量归一化 API 仅适用于 Pascal 及更高版本架构。Pre-Pascal 架构返回 CUDNN_STATUS_ARCH_MISMATCH。受影响的 API 包括

  • 对于 Pre-Pascal 架构,cudnnAddTensor() 的性能可能会从 8.2 回退到 8.3。

  • 当使用兼容模式的旧版 11.x CUDA 工具包的应用程序使用 cuDNN 进行 compute-sanitizer 测试时,由于缺少函数,将会出现错误代码 500 的 cuGetProcAddress 失败。此错误可以忽略,或者使用 --report-api-errors no 选项来抑制,因为这是由于 CUDA 向后兼容性检查函数是否可与 CUDA 工具包组合使用。这些函数是在更高版本的 CUDA 中引入的,但在当前平台上不可用。缺少这些函数是无害的,不会引起任何功能问题。

  • 由于编译器限制,融合注意力力和闪存注意力运行时引擎已针对 NVRTC 11.8 禁用。

已弃用和移除的特性

以下功能在 cuDNN 9.1.1 中已删除

  • 版本 8.5.0 之前的 cuDNN 文档将从 Web 上删除。有关访问先前发布的文档,请参阅 文档存档 主题。

cuDNN 9.1.0#

这些是 NVIDIA cuDNN 9.1.0 发行说明。这些发行说明包括先前 cuDNN 版本的修复以及以下其他更改。

公告

  • 已启用帧指针,这可以实现更好的运行时可见性和可追溯性,并允许在调试目的需要时更轻松地与 NVIDIA 交换运行时信息。有关如何使用来自 cuDNN 符号服务器 的模糊符号来符号化堆栈跟踪的更多信息,请参阅 cuDNN 开发者指南

主要特性和增强功能

以下特性和增强功能已添加到此版本中

  • cuDNN 融合闪存注意力支持已扩展到 NVIDIA Hopper GPU 的 FP8 数据类型。有关更多信息,请参阅 cuDNN 开发者指南

  • cuDNN BF16 和 FP16 融合闪存注意力现在在前向传播中支持嵌入 dim = 256 用例。

  • 通过在 NVIDIA Ampere 和 Hopper GPU 上添加滑动窗口注意力功能,扩展了对 FP16 和 BF16 融合闪存注意力的支持。有关更多信息,请参阅 cuDNN 开发者指南

  • 通过新的引擎改进了单操作 matmul(即,非融合)性能,该引擎可以在 cuBLASLt 支持给定的 matmul 参数时将调用分派到 cuBLASLt。

  • 改进了 cudnnGetRNNWeightParams() 函数,但未更改其原型。您现在可以对 cudnnGetRNNWeightParams() 进行两次单独的调用

    • 一次调用以检索权重矩阵形状(bDesc=NULLbAddr=NULL),

    • 一次调用以检索偏差维度(mDesc=NULLmAddr=NULL

    此调用模式类似于 cuDNN 7.x 中的两个专用 RNN API:cudnnGetRNNLinLayerMatrixParams()cudnnGetRNNLinLayerBiasParams()cudnnGetRNNWeightParams() 函数允许 weightSpace 参数为 NULL。这样,您可以检索权重/偏差偏移量,而不是由 weightSpace 地址指定的缓冲区内的实际指针。

  • 对于 LayerNormRMSNormElementwise 仿射运算(ScaleDScaleBiasDBias)现在对于前向和后向传递都是可选的。

已修复的问题

以下问题已在此版本中修复

  • 在 NVIDIA Hopper 架构上,当查询和值的每个头的嵌入维度不同时,使用打包布局的融合闪存注意力中可能会出现不正确的结果。此问题已修复。

  • 当使用 cuDNN 静态库时,您必须使用构建 cuDNN 的 CUDA 工具包的相同主版本和小版本来构建您的应用程序。对于 12.x 版本,此限制已取消,现在允许您使用 CUDA 工具包 12 的任何次要版本。11.x 版本仍然存在此限制,这已记录在 cuDNN 支持矩阵 中。

  • 从 cuDNN 8.8 移动到 cuDNN 8.9 时,DgradDreluBnBwdWeightsCUDNN_ATTR_ENGINE_GLOBAL_INDEX = 0 观察到性能下降。此回归已在 cuDNN 9.0.0 中修复。

  • 当窗口中的所有值都等于 -128 时,INT8 的最大池化返回 -127。自此版本起,此问题已解决。

已知问题

  • 在图捕获模式下,使用 11.3 之前的 cuBlasLt 运行 cuDNN 可能会失败。

  • 对于 cudnnBackendNormMode_t 设置为 CUDNN_RMS_NORM 的 Norm Backward 操作,CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 3 与工具包 12.2 及更高版本的 CUDA 次要版本不兼容。此引擎的用户应安装工具包附带的更新驱动程序。

  • 已知 cudnnNanPropagation_t 可能在 conv-bias-relu 融合中不受尊重。

  • 在此初始版本中,前向兼容性模式提供的支持存在一些注意事项。有关更多信息,请参阅 cuDNN 开发者指南

  • 对于 ConvBiasAct 操作,当在 CUDA 工具包版本 11.0.3 至 11.1 的系统上运行时,CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 39 可能会返回 CUDNN_STATUS_EXECUTION_FAILED。将 CUDA 工具包版本升级到 11.1 Update 1 或更高版本应能解决此问题。

  • ZLIB 版本 1.2.13 静态链接到 cuDNN Windows 动态库中。在未来的 cuDNN 版本中,将解决将 ZLIB 静态链接到其他平台的问题。

  • 在 H100 GPU 上,compute-sanitizer 工具在 cuDNN 多头注意力 API cudnnMultiHeadAttnForward() 调用的某些 cuBLAS 内核中标记了内存写入访问中的竞争条件。此问题发生在 CUDA 工具包 12.2 中,但在 CUDA 工具包 12.3 中已得到解决。

  • 当库在 compute sanitizer 下进行测试时,cuDNN 对 CUDA 工具包 12.1 中 cuBLAS 的使用可能会导致竞争条件检查失败。这些失败被认为是 cuBLAS 问题,目前正在调查中。此问题的解决方法是使用 CUDA 工具包 12.0 中的 cuBLAS。

  • CUDA 版本 11.7 及更早版本中 NVRTC 中的编译器错误导致在运行时融合引擎中计算布尔输入张量的逻辑运算时输出不正确。已集成一种解决方法以避免最常见的问题。但是,强烈建议更新到至少 CUDA 版本 11.7u1 以进行修复。具体而言,已知的失败案例是模式为 CUDNN_POINTWISE_LOGICAL_NOTCUDNN_POINTWISE_LOGICAL_ANDCUDNN_POINTWISE_LOGICAL_OR 的逐点运算在布尔张量上运行时。

  • 对于非零 beta 问题,用于卷积前向的 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 57 和用于卷积反向数据的 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 62 可能会出现性能下降。但是,cuDNN 启发式算法通常不推荐使用它们,因此可观察到的影响应该很小。

  • 在 AArch64 系统上托管的 Volta 兼容架构上使用 cudnnFusedOpsExecute() 时,如果 cudnnFusedOps_t 设置为 CUDNN_FUSED_SCALE_BIAS_ACTIVATION_WGRAD,则可能会生成不正确的结果。

  • 在 CUDA 11.7 中,当使用运行时融合引擎时,NVRTC 库可能会导致少量内存泄漏。此问题已在 CUDA 工具包 11.8 或更高版本中得到解决。

  • 与 2080 Ti 相比,某些卷积模型在 RTX 3090 上的性能较低。这包括 EfficientNet,性能差异高达 6 倍;UNet,性能差异高达 1.6 倍;以及 Tacotron,性能差异高达 1.6 倍。

  • 池化模式为 CUDNN_POOLING_AVGcudnnPoolingForward() 可能会为输出张量中超出 cudnnGetPoolingNdForwardOutputDim()cudnnGetPooling2dForwardOutputDim() 建议值的像素输出 NaN。

  • 当在 CUDNN_DATA_FLOAT 数据(输入和输出)上以数学类型 CUDNN_TENSOR_OP_MATH_ALLOW_CONVERSION 运行时,卷积(ConvolutionForwardConvolutionBackwardDataConvolutionBackwardFilter)可能会出现性能下降。

  • 与 cuDNN 8.1.0 相比,V100 和 NVIDIA A100 GPU 上的 FastPitch 和 WaveGlow 模型的某些 dgrad NHWC 配置存在已知的性能下降。

  • INT8 操作的数值行为(包括饱和行为、累加器数据类型等)尚未记录在案。

  • 在 NVIDIA Turing 架构上,PyTorch SSD 模型的推理存在已知的 25% 性能下降。

  • 与 cuDNN 8.0.5 相比,在 V100 上运行的 SSD 模型存在已知的约 17% 性能下降。

  • 用于卷积的基于 FFT 和 Winograd 的算法不支持图捕获。

  • 当运行某些滤波器大小为 1x1 的卷积时,存在已知的性能下降。严重程度因用户使用的 CUDA 工具包版本而异。

  • 当运行某些高分组计数的卷积时,存在已知的性能下降。在 V100 上,此问题更为严重。

兼容性

有关操作系统、CUDA、CUDA 驱动程序和 NVIDIA 硬件的最新兼容性软件版本,请参阅cuDNN 支持矩阵

局限性

  • 在 Windows 上禁用 CUDA 上下文抢占有时会导致卷积运行返回 CUDNN_INTERNAL_ERRORS。使用 cuDNN 时,请勿禁用 CUDA 上下文抢占。

  • 在 cuDNN 8.9.0 中,运行时融合引擎(使用 CUDNN_BEHAVIOR_NOTE_RUNTIME_COMPILATION)仅适用于 CUDA 工具包 11.8、12.0 和 12.1 中的 NVRTC。它们不能保证与未来的 CUDA 12.x 工具包前向兼容。

  • cudnnBackendFinalize()cudnnBackendExecute()CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR 上返回的状态可能会根据 cuDNN 动态依赖项的版本而更改。截至撰写本文时,已知只有 cuBLAS 会影响这些函数调用的返回状态。

  • cuDNN 卷积内核的功能支持标准不需要考虑填充。当正向卷积空间维度小于滤波器大小且填充非零但足以将空间维度扩展到或超出滤波器维度时,cuDNN 用户可能会看到意外的缺少问题支持。这在 INT8 卷积内核中很常见,但不限于此。

  • 在 cuDNN 中执行批量归一化时,如果输出张量步幅重叠,则允许操作继续进行,但是,不保证确定性结果。

  • 用于卷积反向数据(属于旧版 CUDNN_CONVOLUTION_BWD_DATA_ALGO_0 的一部分)的 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 25 不支持输出梯度张量的乘积 N*C*H*W 等于或超过 2^31 的张量。

  • 用于卷积反向数据(属于旧版 CUDNN_CONVOLUTION_BWD_DATA_ALGO_1 的一部分)的 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 1 不支持输出梯度张量的乘积 N*H*W 等于或超过 2^31 的张量。此问题一直存在于 cuDNN 的所有先前版本中,并且使用该引擎的用例将显示不正确的结果。

  • 运行时融合引擎仅在基于 CUDA 工具包 11.2 update 1 或更高版本构建的 cuDNN 版本中受支持;它还需要 CUDA 11.2 update 1 或更高版本中的 NVRTC。如果未满足此条件,将返回错误状态 CUDNN_STATUS_NOT_SUPPORTEDCUDNN_STATUS_RUNTIME_PREREQUISITE_MISSING

  • 必须将示例安装在可写位置,否则示例可能会崩溃。

  • 当 cuDNN 库使用 CUDA 工具包 10.2 或更高版本构建时,RNN 和多头注意力 API 调用可能会表现出不确定性行为。这是 cuBLAS 库中新的缓冲区管理和启发式算法的结果。如 结果可再现性 中所述,当通过同一 cuBLAS 句柄在多个 CUDA 流中启动 cuBLAS API 时,数值结果可能不确定。这是由默认配置中使用的两个缓冲区大小(16 KB 和 4 MB)引起的。

    当运行时无法使用更大的缓冲区大小时,可能会使用较小的缓冲区和不同的 GPU 内核,而不是等待释放该大小的缓冲区。内核选择可能会影响数值结果。用户可以通过在 CUBLAS_WORKSPACE_CONFIG 环境变量中设置单个缓冲区大小来消除 cuDNN RNN 和多头注意力 API 的不确定性行为,例如,:16:8 :4096:2

    第一个配置指示 cuBLAS 在 GPU 内存中分配八个 16 KB 的缓冲区,而第二个设置创建两个 4 MB 的缓冲区。cuBLAS 10.2 和 11.0 中的默认缓冲区配置为 :16:8:4096:2,即我们有两个缓冲区大小。在早期的 cuBLAS 库(例如 cuBLAS 10.0)中,它使用了 :16:8 不可调整的配置。当只有一种大小的缓冲区可用时,cuBLAS 调用的行为在多流设置中是确定性的。

  • 张量指针和滤波器指针至少需要 4 字节对齐,包括 cuDNN 库中的 INT8 数据。

  • cuDNN 中的某些计算选项需要在张量上增加对齐才能高性能运行。与往常一样,cuDNN 建议用户将张量对齐到 16 字节边界,这将足以满足 cuDNN 中任何计算选项的对齐要求。否则可能会导致 cuDNN 8.0.x 与 cuDNN v7.6 相比性能下降。

  • 对于某些算法,当计算以 float(32 位浮点数)进行,而输出为 FP16(半精度浮点数)时,不同算法之间的数值精度可能存在差异。cuDNN 8.0.x 用户可以定位后端 API 以程序化方式查询算法的数值注释以获取信息。在用户定位旧版 API 时,algo0 和 algo1 在某些情况下会降低精度累积。在所有情况下,即使这些数值差异可能出现在单元测试中,但已知它们不会影响训练精度。

  • 对于卷积反向数据和反向滤波器的 _ALGO_0 算法,在 Volta 之前的设备上不支持组大于 1 且维度 C、D(如果是 3D 卷积)、H 和 W 的乘积为奇数的分组卷积。为了防止仅在 Volta 及更高版本中具有 16 位版本的指令可能发生的非法内存访问,请将至少一个维度填充为偶数值。

  • 在 INT8x32 Tensor Core 情况下,cuDNN v7.6 支持的参数限制为 W >= (R-1) * dilationW && H >= (S-1) * dilationH,而在 cuDNN v8.0.x 中,不再支持 W == (R-1) * dilationW || H == (S-1) * dilationH 的情况。

  • 在 cuDNN 的先前版本中,某些卷积算法可以使用基于纹理的加载指令来提高性能,尤其是在较旧的硬件架构中。用户可以使用环境变量 CUDNN_TEXOFF_DBG 选择不使用纹理。在 cuDNN 8.x 中,此变量已删除。纹理加载默认情况下已关闭。希望继续使用基于纹理的加载的用户可以采用新的后端 API,并将引擎旋钮 CUDNN_KNOB_TYPE_USE_TEX 切换为 1,用于支持基于纹理的加载指令的引擎。

  • 在后端 API 中,当输入图像的乘积(channels * height * width)超过 536,870,912(即 2^29)时,不支持 CUDNN_ATTR_ENGINE_GLOBAL_INDEX=1 的卷积前向引擎。

  • 当通道数超过 1024 时,cudnnSpatialTfSamplerBackward() 返回 CUDNN_STATUS_NOT_SUPPORTED

  • 使用图捕获时,用户应调用子库版本检查 API(例如,cudnnOpsVersionCheck()cudnnGraphVersionCheck())以在打开图捕获之前加载子库中的内核。cuDNN 9.0.0 中轮询资源使用情况(例如请求的工作区大小)的 API 并不总是与 CUDA 图捕获兼容。依赖于这些 API 与 CUDA 图捕获兼容的用户应首先在“预热”运行期间执行其工作负载,然后再尝试图捕获。

  • cuDNN 用户需要显式地将 cuBLAS 的依赖项添加到链接器命令中,以解决来自 cuDNN 静态库的未定义符号。

  • 从版本 8.1 开始,cuDNN 在 x86_64 架构上使用 AVX intrinsics;不支持 AVX intrinsics 的此架构用户可能会看到非法指令错误。

  • 空间持久批量归一化 API 仅适用于 Pascal 及更高版本架构。Pre-Pascal 架构返回 CUDNN_STATUS_ARCH_MISMATCH。受影响的 API 包括

  • 对于 Pre-Pascal 架构,cudnnAddTensor() 的性能可能会从 8.2 回退到 8.3。

  • 当使用兼容模式的旧版 11.x CUDA 工具包的应用程序使用 cuDNN 进行 compute-sanitizer 测试时,由于缺少函数,将会出现错误代码 500 的 cuGetProcAddress 失败。此错误可以忽略,或者使用 --report-api-errors no 选项来抑制,因为这是由于 CUDA 向后兼容性检查函数是否可与 CUDA 工具包组合使用。这些函数是在更高版本的 CUDA 中引入的,但在当前平台上不可用。缺少这些函数是无害的,不会引起任何功能问题。

  • 由于编译器限制,融合注意力力和闪存注意力运行时引擎已针对 NVRTC 11.8 禁用。

已弃用和移除的特性

以下功能在 cuDNN 9.1.0 中已删除

  • 不再支持 ppc64le。最后一个支持 ppc64le 的版本是 9.0.0。

  • 不再支持 RHEL7。最后一个支持 RHEL7 的版本是 9.0.0。

  • 版本 8.5.0 之前的 cuDNN 文档将在即将发布的版本中删除。

cuDNN 9.0.0#

这些是 NVIDIA cuDNN 9.0.0 发行说明。这些发行说明包括先前 cuDNN 版本的修复以及以下其他更改。

公告

  • 这是近 4 年来 cuDNN 的第一个主要版本升级。有一些令人兴奋的新功能,以及一些可能对当前针对先前版本的 cuDNN 构建的应用程序具有破坏性的更改。本节提供了更多详细信息。

  • cuDNN 库被重组为几个子库,在未来的 cuDNN 版本中,这将允许更灵活地加载 cuDNN 库的选定部分。有关更多信息,请参阅 API 概述

  • 有关已添加、已弃用和已删除的 API 列表,请参阅 cuDNN 9.0.0 的 API 更改

  • cuDNN 不再依赖 cuBLAS 库;相反,cuDNN 现在依赖 cuBLASLt 库来执行某些原始线性代数运算符。

  • CUDNN_VERSION 的定义已从 CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL 更改为 CUDNN_MAJOR * 10000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL。请参阅 cuDNN 开发者指南中的 针对 CUDNN_VERSION 的版本检查

  • cuDNN 现在提供 RPM 和 Debian 元软件包,以便于安装。

    sudo apt-get install -y cudnn
    

    此命令安装适用于最新可用 CUDA 版本的最新可用 cuDNN。有关更多详细信息,请参阅 cuDNN 安装指南

  • 从 cuDNN 9.0.0 开始,操作图的一个重要子集是硬件前向兼容的。cuDNN 9.0.0 及后续版本将在所有当前和未来的 GPU 架构上运行,但受 cuDNN 开发者指南 中记录的特定约束的限制。

主要特性和增强功能

以下特性和增强功能已添加到此版本中

  • cuDNN 后端 API 为许多执行计划使用了更少的内存,这应该对缓存执行计划的用户有利。

  • FP16 和 BF16 融合闪存注意力引擎性能已针对 NVIDIA GPU 显着提高

    • 在 Hopper GPU 上,速度比 cuDNN 8.9.7 提高了高达 50%。

    • 在 Ampere GPU 上,速度比 cuDNN 8.9.7 提高了高达 100%。

  • 通过在 NVIDIA Ampere GPU 上添加相对位置编码的梯度,扩展了对 FP16 和 BF16 闪存注意力的支持。

  • 融合引擎支持在主循环中融合 matmul 的输入 A 和 B 的逐点运算。融合的逐点运算可以是标量、行、列广播或全张量逐点运算。输入 A 和 B 也都支持混合精度。此新功能仅适用于 NVIDIA Hopper GPU。

  • 已将 cuDNN 图 API 执行计划序列化 JSON 模式更新到版本 3。

  • 引入了更具体的错误代码和错误类别(BAD_PARAMNOT_SUPPORTEDINTERNAL_ERROREXECUTION_FAILED),这有助于检查这两个粒度级别的错误。引入了宏 CUDNN_ERROR_CATEGORY,用于从特定错误代码中提取错误类别。

  • 引入了嵌套日志级别,通过设置 CUDNN_LOGLEVEL_DBG,更高级别的日志级别会包含较低级别的日志级别。这更好地遵循了常用实践,并提高了错误报告的可见性。cuDNN 8.x 版本的日志环境变量 CUDNN_LOGERR_DBGCUDNN_LOGWARN_DBGCUDNN_LOGINFO_DBG 已被弃用,但在 cuDNN 9.x 版本的兼容性宽限期内将继续工作。

  • 引入了 cudnnGetLastErrorString API 来获取最新的错误消息。

  • 在此版本中,cuDNN 的线程安全性得到了显著提升。现在支持并发执行执行计划

已修复的问题

  • 在 NVIDIA Ampere 和 Hopper 架构上,当可变序列长度和填充后的序列长度不是 64 的倍数时,可能发生无效的内存访问。此问题已得到修复。

  • 在 NVIDIA Ampere 和 Hopper 架构上,当查询的序列长度小于 64 时,可能产生不正确的结果。此问题已得到修复。

  • 修复了一个精度问题,在该问题中,在 NVIDIA Hopper 融合引擎上,FP32 输入数据被截断而不是舍入为 TF32 数据。

  • 以前在 Linux 上,当 cuDNN 加载其其他子库之一时,它可能会尝试加载不匹配版本的 cuDNN,可能导致应用程序错误。此问题已得到修复;它将首先查找具有完整版本后缀的库文件,然后回退到更通用的版本后缀。

  • 修复了一个序列化问题,当反序列化的执行计划由于不正确地传递内核参数而产生错误结果时,会发生此问题。

  • 对于 ConvBNFusion 操作,CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 2 在某些问题集上存在竞争条件。此问题已在 cuDNN 8.9.6 版本中修复。

  • CUDNN_PROPAGATE_NAN 模式下,保证 NaN 传播。

已知问题

  • 在图捕获模式下,使用 11.3 之前的 cuBlasLt 运行 cuDNN 可能会失败。

  • 对于 cudnnBackendNormMode_t 设置为 CUDNN_RMS_NORM 的 Norm Backward 操作,CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 3 与工具包 12.2 及更高版本的 CUDA 次要版本不兼容。此引擎的用户应安装工具包附带的更新驱动程序。

  • 已知 cudnnNanPropagation_t 可能在 conv-bias-relu 融合中不受尊重。

  • 在此初始版本中,前向兼容性模式提供的支持存在一些注意事项。有关更多信息,请参阅 cuDNN 开发者指南

  • 对于 ConvBiasAct 操作,当在 CUDA 工具包版本 11.0.3 至 11.1 的系统上运行时,CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 39 可能会返回 CUDNN_STATUS_EXECUTION_FAILED。将 CUDA 工具包版本升级到 11.1 Update 1 或更高版本应能解决此问题。

  • ZLIB 版本 1.2.13 静态链接到 cuDNN Windows 动态库中。在未来的 cuDNN 版本中,将解决将 ZLIB 静态链接到其他平台的问题。

  • “compute-sanitizer” 工具在 H100 GPU 上由 cuDNN 多头注意力 API cudnnMultiHeadAttnForward() 调用的某些 cuBLAS 内核中标记了一个内存写入访问中的竞争条件。在 H100 上进行了广泛的测试,使用不同的时钟速度和计算负载,没有发现对功能结果有任何影响,结果始终相同且正确。目前正在调查此问题。

  • 当库在 compute sanitizer 下进行测试时,cuDNN 对 CUDA 工具包 12.1 中 cuBLAS 的使用可能会导致竞争条件检查失败。这些失败被认为是 cuBLAS 问题,目前正在调查中。此问题的解决方法是使用 CUDA 工具包 12.0 中的 cuBLAS。

  • CUDA 版本 11.7 及更早版本中 NVRTC 中的编译器错误导致在运行时融合引擎中计算布尔输入张量的逻辑运算时输出不正确。已集成一种解决方法以避免最常见的问题。但是,强烈建议更新到至少 CUDA 版本 11.7u1 以进行修复。具体而言,已知的失败案例是模式为 CUDNN_POINTWISE_LOGICAL_NOTCUDNN_POINTWISE_LOGICAL_ANDCUDNN_POINTWISE_LOGICAL_OR 的逐点运算在布尔张量上运行时。

  • 对于非零 beta 问题,用于卷积前向的 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 57 和用于卷积反向数据的 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 62 可能会出现性能下降。但是,cuDNN 启发式算法通常不推荐使用它们,因此可观察到的影响应该很小。

  • 在 AArch64 系统上托管的 Volta 兼容架构上使用 cudnnFusedOpsExecute() 时,如果 cudnnFusedOps_t 设置为 CUDNN_FUSED_SCALE_BIAS_ACTIVATION_WGRAD,则可能会生成不正确的结果。

  • 在 CUDA 11.7 中,当使用运行时融合引擎时,NVRTC 库可能会导致少量内存泄漏。此问题已在 CUDA 工具包 11.8 或更高版本中得到解决。

  • 从 cuDNN 8.8 升级到 cuDNN 8.9 时,DgradDreluBnBwdWeightsCUDNN_ATTR_ENGINE_GLOBAL_INDEX = 0 可能会出现性能下降。

  • 与 2080 Ti 相比,某些卷积模型在 RTX 3090 上的性能较低。这包括 EfficientNet,性能差异高达 6 倍;UNet,性能差异高达 1.6 倍;以及 Tacotron,性能差异高达 1.6 倍。

  • 池化模式为 CUDNN_POOLING_AVGcudnnPoolingForward() 可能会为输出张量中超出 cudnnGetPoolingNdForwardOutputDim()cudnnGetPooling2dForwardOutputDim() 建议值的像素输出 NaN。

  • 当在 CUDNN_DATA_FLOAT 数据(输入和输出)上以数学类型 CUDNN_TENSOR_OP_MATH_ALLOW_CONVERSION 运行时,卷积(ConvolutionForwardConvolutionBackwardDataConvolutionBackwardFilter)可能会出现性能下降。

  • 与 cuDNN 8.1.0 相比,V100 和 NVIDIA A100 GPU 上的 FastPitch 和 WaveGlow 模型的某些 dgrad NHWC 配置存在已知的性能下降。

  • INT8 操作的数值行为(包括饱和行为、累加器数据类型等)尚未记录在案。

  • 在 NVIDIA Turing 架构上,PyTorch SSD 模型的推理存在已知的 25% 性能下降。

  • 与 cuDNN 8.0.5 相比,在 V100 上运行的 SSD 模型存在已知的约 17% 性能下降。

  • 用于卷积的基于 FFT 和 Winograd 的算法不支持图捕获。

  • 当运行某些滤波器大小为 1x1 的卷积时,存在已知的性能下降。严重程度因用户使用的 CUDA 工具包版本而异。

  • 当运行某些高分组计数的卷积时,存在已知的性能下降。在 V100 上,此问题更为严重。

兼容性

有关操作系统、CUDA、CUDA 驱动程序和 NVIDIA 硬件的最新兼容性软件版本,请参阅cuDNN 支持矩阵

局限性

  • 在 Windows 上禁用 CUDA 上下文抢占有时会导致卷积运行返回 CUDNN_INTERNAL_ERRORS。使用 cuDNN 时,请勿禁用 CUDA 上下文抢占。

  • 当使用 cuDNN 静态库时,您需要使用构建 cuDNN 的 CUDA Toolkit 的相同主版本号.次版本号来构建您的应用程序。有关确切支持的 CUDA 版本,请参阅 cuDNN 支持矩阵

  • 在 cuDNN 8.9.0 中,运行时融合引擎(使用 CUDNN_BEHAVIOR_NOTE_RUNTIME_COMPILATION)仅适用于 CUDA 工具包 11.8、12.0 和 12.1 中的 NVRTC。它们不能保证与未来的 CUDA 12.x 工具包前向兼容。

  • cudnnBackendFinalize()cudnnBackendExecute()CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR 上返回的状态可能会根据 cuDNN 动态依赖项的版本而更改。截至撰写本文时,已知只有 cuBLAS 会影响这些函数调用的返回状态。

  • cuDNN 卷积内核的功能支持标准不需要考虑填充。当正向卷积空间维度小于滤波器大小且填充非零但足以将空间维度扩展到或超出滤波器维度时,cuDNN 用户可能会看到意外的缺少问题支持。这在 INT8 卷积内核中很常见,但不限于此。

  • 在 cuDNN 中执行批量归一化时,如果输出张量步幅重叠,则允许操作继续进行,但是,不保证确定性结果。

  • 用于卷积反向数据(属于旧版 CUDNN_CONVOLUTION_BWD_DATA_ALGO_0 的一部分)的 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 25 不支持输出梯度张量的乘积 N*C*H*W 等于或超过 2^31 的张量。

  • 用于卷积反向数据(属于旧版 CUDNN_CONVOLUTION_BWD_DATA_ALGO_1 的一部分)的 CUDNN_ATTR_ENGINE_GLOBAL_INDEX = 1 不支持输出梯度张量的乘积 N*H*W 等于或超过 2^31 的张量。此问题一直存在于 cuDNN 的所有先前版本中,并且使用该引擎的用例将显示不正确的结果。

  • 运行时融合引擎仅在基于 CUDA 工具包 11.2 update 1 或更高版本构建的 cuDNN 版本中受支持;它还需要 CUDA 11.2 update 1 或更高版本中的 NVRTC。如果未满足此条件,将返回错误状态 CUDNN_STATUS_NOT_SUPPORTEDCUDNN_STATUS_RUNTIME_PREREQUISITE_MISSING

  • 必须将示例安装在可写位置,否则示例可能会崩溃。

  • 当 cuDNN 库使用 CUDA 工具包 10.2 或更高版本构建时,RNN 和多头注意力 API 调用可能会表现出不确定性行为。这是 cuBLAS 库中新的缓冲区管理和启发式算法的结果。如 结果可再现性 中所述,当通过同一 cuBLAS 句柄在多个 CUDA 流中启动 cuBLAS API 时,数值结果可能不确定。这是由默认配置中使用的两个缓冲区大小(16 KB 和 4 MB)引起的。

    当运行时无法使用更大的缓冲区大小时,可能会使用较小的缓冲区和不同的 GPU 内核,而不是等待释放该大小的缓冲区。内核选择可能会影响数值结果。用户可以通过在 CUBLAS_WORKSPACE_CONFIG 环境变量中设置单个缓冲区大小来消除 cuDNN RNN 和多头注意力 API 的不确定性行为,例如,:16:8 :4096:2

    第一个配置指示 cuBLAS 在 GPU 内存中分配八个 16 KB 的缓冲区,而第二个设置创建两个 4 MB 的缓冲区。cuBLAS 10.2 和 11.0 中的默认缓冲区配置为 :16:8:4096:2,即我们有两个缓冲区大小。在早期的 cuBLAS 库(例如 cuBLAS 10.0)中,它使用了 :16:8 不可调整的配置。当只有一种大小的缓冲区可用时,cuBLAS 调用的行为在多流设置中是确定性的。

  • 张量指针和滤波器指针至少需要 4 字节对齐,包括 cuDNN 库中的 INT8 数据。

  • cuDNN 中的某些计算选项需要在张量上增加对齐才能高性能运行。与往常一样,cuDNN 建议用户将张量对齐到 16 字节边界,这将足以满足 cuDNN 中任何计算选项的对齐要求。否则可能会导致 cuDNN 8.0.x 与 cuDNN v7.6 相比性能下降。

  • 对于某些算法,当计算以 float(32 位浮点数)进行,而输出为 FP16(半精度浮点数)时,不同算法之间的数值精度可能存在差异。cuDNN 8.0.x 用户可以定位后端 API 以程序化方式查询算法的数值注释以获取信息。在用户定位旧版 API 时,algo0 和 algo1 在某些情况下会降低精度累积。在所有情况下,即使这些数值差异可能出现在单元测试中,但已知它们不会影响训练精度。

  • 对于卷积反向数据和反向滤波器的 _ALGO_0 算法,在 Volta 之前的设备上不支持组大于 1 且维度 C、D(如果是 3D 卷积)、H 和 W 的乘积为奇数的分组卷积。为了防止仅在 Volta 及更高版本中具有 16 位版本的指令可能发生的非法内存访问,请将至少一个维度填充为偶数值。

  • 在 INT8x32 Tensor Core 情况下,cuDNN v7.6 支持的参数限制为 W >= (R-1) * dilationW && H >= (S-1) * dilationH,而在 cuDNN v8.0.x 中,不再支持 W == (R-1) * dilationW || H == (S-1) * dilationH 的情况。

  • 在 cuDNN 的先前版本中,某些卷积算法可以使用基于纹理的加载指令来提高性能,尤其是在较旧的硬件架构中。用户可以使用环境变量 CUDNN_TEXOFF_DBG 选择不使用纹理。在 cuDNN 8.x 中,此变量已删除。纹理加载默认情况下已关闭。希望继续使用基于纹理的加载的用户可以采用新的后端 API,并将引擎旋钮 CUDNN_KNOB_TYPE_USE_TEX 切换为 1,用于支持基于纹理的加载指令的引擎。

  • 在后端 API 中,当输入图像的乘积(channels * height * width)超过 536,870,912(即 2^29)时,不支持 CUDNN_ATTR_ENGINE_GLOBAL_INDEX=1 的卷积前向引擎。

  • 当通道数超过 1024 时,cudnnSpatialTfSamplerBackward() 返回 CUDNN_STATUS_NOT_SUPPORTED

  • 使用图捕获时,用户应调用子库版本检查 API(例如,cudnnOpsVersionCheck()cudnnGraphVersionCheck())以在打开图捕获之前加载子库中的内核。cuDNN 9.0.0 中轮询资源使用情况(例如请求的工作区大小)的 API 并不总是与 CUDA 图捕获兼容。依赖于这些 API 与 CUDA 图捕获兼容的用户应首先在“预热”运行期间执行其工作负载,然后再尝试图捕获。

  • cuDNN 用户需要显式地将 cuBLAS 的依赖项添加到链接器命令中,以解决来自 cuDNN 静态库的未定义符号。

  • 从版本 8.1 开始,cuDNN 在 x86_64 架构上使用 AVX intrinsics;不支持 AVX intrinsics 的此架构用户可能会看到非法指令错误。

  • 空间持久批量归一化 API 仅适用于 Pascal 及更高版本架构。Pre-Pascal 架构返回 CUDNN_STATUS_ARCH_MISMATCH。受影响的 API 包括

  • 对于 Pre-Pascal 架构,cudnnAddTensor() 的性能可能会从 8.2 回退到 8.3。

  • 当使用兼容模式的旧版 11.x CUDA 工具包的应用程序使用 cuDNN 进行 compute-sanitizer 测试时,由于缺少函数,将会出现错误代码 500 的 cuGetProcAddress 失败。此错误可以忽略,或者使用 --report-api-errors no 选项来抑制,因为这是由于 CUDA 向后兼容性检查函数是否可与 CUDA 工具包组合使用。这些函数是在更高版本的 CUDA 中引入的,但在当前平台上不可用。缺少这些函数是无害的,不会引起任何功能问题。

  • 由于编译器限制,融合注意力力和闪存注意力运行时引擎已针对 NVRTC 11.8 禁用。

已弃用和移除的特性

以下功能在 cuDNN 9.0.0 中已被弃用