tensorflow.keras 没有使用 GPU

tensorflow.keras not utilizing gpu

我正在使用 tensorflow.keras 来训练 3D CNN。 Tensorflow 可以检测我的 GPU。当我运行以下代码时:

print(tf.config.list_physical_devices('GPU'))
print(tf.config.list_logical_devices('GPU'))

我得到以下输出:

[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
[LogicalDevice(name='/device:GPU:0', device_type='GPU')]

但是,当我训练我的模型时,我可以在 Windows 任务管理器中清楚地看到根本没有使用 GPU。

这是构建和训练模型的代码:

input_shape = train_gen[0][0][0].shape
model = Sequential()
# 1
model.add(Conv3D(8, kernel_size=(3, 3, 3), padding='same', input_shape=input_shape))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPool3D((2, 2, 1), strides=(2, 2, 1), padding='same'))
# 2
model.add(Conv3D(16, kernel_size=(3, 3, 3), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPool3D((2, 2, 2), strides=(2, 2, 2), padding='same'))
# 3
model.add(Conv3D(32, kernel_size=(3, 3, 3), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPool3D((2, 2, 2), strides=(2, 2, 2), padding='same'))
# 4
model.add(Conv3D(64, kernel_size=(3, 3, 3), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPool3D((2, 2, 2), strides=(2, 2, 2), padding='same'))
# 5
model.add(Conv3D(128, kernel_size=(3, 3, 3), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPool3D((2, 2, 2), strides=(2, 2, 2), padding='same'))
# final
model.add(Flatten())
model.add(Dropout(0.5))
model.add(Dense(512))
model.add(Dense(2, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
print('input_shape =', input_shape)
model.summary()

checkpoint = ModelCheckpoint(
    'saved-models/3d-cnn/best', monitor='val_loss', mode='min',
    save_weights_only=True, save_best_only=True, verbose=1
)

history = model.fit(
    train_gen,
    validation_data=val_gen,
    epochs=20,
    callbacks=[checkpoint]
)

train_genval_gen(传递给 fit 方法)都是 CustomDataGenerator class 的实例,它继承自 tf.keras.utils.Sequence 并生成通过从磁盘读取图像并将它们作为 numpy 数组存储在内存中来批量处理数据。

如何让我的模型在训练期间使用 GPU?


编辑:

当我编译我的模型时,终端中显示以下输出:

2022-02-21 16:38:59.667337: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX AVX2
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2022-02-21 16:39:00.087775: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1510] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 3989 MB memory:  -> device: 0, name: NVIDIA GeForce GTX 1660 Ti, pci bus id: 0000:01:00.0, compute capability: 7.5

我注意到我分配了 4.1 GB 的 GPU 内存。

当我调用 model.fit 时,我在终端中显示了另外两条线:

2022-02-21 16:42:25.775427: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:185] None of the MLIR Optimization Passes are enabled (registered 2)
2022-02-21 16:42:27.101558: I tensorflow/stream_executor/cuda/cuda_dnn.cc:369] Loaded cuDNN version 8100

而且我分配了 4.6 GB 的 GPU 内存。 GPU 利用率立即增加到 100%,持续约 1 秒,然后下降并在整个训练过程中保持在 0%。


编辑 2:

我在训练期间在我的终端中输入了以下命令:nvidia-smi -l 5 我得到了类似于以下输出的内容(每 5 秒):

Mon Feb 21 17:11:17 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 496.13       Driver Version: 496.13       CUDA Version: 11.5     |
|-------------------------------+----------------------+----------------------+
| GPU  Name            TCC/WDDM | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ... WDDM  | 00000000:01:00.0 Off |                  N/A |
| N/A   52C    P0    68W /  N/A |   4892MiB /  6144MiB |     70%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A     12176      C   ...bdul\anaconda3\python.exe    N/A      |
+-----------------------------------------------------------------------------+

GPU-Util下的70%值在训练过程中一直在70%到85%之间变化。这是否表明我的 GPU 已被使用?

轻松快速检查是否正在使用 GPU:

运行 和 CUDA_VISIBLE_DEVICES="-1" ./your_code.py 如果使用 python 脚本或导入 os; os.environ['CUDA_VISIBLE_DEVICES'] = 代码中的“-1”。

如果您在 nvidia-smi and/or speed/duration 的训练中经历了重大变化,那么您首先使用的是 GPU。 (具有 `CUDA_VISIBLE_DEVICES="0"(如果在 multi-gpu 设置上则为 "0,1,2")

简短检查清单:

  • 确保您正在导入和使用 tf.keras
  • 确保你已经安装了tensorflow-gpu
  • 使用 watch -n 1 nvidia-smi 观察 GPU 利用率,而 .fit 为 运行ning。
  • 检查版本兼容性table。这很重要。
  • 忽略 nvidia-smi 中显示的 cuda 版本,因为它是您的驱动程序附带的 cuda 版本。安装的cuda版本显示为nvcc -V.

你的情况:

正在将模型加载到 GPU。因此,它与您的 GPU 利用率问题无关。 possible 你的 train_genval_gen 需要时间或者它们有错误。尝试不执行任何特定的扩充以确保问题与 *_gen.

无关