Ga naar inhoud
QGIS
Probleemoplossing

QGIS: DLL load failed importing _C op Windows [Opgelost]

Gepubliceerd op Bijgewerkt op

ImportError: DLL load failed while importing _C betekent dat Windows PyTorch heeft gevonden en daarna weigerde een van de gecompileerde DLL's eronder te laden. Je krijgt deze fout in QGIS nadat een plugin torch in de QGIS Python-omgeving heeft geïnstalleerd, ook de onze. Installeer de Microsoft Visual C++ Redistributable (x64) en start Windows daarna opnieuw op. Daarmee is het probleem op de meeste machines opgelost.

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.

Op sommige machines verwijst dezelfde fout naar een ander bestand. De oplossingen hieronder zijn hetzelfde:

Error loading "C:\...\site-packages\torch\lib\shm.dll" or one of its dependencies.

Dit geldt voor Windows 10 en 11, QGIS 3.22 en later, en PyTorch 2.4.0 tot en met 2.8.0, de Windows-wheels waarin fbgemm.dll wordt meegeleverd. Versie 2.9.0 bevat dat bestand niet meer.

Als je foutmelding [WinError 127] vermeldt in plaats van 126, stop dan hier. Dat betekent dat de DLL wel is geladen, maar dat er een symbool in ontbreekt. Dat is een versieconflict tussen pakketten, niet deze bug.

De snelle oplossing

Installeer de Visual C++ Redistributable (x64)

Voer vc_redist.x64.exe uit vanaf aka.ms/vc14/vc_redist.x64.exe. Kies x64, ook als x86 al is geïnstalleerd. Het zijn afzonderlijke pakketten en torch heeft x64 nodig.

Start Windows opnieuw op

Start Windows opnieuw op, niet alleen QGIS. De installer voltooit een deel van zijn werk pas na het opnieuw opstarten.

Zoek naar een tweede Python

Voer in een Opdrachtprompt where python uit. Meer dan één resultaat betekent dat Anaconda, Miniconda of een zelfstandige Python-installatie concurreert met die van QGIS.

Haal die Python uit PATH

Ga naar Start, "omgevingsvariabelen", Systeemomgevingsvariabelen bewerken, Omgevingsvariabelen, Path. Verwijder de vermeldingen voor de Python die je niet in QGIS gebruikt en log je daarna uit bij Windows en weer in.

Als de fout niet is veranderd, ga dan naar Oplossing 2.

Controleer of het werkt

Open de OSGeo4W Shell vanuit de QGIS-map in het menu Start en voer uit:

python -c "import torch; print(torch.__version__)"

Een versienummer op een eigen regel, zonder traceback erboven, betekent dat de DLL's worden geladen. Herhaal de test nu op de plek die ertoe doet: open in QGIS Plug-ins > Python-console en voer vervolgens import torch uit. Een stille prompt is daar het gewenste resultaat. Als het in de ene omgeving wel werkt en in de andere niet, gebruiken ze verschillende Python-installaties. Ga dan terug naar stap 3.

Oplossing 2: een afhankelijkheid van fbgemm.dll ontbreekt

Op sommige machines is de redistributable geïnstalleerd, maar ontbreekt nog steeds libomp140.x86_64.dll. De duurzame oplossing is overstappen op PyTorch 2.9.0 of later, waarin helemaal geen fbgemm.dll meer wordt meegeleverd. Als je aan een oudere versie vastzit, melden gebruikers op de PyTorch-tracker dat het kopiëren van libomp140.x86_64.dll, dat wordt meegeleverd met de gratis Visual Studio Community, het probleem oplost. Dat is een workaround en geen oplossing van de maintainer. Geen enkele PyTorch-wheel bundelt dit bestand. Download geen losse DLL van een downloadsite.

Als de fout niet is veranderd, ga dan naar Oplossing 3.

Oplossing 3: de wheel past niet bij de machine

Een CUDA-build op een computer zonder overeenkomstige NVIDIA-driver faalt op dezelfde regel. Als je geen NVIDIA GPU hebt, forceer dan de CPU-build:

pip install --force-reinstall torch --index-url https://download.pytorch.org/whl/cpu

Heb je wel een GPU, gebruik dan de opdracht die de PyTorch-installatiepagina geeft voor jouw CUDA-versie. Installeer torch binnen een conda-omgeving met conda in plaats van pip, zodat de runtimebibliotheken uit dezelfde omgeving komen als het pakket.

Als de fout niet is veranderd, ga dan naar Oplossing 4.

Oplossing 4: antivirus heeft na de installatie een bestand verwijderd

Open Windows-beveiliging, daarna Virus- en bedreigingsbeveiliging en vervolgens Beveiligingsgeschiedenis. Herstel alles wat uit je map site-packages is verwijderd, voeg die map toe aan de uitsluitingen en installeer torch opnieuw. De installatie meldt succes en de map ziet er nog steeds gevuld uit, dus niets op het scherm wijst vanzelf naar deze oorzaak.

Als de fout niet is veranderd, ga dan naar Nog steeds problemen? hieronder.

Waarom dit gebeurt

PyTorch levert gecompileerde DLL's mee in plaats van alleen Python-code. fbgemm.dll en de andere DLL's in torch/lib zijn gekoppeld aan de Microsoft C-runtime. Windows weigert een DLL te laden wanneer het de eigen afhankelijkheden van die DLL niet kan vinden. De fout wordt bovenaan de keten gemeld, bij _C, de torch-extensiemodule die de import uitvoert. Daarom noemt de melding een bestand dat gewoon op de schijf staat.

De tweede oorzaak is Python 3.8. Sinds die release worden alleen de systeempaden, de map met het DLL- of PYD-bestand en mappen die met add_dll_directory() zijn toegevoegd, doorzocht. PATH en de huidige werkmap worden helemaal niet meer gebruikt. Een machine waarop zowel Anaconda als QGIS staat, kan de loader daardoor een torch/lib uit de verkeerde Python-omgeving geven. De foutmelding zegt niet welke omgeving is gekozen. Start QGIS via de eigen snelkoppeling in het menu Start, nooit vanuit een shell waarin je conda activate hebt uitgevoerd.

Nog steeds problemen?

AI Segmentation is onze plugin die PyTorch in de QGIS Python-omgeving installeert. Dat is dus de plugin die deze fout kan veroorzaken. De cloudmodi draaien de modellen op onze servers en hebben geen lokale torch-installatie nodig. Daarmee wordt torch niet gerepareerd voor andere plugins die er wel gebruik van willen maken. Stuur de QGIS-versie, de volledige traceback en de pluginversie naar stephane.barbot@terra-lab.ai. We vertellen je welke van de vier oorzaken van toepassing is.

Veelgestelde vragen

Waarom noemt de fout _C terwijl het ontbrekende bestand fbgemm.dll is?

_C is de torch-extensiemodule die de import uitvoert. Die staat dus bovenaan de keten en Windows meldt de fout daar. Het bestand op de regel erboven, fbgemm.dll of shm.dll, staat normaal gesproken wel op de schijf. Waar dat bestand van afhankelijk is, ontbreekt echter.

Welke PyTorch-versies zijn getroffen?

De Windows-wheels van 2.4.0 tot en met 2.8.0 bevatten fbgemm.dll. Versie 2.9.0 bevat het niet meer, dus een upgrade verwijdert deze specifieke fout. De melding met _C kan nog steeds om een andere reden verschijnen, bijvoorbeeld door een CUDA-build op een machine zonder overeenkomstige driver.

Wat is het verschil tussen WinError 126 en WinError 127?

126 betekent dat Windows de module of een van de afhankelijkheden niet kon vinden. Dat is deze bug. 127 betekent dat de DLL wel is geladen, maar dat er een symbool in ontbreekt. Dat is een versieconflict tussen twee pakketten. Geen van de bovenstaande oplossingen helpt bij een 127.

Kan ik libomp140.x86_64.dll downloaden van een DLL-site?

Nee. Haal het bestand uit de gratis installatie van Visual Studio Community. Dat is de bron van het bestand voor de gebruikers die deze workaround op de PyTorch-tracker melden. Een kopie van een downloadsite is niet hetzelfde bestand en geen enkele PyTorch Windows-wheel bundelt dit bestand.

Als je dezelfde foutmelding bij GDAL krijgt, heeft de _gdal-versie van deze fout eigen oplossingen. Voor wat AI in QGIS doet zodra torch is geladen, begin je bij de QGIS AI-hub.