这些天,我没能用GPU来启动我的新程序。
我的GPU是nvidia1080ti,我以前用GPU加速了我的程序。(由于GPU util达到了60%以上,而且时间比使用CPU要短得多)。所以我觉得我的环境设置没有问题。在
与我以前使用GPU的程序相比,在新的程序中,我定义了一个具有许多张量流操作的复杂损失函数。由于网络模型是相似的,我认为复杂的损失会导致时间的增加。在
我的代码如下:import numpy as np
import os
from keras.callbacks import ModelCheckpoint, EarlyStopping
from keras import backend as K
NT, H_num, Nk = 64, 100000, 64
Input_H = np.load('Input_H10W.npy')
print(Input_H.shape)
input_dim = NT * Nk
Nt = int(NT/2)
model = tf.keras.models.Sequential([
tf.keras.layers.InputLayer(input_shape=(input_dim,)) ,
# tf.keras.layers.Dense(4096, activation='relu') ,
# tf.keras.layers.BatchNormalization(),
tf.keras.layers.Dense(2048, activation='relu'),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Dense(1024, activation='relu'),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Dense(256, activation='relu'),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Dense(Nt, activation='tanh')
])
def channel(y_true, y_pred):
results, CSI = y_pred, y_true
a = tf.constant(3.1415926)
wr = tf.cos(results* a)
wi = tf.sin(results* a)
w = tf.complex(wr,wi) #actually W^H 1*16
mse = 0
for i in range(Nk):
hr = tf.slice(CSI, [0, NT*i], [-1, Nt])
hi = tf.slice(CSI, [0, NT*i+Nt], [-1, Nt])
h = tf.complex(hr,hi)
equal_H = K.batch_dot(w, tf.transpose(h))
euqal_H_conj = equal_H - 2j * tf.cast(tf.imag(equal_H), dtype=tf.complex64)
snr = euqal_H_conj * equal_H
snr = tf.cast(snr, dtype=tf.float32)
mse += 1 / (snr/Nt + 1)
mse = mse/Nk
return tf.reduce_mean(mse)
optimizer = tf.train.AdamOptimizer()
model.compile(optimizer, loss=channel)
print(model.summary())
checkpoint = ModelCheckpoint('./trained.h5', monitor='val_loss', verbose=0, save_best_only=True, mode='min', save_weights_only=True)
model.fit(Input_H, Input_H, epochs=2000, batch_size=2048, verbose=2, callbacks=[checkpoint], validation_split=0.2)
model.load_weights('./trained.h5')
程序的结果是好的,但它运行得太慢了。因为除了复杂的损失函数,一切都是正常的,所以我认为这是原因。我用一些软件监控GPU的利用率,在培训期间,有时达到30%,但最多的时候是0%。所以我的程序运行得很慢。在
那么,如何利用我的GPU来加速我的程序呢?
提前谢谢,对不起我的英语。在