我正在阅读Apex AMP documentation:
仅使用Python的版本忽略了
- 使用apex.optimizers.FusedAdam所需的已融合内核。
- 融合内核 需要使用apex.normalization.FusedLayerNorm。
- 融合内核 提高性能和数值稳定性 apex.parallel.SyncBatchNorm。
- 融合内核,可改善 apex.parallel.DistributedDataParallel和apex.amp的性能。 DistributedDataParallel,amp和SyncBatchNorm仍将可用, 但它们可能会更慢。
似乎还有一个"FusedAdam" optimizer:
Pytorch中的Adam优化器(与所有Pytorch优化器一样)带有 通过遍历参数并启动一个 每个参数的一系列内核。这可能需要数百个 小型发布通常受CPU端Python循环和 内核启动开销,导致设备利用率低下。 目前,Apex中的FusedAdam实施使 优化步骤的参数,然后执行 通过融合所有Adam的融合内核进行优化步骤本身 操作。通过这种方式,循环遍历参数以及 内部系列的每个参数的Adam操作被融合,例如 该optimizer.step()只需要启动几个内核即可。
当前的实现(在Apex主版本中)比较脆弱,只能正常工作 使用Amp opt_level O2。我有一个WIP分支使它适用于任何 opt_level(https://github.com/NVIDIA/apex/pull/351)。我建议 等到合并后再尝试。
部分解释。我还有其他问题:
内核是什么意思?层还是优化器?
融合层的想法与融合优化器相同吗?
答案 0 :(得分:2)
“内核”用于计算内核:https://en.wikipedia.org/wiki/Compute_kernel 诸如卷积之类的操作通常使用计算内核来实现,以提高效率。可以使用C,CUDA,OpenCL甚至汇编语言编写计算内核,以实现最高效率。因此,“仅Python的构建”不支持...
“融合”是指计算步骤的通用化。基本上,这是一种实现技巧,可以通过在单个硬件(GPU,CPU或TPU)操作中组合类似的操作来更有效地运行代码。因此,“ fusedLayer”是使操作受益于“融合”实现的一层。