collect2: error: ld вернул 1 состояние выхода (-lcudnn) - PullRequest
0 голосов
/ 03 апреля 2020

Edit 1

Я забыл упомянуть, что хочу использовать библиотеку theano.

После того, как я обратился к администратору, они предоставили модули cudnn. Тем не менее, я все еще получаю ту же ошибку.

$ module load devel/cudnn/10.2
$ python -c "import theano"
Can not use cuDNN on context None: cannot compile with cuDNN. We got this error:
/pfs/work7/workspace/scratch/ul_dco32-conda-0/conda/envs/my_env/bin/../lib/
gcc/x86_64-conda_cos6-linux-gnu/7.3.0/../../../../
x86_64-conda_cos6-linux-gnu/bin/ld: cannot find -lcudnn
collect2: error: ld returned 1 exit status

Mapped name None to device cuda: Tesla V100-SXM2-32GB (0000:3A:00.0)
$ vi $HOME/.theanorc
[global]
floatX = float32
device = cuda

[cuda]
root=$CUDA_HOME/bin

[dnn]
include_path=$CUDA_HOME/include
library_path=$CUDA_HOME/lib64

[lib]
cnmem=1

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

Проблема

Я борюсь с ld: cannot find -lcudnn.

Описание

Я хочу использовать Cuda и CuDnn для моего проекта. Я работаю в кластере, Cuda уже установлена ​​в кластере (ps у меня нет разрешений root). Поэтому я копирую файлы Cuda в свою локальную папку и устанавливаю Cudnn в соответствии с инструкциями на официальном сайте. Однако ld не может найти libcudnn.so.

$ lsb_release -a
Description:    Red Hat Enterprise Linux Server release 7.7 (Maipo)
Release:        7.7

Что я пробовал

$ ld -lcudnn --verbose
attempt to open //usr/x86_64-redhat-linux/lib64/libcudnn.so failed
attempt to open //usr/x86_64-redhat-linux/lib64/libcudnn.a failed
attempt to open //usr/lib64/libcudnn.so failed
attempt to open //usr/lib64/libcudnn.a failed
attempt to open //usr/local/lib64/libcudnn.so failed
attempt to open //usr/local/lib64/libcudnn.a failed
attempt to open //lib64/libcudnn.so failed
attempt to open //lib64/libcudnn.a failed
attempt to open //usr/x86_64-redhat-linux/lib/libcudnn.so failed
attempt to open //usr/x86_64-redhat-linux/lib/libcudnn.a failed
attempt to open //usr/local/lib/libcudnn.so failed
attempt to open //usr/local/lib/libcudnn.a failed
attempt to open //lib/libcudnn.so failed
attempt to open //lib/libcudnn.a failed
attempt to open //usr/lib/libcudnn.so failed
attempt to open //usr/lib/libcudnn.a failed
ld: cannot find -lcudnn

Если я добавлю путь к библиотеке libcudnn.so вручную

$ ld -L "$CUDA_HOME/lib64" -lcudnn
attempt to open /home/ul/ul_student/ul_dco32/pkg/cuda/10.2/lib64/libcudnn.so succeeded
-lcudnn (/home/ul/ul_student/ul_dco32/pkg/cuda/10.2/lib64/libcudnn.so)
librt.so.1 needed by /home/ul/ul_student/ul_dco32/pkg/cuda/10.2/lib64/libcudnn.so
found librt.so.1 at /usr/lib64/librt.so.1
libpthread.so.0 needed by /home/ul/ul_student/ul_dco32/pkg/cuda/10.2/lib64/libcudnn.so
found libpthread.so.0 at /usr/lib64/libpthread.so.0
libdl.so.2 needed by /home/ul/ul_student/ul_dco32/pkg/cuda/10.2/lib64/libcudnn.so
found libdl.so.2 at /usr/lib64/libdl.so.2
libstdc++.so.6 needed by /home/ul/ul_student/ul_dco32/pkg/cuda/10.2/lib64/libcudnn.so
found libstdc++.so.6 at /usr/lib64/libstdc++.so.6
libm.so.6 needed by /home/ul/ul_student/ul_dco32/pkg/cuda/10.2/lib64/libcudnn.so
found libm.so.6 at /usr/lib64/libm.so.6
libgcc_s.so.1 needed by /home/ul/ul_student/ul_dco32/pkg/cuda/10.2/lib64/libcudnn.so
found libgcc_s.so.1 at /usr/lib64/libgcc_s.so.1
libc.so.6 needed by /home/ul/ul_student/ul_dco32/pkg/cuda/10.2/lib64/libcudnn.so
found libc.so.6 at /usr/lib64/libc.so.6
ld-linux-x86-64.so.2 needed by /home/ul/ul_student/ul_dco32/pkg/cuda/10.2/lib64/libcudnn.so
found ld-linux-x86-64.so.2 at /usr/lib64/ld-linux-x86-64.so.2
ld: warning: cannot find entry symbol _start; not setting start address

Вот мой LD_LIBRARY_PATH

$ echo $LD_LIBRARY_PATH
/home/ul/ul_student/ul_dco32/pkg/cuda/10.2/lib64

ld как-то игнорирует LD_LIBRARY_PATH. Поскольку у меня нет разрешений root, я не могу ни создать символьную ссылку c, ни внести изменения в ldconfig. Таким образом, установка LD_LIBRARY_PATH - единственный способ исправить это.

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Оказалось, что проблема была в конфигурации theano. Объявление полного пути CUDA_HOME (или CUDNN_HOME), чем использование $ CUDA_HOME (или $ CUDNN_HOME), решило мою проблему.

[cuda]
root=path/to/cuda/bin

[dnn]
include_path=path/to/cudnn/include
library_path=path/to/cudnn/lib64

PS Модули Cudnn и Cuda были установлены администратором, поэтому одна большая проблема была устранена .

0 голосов
/ 05 апреля 2020

(Это мог бы быть комментарий, но у меня недостаточно репутации для этого; я говорю только об общем использовании линкера и c, я не знаю о проектах cuda или cudnn и о том, какие инструменты сборки они используют, et c)

Если я добавлю путь к библиотеке libcudnn.so вручную

$ ld -L "$CUDA_HOME/lib64" -lcudnn

Это строка ссылки без объектных файлов для связать и создать исполняемый файл с.

attempt to open /home/ul/ul_student/ul_dco32/pkg/cuda/10.2/lib64/libcudnn.so succeeded
-lcudnn (/home/ul/ul_student/ul_dco32/pkg/cuda/10.2/lib64/libcudnn.so)
 :

Это показывает, что вы получили правильный путь в -L.

ld: warning: cannot find entry symbol _start; not setting start address

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

Вот мой LD_LIBRARY_PATH

$ echo $LD_LIBRARY_PATH
/home/ul/ul_student/ul_dco32/pkg/cuda/10.2/lib64

ld каким-то образом игнорирует LD_LIBRARY_PATH. Поскольку у меня нет разрешений root, я не могу ни создать символьную ссылку c, ни внести изменения в ldconfig. Таким образом, установка LD_LIBRARY_PATH - единственный способ, которым я могу это исправить.

LD_LIBRARY_PATH не для использования ld во время соединения, это для того, чтобы сообщить ld.so компоновщик времени выполнения (Dynami *) 1038 * загрузчик), где искать при поиске общих библиотек для загрузки в работающую программу.

...