如何使用GPU通过tf.Keras加速计算

时间:2018-12-06 11:33:02

标签: python tensorflow keras deep-learning gpu

这些天,我无法使用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来加快程序速度? 在此先感谢您,我的英语很抱歉。

0 个答案:

没有答案