| import os |
| import json |
| import tempfile |
| import shutil |
| import traceback |
| from merge_engines.linear import merge_models |
| from merge_engines.evolutionary import evolutionary_merge |
| from uploader import upload_to_hf |
| from memory_manager import check_memory_safe |
| import asyncio |
|
|
| async def run_job_async(job_id: str, params: dict): |
| loop = asyncio.get_event_loop() |
| return await loop.run_in_executor(None, run_job, job_id, params) |
|
|
| def run_job(job_id, params): |
| try: |
| model_a_id = f"{params['model_a_source']}:{params['model_a_id']}" |
| model_b_id = f"{params['model_b_source']}:{params['model_b_id']}" |
| if not check_memory_safe(model_a_id, model_b_id, params.get("evo_params")): |
| raise RuntimeError("Insufficient memory for this merge. Job rejected.") |
| |
| from model_loader import prepare_model |
| path_a = prepare_model(params["model_a_source"], params["model_a_id"], params.get("civitai_key")) |
| path_b = prepare_model(params["model_b_source"], params["model_b_id"], params.get("civitai_key")) |
| |
| output_dir = f"/app/data/output/{job_id}" |
| os.makedirs(output_dir, exist_ok=True) |
| |
| method = params.get("method", "linear") |
| if method == "evolutionary": |
| evo_params = params.get("evo_params", {}) |
| dataset_path = params.get("dataset") |
| evolutionary_merge(path_a, path_b, dataset_path, output_dir, evo_params) |
| else: |
| merge_type = params.get("merge_type", "linear") |
| alpha = params.get("linear_alpha", 0.5) |
| layers_from_a = params.get("franken_layers", None) |
| merge_models(path_a, path_b, output_dir, method=merge_type, |
| alpha=alpha, layers_from_a=layers_from_a) |
| |
| repo_name = params.get("output_repo_name") or f"merge-{job_id[:8]}" |
| upload_to_hf(output_dir, repo_name, params["hf_token"]) |
| |
| if os.path.exists(output_dir): |
| shutil.rmtree(output_dir) |
| |
| return {"repo_name": repo_name, "status": "success"} |
| except Exception as e: |
| traceback.print_exc() |
| raise |
| finally: |
| params["hf_token"] = None |
| params["civitai_key"] = None |