如何让 TensorFlow 使用 100% 的 GPU?

Posted

技术标签:

【中文标题】如何让 TensorFlow 使用 100% 的 GPU?【英文标题】:How to make TensorFlow use 100% of GPU? 【发布时间】:2020-02-28 17:53:46 【问题描述】:

我有一台配备 RTX 2060 GPU 的笔记本电脑,我正在使用 Keras 和 TF 2 在其上训练 LSTM。我还在监控nvidia-smi 的 gpu 使用情况,我注意到 jupyter notebook 和 TF 最多使用 35%,通常 gpu 使用在 10-25% 之间。

以目前的情况,训练这个模型花了7个多小时,我想知道是我做错了什么还是Keras和TF的限制?

我的 nvidia-smi 输出:

Sun Nov  3 00:07:37 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 430.26       Driver Version: 430.26       CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce RTX 2060    Off  | 00000000:01:00.0  On |                  N/A |
| N/A   51C    P3    22W /  N/A |    834MiB /  5931MiB |     24%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1032      G   /usr/lib/xorg/Xorg                           330MiB |
|    0      1251      G   /usr/bin/gnome-shell                         333MiB |
|    0      1758      G   ...equest-channel-token=622209288718607755   121MiB |
|    0      5086      G   ...uest-channel-token=12207632792533837012    47MiB |
+-----------------------------------------------------------------------------+

我的 LSTM:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import LSTM
from tensorflow.keras.layers import Dropout

regressor = Sequential()

regressor.add(LSTM(units = 180, return_sequences = True, input_shape = (X_train.shape[1], 3)))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 180, return_sequences = True))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 180, return_sequences = True))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 180, return_sequences = True))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 180, return_sequences = True))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 180))
regressor.add(Dropout(0.2))

regressor.add(Dense(units = 1))

regressor.compile(optimizer = 'adam', loss = 'mean_squared_error')

regressor.fit(X_train, y_train, epochs = 10, batch_size = 32, callbacks=[cp_callback])

【问题讨论】:

【参考方案1】:

TensorFlow 会自动通过 CUDA 和 cuDNN 优化 GPU 资源分配,前提是后者已正确安装。您看到的使用统计主要是内存/计算资源“活动”,不一定是实用程序(执行);见this answer。您的效用“仅”为 25% 是一件好事 - 否则,如果您大幅增加模型大小(按原样并不大),您就会 OOM。

为了增加使用量,增加批量大小、模型大小或任何会增加计算的并行性;请注意,使模型更深会增加 GPU 的内存效用,但远不如它的计算效用。

另外,考虑使用 CuDNNLSTM 而不是 LSTM,它的运行速度快 10 倍并使用 更少 GPU 内存(由算法工艺提供),但计算量更大-效用。最后,将Conv1D 作为第一层插入strides > 1 将通过减少输入大小来显着提高列车速度,而不必损害性能(实际上它可以提高性能)。


更新:对 GPU 进行超频是一种选择,但我建议不要这样做,因为从长远来看它会磨损 GPU(而且所有 DL 都是“长期”的)。还有“过电压”和其他硬件调整,但都应该用于一些简短的应用程序。最重要的是你的input data pipeline。

【讨论】:

【参考方案2】:

在 tensorflow 或 jupyter 中对 GPU 的使用没有限制。问题是您无法加载 GPU。通常这意味着您的数据加载器的工作速度比 GPU 处理数据的速度要慢。尝试分析您的工作流程,您会发现瓶颈。

【讨论】:

虚假信息; GPU 不是无限的,任何资源(模型/数据)可以加载到 GPU 上。然而,在“数据加载器”上,输入数据处理时间确实可能比 GPU 训练时间长。

以上是关于如何让 TensorFlow 使用 100% 的 GPU?的主要内容,如果未能解决你的问题,请参考以下文章

TensorFlow 低级模型(没有 Keras 和 Sklearn) - 每一步都获得损失 = 0 和准确度 = 100%

tensorflow版本的bert模型 GPU的占用率为100%而其利用率为0%

如何让 Tensorflow Profiler 在 Tensorflow 2.5 中使用“tensorflow-macos”和“tensorflow-metal”工作

如何让顶部导航栏占据 100% 的宽度?

如何让 Keras 在 Anaconda 中使用 Tensorflow 后端?

如何让 Leaflet for R 使用 100% 的闪亮仪表板高度