Как использовать GPU для ускорения вычислений с помощью tf.Keras - PullRequest
0 голосов
/ 06 декабря 2018

В наши дни я не смог использовать графический процессор для запуска своей новой программы.Мой графический процессор - Nvidia 1080Ti, и я ускорил свою программу с графическим процессором раньше.(Поскольку GPU-утилита достигает более 60%, а время намного короче, чем при использовании CPU).Поэтому я думаю, что нет проблем с настройкой среды.

По сравнению с моими предыдущими программами, которые хорошо работают с графическим процессором, в новой программе я определил сложную функцию потерь со многими тензорными операциями.Поскольку сетевая модель похожа, я думаю, что сложные потери приводят к увеличению времени.

Мой код указан в следующем виде:

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')

С программой все в порядке, но она работает слишком медленно.Поскольку все нормально, кроме сложной функции потерь, я думаю, что это и есть причина.Я отслеживаю использование графического процессора с помощью некоторого программного обеспечения, во время обучения оно иногда достигает 30%, но в большинстве случаев составляет 0%.И поэтому моя программа работает очень медленно.

Итак, как я могу использовать свой графический процессор для ускорения моей программы?Заранее спасибо и извините за мой английский.

...