| """Check the CUDA/APE runtime needed by Orienter Stage 2.""" |
|
|
| import argparse |
| import importlib |
| import importlib.metadata |
| import json |
| import platform |
| import sys |
|
|
|
|
| HISTORICAL_REFERENCE = { |
| "python": "3.9.18", |
| "torch": "2.2.0+cu121", |
| "torchvision": "0.17.0+cu121", |
| "detectron2": "0.6", |
| "detrex": "0.3.0", |
| } |
|
|
|
|
| def _version(module_name, distribution_name=None): |
| module = importlib.import_module(module_name) |
| value = getattr(module, "__version__", None) |
| if value is not None: |
| return str(value) |
| return importlib.metadata.version(distribution_name or module_name) |
|
|
|
|
| def check_environment(require_cuda=True, require_ape_extension=True): |
| report = { |
| "python": platform.python_version(), |
| "historical_reference": dict(HISTORICAL_REFERENCE), |
| "versions": {}, |
| "cuda_available": False, |
| "ape_extension": False, |
| "errors": [], |
| } |
|
|
| for module_name, distribution_name in ( |
| ("torch", "torch"), |
| ("torchvision", "torchvision"), |
| ("detectron2", "detectron2"), |
| ("detrex", "detrex"), |
| ): |
| try: |
| report["versions"][module_name] = _version(module_name, distribution_name) |
| except Exception as exc: |
| report["errors"].append(f"cannot import {module_name}: {type(exc).__name__}: {exc}") |
|
|
| try: |
| torch = importlib.import_module("torch") |
| report["torch_cuda_runtime"] = torch.version.cuda |
| report["cuda_available"] = bool(torch.cuda.is_available()) |
| if require_cuda and not report["cuda_available"]: |
| report["errors"].append("torch.cuda.is_available() is false") |
| except Exception: |
| pass |
|
|
| if require_ape_extension: |
| try: |
| importlib.import_module("ape._C") |
| report["ape_extension"] = True |
| except Exception as exc: |
| report["errors"].append( |
| f"cannot import compiled ape._C extension: {type(exc).__name__}: {exc}" |
| ) |
|
|
| return report |
|
|
|
|
| def build_parser(): |
| parser = argparse.ArgumentParser(description=__doc__) |
| parser.add_argument("--allow-no-cuda", action="store_true") |
| parser.add_argument("--skip-ape-extension", action="store_true") |
| return parser |
|
|
|
|
| def main(argv=None): |
| args = build_parser().parse_args(argv) |
| report = check_environment( |
| require_cuda=not args.allow_no_cuda, |
| require_ape_extension=not args.skip_ape_extension, |
| ) |
| print(json.dumps(report, indent=2, sort_keys=True)) |
| return 1 if report["errors"] else 0 |
|
|
|
|
| if __name__ == "__main__": |
| sys.exit(main()) |
|
|