File size: 5,244 Bytes
e2add7e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import hashlib
import importlib.metadata
import json
import os
import platform
import sys
import time
import uuid
from pathlib import Path

ROOT = Path("/data")
UPSTREAM = Path("/opt/space/upstream")
MODEL_ROOT = ROOT / "models/make-it-animatable"
WEIGHTS = {"bw.pth":424693698, "bw_normal.pth":429008352,
           "joints.pth":525833771, "joints_coarse.pth":424706373,
           "pose.pth":525848433}

def configure_storage():
    if not ROOT.is_dir():
        raise RuntimeError("/data is not mounted. Mount the existing persistent bucket at /data.")
    for name in ("cache/huggingface","cache/torch","cache/xdg","cache/pip",
                 "models","inputs","outputs","temp","logs"):
        (ROOT/name).mkdir(parents=True,exist_ok=True)
    os.environ.update(HF_HOME=str(ROOT/"cache/huggingface"),
                      HF_HUB_CACHE=str(ROOT/"cache/huggingface/hub"),
                      TORCH_HOME=str(ROOT/"cache/torch"),
                      XDG_CACHE_HOME=str(ROOT/"cache/xdg"),
                      PIP_CACHE_DIR=str(ROOT/"cache/pip"),
                      TMPDIR=str(ROOT/"temp"),
                      GRADIO_TEMP_DIR=str(ROOT/"temp/gradio"))
    probe = ROOT/"temp"/("write-check-"+uuid.uuid4().hex)
    with probe.open("x") as stream:
        stream.write("ok")
    if probe.read_text() != "ok":
        raise RuntimeError("/data read/write verification failed")
    probe.unlink()
    import tempfile
    tempfile.tempdir = str(ROOT/"temp")
    missing = [str(MODEL_ROOT/"output/best/new"/name) for name,size in WEIGHTS.items()
               if not (MODEL_ROOT/"output/best/new"/name).is_file()
               or (MODEL_ROOT/"output/best/new"/name).stat().st_size != size]
    bones = MODEL_ROOT/"data/Mixamo/bones.fbx"
    if not bones.is_file() or bones.stat().st_size == 0:
        missing.append(str(bones))
    if missing:
        raise RuntimeError("Required cached assets missing or incomplete; startup stopped without "
                           "overwriting or redownloading assets: "+", ".join(missing))
    for name in ("data","output"):
        target = UPSTREAM/name
        expected = MODEL_ROOT/name
        if target.is_symlink():
            if target.resolve() != expected.resolve():
                raise RuntimeError("Unexpected asset link: "+str(target))
        elif target.exists():
            raise RuntimeError("Asset path must be an image-managed symlink: "+str(target))
        else:
            target.symlink_to(expected, target_is_directory=True)
    print("STORAGE_READY /data writable; cached weights reused; downloads=0; installs=0",flush=True)

def startup_checks():
    import torch
    import torch_cluster
    import pytorch3d
    from pytorch3d.ops import sample_farthest_points
    versions = {}
    for name in ("torch","torchvision","torch-cluster","torch-geometric",
                 "torch-scatter","torch-sparse","torch-spline-conv","pytorch3d","numpy","gradio"):
        try:
            versions[name] = importlib.metadata.version(name)
        except importlib.metadata.PackageNotFoundError:
            versions[name] = "not required / not installed"
    report = dict(python=platform.python_version(),packages=versions,cuda=torch.version.cuda,
                  cuda_available=torch.cuda.is_available(),
                  gpu=torch.cuda.get_device_name(0) if torch.cuda.is_available() else None)
    print("RUNTIME_VERSIONS "+json.dumps(report),flush=True)
    if not torch.cuda.is_available():
        raise RuntimeError("CUDA GPU unavailable. Dedicated GPU required; CPU inference is disabled.")
    if torch.__version__ != "2.1.2+cu121" or torch.version.cuda != "12.1":
        raise RuntimeError("Runtime Torch/CUDA differs from the pinned build")
    x = torch.rand((128,3),device="cuda")
    out = torch_cluster.fps(x,ratio=0.25)
    _, indices = sample_farthest_points(x[None],K=32)
    y = torch.ones((32,32),device="cuda") @ torch.ones((32,32),device="cuda")
    torch.cuda.synchronize()
    if len(out) != 32 or indices.shape != (1,32) or y[0,0].item() != 32:
        raise RuntimeError("CUDA binary smoke test failed")
    report["cuda_execution"] = "PASS: matmul, torch_cluster.fps, pytorch3d FPS"
    persistence = {}
    for name in ("cache/huggingface","cache/torch","cache/xdg","cache/pip","inputs","outputs"):
        marker = ROOT/name/".persistence-check"
        existed = marker.is_file()
        if not existed:
            with marker.open("x") as stream:
                stream.write(uuid.uuid4().hex)
        persistence[name] = {"marker":marker.read_text(),"survived_previous_start":existed}
    report["persistence"] = persistence
    report["cached_weights"] = WEIGHTS
    report["startup_time"] = time.time()
    report["startup_id"] = uuid.uuid4().hex
    report["outputs_present"] = sorted(str(p.relative_to(ROOT)) for p in (ROOT/"outputs").glob("*"))
    previous = ROOT/"logs/last-startup.json"
    if previous.is_file():
        report["previous_startup"] = json.loads(previous.read_text()).get("startup_id")
    (ROOT/"logs"/(report["startup_id"]+".json")).write_text(json.dumps(report,indent=2))
    previous.write_text(json.dumps(report,indent=2))
    print("CUDA_EXECUTION_PASS "+json.dumps(report),flush=True)
    return report