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

时间:2017-12-17 12:40:56

标签: tensorflow cuda windows-10 nvidia

这是在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)

在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                                                 |
+-----------------------------------------------------------------------------+

在成功分配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

我最好的猜测是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:

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

编辑#4

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

2 个答案:

答案 0 :(得分:2)

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

假设您已经玩过&#34;首选最高性能设置&#34;你可以使用电源将其推至最大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-

答案 1 :(得分:1)

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

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