这些天,我无法使用GPU来加速新程序。 我的GPU是Nvidia 1080Ti,以前我已经使用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来加快程序速度? 在此先感谢您,我的英语很抱歉。