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