Merge pull request #395 from Stonki13/fix/windows-cuda-detection
Fix CUDA detection on Windows (coli/doctor.py always report CPU-only)
This commit is contained in:
@@ -143,12 +143,24 @@ def need_model(model):
|
|||||||
sys.exit(f"{C.yel}engine is not built.{C.r} Run: coli build")
|
sys.exit(f"{C.yel}engine is not built.{C.r} Run: coli build")
|
||||||
|
|
||||||
def cuda_binary():
|
def cuda_binary():
|
||||||
if not os.path.exists(GLM) or sys.platform != "linux": return False
|
if not os.path.exists(GLM): return False
|
||||||
|
if sys.platform == "linux":
|
||||||
try:
|
try:
|
||||||
linked=subprocess.run(["ldd",GLM],capture_output=True,text=True,timeout=3)
|
linked=subprocess.run(["ldd",GLM],capture_output=True,text=True,timeout=3)
|
||||||
return any("libcudart" in line and "not found" not in line
|
return any("libcudart" in line and "not found" not in line
|
||||||
for line in linked.stdout.splitlines())
|
for line in linked.stdout.splitlines())
|
||||||
except (OSError,subprocess.SubprocessError): return False
|
except (OSError,subprocess.SubprocessError): return False
|
||||||
|
if sys.platform == "win32":
|
||||||
|
# Windows CUDA_DLL=1 builds never link libcudart directly: glm.exe loads
|
||||||
|
# coli_cuda.dll at runtime via LoadLibrary (backend_loader.c), so there's no
|
||||||
|
# import-table entry for ldd/dumpbin to see. Detect the COLI_CUDA build via a
|
||||||
|
# marker string baked into glm.c's #ifdef COLI_CUDA block instead, and require
|
||||||
|
# coli_cuda.dll to actually sit next to glm.exe (else CUDA init fails at startup).
|
||||||
|
try:
|
||||||
|
with open(GLM,"rb") as f: built=b"[CUDA] mode: routed experts" in f.read()
|
||||||
|
except OSError: return False
|
||||||
|
return built and os.path.exists(os.path.join(os.path.dirname(GLM),"coli_cuda.dll"))
|
||||||
|
return False
|
||||||
|
|
||||||
def resource_request(a, env):
|
def resource_request(a, env):
|
||||||
ctx=a.ctx or int(env.get("CTX",4096))
|
ctx=a.ctx or int(env.get("CTX",4096))
|
||||||
|
|||||||
+19
-2
@@ -19,16 +19,33 @@ def _check(identifier, status, summary, **details):
|
|||||||
|
|
||||||
def cuda_linkage(engine_path):
|
def cuda_linkage(engine_path):
|
||||||
"""Return CUDA linkage state without loading the executable or CUDA runtime."""
|
"""Return CUDA linkage state without loading the executable or CUDA runtime."""
|
||||||
if not Path(engine_path).is_file() or os.name != "posix":
|
engine = Path(engine_path)
|
||||||
|
if not engine.is_file():
|
||||||
return {"linked": False, "missing": False}
|
return {"linked": False, "missing": False}
|
||||||
|
if os.name == "posix":
|
||||||
try:
|
try:
|
||||||
result = subprocess.run(["ldd", str(engine_path)], capture_output=True, text=True,
|
result = subprocess.run(["ldd", str(engine)], capture_output=True, text=True,
|
||||||
timeout=3, check=False)
|
timeout=3, check=False)
|
||||||
except (OSError, subprocess.SubprocessError):
|
except (OSError, subprocess.SubprocessError):
|
||||||
return {"linked": False, "missing": False}
|
return {"linked": False, "missing": False}
|
||||||
lines = [line for line in result.stdout.splitlines() if "libcudart" in line]
|
lines = [line for line in result.stdout.splitlines() if "libcudart" in line]
|
||||||
return {"linked": any("not found" not in line for line in lines),
|
return {"linked": any("not found" not in line for line in lines),
|
||||||
"missing": any("not found" in line for line in lines)}
|
"missing": any("not found" in line for line in lines)}
|
||||||
|
if sys.platform == "win32":
|
||||||
|
# Windows CUDA_DLL=1 builds never link libcudart directly: glm.exe loads
|
||||||
|
# coli_cuda.dll at runtime via LoadLibrary (backend_loader.c), so there's no
|
||||||
|
# import-table entry for ldd/dumpbin to see. Detect the COLI_CUDA build via a
|
||||||
|
# marker string baked into glm.c's #ifdef COLI_CUDA block instead, and require
|
||||||
|
# coli_cuda.dll to actually sit next to glm.exe (else CUDA init fails at startup).
|
||||||
|
try:
|
||||||
|
built = b"[CUDA] mode: routed experts" in engine.read_bytes()
|
||||||
|
except OSError:
|
||||||
|
return {"linked": False, "missing": False}
|
||||||
|
if not built:
|
||||||
|
return {"linked": False, "missing": False}
|
||||||
|
dll_present = (engine.parent / "coli_cuda.dll").is_file()
|
||||||
|
return {"linked": dll_present, "missing": not dll_present}
|
||||||
|
return {"linked": False, "missing": False}
|
||||||
|
|
||||||
|
|
||||||
def run_doctor(model, ram_gb=0, context=4096, gpu_indices=None, vram_gb=0, *,
|
def run_doctor(model, ram_gb=0, context=4096, gpu_indices=None, vram_gb=0, *,
|
||||||
|
|||||||
Reference in New Issue
Block a user