Scripts, prompt JSON tiers, usage docs, and README. Input images (data/) and segmentation outputs (output/) are gitignored.
175 lines
4.8 KiB
Python
175 lines
4.8 KiB
Python
"""Verify SamGeo3 / PyTorch / CUDA install for this isolated lab env.
|
|
|
|
Usage (from project root, with venv active):
|
|
python scripts/check_install.py
|
|
python scripts/check_install.py --load-model
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
import os
|
|
import sys
|
|
import traceback
|
|
|
|
|
|
def _ok(msg: str) -> None:
|
|
print(f"[OK] {msg}")
|
|
|
|
|
|
def _warn(msg: str) -> None:
|
|
print(f"[WARN] {msg}")
|
|
|
|
|
|
def _fail(msg: str) -> None:
|
|
print(f"[FAIL] {msg}")
|
|
|
|
|
|
def check_torch() -> bool:
|
|
try:
|
|
import torch
|
|
except ImportError as e:
|
|
_fail(f"torch import failed: {e}")
|
|
return False
|
|
|
|
_ok(f"torch {torch.__version__}")
|
|
cuda = torch.cuda.is_available()
|
|
if cuda:
|
|
name = torch.cuda.get_device_name(0)
|
|
cap = torch.cuda.get_device_capability(0)
|
|
_ok(f"CUDA available | GPU={name} | capability={cap}")
|
|
_ok(f"cuda runtime reported by torch: {torch.version.cuda}")
|
|
else:
|
|
_warn("CUDA not available — SAM3 meta backend needs NVIDIA GPU + CUDA torch")
|
|
return True
|
|
|
|
|
|
def check_samgeo3_imports() -> bool:
|
|
try:
|
|
import samgeo
|
|
from samgeo import SamGeo3
|
|
except ImportError as e:
|
|
_fail(f"samgeo / SamGeo3 import failed: {e}")
|
|
return False
|
|
|
|
_ok(f"samgeo {getattr(samgeo, '__version__', 'unknown')}")
|
|
_ok("SamGeo3 class importable")
|
|
|
|
try:
|
|
import sam3 # noqa: F401
|
|
|
|
_ok(f"sam3 package present ({getattr(sam3, '__version__', 'no __version__')})")
|
|
except ImportError as e:
|
|
_fail(f"sam3 package missing (required for backend='meta'): {e}")
|
|
return False
|
|
|
|
return True
|
|
|
|
|
|
def check_hf_access() -> None:
|
|
token_env = bool(os.environ.get("HF_TOKEN") or os.environ.get("HUGGING_FACE_HUB_TOKEN"))
|
|
token_file = os.path.expanduser("~/.cache/huggingface/token")
|
|
has_file = os.path.isfile(token_file)
|
|
if token_env:
|
|
_ok("HF token found in environment")
|
|
elif has_file:
|
|
_ok(f"HF token file present: {token_file}")
|
|
else:
|
|
_warn(
|
|
"No HF token found. SAM3/3.1 gated models need: "
|
|
"hf auth login (after HF access approval)"
|
|
)
|
|
|
|
ckpt = os.environ.get("SAM3_CHECKPOINT_PATH")
|
|
if ckpt:
|
|
exists = os.path.isfile(ckpt)
|
|
( _ok if exists else _fail)(f"SAM3_CHECKPOINT_PATH={ckpt} exists={exists}")
|
|
else:
|
|
_warn("SAM3_CHECKPOINT_PATH not set (optional; HF download/cache used otherwise)")
|
|
|
|
|
|
def try_load_model(model_id: str, device: str | None) -> bool:
|
|
try:
|
|
from samgeo import SamGeo3
|
|
import torch
|
|
except ImportError as e:
|
|
_fail(f"imports for model load failed: {e}")
|
|
return False
|
|
|
|
if device is None:
|
|
device = "cuda" if torch.cuda.is_available() else "cpu"
|
|
|
|
if device == "cuda" and not torch.cuda.is_available():
|
|
_fail("requested CUDA but torch.cuda.is_available() is False")
|
|
return False
|
|
|
|
print(f"\nLoading SamGeo3(backend='meta', model_id='{model_id}', device='{device}') ...")
|
|
try:
|
|
kwargs = {
|
|
"backend": "meta",
|
|
"model_id": model_id,
|
|
"device": device,
|
|
"confidence_threshold": 0.5,
|
|
"enable_segmentation": True,
|
|
"enable_inst_interactivity": False,
|
|
}
|
|
ckpt = os.environ.get("SAM3_CHECKPOINT_PATH")
|
|
if ckpt and os.path.isfile(ckpt):
|
|
kwargs["checkpoint_path"] = ckpt
|
|
kwargs["load_from_HF"] = False
|
|
_ok(f"using local checkpoint: {ckpt}")
|
|
|
|
sam = SamGeo3(**kwargs)
|
|
_ok(f"model loaded | backend={sam.backend} | device={getattr(sam, 'device', device)}")
|
|
del sam
|
|
if torch.cuda.is_available():
|
|
torch.cuda.empty_cache()
|
|
return True
|
|
except Exception as e:
|
|
_fail(f"model load failed: {e}")
|
|
traceback.print_exc()
|
|
return False
|
|
|
|
|
|
def main() -> int:
|
|
parser = argparse.ArgumentParser(description="SamGeo3 install verification")
|
|
parser.add_argument(
|
|
"--load-model",
|
|
action="store_true",
|
|
help="Also instantiate SamGeo3 (downloads weights if needed)",
|
|
)
|
|
parser.add_argument(
|
|
"--model-id",
|
|
default="facebook/sam3.1",
|
|
help="HF model id for --load-model (default: facebook/sam3.1)",
|
|
)
|
|
parser.add_argument(
|
|
"--device",
|
|
default=None,
|
|
help="cuda | cpu (default: auto)",
|
|
)
|
|
args = parser.parse_args()
|
|
|
|
print("=== SamGeo3 lab: install check ===\n")
|
|
print(f"python: {sys.version}")
|
|
print(f"exe: {sys.executable}\n")
|
|
|
|
ok = True
|
|
ok = check_torch() and ok
|
|
ok = check_samgeo3_imports() and ok
|
|
check_hf_access()
|
|
|
|
if args.load_model:
|
|
ok = try_load_model(args.model_id, args.device) and ok
|
|
|
|
print()
|
|
if ok:
|
|
_ok("all required checks passed")
|
|
return 0
|
|
_fail("one or more required checks failed")
|
|
return 1
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|