|
|
import time |
|
|
import threading |
|
|
import torch |
|
|
|
|
|
gen_lock = threading.Lock() |
|
|
|
|
|
def get_gen_info(state): |
|
|
cache = state.get("gen", None) |
|
|
if cache == None: |
|
|
cache = dict() |
|
|
state["gen"] = cache |
|
|
return cache |
|
|
|
|
|
def any_GPU_process_running(state, process_id): |
|
|
gen = get_gen_info(state) |
|
|
|
|
|
with gen_lock: |
|
|
process_status = gen.get("process_status", None) |
|
|
return process_status is not None |
|
|
|
|
|
def acquire_GPU_ressources(state, process_id, process_name, gr = None): |
|
|
gen = get_gen_info(state) |
|
|
original_process_status = None |
|
|
while True: |
|
|
with gen_lock: |
|
|
process_hierarchy = gen.get("process_hierarchy", None) |
|
|
if process_hierarchy is None: |
|
|
process_hierarchy = dict() |
|
|
gen["process_hierarchy"]= process_hierarchy |
|
|
|
|
|
process_status = gen.get("process_status", None) |
|
|
if process_status is None: |
|
|
original_process_status = process_status |
|
|
gen["process_status"] = "process:" + process_id |
|
|
break |
|
|
elif process_status == "process:main": |
|
|
original_process_status = process_status |
|
|
gen["process_status"] = "request:" + process_id |
|
|
gen["pause_msg"] = f"Generation Suspended while using {process_name}" |
|
|
break |
|
|
elif process_status == "process:" + process_id: |
|
|
break |
|
|
time.sleep(0.1) |
|
|
|
|
|
if original_process_status is not None: |
|
|
total_wait = 0 |
|
|
wait_time = 0.1 |
|
|
wait_msg_displayed = False |
|
|
while True: |
|
|
with gen_lock: |
|
|
process_status = gen.get("process_status", None) |
|
|
if process_status == "process:" + process_id: break |
|
|
if process_status is None: |
|
|
|
|
|
gen["process_status"] = "process:" + process_id |
|
|
break |
|
|
|
|
|
total_wait += wait_time |
|
|
if round(total_wait,2) >= 5 and gr is not None and not wait_msg_displayed: |
|
|
wait_msg_displayed = True |
|
|
gr.Info(f"Process {process_name} is Suspended while waiting that GPU Ressources become available") |
|
|
|
|
|
time.sleep(wait_time) |
|
|
|
|
|
with gen_lock: |
|
|
process_hierarchy[process_id] = original_process_status |
|
|
torch.cuda.synchronize() |
|
|
|
|
|
def release_GPU_ressources(state, process_id): |
|
|
gen = get_gen_info(state) |
|
|
torch.cuda.synchronize() |
|
|
with gen_lock: |
|
|
process_hierarchy = gen.get("process_hierarchy", {}) |
|
|
gen["process_status"] = process_hierarchy.get(process_id, None) |
|
|
|