GlobMP / applications /avoiding /avoiding_baselines /tools /setup_avoiding_gpu.py
mhsnar's picture
Add files using upload-large-folder tool
7985e7e verified
Raw History Blame Contribute Delete
3.14 kB
#!/usr/bin/env python3
"""Check that `direct-d3il` can actually run this folder on this machine.
python tools/setup_avoiding_gpu.py # check, and fix what it can
python tools/setup_avoiding_gpu.py --check # report only
Unlike the maze2d application there is nothing to download: the 96 expert
episodes are vendored under DiRecT/d3il/environments/dataset/data/avoiding/ and
the planner is in checkpoints/. This only verifies the environment.
"""
import argparse, os, subprocess, sys
HERE = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
ENV = os.environ.get("AVOIDING_ENV") or os.path.dirname(os.path.dirname(sys.executable))
PY_, PIP = f"{ENV}/bin/python", f"{ENV}/bin/pip"
NEEDED = ("torch", "numpy", "gym", "mujoco", "casadi", "einops", "matplotlib", "pyyaml")
CUDA_INDEX = "https://download.pytorch.org/whl/cu128"
def gpu_ok():
"""True when the installed torch can drive THIS machine's GPU.
Compares the device's own compute capability against torch's compiled arch
list rather than hardcoding one: cu124 runs an H100 (sm_90) but not a 5090
(sm_120), and the reverse check would force a needless reinstall.
"""
probe = ("import torch\n"
"if not torch.cuda.is_available():\n"
" print('no-cuda', torch.__version__); raise SystemExit\n"
"a = 'sm_%d%d' % torch.cuda.get_device_capability(0)\n"
"print(a, a in torch.cuda.get_arch_list(), torch.__version__)")
out = subprocess.run([PY_, "-c", probe], capture_output=True, text=True).stdout.strip()
return (" True " in f" {out} "), out or "torch unusable"
def have(pkg):
return subprocess.run([PIP, "show", pkg], capture_output=True).returncode == 0
def main():
ap = argparse.ArgumentParser(); ap.add_argument("--check", action="store_true")
a = ap.parse_args()
ok, detail = gpu_ok()
missing = [p for p in NEEDED if not have(p)]
ckpt = os.path.join(HERE, "checkpoints", "model_ema_10.pth")
data = os.path.join(HERE, "DiRecT", "d3il", "environments", "dataset", "data", "avoiding")
print(f"env : {ENV}")
print(f"torch on this GPU : {'OK' if ok else 'NO'} ({detail})")
print(f"missing packages : {missing or 'none'}")
print(f"planner present : {'OK' if os.path.exists(ckpt) else 'NO'} ({ckpt})")
print(f"dataset present : {'OK' if os.path.isdir(data) else 'NO'} ({data})")
if a.check:
return
if not ok:
print(" installed torch cannot drive this GPU; switching to cu128")
subprocess.run([PIP, "install", "--index-url", CUDA_INDEX, "--force-reinstall",
"--no-deps", "torch==2.11.0+cu128"], check=True)
subprocess.run([PIP, "install", "--index-url", CUDA_INDEX, "torch==2.11.0+cu128"], check=True)
if missing:
subprocess.run([PIP, "install", *missing], check=True)
ok, detail = gpu_ok()
print(f"\nfinal: torch {'OK' if ok else 'NO'} ({detail})")
if not ok:
sys.exit("[FAIL] torch still cannot see the GPU")
print("[done] ready to fit dynamics and evaluate")
if __name__ == "__main__":
main()