Spaces:
Running on Zero
Running on Zero
Detect ZeroGPU token expiry and prompt refresh
Browse files
app.py
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
|
|
| 1 |
import io
|
| 2 |
import json
|
| 3 |
import math
|
|
@@ -60,14 +61,16 @@ DEFAULT_ZERO_GPU_MAX_SHARDS = int(
|
|
| 60 |
os.getenv("CHIZZLER_ZERO_GPU_MAX_SHARDS", "1")
|
| 61 |
)
|
| 62 |
SPACE_ID = os.getenv("SPACE_ID")
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
|
|
|
|
|
|
| 71 |
|
| 72 |
|
| 73 |
def log_progress(message: str, level: int = 1, enabled: bool = True) -> None:
|
|
@@ -80,6 +83,39 @@ def log_progress(message: str, level: int = 1, enabled: bool = True) -> None:
|
|
| 80 |
sys.stdout.flush()
|
| 81 |
|
| 82 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 83 |
# Load environment variables
|
| 84 |
load_dotenv()
|
| 85 |
|
|
@@ -1175,6 +1211,16 @@ def process_dataset_and_push(
|
|
| 1175 |
)
|
| 1176 |
attempts = 0
|
| 1177 |
while True:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1178 |
try:
|
| 1179 |
result = _process_dataset_and_push_gpu(
|
| 1180 |
dataset_id,
|
|
@@ -1199,6 +1245,11 @@ def process_dataset_and_push(
|
|
| 1199 |
)
|
| 1200 |
except Exception as exc:
|
| 1201 |
message = str(exc)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1202 |
if auto_resume and "GPU task aborted" in message:
|
| 1203 |
attempts += 1
|
| 1204 |
log_progress(
|
|
|
|
| 1 |
+
import base64
|
| 2 |
import io
|
| 3 |
import json
|
| 4 |
import math
|
|
|
|
| 61 |
os.getenv("CHIZZLER_ZERO_GPU_MAX_SHARDS", "1")
|
| 62 |
)
|
| 63 |
SPACE_ID = os.getenv("SPACE_ID")
|
| 64 |
+
ZERO_GPU_TOKEN_REFRESH_BUFFER_SEC = int(
|
| 65 |
+
os.getenv("CHIZZLER_ZERO_GPU_TOKEN_REFRESH_BUFFER_SEC", "120")
|
| 66 |
+
)
|
| 67 |
+
warnings.filterwarnings(
|
| 68 |
+
"ignore",
|
| 69 |
+
message=(
|
| 70 |
+
"LoginButton created outside of a Blocks context\\. "
|
| 71 |
+
"May not work unless you call its `activate\\(\\)` method manually\\."
|
| 72 |
+
),
|
| 73 |
+
)
|
| 74 |
|
| 75 |
|
| 76 |
def log_progress(message: str, level: int = 1, enabled: bool = True) -> None:
|
|
|
|
| 83 |
sys.stdout.flush()
|
| 84 |
|
| 85 |
|
| 86 |
+
def get_zero_gpu_token_payload(request: Optional[gr.Request]) -> Optional[dict]:
|
| 87 |
+
if request is None:
|
| 88 |
+
return None
|
| 89 |
+
headers = getattr(request, "headers", None)
|
| 90 |
+
if headers is None or not hasattr(headers, "get"):
|
| 91 |
+
return None
|
| 92 |
+
token = headers.get("x-ip-token")
|
| 93 |
+
if not token:
|
| 94 |
+
return None
|
| 95 |
+
try:
|
| 96 |
+
payload = token.split(".")[1]
|
| 97 |
+
payload += "=" * (-len(payload) % 4)
|
| 98 |
+
data = json.loads(base64.urlsafe_b64decode(payload.encode()).decode("utf-8"))
|
| 99 |
+
if isinstance(data, dict):
|
| 100 |
+
return data
|
| 101 |
+
except Exception:
|
| 102 |
+
return None
|
| 103 |
+
return None
|
| 104 |
+
|
| 105 |
+
|
| 106 |
+
def zero_gpu_token_seconds_left(request: Optional[gr.Request]) -> Optional[int]:
|
| 107 |
+
payload = get_zero_gpu_token_payload(request)
|
| 108 |
+
if not payload:
|
| 109 |
+
return None
|
| 110 |
+
exp = payload.get("exp")
|
| 111 |
+
if exp is None:
|
| 112 |
+
return None
|
| 113 |
+
try:
|
| 114 |
+
return int(exp) - int(time.time())
|
| 115 |
+
except Exception:
|
| 116 |
+
return None
|
| 117 |
+
|
| 118 |
+
|
| 119 |
# Load environment variables
|
| 120 |
load_dotenv()
|
| 121 |
|
|
|
|
| 1211 |
)
|
| 1212 |
attempts = 0
|
| 1213 |
while True:
|
| 1214 |
+
seconds_left = zero_gpu_token_seconds_left(request)
|
| 1215 |
+
if (
|
| 1216 |
+
SPACE_ID
|
| 1217 |
+
and seconds_left is not None
|
| 1218 |
+
and seconds_left <= ZERO_GPU_TOKEN_REFRESH_BUFFER_SEC
|
| 1219 |
+
):
|
| 1220 |
+
return (
|
| 1221 |
+
"ZeroGPU login token is expiring "
|
| 1222 |
+
f"({seconds_left}s left). Click Process/Resume again to refresh it."
|
| 1223 |
+
)
|
| 1224 |
try:
|
| 1225 |
result = _process_dataset_and_push_gpu(
|
| 1226 |
dataset_id,
|
|
|
|
| 1245 |
)
|
| 1246 |
except Exception as exc:
|
| 1247 |
message = str(exc)
|
| 1248 |
+
if "ZeroGPU proxy token expired" in message:
|
| 1249 |
+
return (
|
| 1250 |
+
"ZeroGPU login token expired. Click Process/Resume again "
|
| 1251 |
+
"to refresh your session."
|
| 1252 |
+
)
|
| 1253 |
if auto_resume and "GPU task aborted" in message:
|
| 1254 |
attempts += 1
|
| 1255 |
log_progress(
|