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

Ste*_*ner 11 cuda nvidia windows-10 tensorflow

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

这是张量流代码,要求它分配比我之前看到的略多:(我希望它尽可能接近内存分数= 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)
Run Code Online (Sandbox Code Playgroud)

就在jupyter笔记本中运行上面这行之前,我运行了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                                                 |
+-----------------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

成功分配5.01GB后从TF输出,显示"无法从设备分配5.04G(5411658752字节):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
Run Code Online (Sandbox Code Playgroud)

我最好的猜测是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);
}
Run Code Online (Sandbox Code Playgroud)

编辑#2:

下面的帖子表明Windows 10通过获取一小部分VRAM阻止在用于计算的辅助视频卡上普遍使用VRAM:https: //social.technet.microsoft.com/Forums/windows/en-US/15b9654e- 5da7-45b7-93de-e8b63faef064 /窗口-10做的那样-不-让- CUDA的应用程序使用的,全VRAM上,尤其是二次图形卡?论坛= win10itprohardware

这个线程似乎难以置信,因为它意味着所有Windows 10盒子本身都比Windows 7差,因为任何计算机专用显卡上的VRAM都可能成为瓶颈.

编辑#3:

将标题更新为更明确的问题.反馈表明这可能是微软或Nvidia的错误.我正在寻求其他途径来解决这个问题.但是我不想假设这不能直接解决.
进一步的实验确实表明我遇到的问题是来自单个过程的大量分配的情况.当另一个进程发挥作用时,可以使用所有VRAM.

编辑#4

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

N.K*_*N.K 5

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

假设您已经使用了“首选最大性能设置”,您可以使用电源将其推至最大 92%。

如果您想了解有关 WDDM 2.x 的更多信息,这将为您提供详细帮助:

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


Ste*_*ner 3

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

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