akhaliq HF Staff commited on
Commit
d31983f
·
1 Parent(s): cd1ff6e

Optimize model preloading on ZeroGPU by initializing pipeline pools at module scope

Browse files
Files changed (1) hide show
  1. app.py +41 -1
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