Tensorflow 2.0-GPU Windows выполняет обучающий код на процессоре - PullRequest
1 голос
/ 16 января 2020

В настоящее время я использую Tensorflow 2.0 . Вот мой P C:

  • Процессор: i5-4690 3,5 ГГц.
  • Оперативная память: 16 ГБ.
  • Графический процессор: NVIDIA GeForce 1050Ti 4 ГБ.
  • ОС: Windows 10 Pro 64 bit.
  • CUDA 10.0 и cuDNN 7.4.

Мой проект представляет собой проект классификации изображений с использованием ResNet50 и Набор данных CIFAR100 .

Я строю сеть с использованием подклассов (фрагмент кода был слишком длинным, поэтому я не прикреплял его к этому вопросу) и загружал данные с помощью tf.data.Dataset.from_tensor_slices:

def load_cifar100(batch_size, num_classes=100):
    (x_train, y_train), (x_test, y_test) = cifar100.load_data()

    x_train, x_test = x_train.astype('float32') / 255, x_test.astype('float32') / 255

    x_val, y_val = x_train[-10000:], y_train[-10000:]
    x_train, y_train = x_train[:-10000], y_train[:-10000]

    y_train = to_categorical(y_train, num_classes)
    y_test = to_categorical(y_test, num_classes)
    y_val = to_categorical(y_val, num_classes)

    train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
    train_dataset = train_dataset.shuffle(buffer_size=1024).batch(batch_size)

    val_dataset = tf.data.Dataset.from_tensor_slices((x_val, y_val))
    val_dataset = val_dataset.batch(batch_size)

    test_dataset = tf.data.Dataset.from_tensor_slices((x_test, y_test))
    test_dataset = test_dataset.batch(batch_size)

    return train_dataset, val_dataset, test_dataset

Я использовал GradientTape для настройки моего тренировочного процесса:

def training(x_batch, y_batch):
    with tf.GradientTape() as tape:
        logits = model(x_batch, training=True)
        loss_val = loss(y_batch, logits)

    grads = tape.gradient(loss_val, model.trainable_weights)
    optimizer.apply_gradients(zip(grads, model.trainable_weights))
    train_acc_metric(y_batch, logits)


for epoch in range(epochs):
    train_acc_metric.reset_states()
    for step, (x_batch_train, y_batch_train) in enumerate(train_dataset):
        training(x_batch_train, y_batch_train)

    train_acc = train_acc_metric.result()
    template = 'Epoch {}, Train_Acc: {}'
    print(template.format(epoch + 1,
                          train_acc))

Во время тренировки я увидел, что мой GPU вообще не работал [Pic1], и все тренировки процесс просто положить в CPU, хотя я включаю конфигурацию отладки tf.debugging.set_log_device_placement(True) и кажется, что все слои были загружены в GPU [Pic2].

GPU not working

Tensorflow logs

ОБНОВЛЕНИЕ:

Вот как выглядит графический процессор при переходе на функцию model.fit , И время обучения для каждой эпохи было намного быстрее, чем GradientTape: RUn on model.fit

1 Ответ

0 голосов
/ 17 января 2020

Перед началом процесса обучения полезно проверить, использует ли Tensorflow (TF2) графические процессоры:

assert tf.test.is_gpu_available()
assert tf.test.is_built_with_cuda()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...