| | 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) |
| |
|