我正在使用 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繼承自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 利用率在大約 1 秒內立即增加到 100%,然后下降并在整個訓練程序中保持在 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 已被使用?
uj5u.com熱心網友回復:
輕松快速檢查是否正在使用 GPU:
CUDA_VISIBLE_DEVICES="-1" ./your_code.py如果使用 python 腳本或 import os 則運行;os.environ['CUDA_VISIBLE_DEVICES'] = '-1'` 在代碼中。
如果您在 nvidia-smi 和/或訓練的速度/持續時間方面經歷了顯著變化,那么您首先使用的是 GPU。(具有 `CUDA_VISIBLE_DEVICES="0" (或“0,1,2”,如果在多 GPU 設定上)
簡短的清單:
- 確保您正在匯入和使用
tf.keras. - 確保您已安裝
tensorflow-gpu watch -n 1 nvidia-smi在運行時觀察 GPU 利用率.fit。- 檢查版本兼容性表。這個很重要。
- 忽略中顯示的 cuda 版本
nvidia-smi,因為它是您的驅動程式附帶的 cuda 版本。安裝的 cuda 版本顯示為nvcc -V.
在你的情況下:
模型正在加載到 GPU。因此,它與您的 GPU 利用率問題無關。您的train_gen和可能val_gen需要時間,或者它們有問題。嘗試不執行任何特定擴充以確保問題與*_gen.
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/430100.html
