如何让 TensorFlow 使用 100% 的 GPU?
How to make TensorFlow use 100% of GPU?
我有一台配备 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])
在 tensorflow 或 jupyter 中没有 GPU 使用限制。问题是您无法加载 GPU。通常这意味着数据加载器的工作速度比 GPU 处理数据的速度慢。尝试分析您的工作流程,您会发现瓶颈。
假设后者已正确安装,TensorFlow 会自动通过 CUDA 和 cuDNN 优化 GPU 资源分配。您看到的使用情况统计信息主要是 memory/compute 资源 'activity' 的使用情况统计信息,不一定是实用程序(执行);参见 。你的效用是 "only" 25% 是一件好事 - 否则,如果你大大增加你的模型尺寸(不是原来的大),你会 OOM。
要增加使用率、增加批量大小、模型大小或任何可以增加并行度计算的方法;请注意,使模型更深会增加 GPU 的内存效用,但远不会增加它的计算效用。
此外,考虑使用 CuDNNLSTM
而不是 LSTM
,这样可以 运行 快 10 倍 并且使用 更少 GPU 内存(由算法工艺提供),但更多的计算效用。最后,插入 Conv1D
作为带有 strides > 1
的第一层将通过减少输入大小显着提高列车速度,而不一定会损害性能(实际上可以提高性能)。
更新:对 GPU 超频是一种选择,但我建议不要这样做,因为它会在长时间 运行(和所有 DL)中磨损 GPU是 "long run")。还有 "over-volting" 和其他硬件调整,但所有这些都应该用于一些简短的应用程序。最大的不同是你的 input data pipeline.
我有一台配备 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])
在 tensorflow 或 jupyter 中没有 GPU 使用限制。问题是您无法加载 GPU。通常这意味着数据加载器的工作速度比 GPU 处理数据的速度慢。尝试分析您的工作流程,您会发现瓶颈。
假设后者已正确安装,TensorFlow 会自动通过 CUDA 和 cuDNN 优化 GPU 资源分配。您看到的使用情况统计信息主要是 memory/compute 资源 'activity' 的使用情况统计信息,不一定是实用程序(执行);参见
要增加使用率、增加批量大小、模型大小或任何可以增加并行度计算的方法;请注意,使模型更深会增加 GPU 的内存效用,但远不会增加它的计算效用。
此外,考虑使用 CuDNNLSTM
而不是 LSTM
,这样可以 运行 快 10 倍 并且使用 更少 GPU 内存(由算法工艺提供),但更多的计算效用。最后,插入 Conv1D
作为带有 strides > 1
的第一层将通过减少输入大小显着提高列车速度,而不一定会损害性能(实际上可以提高性能)。
更新:对 GPU 超频是一种选择,但我建议不要这样做,因为它会在长时间 运行(和所有 DL)中磨损 GPU是 "long run")。还有 "over-volting" 和其他硬件调整,但所有这些都应该用于一些简短的应用程序。最大的不同是你的 input data pipeline.