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_gen
和 val_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_gen
和 val_gen
需要时间或者它们有错误。尝试不执行任何特定的扩充以确保问题与 *_gen
.
无关
我正在使用 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_gen
和 val_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_gen
和 val_gen
需要时间或者它们有错误。尝试不执行任何特定的扩充以确保问题与 *_gen
.