动态页面停用

1. 简介

本文档描述了包含坏内存单元的帧缓冲区页面的停用。

2. 概述

NVIDIA® 驱动程序支持“停用”包含坏内存单元的帧缓冲区页面。这被称为“动态页面停用”,并且对于质量下降的单元自动完成。此功能可以提高原本良好的板卡的使用寿命,因此是受支持产品(尤其是在 HPC 和企业环境中)的一项重要弹性功能。

3. 实施

将页面标记为排除称为“停用”,而将该页面从后续内存分配中实际排除的行为称为“黑名单”。NVIDIA 驱动程序将在页面经历单个双位 ECC 错误 (DBE) 或同一地址上的 2 个单位 ECC 错误 (SBE) 后停用该页面。这些地址存储在 InfoROM 中。当每个 GPU 连接并初始化时,驱动程序将从 InfoROM 中检索这些地址,然后让帧缓冲区管理器将这些页面放在一边,以便驱动程序或用户应用程序无法使用它们。

注意

页面停用可能仅在启用 ECC 时发生。但是,一旦页面被停用,即使稍后禁用 ECC,驱动程序也始终会将其列入黑名单。

理想情况下,NVIDIA 驱动程序将在 2 个 SBE 点捕获弱化的单元并停用页面,赶在单元退化到 DBE 点并中断应用程序之前。

3.1. 用例 1:检测到 DBE

  1. NVIDIA 驱动程序检测到 DBE 并报告发生了 DBE。

  2. 应用程序将收到 DBE 事件通知以进行正常退出,并且在映射出 DBE 之前,不会在 GPU 上创建更多上下文。

  3. NVIDIA 驱动程序将 DBE 计数和地址记录在 InfoROM 中。

    页面停用发生,并且 nvidia-smi 停用的页面 ‘双位 ECC’ 字段递增。

    nvidia-smi ‘待处理页面黑名单’ 状态变为 ‘是’

  4. NVIDIA 驱动程序在单独的列表中记录包含 DBE 的页面将被停用。

  5. 在下次重新连接 GPU 时,该页面将从使用中映射出去。

    页面黑名单发生,并且 nvidia-smi ‘待处理页面黑名单’ 状态变为 ‘否’

注意

DBE 地址和计数在驱动程序重新加载后仍然保留。

3.2. 用例 2:在同一位置检测到两个 SBE

  1. NVIDIA 驱动程序检测到 SBE 并报告发生了 SBE。

  2. NVIDIA 驱动程序将 SBE 计数和地址记录在 InfoROM 中。

  3. 如果 SBE 在特定地址发生多次,则驱动程序在单独的列表中记录包含该地址的页面将被停用。

    页面停用发生,并且 nvidia-smi 停用的页面 ‘单位 ECC’ 字段递增。

    nvidia-smi ‘待处理页面黑名单’ 状态变为 ‘是’

  4. 在下次重新连接 GPU 时,该页面将从使用中映射出去。

    页面黑名单发生,并且 nvidia-smi ‘待处理页面黑名单’ 状态变为 ‘否’

注意

与 DBE 情况不同,应用程序继续不间断地运行。

注意

SBE 地址和计数在驱动程序重新加载后仍然保留。

4. 黑名单和 ECC 错误恢复

先前已停用的页面将被列入黑名单,以供将来所有帧缓冲区的分配,前提是目标 GPU 已正确重新连接和初始化。本章介绍了一个程序,用于确保停用的页面被列入黑名单,并且所有 GPU 都已从 ECC 错误中恢复。

注意

此过程需要终止目标 GPU 上的所有客户端。当客户端保持活动状态时,无法将新页面列入黑名单。

黑名单:程序概述

  1. 验证是否存在待处理的停用页面。

  2. 确定相关的 GPU,并且必须一起重新连接。

  3. 停止应用程序并验证是否没有剩余的运行程序。

  4. 重新初始化 GPU,或重新启动系统。

  5. 验证是否已发生黑名单。

  6. 重新启动应用程序。

4.1. 验证待处理的停用页面

当页面被停用但尚未被列入黑名单时,停用的页面将被标记为该 GPU 的待处理状态。这可以通过 nvidia-smi 查看

$ nvidia-smi -i <target gpu> -q -d  PAGE_RETIREMENT
  ...
  Retired pages
  Single Bit ECC             : 2
  Double Bit ECC             : 0
  Pending Page Blacklist    : Yes
  ...

如果“待处理页面黑名单”显示“否”,则所有停用的页面都已被列入黑名单。

如果“待处理页面黑名单”显示“是”,则至少有一个已计数的停用页面尚未被列入黑名单。请注意,未显示待处理页面的确切计数。

注意

停用页面计数在页面停用时立即递增,而不是在页面被列入黑名单的下一次驱动程序重新加载时递增。

4.2. 停止 GPU 客户端

在 NVIDIA 驱动程序可以重新连接 GPU 之前,必须首先停止正在使用这些 GPU 的客户端,并且 GPU 必须处于未使用状态。

应首先停止所有正在使用 GPU 的应用程序。使用 nvidia-smi 列出正在积极使用 GPU 的进程。在下面的示例中,tensorflow python 程序正在使用 GPU 0 和 1。两者都需要停止。

$ nvidia-smi
...
+---------------------------------------------------------------------+
| Processes:                                               GPU Memory |
|  GPU       PID   Type   Process name                     Usage      |
|=====================================================================|
|    0      8962      C   python                             15465MiB |
|    1      8963      C   python                             15467MiB |
+---------------------------------------------------------------------+

一旦所有应用程序都停止,nvidia-smi 应显示未找到任何进程

$ nvidia-smi
...
+---------------------------------------------------------------------+
| Processes:                                               GPU Memory |
|  GPU       PID   Type   Process name                     Usage      |
|=====================================================================|
|  No running processes found                                         |
+---------------------------------------------------------------------+

在 Linux 系统上,额外的软件基础架构可以保持 GPU 打开并阻止驱动程序分离 GPU。这些包括 nvidia-persistenced 和 nvidia-docker 版本 1。Nvidia-docker 版本 2 不需要停止。

可以使用 lsof 命令在 Linux 上验证使用驱动程序的打开进程列表

$ sudo lsof /dev/nvidia*
COMMAND   PID                USER   FD   TYPE  DEVICE NODE NAME
nvidia-pe 941 nvidia-persistenced    2u   CHR 195,255  453 /dev/nvidiactl
nvidia-pe 941 nvidia-persistenced    3u   CHR   195,0  454 /dev/nvidia0
nvidia-pe 941 nvidia-persistenced    4u   CHR 195,254  607 /dev/nvidia-modeset
nvidia-pe 941 nvidia-persistenced    5u   CHR   195,1  584 /dev/nvidia1
nvidia-pe 941 nvidia-persistenced    6u   CHR 195,254  607 /dev/nvidia-modeset

一旦 GPU 的所有客户端都停止,lsof 应返回无条目

$ sudo service nvidia-persistenced stop
$ sudo lsof /dev/nvidia*
$

4.3. 重新连接 GPU

重新连接 GPU 以将待处理的停用页面列入黑名单,可以通过几种方式完成。按成本从低到高排序

  • 重新连接 GPU(仅限禁用持久模式)

  • 重置 GPU

  • 重新加载内核模块 (nvidia.ko)

  • 重新启动机器(或 VM)

重新连接 GPU 是侵入性最小的解决方案。只要未启用持久模式,在最后一个客户端在 GPU 上终止后的几秒钟内,分离过程就会自动发生。下一个以 GPU 为目标的客户端将触发驱动程序重新连接并将所有标记的页面列入黑名单。

如果启用了持久模式,则首选解决方案是使用 nvidia-smi 重置 GPU。要重置单个 GPU

$ nvidia-smi -i < target GPU> -r

或一起重置所有 GPU

$ nvidia-smi -r

这些操作重新连接 GPU,作为重置所有 GPU SW 和 HW 状态的更大过程中的一个步骤。

重新加载 NVIDIA 内核模块会触发机器上所有 GPU 的重新连接,因此需要终止所有 GPU 上的所有客户端。

最后,重新启动机器将有效地重新连接 GPU,因为驱动程序在重新启动期间重新加载和重新初始化。虽然不需要重新启动并且具有高度侵入性,但在某些操作环境中,它可能会简化恢复操作。

5. 可用性

动态页面停用在以下产品和环境中受支持

  • 驱动程序:R319 及更高版本

  • 操作系统:所有标准驱动程序支持的 Linux 和 Windows TCC 平台

  • GPU

    • K20 及更新的 Tesla 产品,包括 Tesla V100 和 T4

    • Quadro GV100 及更新的产品

    • Quadro Virtual Data Center Workstation (Quadro vDWS) 和 NVIDIA vComputeServer(从 NVIDIA Virtual GPU Software v9.0 开始)

    • 目前不支持 GeForce 产品

6. 可见性

三种主要机制提供页面停用的可见性:系统日志中的 XID 错误、NVML API 和 nvidia-smi 命令行工具。

6.1. XID

XID 错误是记录到系统错误日志的驱动程序错误。请参阅 XID 白皮书,了解有关 XID 的一般信息。有三个与动态页面停用相关的主要 XID

  • XID 48:发生了 DBE。

  • XID 63:页面已成功停用。

  • XID 64:由于错误,页面停用失败。

在系统日志中,这些 XID 以以下形式显示

  • XID 48:“XID 48 在 GPU (<id>) 上检测到无法纠正的双位错误 (DBE)”

  • XID 63:“XID 63 动态页面停用:新的停用页面,重新加载驱动程序以激活。(<address>)”

  • XID 64:“XID 64 动态页面停用:致命错误,无法停用页面 (<address>)”

6.2. NVML

NVIDIA Management Library (NVML) 是一个公共的基于 C 的库,用于 GPU 监控和管理。它包括报告停用页面的状态和计数的 API。有关该库的一般信息,请参阅 NVML API 文档。

可以使用以下方法检索当前停用的页面集及其地址

nvmlReturn_t nvmlDeviceGetRetiredPages (nvmlDevice_t device, nvmlPageRetirementCause_t cause, unsigned int* pageCount, unsigned long long* addresses)

驱动程序版本 410.72 或更高版本提供了一个较新的 API,该 API 还返回页面停用时间戳

nvmlReturn_t nvmlDeviceGetRetiredPages_v2 (nvmlDevice_t device, nvmlPageRetirementCause_t cause, unsigned int* pageCount, unsigned long long* addresses, unsigned long long* timestamps)

对于这两个 API,传递的 nvmlPageRetirementCause_t 是以下之一

  • NVML_PAGE_RETIREMENT_CAUSE_MULTIPLE_SINGLE_BIT_ECC_ERRORS

  • NVML_PAGE_RETIREMENT_CAUSE_DOUBLE_BIT_ECC_ERROR

可以使用以下方法检索驱动程序的当前状态(是否有任何页面正在等待停用)

nvmlReturn_t nvmlDeviceGetRetiredPagesPendingStatus (nvmlDevice_t device, nvmlEnableState_t* isPending)

6.3. nvidia-smi

nvidia-smi 是一个公共命令行界面,用于 GPU 监控和管理。它实现了大多数 NVML API,并支持报告停用页面的状态和计数。有关该工具的一般信息,请参阅 nvidia-smi 手册页。

nvidia-smi 工具提供

  • 按停用原因列出停用页面数量的能力,并指示是否有任何页面正在等待停用,以及

  • 列出所有停用页面地址的能力。

要以人类可读的形式查看停用页面的数量和驱动程序的页面停用状态

$ nvidia-smi -i <target gpu> -q -d  PAGE_RETIREMENT
     ...
     Retired pages
            Single Bit ECC   : 2
            Double Bit ECC   : 0
            Pending Page Blacklist  : No
     ...

nvidia-smi “待处理页面黑名单” 字段指示页面最近是否已停用,并将在下次系统重新启动或驱动程序加载时列入黑名单。

注意

停用页面计数在页面停用时立即递增,而不是在页面被列入黑名单的下一次驱动程序重新加载时递增。

如果页面已被停用,则可以通过 nvidia-smi 的脚本化输出以 XML 格式查看受影响的地址

$ nvidia-smi -i <target gpu> -q -x
...
 <retired_pages>
     <multiple_single_bit_retirement>
     <retired_count>2</retired_count>
          <retired_page_addresses>
               <retired_page_addresse>0xABC123</retired_page_addresse>
               <retired_page_addresse>0xDEF456</retired_page_addresse>
          </retired_page_addresses>
     </multiple_single_bit_retirement>
     <double_bit_retirement>
          <retired_count>0</retired_count>
          <retired_page_addresses></retired_page_addresses>
     </double_bit_retirement>
     <pending_retirement>No</pending_retirement>
 </retired_pages>
...

或 CSV 格式

$ nvidia-smi -i <target gpu> --query-retired-pages=
gpu_uuid,retired_pages.address,retired_pages.cause --format=csv
...
gpu_uuid, retired_pages.address, retired_pages.cause
GPU-d73c8888-9482-7d65-c95c-4b58c7d9eb4c, 0xABC123, Double Bit ECC
GPU-d73c8888-9482-7d65-c95c-4b58c7d9eb4c, 0xDEF456, Double Bit ECC
GPU-d73c8888-9482-7d65-c95c-4b58c7d9eb4c, 0x123ABC, Single Bit ECC

7. 注意事项

在将错误记录到 InfoROM 和在持久模式下结束 CUDA™ 作业之间存在竞争条件。当响应 DBE 关闭时,最常遇到此竞争条件。这种情况的影响是,在某些极端情况下,页面可能无法停用。

在重新启动系统之前临时退出持久模式将强制刷新任何待处理的写入到 InfoROM。如果看到 XID 48 但未看到 XID 63,建议通过以下命令退出持久模式

% nvidia-smi -i <target GPU> -pm 0

此时,应看到 XID 63,并且可以使用 NVML 查询来验证页面是否已写入 InfoROM。

目前没有计划修复持久模式下的竞争条件,因为持久模式已被持久守护程序取代。持久守护程序不易受到此竞争条件的影响。为了让您知道您的平台容易受到此竞争条件的影响,内核驱动程序将在 dmesg 日志文件中打印警告,以指示未使用持久守护程序。

8. 常见问题解答

8.1. RMA 资格

在 GPU 应退回维修之前,可以映射出多少页?

Tesla 板卡将继续停用页面,直到页面停用表满为止,最多 64 个动态停用的内存页面。但是,生成 60 个或更多停用页面的板卡有资格获得 RMA。具有 64 个停用页面的 Tesla 卡将无法通过 NVIDIA 现场诊断工具。

此外,如果发现板卡显示 15 个或更多停用页面,并且继续以每周一个或多个新停用页面的速度停用内存页面,则可以在达到 60 页 RMA 阈值之前对其进行 RMA 评估。请跟踪页面停用率,并在退回的板卡上提供该信息。

8.2. 内存影响

可用内存是否因停用页面而减少?

每个停用的页面都会减少应用程序可用的总内存。但是,以这种方式停用的内存总最大大小仅为 4 MiB 左右。相对于其他因素(例如 NVIDIA 驱动程序在正常运行期间内部分配的内存的自然波动)而言,这微不足道。

每个停用页面的大小是多少?

64KiB

可以停用多少页?

总共可以映射出或停用 64 个页面。这可以是 DBE 和 SBE 页面的任意组合。

InfoROM 中可以存储多少个地址?

InfoROM 至少可以存储 192 个不同的地址。不同的 GPU 型号和 InfoROM 格式可能会将此数量扩展到超过 192 个地址,最多 600 个。

8.3. 配置

我的 GPU 上是否启用了 ECC?

nvidia-smi 可用于显示 GPU 当前是否已启用 ECC,以及重新启动后待激活的模式。

$ nvidia-smi -q
...
   Ecc Mode
     Current                     : Disabled
     Pending                     : Enabled

可以禁用页面停用吗?

否,页面停用是一项重要的可靠性功能,对于 SBE 或 DBE 都不能禁用。任何已标记为停用的页面都将在所有未来的分配中继续被排除。但请注意,如果禁用 ECC,则不会检测到新的内存错误,因此不会有新的页面被列入黑名单以供将来停用。

可以通过 nvidia-smi 禁用 ECC

$ nvidia-smi -e 0
Disabled ECC support for GPU 00000000:06:00.0.
All done.
Reboot required.

或类似地重新启用

sudo nvidia-smi -e 1
Enabled ECC support for GPU 00000000:06:00.0.
All done.
Reboot required.

用于触发停用的 SBE 重复阈值是否可配置?

我可以禁用 SBE 或 DBE 的 DMA 保护范围 (DPR) 吗?

否,NVIDIA 不支持禁用 DPR,无论是完全禁用还是仅禁用 SBE 或 DBE。

8.4. 应用程序行为

应用程序行为是否受到影响?

否,应用程序行为相同。由于页面仅在驱动程序重新启动后才停用,因此停用页面的行为发生在任何 GPU 进程或应用程序的生命周期之外。在具有计划停用(列入黑名单)的页面的 GPU 上运行的应用程序将继续在其内存空间中看到这些页面,尽管由于双位错误 (DBE) 而停用的任何页面都必然会导致应用程序终止。即使没有页面停用也是如此。

8.5. 应用程序性能

应用程序性能是否受到影响?

否,应用程序性能不受页面停用或后续黑名单的影响。停用是在应用程序执行期间采取的唯一操作,而实际的黑名单事件仅在应用程序终止后发生。如上面的第一个常见问题解答中所述,停用页面的内存影响也可以忽略不计。

由于页面停用导致的内存碎片是否预计会影响应用程序性能?

预计碎片不会影响性能。

8.6. 驱动程序行为

多个 SBE 是否必须位于同一地址才能触发停用?

是,多个 SBE 必须位于完全相同的位置(地址)。同一页面内不同位置的多个 SBE 不会触发页面停用。

“卡住”的位是否由驱动程序重写,还是在每次读取时纠正?

在 Kepler 类 GPU 及更高版本上,驱动程序会重写数据以避免卡住的位。

是否无限期地跟踪所有 SBE 和 DBE 地址?

SBE 和 DBE 地址会无限期地跟踪,直到可以存储的最大地址数(请参阅 内存影响)。超出最大值的其他地址将被丢弃。

9. 声明

本文档仅供参考,不应被视为对产品的特定功能、状况或质量的保证。NVIDIA Corporation(“NVIDIA”)对本文档中包含的信息的准确性或完整性不作任何明示或暗示的陈述或保证,并且对本文档中包含的任何错误不承担任何责任。NVIDIA 对使用此类信息或因使用此类信息而可能导致的侵犯专利或第三方的其他权利的后果或使用不承担任何责任。本文档不承诺开发、发布或交付任何材料(下文定义)、代码或功能。

NVIDIA 保留随时对此文档进行更正、修改、增强、改进和任何其他更改的权利,恕不另行通知。

客户应在下订单前获取最新的相关信息,并应验证此类信息是最新且完整的。

NVIDIA 产品根据订单确认时提供的 NVIDIA 标准销售条款和条件进行销售,除非 NVIDIA 和客户的授权代表签署的个别销售协议(“销售条款”)另有约定。NVIDIA 特此明确反对将任何客户通用条款和条件应用于购买本文档中引用的 NVIDIA 产品。本文档未直接或间接形成任何合同义务。

NVIDIA 产品并非设计、授权或保证适用于医疗、军事、航空、航天或生命支持设备,也不适用于 NVIDIA 产品的故障或故障可以合理预期会导致人身伤害、死亡或财产或环境损害的应用。NVIDIA 对在上述设备或应用中包含和/或使用 NVIDIA 产品不承担任何责任,因此此类包含和/或使用风险由客户自行承担。

NVIDIA 不对基于本文档的产品适用于任何特定用途做出任何陈述或保证。NVIDIA 不一定会对每种产品的所有参数进行测试。客户全权负责评估和确定本文档中包含的任何信息的适用性,确保产品适合并满足客户计划的应用,并执行应用所需的测试,以避免应用或产品的默认设置。客户产品设计中的缺陷可能会影响 NVIDIA 产品的质量和可靠性,并可能导致超出本文档中包含的附加或不同条件和/或要求。NVIDIA 对可能基于或归因于以下原因的任何默认设置、损坏、成本或问题不承担任何责任:(i) 以任何与本文档相悖的方式使用 NVIDIA 产品,或 (ii) 客户产品设计。

本文档未授予任何 NVIDIA 专利权、版权或其他 NVIDIA 知识产权下的任何明示或暗示的许可。NVIDIA 发布的有关第三方产品或服务的信息不构成 NVIDIA 授予使用此类产品或服务的许可,也不构成对此类产品或服务的保证或认可。使用此类信息可能需要获得第三方在其专利或其他知识产权下的许可,或获得 NVIDIA 在 NVIDIA 的专利或其他知识产权下的许可。

只有在获得 NVIDIA 书面事先批准的情况下,才允许复制本文档中的信息,复制时不得进行更改,并且必须完全遵守所有适用的出口法律和法规,并附带所有相关的条件、限制和声明。

本文档和所有 NVIDIA 设计规范、参考板、文件、图纸、诊断程序、列表和其他文档(统称为“材料”)均按“原样”提供。NVIDIA 对材料不作任何明示、暗示、法定或其他方面的保证,并明确否认所有关于非侵权性、适销性和特定用途适用性的暗示保证。在法律未禁止的范围内,在任何情况下,NVIDIA 均不对任何损害负责,包括但不限于任何直接、间接、特殊、附带、惩罚性或后果性损害,无论何种原因以及何种责任理论,因使用本文档而引起,即使 NVIDIA 已被告知可能发生此类损害。尽管客户可能因任何原因而遭受任何损害,但 NVIDIA 对本文所述产品的客户承担的累计总责任应根据产品的销售条款进行限制。

9.1. 商标

NVIDIA 和 NVIDIA 徽标是 NVIDIA Corporation 在美国和其他国家/地区的商标或注册商标。其他公司和产品名称可能是与其相关的各自公司的商标。