/ / Execute o Caffe como somente CPU após uma instalação bem-sucedida da GPU Caffe - docker, caffe, nvidia, nvidia-docker

Execute o Caffe como apenas CPU após uma instalação bem sucedida do GPU Caffe - docker, caffe, nvidia, nvidia-docker

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 № 1

Concordo 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.