Tensorflow с 2 графическими процессорами игнорирует один из них - PullRequest
1 голос
/ 29 марта 2020

У меня проблема с вычислением тензорного потока на 2 графических процессорах, подключенных по технологии SLI: только один из них работает, а второй - нет, хотя оба графических процессора распознаются TF.

Настройка: - Ubuntu 18.04 - Python 3 - Tensorflow 2.1 - Cuda 10.1 - драйверы Nvidia (официальные лица) 440.64 - AMD Ryzen 2700 - Asus x470 prime - Два графических процессора GTX 1070, соединенные через технику SLI.

Я уже тестировал многие вещи, которые я нашел в inte rnet. Конкретно:

  1. Я начал с Tensorflow 2.0, он не работал, поэтому я обновил его до TF 2.1. Проблема остается

  2. Очистил и переустановил драйверы Nvidia 430.50. Обновил их до 440,64. Проблема остается

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

  4. Я проверил каждый из портов графического процессора на моей материнской плате отдельно. Это сработало, и это означает, что с каждым из портов все в порядке.

  5. Я вставил два GPU с аппаратным соединением SLI и без него и запустил следующий код:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.applications import Xception
import numpy as np

num_samples = 100
height = 224
width = 224
num_classes = 50

strategy = tf.distribute.MirroredStrategy(devices=['/GPU:0', '/GPU:1'])
with strategy.scope():
    parallel_model = Xception(weights=None,
                              input_shape=(height, width, 3),
                              classes=num_classes)
    parallel_model.compile(loss='categorical_crossentropy', optimizer='rmsprop')

### Works only for the first GPU of the 
# parallel_model = Xception(weights=None,
#                           input_shape=(height, width, 3),
#                           classes=num_classes)
# parallel_model.compile(loss='categorical_crossentropy', optimizer='rmsprop')

print("Num GPUs Available: ", len(tf.config.experimental.list_physical_devices('GPU')))

# Generate dummy data.
x = np.random.random((num_samples, height, width, 3))
y = np.random.random((num_samples, num_classes))

parallel_model.summary()
# This `fit` call will be distributed on 8 GPUs.
# Since the batch size is 256, each GPU will process 32 samples.
parallel_model.fit(x, y, epochs=20, batch_size=16)

В результате, когда strategy = tf.distribute.MirroredStrategy(devices=['/GPU:0']), код работает нормально. Однако, когда devices=['/GPU:1'] или devices=['/GPU:0', '/GPU:1'], nvidia-smi показывает какой-то процесс на 2-м графическом процессоре, но выполнение кода укладывается в строку

2020-03-28 21:51:14.891325: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1241] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 7162 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1070, pci bus id: 0000:08:00.0, compute capability: 6.1)
2020-03-28 21:51:14.891805: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2020-03-28 21:51:14.892399: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1241] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:1 with 7624 MB memory) -> physical GPU (device: 1, name: GeForce GTX 1070, pci bus id: 0000:09:00.0, compute capability: 6.1),

, поэтому я должен перезагрузить компьютер, потому что он мёртв.

Первоначально моя конфигурация X11 (xorg.conf) не была настроена для SLI:
Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
EndSection

Section "Device"
    Identifier     "Device1"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
EndSection

Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
    Monitor        "Monitor0"
    DefaultDepth    24
    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection

После поиска в Google я играл с sudo nvidia-xconfig -sli=on; sudo nvidia-xconfig -sli=auto, et c

В результате после перезагрузки я получаю bootl oop с двумя строками:

recovering journal
/dev/nume0n1p2: clean, XXX/XXX files, XXX/XXX blocks

Каждые ~ 3 се c экрана становится черным, а затем эти 2 линии показывают снова. Невозможно получить доступ к TTY, потому что он также находится в bootl oop. Я посмотрел все, что мог найти на эту тему, ничего не получалось. Итак, я сохранил предыдущую конфигурацию X11 без SLI

Если у вас возникла проблема такого типа, не стесняйтесь поделиться ею. Любой совет поможет.

Спасибо!

...