Запускайте Caffe как CPU-only после успешной установки GPU Caffe

У меня есть образ Docker с Caffe, скомпилированный с поддержкой cudnn. CUDA и все остальные зависимости правильно установлены в образе и правильно работают при использовании nvidia-docker для предоставления драйверов с хост-компьютера.

Я хотел бы запустить этот же образ без использования nvidia-docker и просто установить Caffe в режим ЦП. Однако, когда я это делаю, я все еще вижу ошибки, связанные с тем, что правильные драйверы Nvidia не могут быть найдены. Как будто сборка Caffe с поддержкой cudnn приводит к тому, что Caffe требует драйверы графического процессора. Это проблематично для моего варианта использования: предоставление одного образа Docker, который можно использовать взаимозаменяемо либо как образ на основе процессора, либо как образ на основе графического процессора.

Как я могу установить Caffe с включенной поддержкой cudnn / GPU, но при этом запускать его без зависимости времени выполнения от каких-либо зависимостей CUDA / GPU?

Примечание: это не вопрос об отключении поддержки GPU с флагом CPU_ONLY во время сборки Caffe. Скорее, речь идет о том, чтобы Caffe был создан для использования графического процессора, а затем запускал его так, чтобы не требовалось никаких драйверов, библиотек CUDA и т. д., в режиме runtime только для ЦП. .

Тип ошибки, которую я вижу во время выполнения, приведен ниже:

I0523 21:09:42.175459    14 layer_factory.hpp:77] Creating layer conv1
I0523 21:09:42.175561    14 net.cpp:84] Creating Layer conv1
I0523 21:09:42.175606    14 net.cpp:406] conv1 <- data
I0523 21:09:42.175660    14 net.cpp:380] conv1 -> conv1
F0523 21:09:42.177079    14 cudnn_conv_layer.cpp:52] Check failed: error == cudaSuccess (35 vs. 0)  CUDA driver version is insufficient for CUDA runtime version
*** Check failure stack trace: ***
Aborted (core dumped)

Здесь я просто загружаю модель prototxt после вызова caffe.set_mode_cpu() с использованием привязки Caffe Python.

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


person ely    schedule 24.05.2017    source источник
comment
похоже, что сеть, которую вы используете, явно определила слой, который должен работать с использованием cuda самое близкое обсуждение, которое я смог найти по вашей проблеме.. предлагаю переключить движок на caffe.. было бы даже полезно, если бы вы разместили здесь свой файл prototxt... groups.google.com/forum/#!msg/caffe-users/Hc6c4KVaXkQ/   -  person Eliethesaiyan    schedule 25.05.2017
comment
Сеть не определяет никаких свойств, зависящих от GPU или CUDA. Если я использую флаг CPU_ONLY, все работает, как и ожидалось, с точно такой же обученной сетью. Обратите внимание, что Caffe выбирает использовать cudnn_conv_layer несмотря на caffe.set_mode_cpu() — этого не происходит при прямом проходе по сети в режиме CPU_ONLY.   -  person ely    schedule 25.05.2017
comment
К сожалению, я не могу поделиться файлом prototxt, поскольку он предназначен для проекта, связанного с работой, но это тривиально легко воспроизвести с любой предварительно обученной моделью, которая не полагается на решатель графического процессора и т. д. Просто запустите его на хосте графического процессора с помощью Caffe установлен с поддержкой cudnn, но попробуйте обычные docker и set_mode_cpu.   -  person ely    schedule 25.05.2017
comment
ну... не уверен... но я думаю, что это может быть похожей проблемой github.com/ happynear/caffe-windows/issues/37   -  person Eliethesaiyan    schedule 26.05.2017
comment
@Eliethesaiyan, это полезно - если это не было изменено в более поздних версиях Caffe, это предполагает, что использование USE_CUDNN и CPU_ONLY является взаимоисключающим, что безумие, но я думаю, хорошо знать, что ограничение присуще Caffe.   -  person ely    schedule 26.05.2017


Ответы (2)


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

В частности, в cudnn_conv_layer.cpp, реализация LayerSetup вызывает CUDA_CHECK и CUDNN_CHECK например Обработка потока CUDA.

Похоже, когда Caffe скомпилирован с поддержкой cudnn, эти проверки не пройдут, если вы попытаетесь выполнить в режиме ЦП, даже после set_mode_cpu(). Я не уверен, будет ли достаточным изменение макроса CUDNN_CHECK или же для этого потребуется написать полностью новый слой Caffe, который проверяет режим выполнения, прежде чем определить, какие проверки ресурсов выполнять. Ни один из этих случаев не подходит для моей текущей ситуации, поэтому я разделю функции процессора и графического процессора на два отдельных файла Docker.

person ely    schedule 28.05.2017

Я согласен, что вы должны иметь возможность сделать этот выбор, просто установив solver_mode в solver.prototxt или что-то подобное. Однако это не то, как BVLC разработала Caffe; в коде есть различные другие ссылки, которые предполагают, что он может использовать графические процессоры, подразумеваемые наличием кода CUDA.

Решением будет копаться в коде, находить ссылки на флаги присутствия CUDA и изменять код для динамического использования ветвей «CPU_ONLY», когда установлен ваш флаг CPU.

person Prune    schedule 24.05.2017
comment
Мне непонятно это. Что делает set_mode_cpu(), если не позволяет делать это даже в среде, в которой установлена ​​CUDA? Другими словами, как set_mode_cpu направляет все на ЦП, но при этом имеет некоторую зависимость от CUDA? - person ely; 24.05.2017
comment
Я копался в коде прошлой осенью, но, боюсь, я не помню, где именно был этот камень преткновения. - person Prune; 24.05.2017
comment
Соответствует ли ответ, который я предоставил, вашему предыдущему опыту работы с кодом Caffe? - person ely; 28.05.2017
comment
Да, это так. Я отключил макрос проверки, так как эта компиляция никогда не будет использовать графический процессор. - person Prune; 30.05.2017
comment
Итак, единственный вариант — снова собрать caffe без поддержки GPU? - person Deepank; 06.07.2017