[Resolvido] DLL load failed importing _C no QGIS
Publicado em Atualizado em
ImportError: DLL load failed while importing _C significa que o Windows encontrou o PyTorch e depois se recusou a carregar uma das DLLs compiladas abaixo dele. Você encontra esse erro no QGIS depois que um plugin instala torch no Python do QGIS, inclusive o nosso. Instale o Microsoft Visual C++ Redistributable (x64) e reinicie o Windows. Isso resolve na maioria das máquinas.
Traceback (most recent call last):
File "C:\...\site-packages\torch\__init__.py", line 141, in <module>
raise err
OSError: [WinError 126] The specified module could not be found.
Error loading "C:\...\site-packages\torch\lib\fbgemm.dll" or one of its dependencies.
ImportError: DLL load failed while importing _C: The specified module could not be found.
O mesmo erro nomeia um arquivo diferente em algumas máquinas, e as correções abaixo são as mesmas:
Error loading "C:\...\site-packages\torch\lib\shm.dll" or one of its dependencies.
Aplica-se ao Windows 10 e 11, ao QGIS 3.22 e posteriores, e ao PyTorch 2.4.0 até 2.8.0, as versões para Windows que incluem fbgemm.dll. A versão 2.9.0 deixou de incluir esse arquivo.
Se o seu erro disser [WinError 127] em vez de 126, pare aqui. Isso significa que a DLL foi carregada e que está faltando um símbolo dentro dela. É uma incompatibilidade de versão entre pacotes, não este bug.
A correção rápida
Instale o Visual C++ Redistributable (x64)
Execute vc_redist.x64.exe em aka.ms/vc14/vc_redist.x64.exe. Escolha x64 mesmo que você já tenha x86. São pacotes separados, e o torch precisa de x64.
Reinicie o Windows
Reinicie o Windows, não apenas o QGIS. O instalador deixa parte do trabalho para a reinicialização.
Procure um segundo Python
Em um Prompt de Comando, execute where python. Mais de um resultado significa que um Python do Anaconda, Miniconda ou independente está competindo com o Python do QGIS.
Tire esse Python do PATH
Vá para Iniciar, procure por "variáveis de ambiente", abra Editar as variáveis de ambiente do sistema, Variáveis de Ambiente, Path. Exclua as entradas do Python que você não usa no QGIS, depois saia do Windows e entre novamente.
Se o erro não mudar, vá para a Correção 2.
Verifique se funcionou
Abra o OSGeo4W Shell na pasta do QGIS no menu Iniciar e execute:
python -c "import torch; print(torch.__version__)"
Um número de versão sozinho em uma linha, sem traceback acima dele, significa que as DLLs carregaram. Agora repita o teste onde importa: no QGIS, Complementos, depois Console Python, depois import torch. Um prompt silencioso ali é o resultado que você quer. Se um dos dois testes passar e o outro falhar, eles estão executando Pythons diferentes. Volte à etapa 3.
Correção 2: falta uma dependência de fbgemm.dll
Algumas máquinas têm o pacote redistribuível e ainda assim não têm libomp140.x86_64.dll. A correção definitiva é migrar para o PyTorch 2.9.0 ou posterior, que não inclui fbgemm.dll. Se você está preso a uma versão mais antiga, usuários no rastreador do PyTorch relatam que copiar libomp140.x86_64.dll, que vem com o Visual Studio Community gratuito, faz o sistema funcionar. Isso é uma solução alternativa, nunca uma correção dos mantenedores, e nenhum wheel do PyTorch inclui o arquivo. Não baixe uma DLL avulsa de um site de downloads.
Se o erro não mudar, vá para a Correção 3.
Correção 3: o wheel não corresponde à máquina
Uma build CUDA em um computador sem um driver NVIDIA compatível falha na mesma linha. Sem uma GPU NVIDIA, force a build para CPU:
pip install --force-reinstall torch --index-url https://download.pytorch.org/whl/cpu
Com uma GPU, use o comando que a página de instalação do PyTorch fornece para a sua versão do CUDA. Dentro de um ambiente conda, instale o torch com conda em vez de pip, para que as bibliotecas de runtime venham do mesmo lugar que o pacote.
Se o erro não mudar, vá para a Correção 4.
Correção 4: o antivírus removeu um arquivo depois da instalação
Abra a Segurança do Windows, depois Proteção contra vírus e ameaças, depois Histórico de proteção. Restaure tudo o que ele removeu da sua pasta site-packages, adicione essa pasta às exclusões e reinstale o torch. A instalação informa que foi concluída e a pasta ainda parece cheia, então nada na tela aponta para esse problema.
Se o erro não mudar, vá para Ainda não funciona? abaixo.
Por que isso acontece
O PyTorch distribui DLLs compiladas, não apenas Python puro. fbgemm.dll e suas vizinhas em torch/lib fazem vínculo com o runtime C da Microsoft, e o Windows se recusa a carregar uma DLL quando não consegue encontrar as dependências dessa própria DLL. Ele informa a falha no topo da cadeia, em _C, o módulo de extensão do torch responsável pela importação. Por isso a mensagem nomeia um arquivo que está bem ali no disco.
A segunda causa é o Python 3.8. Desde essa versão, apenas os caminhos do sistema, o diretório que contém o arquivo DLL ou PYD e os diretórios adicionados com add_dll_directory() são pesquisados. PATH e o diretório de trabalho atual não são mais usados de forma alguma. Assim, uma máquina com Anaconda e QGIS pode entregar ao carregador um torch/lib do Python errado, e o erro não informa qual ele escolheu. Inicie o QGIS pelo próprio atalho no menu Iniciar, nunca a partir de um shell onde você executou conda activate.
Ainda não funciona?
AI Segmentation é o nosso plugin que instala PyTorch no Python do QGIS, então é ele que pode apresentar esse erro. Seus modos na nuvem executam os modelos nos nossos servidores e não precisam de torch local, mas isso não corrige o torch para nenhum outro plugin que precise dele. Envie a versão do QGIS, o traceback completo e a versão do plugin para stephane.barbot@terra-lab.ai. Diremos qual dos quatro casos é o seu.
Perguntas frequentes
Por que o erro cita _C quando o arquivo ausente é fbgemm.dll?
_C é o módulo de extensão do torch que faz a importação, então ele fica no topo da cadeia e o Windows informa a falha ali. O arquivo nomeado na linha acima, fbgemm.dll ou shm.dll, normalmente está presente no disco. O que não está presente são as dependências desse arquivo.
Quais versões do PyTorch são afetadas?
As versões para Windows de 2.4.0 até 2.8.0 incluem fbgemm.dll. A versão 2.9.0 deixou de incluí-lo, então atualizar remove esta falha específica. A mensagem com _C ainda pode aparecer por outro motivo, como uma build CUDA em uma máquina sem um driver compatível.
Qual é a diferença entre WinError 126 e WinError 127?
126 significa que o Windows não conseguiu encontrar o módulo ou uma de suas dependências. Esse é o bug descrito aqui. 127 significa que a DLL foi carregada e que está faltando um símbolo dentro dela. É uma incompatibilidade de versão entre dois pacotes. Nenhuma das correções acima ajuda no caso 127.
Posso baixar libomp140.x86_64.dll de um site de DLLs?
Não. Pegue-o na instalação gratuita do Visual Studio Community. É de lá que as pessoas que relatam a solução alternativa no rastreador do PyTorch o obtêm. Uma cópia de um site de downloads não é o mesmo arquivo, e nenhum wheel do PyTorch para Windows inclui esse arquivo de qualquer maneira.
Se você encontrar a mesma mensagem no GDAL, a versão _gdal deste erro tem suas próprias correções. Para saber o que a AI no QGIS faz depois que o torch carrega, comece pelo hub de AI do QGIS.


