Eu tenho uma imagem do Docker com o Caffe compilado com suporte a cudnn. O CUDA e todas as outras dependências estão instaladas corretamente na imagem e funcionam corretamente ao usar nvidia-docker
para fornecer drivers da máquina host.
Eu gostaria de rodar esta mesma imagem sem usando nvidia-docker
e apenas defina o Caffe no modo CPU. No entanto, quando faço isso, ainda vejo erros de que os drivers corretos da Nvidia não podem ser encontrados. É como se criar o Caffe com suporte a cudnn fizesse com que o Caffe exigir os drivers da GPU. Isso é problemático para o meu caso de uso: fornecer uma única imagem do Docker que possa ser usada de forma intercambiável como uma imagem baseada na CPU ou uma imagem baseada na GPU.
Como posso instalar o Caffe com o suporte cudnn / GPU ativado, mas ainda executá-lo sem dependência de tempo de execução de nenhuma dependência da CUDA / GPU?
Nota: não se trata de desativar o suporte à GPU com um CPU_ONLY
bandeira durante o tempo de construção de Caffe. Em vez disso, trata-se de criar o Caffe para poder usar a GPU, mas executá-lo de uma maneira que não exija drivers, bibliotecas CUDA etc. em uma CPU apenas tempo de execução modo.
O tipo de erro que vejo no tempo de execução está abaixo:
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)
Aqui estou apenas carregando um modelo de prototxt depois de chamando caffe.set_mode_cpu()
usando a ligação Python de Caffe.
Se eu compilar no modo CPU_ONLY, tudo funcionará,ou se eu realmente executar com a nvidia-docker em uma máquina que hospeda os drivers corretos. Mas estou procurando especificamente uma única imagem do Docker que seja portátil entre máquinas host que possuem e não possuem GPUs ou as dependências de driver necessárias.
Respostas:
0 para resposta № 1Concordo que você deve poder fazer essa escolha simplesmente definindo solver_mode
dentro solver.prototxt
ou alguma configuração semelhante. No entanto, não foi assim que o BVLC projetou o Caffe; existem vários outros links no código que pressupõem que ele possa se valer das GPUs implícitas pela presença do código CUDA.
A solução seria procurar o código, encontrar as referências aos sinalizadores de presença CUDA e alterar o código para usar dinamicamente os ramos "CPU_ONLY" quando o seu CPU
sinalizador foi definido.
0 para resposta № 2
Depois de mais escavações, esta referência sugere que é o LayerSetup
função para determinadas camadas de convolução causando o problema.
Em particular, em cudnn_conv_layer.cpp, a implementação LayerSetup faz chamadas para CUDA_CHECK e CUDNN_CHECK por exemplo Manipulação de fluxo CUDA.
Parece que quando o Caffe é compilado com suporte a cudnn, essas verificações falharão se você tentar executar no modo CPU, mesmo após set_mode_cpu()
. Não tenho certeza se uma alteração no CUDNN_CHECK
macro seria suficiente ou se exigir escrevendo uma camada Caffe totalmente nova que verifica o modo de tempo de execução antes de determinarqual recurso verifica para executar. Qualquer um dos casos não é viável para minha situação atual, portanto, dividirei as funcionalidades da CPU e da GPU em dois Dockerfiles separados.