【问题标题】:Can I fix my GPU clock rate to ensure consistent profiling results?我可以修复我的 GPU 时钟频率以确保一致的分析结果吗?
【发布时间】:2021-02-18 10:15:38
【问题描述】:

我想对几个 CUDA 内核进行一些比较分析。但是,其中一个在一个程序中运行,该程序会为 GPU 加载更多工作,而另一个仅在测试工具中运行。

对于某些 GPU,这些情况意味着时钟频率会发生变化(可能不止一种时钟频率,因为有多种)。这种影响在 Tesla T4 等设备(没有主动冷却)中尤为严重。

是否可以防止时钟速率因负载(或热条件)而改变?

我已经研究过 nvidia-smi 实用程序,它有一个名为 clocks 的子命令 - 但所做的只是以下内容:

clocks -- Control and query clock information.

Usage: nvidia-smi clocks [options]
options include:
   [-i | --id]: Enumeration index, PCI bus ID or UUID. Provide comma
                 separated values for more than one device
   [ | --sync-boost-list]: List all synchronous boost groups
   [ | --sync-boost-add]: Add a synchronous boost group

   [ | --sync-boost-remove]: Remove a synchronous boost group. Provide the group id
                 returned from --sync-boost-list

...看起来这不是我需要的。当然,欢迎非基于nvidia-smi 的解决方案。

注意事项:

  • 我对修复 Quadro 和 Tesla 卡的时钟频率特别感兴趣,以防万一。
  • 如有必要,我可以成为 root。
  • 将 CUDA 10.2 与捆绑的驱动程序一起使用。如果绝对有必要,我也许可以切换到新版本。

【问题讨论】:

    标签: cuda profiling benchmarking clock


    【解决方案1】:

    TL;DR

    1. 首先,设置持久模式,例如nvidia-smi -i 0 -pm 1(为 GPU 索引 0 设置持久化模式)
    2. 使用nvidia-smi 命令,例如-ac 或-lgc(应用程序时钟,锁定gpu 时钟)
    3. nvidia-smi 提供所有这些nvidia-smi --help 的命令行帮助
    4. 此功能可能无法在您的 GPU 上运行。安装最新的驱动程序,而且某些产品根本不提供此功能
    5. 这些设置通常需要 root 权限,或 Windows 上的管理员权限
    6. 此描述可能会发生变化。请注意,您使用的版本的命令行帮助应该具有指导意义

    更长:

    我使用驱动程序 455.23.05 进行此描述。某些功能(例如-lgc)可能在旧版驱动程序中不可用。其中一些特性可能需要设置持久性模式,并且还有助于减少应用程序启动时的可变性。 这并不是对nvidia-smi工具的详尽描述。

    设置应用程序时钟:

    应用程序时钟功能通常对所描述的测试很有用。当没有应用程序运行(AFAIK)时,它不会强制 GPU 时钟保持在指定的设置,但时钟应该“一旦”应用程序开始运行就达到这些值。它允许您指定 gpu 时钟(即核心时钟)以及内存时钟。让我们从摘录一些重要开关的命令行帮助文本开始:

    -ac   --applications-clocks= Specifies <memory,graphics> clocks as a
                                    pair (e.g. 2000,800) that defines GPU's
                                   speed in MHz while running applications on a GPU.
    -rac  --reset-applications-clocks
                               Resets the applications clocks to the default values.
    -acp  --applications-clocks-permission=
                                Toggles permission requirements for -ac and -rac commands:
                                0/UNRESTRICTED, 1/RESTRICTED
    

    要开始设置应用程序时钟,您可能需要在 Linux 上使用sudo 或类似命令来执行部分或全部这些命令。另请注意,可以打开/关闭提升权限的要求。同样重要的是,您不能为 &lt;memory,graphics&gt; 设置对选择您喜欢的任何值。您必须指定一对,而且该对只能来自允许的选项列表。其他选择将导致未指定的行为。这些选择可以从--query-supported-clocks 开关(使用--help-query-supported-clocks 获得有关该开关的命令行帮助)到nvidia-smi 确定,后者本身需要一些格式。例如,以下命令将给出可以传递给-ac 命令的有效对的详尽列表:

    nvidia-smi -i 0 --query-supported-clocks=mem,gr --format=csv 
    

    获得有效对的列表后,您可以将其中一对指定给应用程序时钟命令:

    nvidia-smi -i 0 -ac 877,1215
    

    (例如,如果以 root 运行或通过 -acp 启用上述命令,在我的 Tesla V100 上会将内存时钟设置为 877MHz,将核心时钟设置为 1215MHz。请注意 -i 开关以选择 GPU使用此命令定位目标。877,1215 对可能在您的 GPU 上无效。另请注意,-acp 功能已从驱动程序 465.xx 和更高版本中删除。)

    当您完成所有操作后,您可能希望使用-rac 将应用程序时钟行为重置为默认行为(GPU 根据自己的启发式方法选择时钟频率)。

    此外,提供的许多配对可能涉及“提升”行为。 如果发生限制事件,GPU 不能保证完全按照您指定的方式维持所有时钟。典型的节流事件是:

    1. GPU 消耗的电能过多
    2. GPU 温度过高

    使用 nvidia-smi (nvidia-smi -a) 的“完整”输出可以发现实际节流事件的存在,查找“时钟节流原因”。此输出中提供了其他有用信息,例如默认应用程序时钟。当N/A 出现在您的输出中时,这意味着您的 GPU 不支持此功能。各种 GPU 系列支持的功能种类繁多,我无法回答有关此的问题。

    在没有节流事件的情况下,并且假设您的 GPU 支持该功能,我希望应用程序时钟在您的应用程序运行时保持有效。请注意,如果在应用程序当前运行时指定了此命令,则时钟更改可能在 GPU 空闲之前不会生效。在这种情况下,您可能希望监控 GPU 时钟(同样,使用nvidia-smi)。因此,我通常建议在 GPU 空闲时使用这些命令。然后开始在 GPU 上工作。

    锁定 GPU(核心)时钟:

    在许多情况下,gpu 核心时钟(core、gpu、graphics 在这种情况下都是同义词)表现出最大的可变性(例如,我的 Tesla V100 上提供的应用程序时钟仅包含 877MHz 的内存时钟值;没有其他选择是可能的)。有一个单独的开关可用于将 GPU 核心时钟“锁定”到一系列值。

    -lgc  --lock-gpu-clocks=    Specifies <minGpuClock,maxGpuClock> clocks as a
                                    pair (e.g. 1500,1500) that defines the range
                                    of desired locked GPU clock speed in MHz.
                                    Setting this will supercede application clocks
                                    and take effect regardless if an app is running.
                                    Input can also be a singular desired clock value
                                    (e.g. <GpuClockValue>).
    -rgc  --reset-gpu-clocks
                                Resets the Gpu clocks to the default values.
    

    使用范围的上下端点指定此范围。如果您只想选择一个特定的值,您可以将下端点和上端点都指定为该值。据我所知,范围端点包括在内。

    例如以下命令:

    nvidia-smi -i 0 -lgc 1215,1215
    

    将在我的 Tesla V100 GPU 上将 GPU 核心时钟“锁定”到 1215 MHz。据我所知,即使应用程序正在运行,这种效果也会立即发生。对于应用程序时钟,我能想到的大多数其他警告应该是类似的:

    • 选择一个有效的 GPU 核心时钟,作为 --query-supported-clocks 命令的输出
    • GPU 不能保证在发生限制时保持请求
    • 需要提升的权限
    • 用-rgc重置行为

    如帮助中所述,此开关会“覆盖”先前与核心时钟相关的应用程序时钟设置。另外,请注意,许多开关有两种形式,“长”形式和“短”形式。如果需要额外的开关参数,长格式通常需要= 分隔符,短格式通常需要空格分隔符:

     nvidia-smi -i 0 -lgc 1215,1215
    

    或

     nvidia-smi -i 0 -lock-gpu-clocks=1215,1215
    

    您通常不能混合使用这种格式:

     nvidia-smi -i 0 -lgc=1215,1215
    

    可能会报错。

    最后一点:

    这种影响在 Tesla T4 等设备(没有主动冷却)中尤为严重。

    根据我使用 T4 的经验,一个可能的观察结果是节流。 T4 GPU 是功耗最低的数据中心级 GPU 之一,GPU 计算需求肯定有可能超过功率限制 (70W) 所能支持的水平。在这种情况下,GPU 时钟将节流,并且上述命令都不允许您覆盖此行为。根据设计,当 GPU 试图保护自己或保护运行它的系统时,您不能强制 GPU 以更高的时钟运行。

    此外,T4 没有主动冷却这一事实并不重要。 T4 唯一批准/支持的使用设置位于 a server that is designed to handle the T4 中。 (对于任何 NVIDIA 数据中心 GPU,类似的说法都是正确的)。此类服务器监控 T4 GPU 温度并为 GPU 提供服务器交付的强制流通式冷却。这是设计使然。服务器负责将 GPU 保持在适当的温度工作范围内。如果服务器没有这样做,您应该与您的服务器供应商解决这个问题。如果您在未经批准的设置(例如不合格的服务器或台式机/工作站)中操作 T4 GPU,那么我通常认为该设备的体验会很糟糕。

    【讨论】:

    • 感谢您花时间写这篇长文。我可能会在下周尝试这个。我只是要注意,我不打算将时钟设置得特别高,我只是想将它们设置为相同的值。关于您关于 T4 的说明:您是绝对正确的。但是我不能在这样一个专业的服务器上进行我的实验,嗯,原因。我很小心,不要让 T4 过热,所以我的实验在时间上是分开的。
    • @einpoklum 根据我对与 T4 规格相似的单插槽 Quadro 设计的经验,在充分冷却的情况下,通常基于电源的节流,因为 PCIe 插槽只能提供 75W 的功率,而 NVIDIA 的电源管理确保严格执行,将持续重负载下的功耗保持在 65W 左右。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    相关资源
    最近更新 更多