Как устранить предупреждения Tensorflow — cuDNN, cuFFT, cuBLAS и NUMA

Я пытаюсь настроить свой компьютер с Ubuntu 22.04 (на котором установлена ​​мобильная версия NVIDIA GeForce GTX 1500 Ti) для запуска проекта Tensorflow для моей магистерской диссертации.

Я успешно установил драйвер Nvidia 535 и Nvidia Cuda Toolkit 12.2, используя инструкции ниже.

sudo apt install nvidia-driver-535
wget https://developer.download.nvidia.com/compute/cuda/12.2.2/local_installers/cuda_12.2.2_535.104.05_linux.run
sudo sh cuda_12.2.2_535.104.05_linux.run

Чтобы убедиться, что все установлено правильно, я проверил, что мои файлы cuda расположены по адресу /usr/local/cuda-12.2 с символической ссылкой /usr/local/cuda, указывающей на него, и запустил nvidia-smi и nvcc --version, что вывело:

+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.183.01             Driver Version: 535.183.01   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA GeForce GTX 1050 Ti     Off | 00000000:01:00.0 Off |                  N/A |
| N/A   42C    P8              N/A /  30W |      7MiB /  4096MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
                                                                                         
+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|    0   N/A  N/A      1863      G   /usr/lib/xorg/Xorg                            4MiB |
+---------------------------------------------------------------------------------------+
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Tue_Aug_15_22:02:13_PDT_2023
Cuda compilation tools, release 12.2, V12.2.140
Build cuda_12.2.r12.2/compiler.33191640_0

Наконец, я создал venv на Python 3.9.2, установил tensorflow 2.17 (используя pip install tensorflow[and-cuda]) и запустил приведенный ниже скрипт:

import tensorflow as tf

def check_gpu():
    print("TensorFlow Version:", tf.__version__)

    # List all devices
    devices = tf.config.list_physical_devices()
    print("Physical devices:")
    for device in devices:
        print(device)

    # Check if GPU is available
    if tf.config.list_physical_devices('GPU'):
        print("GPU is available")
    else:
        print("GPU is not available")

    # Test TensorFlow GPU operation
    try:
        with tf.device('/GPU:0'):  # Specify GPU device
            a = tf.constant([1.0, 2.0, 3.0, 4.0])
            b = tf.constant([2.0, 2.0, 2.0, 2.0])
            c = a + b
            print("TensorFlow can run on GPU")
            print("Result of GPU operation:", c.numpy())
    except RuntimeError as e:
        print("Error using GPU:", e)

check_gpu()

Несмотря на то, что сценарий выполнен успешно и операции выполняются графическим процессором, у меня появляется несколько предупреждений (cuDNN, cuFFT, cuBLAS и NUMA), как показано ниже.

2024-08-20 12:24:28.116134: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:485] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered
2024-08-20 12:24:28.129784: E external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:8454] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered
2024-08-20 12:24:28.133871: E external/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1452] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered

I0000 00:00:1724153069.716493   10819 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355

После просмотра Интернета я попытался вручную перенести файлы cuDNN на свою установку cuda, запустив приведенный ниже код, но предупреждения не исчезли.

wget https://developer.download.nvidia.com/compute/cudnn/redist/cudnn/linux-x86_64/cudnn-linux-x86_64-9.3.0.75_cuda12-archive.tar.xz
tar xf cudnn-linux-x86_64-9.3.0.75_cuda12-archive.tar.xz
cd cudnn-linux-x86_64-9.3.0.75_cuda12-archive
sudo cp include/cudnn*.h /usr/local/cuda/include
sudo cp lib/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn*.h
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*

Если у кого-нибудь есть идеи, как решить эти предупреждения, я был бы очень признателен.

Заранее спасибо!

Возможно, глупый вопрос, но вы удалили «tensorflow[and-cuda]» перед установкой CuDNN вручную? Также обратите внимание, что официально TF 2.17 использует CUDA 12.3 и CuDNN 8.9. Небольшое изменение версии в CUDA не должно быть плохим, но я не уверен в существенной разнице версий CuDNN (версия 8.x против 9.x). Кроме того, ответ в этой теме предложил решение, хотя и сложное.

mhenning 21.08.2024 11:30

Привет @mhenning. Да, я пытался установить cuDNN с неустановленным тензорным потоком, но это не сработало. Что касается основной разницы в версиях, я думаю, что это могло быть одной из проблем. Предложенное вами исправление не сработало, но я смог найти обходной путь. Ниже я опубликовал ответ на решение, которое сработало для меня. Тем не менее спасибо за вашу помощь!

brunomcebola 24.08.2024 18:36
Udacity Nanodegree Capstone Project: Классификатор пород собак
Udacity Nanodegree Capstone Project: Классификатор пород собак
Вы можете ознакомиться со скриптами проекта и данными на github .
1
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

После некоторых головных болей мне наконец удалось устранить все предупреждения!

Что касается предупреждений cuDNN, cuFFT и cuBLAS:

По сути, я понизил версию драйвера NVIDIA с 535 до 470, Cuda с 12,2 до 11,4, cuDNN с 9.3.0 до 8.9.7 и Tensorflow с 2,17 до 2,5. Хоть это и не было идеальным решением, оно все равно лучше, чем раньше, поскольку позволяет мне выполнять необходимую работу. Также обратите внимание, что это не рекомендуемые версии NVIDIA для моей системы, но те, которые мне подошли. Вот шаги, которые я предпринял:

  1. Я удалил все пакеты и драйверы, связанные с nvidia и cuda.
sudo apt remove --purge *nvidia* *cuda*
sudo apt autoremove
  1. Затем я установил драйвер Nvidia версии 470.
sudo apt install nvidia-driver-470
sudo reboot
  1. После этого я установил Cuda 11.4, используя файл запуска для Ubuntu 20.04, который отлично работает для Ubuntu 22.04. Обратите внимание, что во время установки появится предупреждение об уже установленном драйвере. Просто введите continue, примите условия NVIDIA и снимите флажок с параметра драйвера.
wget https://developer.download.nvidia.com/compute/cuda/11.4.4/local_installers/cuda_11.4.4_470.82.01_linux.run
sudo sh cuda_11.4.4_470.82.01_linux.run
echo export PATH=/usr/local/cuda/bin:\$PATH >> ~/.bashrc
echo export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH >> ~/.bashrc
sudo reboot
  1. Наконец, я вручную добавил файлы cuDNN 8.9.7 в каталог установки Cuda.
wget https://developer.download.nvidia.com/compute/cudnn/redist/cudnn/linux-x86_64/cudnn-linux-x86_64-8.9.7.29_cuda11-archive.tar.xz
tar xf cudnn-linux-x86_64-8.9.7.29_cuda11-archive.tar.xz
sudo cp cudnn-linux-x86_64-8.9.7.29_cuda11-archive/include/cudnn*.h /usr/local/cuda/include
sudo cp cudnn-linux-x86_64-8.9.7.29_cuda11-archive/lib/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*

Что касается предупреждений NUMA:

Я нашел этот пост от zrruziev в GitHub Gist, в котором представлено пошаговое решение, как устранить предупреждение. Тем не менее, поскольку предлагаемое решение необходимо запускать вручную при каждой перезагрузке, я взял скрипт , предоставленный enonu, и создал сервис, который делает это автоматически. Шаги:

  1. Создать файл сценария bash
sudo nano /usr/local/bin/set_numa.sh
#!/bin/bash

if [[ "$EUID" -ne 0 ]]; then
  exit 1
fi

PCI_ID=$(lspci | grep "VGA compatible controller: NVIDIA Corporation" | cut -d' ' -f1)
PCI_ID = "0000:$PCI_ID"
FILE=/sys/bus/pci/devices/$PCI_ID/numa_node

if [[ -f "$FILE" ]]; then
  CURRENT_VAL=$(cat $FILE)
  if [[ "$CURRENT_VAL" -eq -1 ]]; then
    echo 0 > $FILE
  fi
else
  exit 1
fi
  1. Сделать скрипт исполняемым
sudo chmod +x /usr/local/bin/set_numa.sh
  1. Создать служебный файл systemd
sudo nano /etc/systemd/system/set_numa.service
[Unit]
Description=Set NUMA Node for NVIDIA GPU
After=multi-user.target

[Service]
ExecStart=/usr/local/bin/set_numa.sh
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
  1. Запустите службу, чтобы она запускалась при загрузке. Обратите внимание, что вам необходимо перезагрузиться, чтобы изменения вступили в силу.
sudo systemctl enable set_numa
sudo systemctl start set_numa

Убедитесь, что все работает:

После перезагрузки машины, чтобы проверить, все ли работает нормально, я запустил nvidia-smi, nvcc --version, sudo systemctl status set_numa и скрипт из моего первоначального поста. Результаты следующие:

$ nvidia-smi
Sat Aug 24 17:26:20 2024       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.256.02   Driver Version: 470.256.02   CUDA Version: 11.4     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  Off  | 00000000:01:00.0  On |                  N/A |
| N/A   51C    P0    N/A /  N/A |    465MiB /  4040MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Mon_Oct_11_21:27:02_PDT_2021
Cuda compilation tools, release 11.4, V11.4.152
Build cuda_11.4.r11.4/compiler.30521435_0

$ sudo systemctl status set_numa
● set_numa.service - Set NUMA Node for NVIDIA GPU
     Loaded: loaded (/etc/systemd/system/set_numa.service; enabled; vendor preset: enabled)
     Active: active (exited) since Sat 2024-08-24 23:19:47 WEST; 34min ago
    Process: 1741 ExecStart=/usr/local/bin/set_numa.sh (code=exited, status=0/SUCCESS)
   Main PID: 1741 (code=exited, status=0/SUCCESS)
        CPU: 15ms

ago 24 23:19:47 <my-machine-name> systemd[1]: Starting Set NUMA Node for NVIDIA GPU...
ago 24 23:19:47 <my-machine-name> systemd[1]: Finished Set NUMA Node for NVIDIA GPU.

$ python test_script.py
2024-08-24 23:55:54.496175: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0
TensorFlow Version: 2.5.0
2024-08-24 23:55:56.033467: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcuda.so.1
2024-08-24 23:55:56.054557: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1733] Found device 0 with properties: 
pciBusID: 0000:01:00.0 name: NVIDIA GeForce GTX 1050 Ti computeCapability: 6.1
coreClock: 1.62GHz coreCount: 6 deviceMemorySize: 3.95GiB deviceMemoryBandwidth: 104.43GiB/s
2024-08-24 23:55:56.054592: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0
2024-08-24 23:55:56.071430: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcublas.so.11
2024-08-24 23:55:56.071482: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcublasLt.so.11
2024-08-24 23:55:56.078799: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcufft.so.10
2024-08-24 23:55:56.080862: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcurand.so.10
2024-08-24 23:55:56.082734: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcusolver.so.11
2024-08-24 23:55:56.086919: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcusparse.so.11
2024-08-24 23:55:56.087933: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudnn.so.8
2024-08-24 23:55:56.089044: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1871] Adding visible gpu devices: 0
Physical devices:
PhysicalDevice(name='/physical_device:CPU:0', device_type='CPU')
PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')
GPU is available
2024-08-24 23:55:56.090068: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2024-08-24 23:55:56.091047: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1733] Found device 0 with properties: 
pciBusID: 0000:01:00.0 name: NVIDIA GeForce GTX 1050 Ti computeCapability: 6.1
coreClock: 1.62GHz coreCount: 6 deviceMemorySize: 3.95GiB deviceMemoryBandwidth: 104.43GiB/s
2024-08-24 23:55:56.091593: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1871] Adding visible gpu devices: 0
2024-08-24 23:55:56.092275: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0
2024-08-24 23:55:56.895543: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1258] Device interconnect StreamExecutor with strength 1 edge matrix:
2024-08-24 23:55:56.895603: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1264]      0 
2024-08-24 23:55:56.895612: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1277] 0:   N 
2024-08-24 23:55:56.896557: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1418] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 2975 MB memory) -> physical GPU (device: 0, name: NVIDIA GeForce GTX 1050 Ti, pci bus id: 0000:01:00.0, compute capability: 6.1)
TensorFlow can run on GPU
Result of GPU operation: [3. 4. 5. 6.]

Надеюсь, это поможет любому в моем месте.

С уважением и хорошей программой!

Для будущих читателей: «Я понизил версию драйвера NVIDIA с 535 до 470», — не обязательно.

Robert Crovella 24.08.2024 18:39

Другие вопросы по теме