常见问题解答#

问:混合精度训练是如何工作的?

答:几个组件需要协同工作才能实现混合精度训练。cuDNN 需要支持具有所需数据类型配置的层,并具有运行速度非常快的优化内核。此外,框架中有一个称为自动混合精度 (AMP) 的模块,它可以智能地决定哪些操作可以在较低精度下运行,而不会影响收敛,并最大限度地减少整个图中的类型转换/转置次数。这些共同作用可以为您提供加速。有关更多信息,请参阅混合精度数值准确性

问:如何在 cuDNN 9.0.0 版本中选择最快的卷积内核?

答:在 cuDNN v8 版本后引入的 cuDNN Graph API 中,卷积内核按类似的计算和数值属性分组到引擎中。每个引擎都有一组可查询的性能调优旋钮。诸如卷积运算图之类的计算案例可以使用引擎及其旋钮的不同有效组合来计算,这被称为引擎配置。用户可以查询任何给定计算案例的引擎配置数组,并按性能从快到慢排序,这是根据 cuDNN 自身的启发式方法得出的。或者,用户可以通过查询引擎计数和每个引擎的可用旋钮来生成所有可能的引擎配置。生成的列表可用于自动调优,或者用户可以创建自己的启发式方法。

问:为什么 cuDNN 9.0 版本卷积 API 调用在第一次调用时比后续调用慢得多?

答:由于库拆分,cuDNN 9.0 API 只会在第一次需要它的 API 调用时加载必要的内核。在 8.0 之前的早期版本中,这种加载会在触发 CUDA 上下文初始化的第一个 cuDNN API 调用中观察到,通常是 cudnnCreate()。从 8.0 版本开始,这被延迟到触发 CUDA 上下文初始化的第一个子库调用。希望预加载 CUDA 上下文的用户可以调用新的 cudnn*VersionCheck API,它具有初始化 CUDA 上下文的副作用。这将减少所有后续 API 调用的运行时间。

问:如何构建 cuDNN 9.0.0 拆分库?

答:cuDNN v9.0 库被拆分为多个子库。每个库包含 API 的子集。用户可以直接链接到各个库,或者链接到遵循插件架构的 dlopen 层。

要链接到单个库,用户可以直接在链接器命令行上指定它及其依赖项。例如,要仅链接到库的图形 API 部分:-lcudnn_graph

或者,用户可以继续链接到 shim 层 (-libcudnn),它可以 dlopen 提供函数实现的正确库。当第一次调用该函数时,会发生库的动态加载。

链接器参数是 -lcudnn