如何从 Windows 10 上的单个进程在辅助 GPU 上使用 100% 的 VRAM?

Posted

技术标签:

【中文标题】如何从 Windows 10 上的单个进程在辅助 GPU 上使用 100% 的 VRAM?【英文标题】:How can I use 100% of VRAM on a secondary GPU from a single process on windows 10? 【发布时间】:2018-05-31 00:17:31 【问题描述】:

这是在没有显示器连接到 Nvidia 卡的 Windows 10 计算机上。 我已经包含了 nvida-smi 的输出,显示 > 5.04G 可用。

这是要求它分配的 tensorflow 代码比我之前看到的稍微多一点:(我希望它尽可能接近内存分数 = 1.0)

config = tf.ConfigProto()
#config.gpu_options.allow_growth=True
config.gpu_options.per_process_gpu_memory_fraction=0.84
config.log_device_placement=True
sess = tf.Session(config=config)

在 jupyter notebook 中运行上述行之前,我运行了 nvida-smi:

    +-----------------------------------------------------------------------------+
| NVIDIA-SMI 376.51                 Driver Version: 376.51                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name            TCC/WDDM | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 106... WDDM  | 0000:01:00.0     Off |                  N/A |
|  0%   27C    P8     5W / 120W |     43MiB /  6144MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

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

TF成功分配5.01GB后输出,显示“failed to allocate 5.04G (5411658752 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY”(需要向右滚动才能看到)

2017-12-17 03:53:13.959871: I C:\tf_jenkins\home\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\common_runtime\gpu\gpu_device.cc:1030] Found device 0 with properties:
name: GeForce GTX 1060 6GB major: 6 minor: 1 memoryClockRate(GHz): 1.7845
pciBusID: 0000:01:00.0
totalMemory: 6.00GiB freeMemory: 5.01GiB
2017-12-17 03:53:13.960006: I C:\tf_jenkins\home\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\common_runtime\gpu\gpu_device.cc:1120] Creating TensorFlow device (/device:GPU:0) -> (device: 0, name: GeForce GTX 1060 6GB, pci bus id: 0000:01:00.0, compute capability: 6.1)
2017-12-17 03:53:13.961152: E C:\tf_jenkins\home\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\stream_executor\cuda\cuda_driver.cc:936] failed to allocate 5.04G (5411658752 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY
Device mapping:
/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: GeForce GTX 1060 6GB, pci bus id: 0000:01:00.0, compute capability: 6.1
2017-12-17 03:53:14.151073: I C:\tf_jenkins\home\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\common_runtime\direct_session.cc:299] Device mapping:
/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: GeForce GTX 1060 6GB, pci bus id: 0000:01:00.0, compute capability: 6.1

我最好的猜测是 Nvidia 用户级 dll 中的某些策略阻止使用所有内存(也许允许连接显示器?)

如果该理论是正确的,我正在寻找任何用户可访问的旋钮以在 Windows 10 上将其关闭。 如果我在错误的轨道上,任何帮助指出正确的方向表示赞赏。

编辑#1:

我意识到我没有包括这一点研究:tensorflow 中的以下代码表明 stream_exec 正在“告诉”TensorFlow 只有 5.01GB 是免费的。这是我当前理论的主要原因,即某些 Nvidia 组件正在阻止分配。 (但是我可能误解了哪个组件实现了实例化的 stream_exec。)

auto stream_exec = executor.ValueOrDie();
int64 free_bytes;
int64 total_bytes;
if (!stream_exec->DeviceMemoryUsage(&free_bytes, &total_bytes)) 
  // Logs internally on failure.
  free_bytes = 0;
  total_bytes = 0;

const auto& description = stream_exec->GetDeviceDescription();
int cc_major;
int cc_minor;
if (!description.cuda_compute_capability(&cc_major, &cc_minor)) 
  // Logs internally on failure.
  cc_major = 0;
  cc_minor = 0;

LOG(INFO) << "Found device " << i << " with properties: "
          << "\nname: " << description.name() << " major: " << cc_major
          << " minor: " << cc_minor
          << " memoryClockRate(GHz): " << description.clock_rate_ghz()
          << "\npciBusID: " << description.pci_bus_id() << "\ntotalMemory: "
          << strings::HumanReadableNumBytes(total_bytes)
          << " freeMemory: " << strings::HumanReadableNumBytes(free_bytes);

编辑#2:

以下线程表明 Windows 10 正在通过获取 % 的 VRAM 来阻止在用于计算的辅助显卡上普遍使用 VRAM: https://social.technet.microsoft.com/Forums/windows/en-US/15b9654e-5da7-45b7-93de-e8b63faef064/windows-10-does-not-let-cuda-applications-to-use-all-vram-on-especially-secondary-graphics-cards?forum=win10itprohardware

这个线程似乎不可信,因为它意味着所有 Windows 10 机器本质上都比 Windows 7 更糟糕,因为计算专用显卡上的 VRAM 可能成为瓶颈。

编辑#3:

更新标题以更清楚地成为一个问题。反馈表明这对于微软或英伟达来说可能是一个更好的错误。我正在寻求其他途径来解决这个问题。但是我不想假设这不能直接解决。 进一步的实验确实表明,我遇到的问题是针对单个进程进行大量分配的情况。当另一个进程开始运行时,所有的 VRAM 都可以使用。

编辑#4

这里的失败是分配失败,根据上面的 NVIDIA-SMI,我有 43MiB 正在使用中(可能是系统?),但不是可识别的进程。我看到的失败类型是单一的单一分配。在需要连续地址空间的典型分配模型下。所以相关的问题可能是:是什么导致使用 43MiB?是否放置在地址空间中以使 5.01 GB 分配是最大可用连续空间?

【问题讨论】:

这个问题在 NVIDIA 开发者论坛中反复出现。根据大多数观察,分配限制似乎接近 GPU 内存的 81%,跨各种 GPU。最好的任何人都可以说,这似乎是 Windows 10 WDDM 2.0 使用的驱动程序模型的“功能”。使用驱动程序模型 WDDM 1.x 的早期 Windows 版本似乎没有遇到此问题,使用相同的 GPU。 到目前为止,它看起来像是一个每个进程的限制......从我的角度来看,这是一个非常难以捍卫的全球政策。理想情况下,会有一个注册表解决方法。如果不是,我会将赏金发放给可以指出官方确认政策已经到位、有意且没有解决方法的人。 我很好奇这个问题是否有实质性的原因。这是我可以解决的问题吗? ……措辞不好?太混乱了?到目前为止,这个问题没有引起人们的注意.. 它真的是错误的论坛吗?请注意,我是 Microsoft 的资深人士,我希望这正是他们想要解决的问题,而不是简单地让谣言恶化。当我在那里时,我们会查看这些论坛并准确回答此类问题。 我不是反对者,但确实考虑过一次接近投票。这不是论坛,而是问答网站,这里没有明确的问题。您的文章读起来更像是一份错误报告,您可能希望将其提交给 Microsoft(或者,如果您的理论认为这与 NVIDIA 的驱动程序有关,请向 NVIDIA 提交一份。考虑到 NVIDIA 会自己开枪)在具有这种“特征”的脚上,它们似乎不太可能是罪魁祸首)。 道歉我在广义上使用“论坛”,我知道这是一个问答网站。自从我积极使用它以来已经有好几年了。可以肯定地说,隐含的问题被掩盖了:“如何配置 windows10 以允许从单个进程在辅助 GPU 上 100% 使用 VRAM?”虽然这可能是一个错误而不是我的错误配置,但在知道答案之前,我不知道该栏如何应用。 (另外我正在寻求多种途径......如果它是由另一个渠道确定的,大概关闭它会阻止我发布答案。) 【参考方案1】:

目前显然不可能,因为 Windows 显示驱动程序模型 2.x 定义了一个限制,并且没有进程可以覆盖它合法

假设您玩过“首选最高性能设置”,您可以使用电源将其推至最高 92%。

如果您想了解有关 WDDM 2.x 的更多信息,这将对您有所帮助:

https://docs.microsoft.com/en-us/windows-hardware/drivers/display/what-s-new-for-windows-threshold-display-drivers--wddm-2-0-

【讨论】:

我实际上还没有尝试过!使用 Nvidia 控制面板需要先连接显示器。鉴于我已经从头开始重新安装 windows10 以确保 GPU 从未连接到显示器,因此撤消来之不易的属性并不是我要尝试的第一件事。如果这可以将其提高到 92%,那将是一个不错的提升。 遗憾的是,“首选最高性能设置”似乎不会以任何方式影响问题。我附加了一个监视器,更改了设置并重现了原始问题。我重新启动重现了原始问题,再次卸下显示器隔离GPU并再次重新启动,仍然重现原始问题。 (通过原始问题,我的意思是强制分配 5.04 GB 失败,同时证明 5.01 GB 是可能的)。 您是否尝试过使用任何基准测试应用程序..?此外,如果您可以重新连接显示器并设置寡妇电源管理设置并将性能设置为最高可用设置。 这个答案暗示有一种“非法”的方式来改变这个 WDDM?请告知如何执行此操作!【参考方案2】:

我相信,对于支持TCC driver的卡,这是一个可以解决的问题。遗憾的是我的 1060 GTX 似乎不支持。

我需要这样的卡来验证。如果没有人开发适用于 GTX 1060 的解决方案,我肯定会向能够通过 TCC 驱动程序在 Windows 10 上使用 100% VRAM 演示单个进程的人发放奖励。

【讨论】:

以上是关于如何从 Windows 10 上的单个进程在辅助 GPU 上使用 100% 的 VRAM?的主要内容,如果未能解决你的问题,请参考以下文章

可以从列表页面上的 api 中的辅助表获取变量,但不能在单个项目页面上

如何在 Windows 中终止当前使用 localhost 上的端口的进程?

iOS 10.2 上的 Swift 3:如何从麦克风订阅单个样本?需要实时处理音频

如何在 Windows 上的多个进程上存储持久设置

单个实例[Windows必须在处理单个实例时重新打开...]

在锁定的 Windows 10 机器上的后台进程中将文本放入剪贴板