Compile MXNet C ++ api com OpenBlas a partir do código-fonte no Windows 10

Por que você precisa compilar e esperar por este tipo de texto introdutório? Vá direto ao tópico: compilar mxnet a partir do código-fonte no Windows

MXNet tem relativamente poucas dependências, mas não é fácil de compilar.

Pode compilar de acordo com a documentação oficial.A princípio os resultados são os mesmos.Estou habituado a usar o cmake-gui, principalmente porque é intuitivo na configuração dos parâmetros. Se você quiser ir direto para a compilação, sugiro que leia o resumo final primeiro. O seguinte processo e análise de erro não são necessariamente os melhores porque são compilados e analisados ​​ao mesmo tempo.

O site oficial tem muitas informações e as descrições em vários lugares também são inconsistentes. Deixe-me resumir um pouco.

Resumo das informações no site oficial

Primeiro, se a versão for 1.5.1 ou inferior, primeiro modifique _MSC_VER na tupla.h. Consulte a seção "Problemas ao gerar OP.h por meio de OpWrapperGenerator.py" para razões específicas e como modificá-lo. Não o altere após a compilação, você deve começar a compilar novamente.

(1) Como o MXNet tem muitas dependências, se você usar o clone git, você deve adicionar o comando --recursive, para que os módulos dependentes na pasta de terceiros sejam baixados automaticamente. Porque eu uso o pacote de arquivos, então não preciso desse clone do git.

(2) É especificamente declarado aqui que a versão mais recente do MXNet oferece suporte a MSVC2019. Referência: https://mxnet.cdn.apache.org/get_started/build_from_source

(3) No caso de não usar o clone git, qual pacote de arquivos compilar foi claramente indicado na documentação oficial. Sem usar git clone --recursive, é o pacote neste link https://mxnet.cdn.apache.org/get_started/download.tar.gz (a página de download e download do .tar.gz), que corresponde a https: // github. Com / apache / incubator-mxnet / releases , tomando a versão 1.60 como exemplo, existem os seguintes 5 pacotes de arquivos, e o primeiro pacote abaixo precisa ser baixado

Ativos 5

apache-mxnet-src-1.6.0-incubating.tar.gz 34,3 MB

apache-mxnet-src-1.6.0-incubating.tar.gz.asc 833 bytes

apache-mxnet-src-1.6.0-incubating.tar.gz.sha512 171 bytes

Código-fonte (CEP)

Código fonte (tar.gz)

A versão mais recente é 1.70rc0, todos os recursos de download são os seguintes, compile também selecione o primeiro pacote.

Ativos 5

apache-mxnet-src-1.7.0.rc0-incubating.tar.gz 35,4 MB

apache-mxnet-src-1.7.0.rc0-incubating.tar.gz.asc 836 bytes

apache-mxnet-src-1.7.0.rc0-incubating.tar.gz.sha512 175 bytes

Código-fonte (CEP)

Código fonte (tar.gz)

Há também a versão 1.5.1 (versão aprimorada de 1.5), que é frequentemente usada, e há mais materiais relacionados.Se você deseja compilar a partir do código-fonte, escolha o primeiro pacote também.

Ativos 5

apache-mxnet-src-1.5.1-incubating.tar.gz 159 MB

apache-mxnet-src-1.5.1-incubating.tar.gz.asc 836 Bytes

apache-mxnet-src-1.5.1-incubating.tar.gz.sha512 171 bytes

Código-fonte (CEP)

Código fonte (tar.gz)

(4) Quais opções são configuradas

De acordo com a documentação em https://github.com/dmlc/gluon-cv/tree/master/scripts/deployment/cpp-inference , já existem muitas opções antes das opções padrão, que podem ser configuradas por um conforme necessário, como

-DUSE_CUDA = 0 = 0 -DUSE_CUDNN -DUSE_OPENCV = 1 = 1 -DUSE_OPENMP -DUSE_PROFILER = 1 = -DUSE_BLAS aberto -DUSE_LAPACK = 1 = 0 -DUSE_DIST_KVSTORE -DUSE_MKL_IF_AVAILABLE = 0 -DUSE_CPP_PACKAGE = 1 = 0 -DBUILD_CPP_EXAMPLES -DDO_NOT_BUILD_EXAMPLES = 1 -DCMAKE_INSTALL_PREFIX = c: \ incubator-mxnet

Remova USE_F16C, caso contrário, um erro será relatado: O conjunto de instruções F16C ainda não é compatível com MSVC;

去掉 USE_JEMALLOC (para evitar incompatibilidades com a biblioteca OpenMP do LLVM) ;

Remova todas as opções relacionadas do MKL (assumindo que você deseja compilar um projeto suportado pelo OpenBlas);

Escolha CUDA de acordo com sua situação real.

(5) Sobre OpenCV

Adicione o diretório OpenCV, não há muito a dizer, meu OpenCV é compilado por mim,

https://blog.csdn.net/tanmx219/article/details/106928732

Você pode baixar diretamente a versão oficial e configurar, por exemplo, usar o pacote openCV deste local:

https://github.com/opencv/opencv/releases/tag/4.3.0

Existe apenas o arquivo OpenCVConfig.cmake no diretório de configuração.

(6) Configuração OpenBlas

O OpenBlas precisa inserir dois endereços, um é lib (não é um diretório lib) e o outro é o diretório de inclusão. Pegue a versão do Windows que baixei como exemplo, esses dois endereços são:
D: \ devMXNet \ OpenBLAS-0.3.10- x64 \ lib \ libopenblas.dll.a
D: \ devMXNet \ OpenBLAS-0.3.10-x64 \ include

Para o libopenblas.dll.a acima, descobri que ele pode ser compilado corretamente com libopenblas.lib. Não sei por que, verifiquei muitas postagens na Internet e todos usaram libopenblas.dll.a.

Além disso, configurei na variável de ambiente: OpenBLAS_HOME = D: \ devMXNet \ openblas-0.2.14-x64-install, o endereço fornecido automaticamente em CMakeCache.txt neste momento é:
// Caminho para um arquivo.
OpenBLAS_INCLUDE_DIR: PATH = D: /devMXNet/openblas-0.2.14-x64-install/include
// Caminho para uma biblioteca.
OpenBLAS_LIB: FILEPATH = D: /devMXNet/openblas-0.2.14-x64-install/lib/libopenblas.dll.a
Pode-se ver que a configuração padrão no cmake também é libopenblas.dll.a.

Anexo: openblas-0.2.14-x64-install é  o endereço de download fornecido por
https://github.com/dmlc/gluon-cv/tree/master/scripts/deployment/cpp-inference http: // mxnet-files. s3.amazonaws.com/openblas/openblas-0.2.14-x64-install.zip)

Por fim, a foto acima

Depois de repetir o configure várias vezes, haverá alguns avisos. Parece ser a versão gtest ou algo assim, e não parece ter nenhum efeito. Não importa o que aconteça, basta gerar o projeto diretamente e iniciar a compilação do vs2019.

 

Escolha o modo Release, a compilação é surpreendentemente lenta, mais de 1 hora, espere pacientemente! Seria perfeito planejar a compilação durante o intervalo.

Em circunstâncias normais, libmxnet.dll será gerado no final. Ocasionalmente, haverá erros como não ser capaz de localizar op.h. Parece que estes são principalmente para exemplos e não têm efeito sobre libmxnet.dll.

 

Lidando com a impossibilidade de abrir o arquivo de inclusão: "mxnet-cpp / op.h": Não existe esse arquivo ou diretório

Ele está listado especificamente aqui porque a maioria dos amigos que usam cmake-gui em sistemas Windows o encontrará, mas nenhum deles ofereceu uma solução razoável. Se você usar o Makefile diretamente, parece que não existe esse problema (eu não tentei isto). Mais tarde, me referi às instruções aqui ( https://www.programmersought.com/article/14353977045/ ) e provavelmente sabia o motivo. Agora compartilhe a solução.

Reportar um erro

O conteúdo do erro é aproximadamente o seguinte

........ Descrição do código de gravidade A linha do arquivo de projeto proíbe o erro de status de exibição C1083 Não é possível abrir o arquivo de inclusão: "mxnet-cpp / op.h": Não existe esse arquivo ou diretório mlp D: \ devMXNet \ apache-mxnet- 160 \ cpp-package \ include \ mxnet-cpp \ optimizer.hpp 37

Erro C1083 Não é possível abrir o arquivo de inclusão: "mxnet-cpp / op.h": Nenhum arquivo ou diretório mlp_gpu D: \ devMXNet \ apache-mxnet-160 \ cpp-package \ include \ mxnet-cpp \ optimizer.hpp 37

Erro C1083 Não é possível abrir o arquivo de inclusão: "mxnet-cpp / op.h": Nenhum arquivo ou diretório mlp_cpu D: \ devMXNet \ apache-mxnet-160 \ cpp-package \ include \ mxnet-cpp \ optimizer.hpp 37

Erro C1083 Não é possível abrir o arquivo de inclusão: "mxnet-cpp / op.h": Nenhum arquivo ou diretório resnet D: \ devMXNet \ apache-mxnet-160 \ cpp-package \ include \ mxnet-cpp \ optimizer.hpp 37

Erro C1083 Não é possível abrir o arquivo de inclusão: "mxnet-cpp / op.h": Nenhum arquivo ou diretório alexnet D: \ devMXNet \ apache-mxnet-160 \ cpp-package \ include \ mxnet-cpp \ optimizer.hpp 37

Erro C1083 Não é possível abrir o arquivo de inclusão: "mxnet-cpp / op.h": Nenhum arquivo ou diretório googlenet D: \ devMXNet \ apache-mxnet-160 \ cpp-package \ include \ mxnet-cpp \ optimizer.hpp 37

Erro C1083 Não é possível abrir o arquivo de inclusão: "mxnet-cpp / op.h": Nenhum arquivo ou diretório charRNN D: \ devMXNet \ apache-mxnet-160 \ cpp-package \ include \ mxnet-cpp \ optimizer.hpp 37

Erro C1083 Não é possível abrir o arquivo de inclusão: "mxnet-cpp / op.h": Nenhum arquivo ou diretório inception_bn D: \ devMXNet \ apache-mxnet-160 \ cpp-package \ include \ mxnet-cpp \ optimizer.hpp 37

Erro C1083 Não é possível abrir o arquivo de inclusão: "mxnet-cpp / op.h": Nenhum arquivo ou diretório lenet D: \ devMXNet \ apache-mxnet-160 \ cpp-package \ include \ mxnet-cpp \ optimizer.hpp 37

Erro C1083 Não é possível abrir o arquivo de inclusão: "mxnet-cpp / op.h": Nenhum arquivo ou diretório lenet_with_mxdataiter D: \ devMXNet \ apache-mxnet-160 \ cpp-package \ include \ mxnet-cpp \ optimizer.hpp 37

 

Solução

Mude para o seu ambiente python com mxnet (python api) instalado e vá para este endereço (selecione de acordo com seu próprio diretório de compilação),

D:\devMXNet\apache-mxnet-151\cpp-package\script

Use o seguinte comando

python OpWrapperGenerator.py libmxnet.dll

Se você gosta de especificar endereços absolutos, apenas

python OpWrapperGenerator.py D:\\devMXNet\\apache-mxnet-151\\cpp-package\\scripts\\libmxnet.dll

Se tudo estiver normal, você pode encontrar o arquivo op.h neste local correspondente,

D: \ devMXNet \ apache-mxnet-151 \ cpp-package \ include \ mxnet-cpp \ op.h

 

Se os arquivos dependentes estiverem incompletos, os seguintes problemas podem ocorrer

Se OpWrapperGenerator.py só encontrar libmxnet.dll em scripts, há uma grande probabilidade de que você obtenha o seguinte erro

Traceback (most recent call last):
  File "D:\Anaconda3\envs\mx36gpu\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "D:\Anaconda3\envs\mx36gpu\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  ......
  File "d:\devMXNet\apache-mxnet-151\cpp-package\scripts\OpWrapperGenerator.py", line 320, in ParseAllOps
    cdll.libmxnet = cdll.LoadLibrary(sys.argv[1])
  File "D:\Anaconda3\envs\mx36gpu\lib\ctypes\__init__.py", line 426, in LoadLibrary
    return self._dlltype(name)
  File "D:\Anaconda3\envs\mx36gpu\lib\ctypes\__init__.py", line 348, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: [WinError 126] 找不到指定的模块。

Isso ocorre porque o módulo dependente de libmxnet.dll não pode ser encontrado.Há duas maneiras de resolver esse problema.

Uma é adicionar os endereços desses módulos no Caminho (um pouco problemático).

Em segundo lugar, copie todos os módulos necessários para o diretório de scripts e coloque-os juntos com OpWrapperGenerator.py. Foi assim que fiz. Como mostrado abaixo,

 

Claro, alguns deles são supérfluos, mas estou realmente cansada de fazer isso de tudo e não quero escolher um por um. Se você quiser saber em detalhes quais dependências do libmxnet.dll, você pode ir aqui

https://github.com/lucasg/Dependencies/releases

Baixe um analisador de dependências Dependências no Windows e adicione-as uma por uma de acordo com as dependências mencionadas nele. Deixe-me fazer uma captura de tela (oh, é problemático)

Coloquei o op.h bruto aqui (ainda não testei, pode não funcionar, só depende de como é, infelizmente, é um monte de operações)

https://download.csdn.net/download/tanmx219/12594399

Problema ao gerar OP.h por meio de OpWrapperGenerator.py

Ao gerar o arquivo op.h com python, você pode encontrar esse problema

argument "lrs" of operator "multi_sgd_update" has unknown type ", required"
argument "wds" of operator "multi_sgd_update" has unknown type ", required"
argument "lrs" of operator "multi_sgd_mom_update" has unknown type ", required"
argument "lrs" of operator "multi_sgd_mom_update" has unknown type ", required"
argument "wds" of operator "multi_sgd_mom_update" has unknown type ", required"
argument "lrs" of operator "multi_mp_sgd_update" has unknown type ", required"
argument "wds" of operator "multi_mp_sgd_update" has unknown type ", required"
argument "lrs" of operator "multi_mp_sgd_mom_update" has unknown type ", required"
argument "wds" of operator "multi_mp_sgd_mom_update" has unknown type ", required"

A solução é a seguinte.

Encontre este arquivo, https://github.com/apache/incubator-mxnet/blob/master/include/mxnet/tuple.h#L744

Comente o bloco #if interno.

namespace dmlc {
/*! \brief description for optional TShape */
DMLC_DECLARE_TYPE_NAME(optional<mxnet::TShape>, "Shape or None");
DMLC_DECLARE_TYPE_NAME(optional<mxnet::Tuple<int>>, "Shape or None");
// avoid low version of MSVC
#if !defined(_MSC_VER) // <----------- Here !
template<typename T>
struct type_name_helper<mxnet::Tuple<T> > {
  static inline std::string value() {
    return "tuple of <" + type_name<T>() + ">";
  }
};
#endif
}  // namespace dmlc

A solução está aqui

https://github.com/apache/incubator-mxnet/issues/14116

https://github.com/apache/incubator-mxnet/issues/15143

https://github.com/apache/incubator-mxnet/pull/15144

Verifiquei a versão 1.60, este local foi alterado para o seguinte (adicionado && _MSC_VER <1900),

namespace dmlc {
/*! \brief description for optional TShape */
DMLC_DECLARE_TYPE_NAME(optional<mxnet::TShape>, "Shape or None");
DMLC_DECLARE_TYPE_NAME(optional<mxnet::Tuple<int>>, "Shape or None");
// avoid low version of MSVC
#if !(defined(_MSC_VER) && _MSC_VER < 1900)
template<typename T>
struct type_name_helper<mxnet::Tuple<T> > {
  static inline std::string value() {
    return "tuple of <" + type_name<T>() + ">";
  }
};
#endif
}  // namespace dmlc

Além disso, anexe OSError: [WinError 126] O módulo especificado não pode ser encontrado - a solução

Quando um programa Python usa a biblioteca ctypes para chamar uma dll criada por um programa C ++, o seguinte erro será gerado:

OSError: [WinError 126] O módulo especificado não foi encontrado

Depois que o Baidu descobriu que existem duas razões principais para esses problemas:

(1) O arquivo DLL não pode ser encontrado, o caminho está errado ou está isolado por um software antivírus;

(2) A biblioteca dinâmica DLL depende de outras bibliotecas dinâmicas DLL e não pode ser encontrada pelo sistema. Se a biblioteca dependente depende de outras bibliotecas, ela deve ser encontrada camada por camada. Ou seja, ao carregar uma dll em Python, se a dll também depende de outras dlls, essas dlls relacionadas também devem ser encontradas pelo Python Acesso ao processo (sentindo-se tão prolixo).

Solução:

Por um motivo, você pode alterar o caminho do arquivo para um caminho absoluto; desligue o software antivírus e opere novamente.

Pelo segundo motivo, a solução mais básica é importar bibliotecas dinâmicas DLL relacionadas. Se você não puder determinar a biblioteca dinâmica DLL relevante, a causa desse tipo de problema é provavelmente porque seu host de destino não tem o ambiente C ++ relevante instalado. Obtenha uma biblioteca de tempo de execução redistribuível do Visual C ++!

 

Erro LNK1181 Não foi possível abrir o arquivo de entrada "mxnet_static.lib"

Supondo que você compilou todas as partes e Op.h foi gerado normalmente, no final da geração, você verá esse erro,

Código de severidade descrição do arquivo de projeto linha proibida status de exibição
Erro LNK1181 Não é possível abrir o arquivo de entrada "mxnet_static.lib" resnet D: \ devMXNet \ apache-mxnet-151 \ dev \ cpp-package \ example \ LINK 1
Erro LNK1181 Não é possível abrir o arquivo de entrada "mxnet_static.lib" mlp D: \ devMXNet \ apache-mxnet-151 \ dev \ cpp-package \ example \ LINK 1
Erro LNK1181 Não é possível abrir o arquivo de entrada "mxnet_static.lib" alexnet D: \ devMXNet \ apache-mxnet-151 \ dev \ cpp-package \ example \ LINK 1
erro LNK1181 não pode abrir o arquivo de entrada "mxnet_static.lib" googlenet D: \ devMXNet \ apache-mxnet-151 \ dev \ cpp-package \ example \ LINK 1
erro LNK1181 não pode abrir o arquivo de entrada "mxnet_static .lib" charRNN D: \ devMXNet \ apache-mxnet-151 \ dev \ cpp-package \ example \ LINK 1
Erro LNK1181 Não é possível abrir o arquivo de entrada "mxnet_static.lib" lenet_with_mxdataiter D: \ devMXNet \ apache-mxnet -151 \ dev \ cpp-package \ example \ LINK 1
Erro LNK1181 Não é possível abrir o arquivo de entrada "mxnet_static.lib" inception_bn D: \ devMXNet \ apache-mxnet-151 \ dev \ cpp-package \ example \ LINK 1
Erro LNK1181 Não é possível abrir o arquivo de entrada "mxnet_static.lib" lenet D: \ devMXNet \ apache-mxnet-151 \ dev \ cpp-package \ example \ LINK 1
Erro LNK1181 Não é possível abrir o arquivo de entrada "mxnet_static.lib" test_regress_label D: \ devMXNet \ apache-mxnet-151 \ dev \ cpp-package \ example \ LINK 1
Erro LNK1181 Não é possível abrir o arquivo de entrada "mxnet_static.lib" mlp_gpu D: \ devMXNet \ apache-mxnet-151 \ dev \ cpp-package \ example \ LINK 1

Este é um bug da configuração do mxnet cmake no Windows, você pode consultar: https://github.com/apache/incubator-mxnet/issues/11628 .

Solução:


Copie o arquivo D: \ devMXNet \ apache-mxnet-151 \ dev \ Release \ libmxnet.lib diretamente
para
D: \ devMXNet \ apache-mxnet-151 \ dev \ cpp-package \ example \ mxnet_static.lib
Observe que o nome do arquivo foi alterado Tornou-se mxnet_static.lib

Claro, você pode ir para o arquivo de configuração cmake para alterá-lo sem muitos problemas.
Por fim, clique em VS2019 para gerar. Parabéns, tudo acabou e um libmxnet.dll completo e rotinas relacionadas foram gerados.

 

Resumo final

Eu escrevi muito antes, porque está misturado com a solução do problema, então parece um pouco confuso. Eu uso o caso da minha primeira compilação bem-sucedida para resolver a ordem.

(1) O pacote de arquivo principal: openblas-0.2.14-x64-install.zip (download: http://mxnet-files.s3.amazonaws.com/openblas/openblas-0.2.14-x64-install.zip ) apache -mxnet-src-1.5.1-incubating.tar.gz (download: https://github.com/apache/incubator-mxnet/release )

(2) Modifique a tupla.he mude a frase #if ... para este #if! (Definido (_MSC_VER) && _MSC_VER <1900)

(3) configuração cmake-gui, não se esqueça de USE_CPP_PACKAGE, etc.

(4) VS2019 gera o projeto, a rotina final relatará um erro abrangente, C1083 não pode abrir o arquivo de inclusão: "mxnet-cpp / op.h": Não existe esse arquivo ou diretório

(5) Gere o arquivo op.h.Por exemplo, meu ambiente anaconda mxnet é mx36gpu, então mude para este ambiente para executar OpWrapperGenerator.py e não se esqueça de copiar outros arquivos dll relacionados a libmxnet.dll com antecedência.

(mx36gpu) C:\Users\Administrator>cd /d D:\devMXNet\apache-mxnet-151b\cpp-package\scripts
(mx36gpu) D:\devMXNet\apache-mxnet-151b\cpp-package\scripts>python OpWrapperGenerator.py libmxnet.dll
(mx36gpu) D:\devMXNet\apache-mxnet-151b\cpp-package\scripts>

(6) VS2019 clica para gerar novamente, o último erro aparecerá neste momento, o erro LNK1181 não pode abrir o arquivo de entrada "mxnet_static.lib", copie libmxnet.lib e renomeie-o.

Por fim, na foto acima, desejo a todos uma boa compilação.

 

Acho que você gosta

Origin blog.csdn.net/tanmx219/article/details/107227439
Recomendado
Clasificación