Spaces:
Running on Zero
Running on Zero
Optimize model preloading on ZeroGPU by initializing pipeline pools at module scope
Browse files
app.py
CHANGED
|
@@ -3302,6 +3302,7 @@ class PipelinePool:
|
|
| 3302 |
|
| 3303 |
ACTIVE_PIPELINE_POOL: Optional[PipelinePool] = None
|
| 3304 |
ACTIVE_POOL_LOCK = threading.Lock()
|
|
|
|
| 3305 |
QUEUE_MAX_SIZE = DEFAULT_QUEUE_SIZE
|
| 3306 |
QUEUE_CONCURRENCY_LIMIT = DEFAULT_CONCURRENCY_LIMIT
|
| 3307 |
|
|
@@ -3383,7 +3384,6 @@ def is_pipeline_pool_ready_for_task(task: str) -> bool:
|
|
| 3383 |
|
| 3384 |
|
| 3385 |
def get_pipeline_pool(task: str) -> PipelinePool:
|
| 3386 |
-
global ACTIVE_PIPELINE_POOL
|
| 3387 |
if not torch.cuda.is_available():
|
| 3388 |
raise RuntimeError(
|
| 3389 |
"Lance inference requires a GPU. The Gradio UI can start on CPU, but generation is disabled "
|
|
@@ -3391,6 +3391,14 @@ def get_pipeline_pool(task: str) -> PipelinePool:
|
|
| 3391 |
)
|
| 3392 |
model_variant = get_task_model_variant(task)
|
| 3393 |
gpu_ids = parse_gpu_ids(os.getenv("LANCE_GPUS", DEFAULT_GPUS))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3394 |
with ACTIVE_POOL_LOCK:
|
| 3395 |
if ACTIVE_PIPELINE_POOL is not None and ACTIVE_PIPELINE_POOL.model_variant == model_variant:
|
| 3396 |
if not ACTIVE_PIPELINE_POOL.is_initialized:
|
|
@@ -4214,6 +4222,38 @@ def extract_path(file_data):
|
|
| 4214 |
return str(file_data)
|
| 4215 |
|
| 4216 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4217 |
if __name__ == "__main__":
|
| 4218 |
args = parse_args()
|
| 4219 |
os.environ["LANCE_GPUS"] = args.gpus
|
|
|
|
| 3302 |
|
| 3303 |
ACTIVE_PIPELINE_POOL: Optional[PipelinePool] = None
|
| 3304 |
ACTIVE_POOL_LOCK = threading.Lock()
|
| 3305 |
+
GLOBAL_POOLS: dict[str, PipelinePool] = {}
|
| 3306 |
QUEUE_MAX_SIZE = DEFAULT_QUEUE_SIZE
|
| 3307 |
QUEUE_CONCURRENCY_LIMIT = DEFAULT_CONCURRENCY_LIMIT
|
| 3308 |
|
|
|
|
| 3384 |
|
| 3385 |
|
| 3386 |
def get_pipeline_pool(task: str) -> PipelinePool:
|
|
|
|
| 3387 |
if not torch.cuda.is_available():
|
| 3388 |
raise RuntimeError(
|
| 3389 |
"Lance inference requires a GPU. The Gradio UI can start on CPU, but generation is disabled "
|
|
|
|
| 3391 |
)
|
| 3392 |
model_variant = get_task_model_variant(task)
|
| 3393 |
gpu_ids = parse_gpu_ids(os.getenv("LANCE_GPUS", DEFAULT_GPUS))
|
| 3394 |
+
|
| 3395 |
+
if model_variant in GLOBAL_POOLS:
|
| 3396 |
+
pool = GLOBAL_POOLS[model_variant]
|
| 3397 |
+
if not pool.is_initialized:
|
| 3398 |
+
pool.initialize_all()
|
| 3399 |
+
return pool
|
| 3400 |
+
|
| 3401 |
+
global ACTIVE_PIPELINE_POOL
|
| 3402 |
with ACTIVE_POOL_LOCK:
|
| 3403 |
if ACTIVE_PIPELINE_POOL is not None and ACTIVE_PIPELINE_POOL.model_variant == model_variant:
|
| 3404 |
if not ACTIVE_PIPELINE_POOL.is_initialized:
|
|
|
|
| 4222 |
return str(file_data)
|
| 4223 |
|
| 4224 |
|
| 4225 |
+
def initialize_global_pools() -> None:
|
| 4226 |
+
if not torch.cuda.is_available():
|
| 4227 |
+
print("[startup] CUDA is not available, skipping global preloading.", flush=True)
|
| 4228 |
+
return
|
| 4229 |
+
|
| 4230 |
+
variants_text = os.getenv("LANCE_PREFETCH_MODEL_VARIANTS", f"{MODEL_VARIANT_VIDEO},{MODEL_VARIANT_IMAGE}")
|
| 4231 |
+
variants: list[str] = []
|
| 4232 |
+
for raw_variant in variants_text.split(","):
|
| 4233 |
+
raw_variant = raw_variant.strip()
|
| 4234 |
+
if not raw_variant:
|
| 4235 |
+
continue
|
| 4236 |
+
variant = normalize_model_variant(raw_variant)
|
| 4237 |
+
if variant not in variants:
|
| 4238 |
+
variants.append(variant)
|
| 4239 |
+
|
| 4240 |
+
gpu_ids = parse_gpu_ids(os.getenv("LANCE_GPUS", DEFAULT_GPUS))
|
| 4241 |
+
print(f"[startup] Initializing global pools at startup for variants {variants} on GPUs {gpu_ids}", flush=True)
|
| 4242 |
+
|
| 4243 |
+
for variant in variants:
|
| 4244 |
+
try:
|
| 4245 |
+
print(f"[startup] Instantiating and initializing global pool for: {variant}", flush=True)
|
| 4246 |
+
pool = PipelinePool(gpu_ids, model_variant=variant)
|
| 4247 |
+
pool.initialize_all()
|
| 4248 |
+
GLOBAL_POOLS[variant] = pool
|
| 4249 |
+
except Exception as exc:
|
| 4250 |
+
print(f"[startup] Global pool preloading failed for {variant}: {exc}", flush=True)
|
| 4251 |
+
traceback.print_exc()
|
| 4252 |
+
|
| 4253 |
+
|
| 4254 |
+
initialize_global_pools()
|
| 4255 |
+
|
| 4256 |
+
|
| 4257 |
if __name__ == "__main__":
|
| 4258 |
args = parse_args()
|
| 4259 |
os.environ["LANCE_GPUS"] = args.gpus
|