Python: Ich kriege dauernd folgenden OSerror, wenn ich 'import open3d' mache, was soll ich tun?
Der Fehler sagt: import open3d
File "/path/.local/lib/python3.8/site-packages/open3d/__init__.py", line 38, in <module>
CDLL(str(next((Path(__file__).parent / "cpu").glob("pybind*"))))
File "/usr/lib/python3.8/ctypes/__init__.py", line 373, in __init__
self._handle = _dlopen(self._name, mode)
OSError: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by /.singularity.d/libs/libGLdispatch.so.0)
´´´´´´´ /path/.local/lib/python3.8/site-packages/open3d/__init__.py
"
Ich arbeite in einen Container, Apptainer, vom Cluster meiner Uni. Im Apptainer ist GLIBC_2.31 vorhanden (Ubuntu 20.04). Ich kann es nicht höher upgraden. Vom Cluster haben wir Ubuntu 22.04, und GLIBC 2.35.
Ich habe open3d im Apptainer, also im container installiert, python3 -m pip install open3d.
Und dann bekomme ich diesen Fehler oben. Auf meinen lokalen rechner (Ubuntu 24.04 ,GLIBC_2.39) und im docker container (auch 2.31) funktioniert alles. WOran kann es liegen?
2 Antworten
Dein Problem löst die Shared Library libGLdispatch.so.0 aus. Diese wurde mit GLIBC 2.34 kompiliert und nutzt auch Funktionen von dieser Version. Wenn die Abhängigkeit (in der Version) nicht gefunden wurde, gibt es den Fehler.
Dein Import im Python Code möchte die besagte Shared Library nutzen und lädt intern weitere Dependencies wie glibc.
ldd -v /.singularity.d/libs/libGLdispatch.so.0
Mit dem Befehl kannst du die Dependencies mit glibc Version anzeigen lassen. Du kannst alternativ auch anderen Executables bzw. Shared Libraries angegeben.
Zum Lösen des Problem kannst du zu einen das Betriebssystem mit der bereitgestellten glibc Version aktualisieren. Alternativ gibt es vielleicht auch andere Builds der Shared Library, die auch mit älteren glibc Versionen klar kommt. In beiden Fällen ist ein neues/anderes Container Image notwendig.
Falls es ein öffentliches Container Image mit allen Abhängigkeiten ist, hilft vielleicht schon ein andere Tag (Version vom Image). Ansonsten solltest du dich an den Maintainer vom Image wenden (Du? deine Uni?) oder es mit vorhandenen Source Code (Dockerfile) selber lösen.
Bezüglich GPU Unterstützung kann es gut sein, dass dies andere Shared Library Dependencies voraussetzt. Ohne GPU wird diese eventuell gar nicht geladen und es gibt auch kein Fehler. Der CPU Weg läuft dann dementsprechend ohne Probleme.
Mit deinem lokalen Ausführen könnte es eventuell am GPU Support liegen. Nutzt bei dir lokal die GPU? Auch wenn du die GPU nutzen möchtest, hast du das erfolgreiche Docker + GPU Setup überprüft? Wenn die GPU nicht korrekt im Container ist, wird wahrscheinlich einfach die CPU genommen. Im Cluster der Uni sollte das korrekt eingerichtet sein.
Wie kann es auch sein das ich nur bei open3d package diese Probleme habe, weil doch generell der Container alle files in nvliblist benutzt oder nicht bzw. Es geladen wird?
Das kommt raus, wenn ich den Befehl oben eingebe:
/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by /.singularity.d/libs/libGLdispatch.so.0)
linux-vdso.so.1 (0x00007ffccd7b4000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007dc07e482000)
/lib64/ld-linux-x86-64.so.2 (0x00007dc07e73f000)
Version information:
/.singularity.d/libs/libGLdispatch.so.0:
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.34) => not found
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libc.so.6:
ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
Ich habe sonst gelesen die .so file im
nvliblist.conf
einfach auszukommentieren, aber dazu hab ich keine rechte.
version `GLIBC_2.34' not found
Da steht es: Das Python-Skript will (warum auch immer) glibc 2.34 haben, du hast aber nur 2.31. Du wirst also entweder das Skript anpassen oder den Container upgraden müssen.
Dann befrage den Zuständigen für das Cluster. 🤷♂️
Da ich auch das Skript nicht sehe, weiß ich nicht mal, was du genau machen willst.
Mein Python skript besteht nur aus einer Zeile: import open3d
Das wars. Wenn ich GPU ausschalte funktioniert es, sonst kriege ich nen OS Error.
Du meinst libGLdispatch.so.0 will 2.34? und nicht das Python-skript oder?
Wenn ich z.B GPU access aus mache (also apptainer run statt apptainer --nv run), dann steht da kein error. In der tat , findet der Container nicht mal den pfad nach /.singularity.d/.
Also liegt ja das Problem mit den GPU. /.singularity... kann ich nicht ändern, da ich aufm externen Cluster arbeite.
Den Container kann ich nicht upgraden, da es dann nicht mehr kompatibel mit der library Isaacgym ist welches ich brauche