GPU 仅被使用 1-5% Tensorflow-gpu 和 Keras
GPU only being used 1-5% Tensorflow-gpu and Keras
我刚刚为 gpu 安装了 tensorflow,正在为我的 CNN 使用 keras。在训练期间,我的 GPU 只使用了大约 5%,但是在训练期间使用了 6gb 的 vram 中的 5 个。有时它会出现故障,在控制台中打印 0.000000e+00 并且 gpu 达到 100%,但几秒钟后训练速度减慢到 5%。我的 GPU 是 Zotac gtx 1060 mini,我使用的是 Ryzen 5 1600x。
Epoch 1/25
121/3860 [..............................] - ETA: 31:42 - loss: 3.0575 - acc: 0.0877 - val_loss: 0.0000e+00 - val_acc: 0.0000e+00Epoch 2/25
121/3860 [..............................] - ETA: 29:48 - loss: 3.0005 - acc: 0.0994 - val_loss: 0.0000e+00 - val_acc: 0.0000e+00Epoch 3/25
36/3860 [..............................] - ETA: 24:47 - loss: 2.9863 - acc: 0.1024
通常,我们希望瓶颈出现在 GPU 上(因此利用率为 100%)。如果没有发生这种情况,则说明您的代码的其他部分在每次批处理过程中都花费了很长时间。很难说它是什么(特别是因为你没有添加任何代码),但你可以尝试一些事情:
1。输入数据
确保网络的输入数据始终可用。从磁盘读取图像需要很长时间,所以使用多个 workers
和 multiprocessing
接口:
model.fit(..., use_multiprocessing=True, workers=8)
2。强制模型进入GPU
这几乎不是问题,因为 /gpu:0
是默认设备,但值得确保您在预期设备上执行模型:
with tf.device('/gpu:0'):
x = Input(...)
y = Conv2D(..)
model = Model(x, y)
2。查看模型尺寸
如果您的批次大小很大并且允许软放置,则您的网络部分(不适合 GPU 的内存)可能会放置在 CPU。这大大减慢了这个过程。
如果软放置打开,尝试禁用并检查是否抛出内存错误:
# make sure soft-placement is off
tf_config = tf.ConfigProto(allow_soft_placement=False)
tf_config.gpu_options.allow_growth = True
s = tf.Session(config=tf_config)
K.set_session(s)
with tf.device(...):
...
model.fit(...)
如果是这种情况,请尝试减小批处理大小,直到它适合并为您提供良好的 GPU 使用率。然后再次打开软放置。
您可以尝试一些方向。
- 仔细检查您的输入管道,确保它不是性能瓶颈。
- 增加批号或层宽以确保 GPU 有足够的数据来使用。
- 最有效的方法是转储配置文件json看看。
我的经验是大部分时间利用率低是因为 GPU 消耗的数据不足。
一些有用的链接
* https://www.tensorflow.org/guide/performance/datasets
* https://towardsdatascience.com/howto-profile-tensorflow-1a49fb18073d
我刚刚为 gpu 安装了 tensorflow,正在为我的 CNN 使用 keras。在训练期间,我的 GPU 只使用了大约 5%,但是在训练期间使用了 6gb 的 vram 中的 5 个。有时它会出现故障,在控制台中打印 0.000000e+00 并且 gpu 达到 100%,但几秒钟后训练速度减慢到 5%。我的 GPU 是 Zotac gtx 1060 mini,我使用的是 Ryzen 5 1600x。
Epoch 1/25
121/3860 [..............................] - ETA: 31:42 - loss: 3.0575 - acc: 0.0877 - val_loss: 0.0000e+00 - val_acc: 0.0000e+00Epoch 2/25
121/3860 [..............................] - ETA: 29:48 - loss: 3.0005 - acc: 0.0994 - val_loss: 0.0000e+00 - val_acc: 0.0000e+00Epoch 3/25
36/3860 [..............................] - ETA: 24:47 - loss: 2.9863 - acc: 0.1024
通常,我们希望瓶颈出现在 GPU 上(因此利用率为 100%)。如果没有发生这种情况,则说明您的代码的其他部分在每次批处理过程中都花费了很长时间。很难说它是什么(特别是因为你没有添加任何代码),但你可以尝试一些事情:
1。输入数据
确保网络的输入数据始终可用。从磁盘读取图像需要很长时间,所以使用多个 workers
和 multiprocessing
接口:
model.fit(..., use_multiprocessing=True, workers=8)
2。强制模型进入GPU
这几乎不是问题,因为 /gpu:0
是默认设备,但值得确保您在预期设备上执行模型:
with tf.device('/gpu:0'):
x = Input(...)
y = Conv2D(..)
model = Model(x, y)
2。查看模型尺寸
如果您的批次大小很大并且允许软放置,则您的网络部分(不适合 GPU 的内存)可能会放置在 CPU。这大大减慢了这个过程。
如果软放置打开,尝试禁用并检查是否抛出内存错误:
# make sure soft-placement is off
tf_config = tf.ConfigProto(allow_soft_placement=False)
tf_config.gpu_options.allow_growth = True
s = tf.Session(config=tf_config)
K.set_session(s)
with tf.device(...):
...
model.fit(...)
如果是这种情况,请尝试减小批处理大小,直到它适合并为您提供良好的 GPU 使用率。然后再次打开软放置。
您可以尝试一些方向。
- 仔细检查您的输入管道,确保它不是性能瓶颈。
- 增加批号或层宽以确保 GPU 有足够的数据来使用。
- 最有效的方法是转储配置文件json看看。
我的经验是大部分时间利用率低是因为 GPU 消耗的数据不足。
一些有用的链接 * https://www.tensorflow.org/guide/performance/datasets * https://towardsdatascience.com/howto-profile-tensorflow-1a49fb18073d