mrdarkbr/wan22-code-backup
055
1import os2import shutil3import subprocess4import sys5from pathlib import Path6 7import modal8 9app = modal.App("restore-all-volumes-fast")10image = (11 modal.Image.debian_slim(python_version="3.11")12 .pip_install("huggingface_hub[hf_transfer]>=0.34", "hf_transfer")13 .apt_install("git", "wget", "aria2")14 .env({15 "HF_HUB_ENABLE_HF_TRANSFER": "1",16 "HF_HUB_DOWNLOAD_TIMEOUT": "7200",17 })18)19 20vol_qwen = modal.Volume.from_name("comfyui-models", create_if_missing=True)21vol_wan = modal.Volume.from_name("wan22-comfyui-models", create_if_missing=True)22vol_animate = modal.Volume.from_name("wan22-animate-models", create_if_missing=True)23vol_qwenpose = modal.Volume.from_name("qwenposetransfers", create_if_missing=True)24vol_qwent2v = modal.Volume.from_name("qwen-t2v-models", create_if_missing=True)25vol_krea2 = modal.Volume.from_name("krea-2-models", create_if_missing=True)26vol_minimax = modal.Volume.from_name("minimax-h3-models", create_if_missing=True)27vol_minimax_runs = modal.Volume.from_name("minimax-h3-extension-runs", create_if_missing=True)28vol_maskvid = modal.Volume.from_name("maskvid-models-volume", create_if_missing=True)29 30 31def run_hf_download(repo_id: str, mount_path: str, repo_type: str, token: str):32 from huggingface_hub import snapshot_download33 print(f"๐ Baixando {repo_id} ({repo_type}) com hf_transfer ultra-rapido para {mount_path}...")34 snapshot_download(35 repo_id=repo_id,36 repo_type=repo_type,37 local_dir=mount_path,38 token=token.strip(),39 max_workers=16,40 )41 print(f"โ
Restaurado: {repo_id}")42 43 44@app.function(image=image, volumes={"/data/qwen": vol_qwen}, timeout=86400, cpu=8, ephemeral_disk=2048 * 1024)45def download_qwen(token: str):46 run_hf_download("mrdarkbr/QWEN_MODAL_BACKUP", "/data/qwen", "dataset", token)47 vol_qwen.commit()48 49 50@app.function(image=image, volumes={"/data/animate": vol_animate}, timeout=86400, cpu=8, ephemeral_disk=2048 * 1024)51def download_animate(token: str):52 run_hf_download("mrdarkbr/wan22-animate-models-backup", "/data/animate", "model", token)53 vol_animate.commit()54 55 56@app.function(image=image, volumes={"/data/qwenpose": vol_qwenpose}, timeout=86400, cpu=8, ephemeral_disk=2048 * 1024)57def download_qwenpose(token: str):58 run_hf_download("mrdarkbr/qwenposetransfers-backup", "/data/qwenpose", "model", token)59 vol_qwenpose.commit()60 61 62@app.function(image=image, volumes={"/data/qwent2v": vol_qwent2v}, timeout=86400, cpu=8, ephemeral_disk=2048 * 1024)63def download_qwent2v(token: str):64 run_hf_download("mrdarkbr/qwen-t2v-models-backup", "/data/qwent2v", "dataset", token)65 vol_qwent2v.commit()66 67 68@app.function(image=image, volumes={"/data/krea2": vol_krea2}, timeout=86400, cpu=8, ephemeral_disk=2048 * 1024)69def download_krea2(token: str):70 run_hf_download("mrdarkbr/krea2-models-backup", "/data/krea2", "dataset", token)71 72 # Organizar LoRAs do Krea2 em todas as pastas necessarias73 base_dir = Path("/data/krea2")74 loras_dirs = [base_dir / "loras", base_dir / "models" / "loras"]75 for ld in loras_dirs:76 ld.mkdir(parents=True, exist_ok=True)77 78 for f in base_dir.glob("*.safetensors"):79 for ld in loras_dirs:80 dst = ld / f.name81 if not dst.exists():82 shutil.copy2(f, dst)83 print(f"Copiado {f.name} para {ld}")84 85 vol_krea2.commit()86 print("Volume krea-2-models restaurado e organizado!")87 88 89@app.function(image=image, volumes={"/data/minimax": vol_minimax}, timeout=86400, cpu=8, ephemeral_disk=2048 * 1024)90def download_minimax(token: str):91 run_hf_download("mrdarkbr/minimax-h3-models-backup", "/data/minimax", "dataset", token)92 93 # Organizar pastas de loras94 base_dir = Path("/data/minimax")95 lora_dirs = [base_dir / "loras", base_dir / "models" / "loras"]96 for ld in lora_dirs:97 ld.mkdir(parents=True, exist_ok=True)98 99 for f in base_dir.glob("*.safetensors"):100 for ld in lora_dirs:101 dst = ld / f.name102 if not dst.exists():103 shutil.copy2(f, dst)104 105 # Download extra missing models using aria2 / hf_transfer106 unet_dir = Path("/data/minimax/diffusion_models")107 unet_dir.mkdir(parents=True, exist_ok=True)108 unet_path = unet_dir / "pinkcherryMMH3Fl2va_06Beta_int8.safetensors"109 if not unet_path.exists() or unet_path.stat().st_size < 1000000:110 print(f"Baixando pinkcherry com aria2 acelerado em {unet_path}...")111 unet_url = "https://huggingface.co/mrdarkbr/minimax-h3-models-backup/resolve/main/diffusion_models/pinkcherryMMH3Fl2va_06Beta_int8.safetensors"112 subprocess.run(["aria2c", "-c", "-x", "16", "-s", "16", "-k", "1M", "--header", f"Authorization: Bearer {token.strip()}", "-d", str(unet_dir), "-o", "pinkcherryMMH3Fl2va_06Beta_int8.safetensors", unet_url], check=False)113 114 lora_path = lora_dirs[0] / "AfterMidnight_ref2va_h3_sexytime_rank64-v1.2.safetensors"115 if not lora_path.exists() or lora_path.stat().st_size < 1000000:116 print(f"Baixando AfterMidnight com aria2 acelerado em {lora_path}...")117 lora_url = "https://huggingface.co/SexGod1979/AfterMidnight-MiniMax-H3-NSFW/resolve/main/AfterMidnight_ref2va_h3_sexytime_rank64-v1.2.safetensors"118 subprocess.run(["aria2c", "-c", "-x", "16", "-s", "16", "-k", "1M", "-d", str(lora_dirs[0]), "-o", "AfterMidnight_ref2va_h3_sexytime_rank64-v1.2.safetensors", lora_url], check=False)119 # Copiar para models/loras tambem120 if lora_path.exists():121 shutil.copy2(lora_path, lora_dirs[1] / lora_path.name)122 123 vol_minimax.commit()124 print("Volume minimax-h3-models restaurado!")125 126 127@app.function(image=image, volumes={"/data/minimax-runs": vol_minimax_runs}, timeout=86400, cpu=8, ephemeral_disk=2048 * 1024)128def download_minimax_runs(token: str):129 run_hf_download("mrdarkbr/minimax-h3-extension-runs-backup", "/data/minimax-runs", "dataset", token)130 vol_minimax_runs.commit()131 132 133@app.function(image=image, volumes={"/data/wan22": vol_wan}, timeout=86400, cpu=8, ephemeral_disk=2048 * 1024)134def download_wan(token: str):135 run_hf_download("mrdarkbr/wan22-comfyui-models-backup", "/data/wan22", "dataset", token)136 137 # 1. LoRAs SVI138 lora_dir = Path("/data/wan22/models/loras")139 lora_dir.mkdir(parents=True, exist_ok=True)140 urls = {141 "SVI_v2_PRO_Wan2.2-I2V-A14B_HIGH_lora_rank_128_fp16.safetensors": "https://huggingface.co/Kijai/WanVideo_comfy/resolve/main/LoRAs/Stable-Video-Infinity/v2.0/SVI_v2_PRO_Wan2.2-I2V-A14B_HIGH_lora_rank_128_fp16.safetensors",142 "SVI_v2_PRO_Wan2.2-I2V-A14B_LOW_lora_rank_128_fp16.safetensors": "https://huggingface.co/Kijai/WanVideo_comfy/resolve/main/LoRAs/Stable-Video-Infinity/v2.0/SVI_v2_PRO_Wan2.2-I2V-A14B_LOW_lora_rank_128_fp16.safetensors",143 }144 for filename, url in urls.items():145 dest = lora_dir / filename146 if not dest.exists() or dest.stat().st_size < 1000000:147 print(f"Baixando LoRA SVI: {filename}...")148 subprocess.run(["aria2c", "-c", "-x", "16", "-s", "16", "-k", "1M", "-d", str(lora_dir), "-o", filename, url], check=False)149 150 # 2. Modelos MMAudio (em /data/wan22/mmaudio e /data/wan22/models/mmaudio)151 mmaudio_dirs = [Path("/data/wan22/mmaudio"), Path("/data/wan22/models/mmaudio")]152 for md in mmaudio_dirs:153 md.mkdir(parents=True, exist_ok=True)154 155 mmaudio_models = {156 "mmaudio_large_44k_v2_fp16.safetensors": "https://huggingface.co/Kijai/MMAudio_safetensors/resolve/main/mmaudio_large_44k_v2_fp16.safetensors",157 "mmaudio_vae_44k_fp16.safetensors": "https://huggingface.co/Kijai/MMAudio_safetensors/resolve/main/mmaudio_vae_44k_fp16.safetensors",158 "mmaudio_synchformer_fp16.safetensors": "https://huggingface.co/Kijai/MMAudio_safetensors/resolve/main/mmaudio_synchformer_fp16.safetensors",159 "apple_DFN5B-CLIP-ViT-H-14-384_fp16.safetensors": "https://huggingface.co/Kijai/MMAudio_safetensors/resolve/main/apple_DFN5B-CLIP-ViT-H-14-384_fp16.safetensors"160 }161 162 for filename, url in mmaudio_models.items():163 primary_dest = mmaudio_dirs[0] / filename164 if not primary_dest.exists() or primary_dest.stat().st_size < 100000:165 print(f"Baixando modelo MMAudio: {filename}...")166 subprocess.run(["aria2c", "-c", "-x", "16", "-s", "16", "-k", "1M", "-d", str(mmaudio_dirs[0]), "-o", filename, url], check=False)167 secondary_dest = mmaudio_dirs[1] / filename168 if not secondary_dest.exists() and primary_dest.exists():169 shutil.copy2(primary_dest, secondary_dest)170 171 vol_wan.commit()172 print("Volume wan22-comfyui-models restaurado com SVI e MMAudio!")173 174 175@app.function(image=image, volumes={"/data/maskvid": vol_maskvid}, timeout=86400, cpu=8, ephemeral_disk=2048 * 1024)176def download_maskvid(token: str):177 run_hf_download("mrdarkbr/maskvid-models-backup", "/data/maskvid", "dataset", token)178 vol_maskvid.commit()179 print("Volume maskvid-models-volume restaurado!")180 181 182@app.function(183 image=image,184 volumes={185 "/data/minimax": vol_minimax,186 "/data/wan": vol_wan,187 "/data/krea": vol_krea2,188 "/data/comfy": vol_qwen,189 },190 timeout=600191)192def sync_single_local_lora(filename: str, data: bytes):193 # Salvar em todos os volumes necessarios194 for base in [Path("/data/minimax"), Path("/data/wan"), Path("/data/krea"), Path("/data/comfy")]:195 for d in [base / "loras", base / "models" / "loras", base]:196 d.mkdir(parents=True, exist_ok=True)197 dst = d / filename198 if not dst.exists() or dst.stat().st_size != len(data):199 with open(dst, "wb") as f:200 f.write(data)201 202 vol_minimax.commit()203 vol_wan.commit()204 vol_krea2.commit()205 vol_qwen.commit()206 207 208@app.local_entrypoint()209def main(token: str = ""):210 token = token.strip()211 if not token:212 raise ValueError('Use modal run restore_all.py --token="hf_..."')213 print("Restaurando nove volumes em paralelo com velocidade maxima...")214 jobs = [215 download_qwen.spawn(token),216 download_wan.spawn(token),217 download_animate.spawn(token),218 download_qwenpose.spawn(token),219 download_qwent2v.spawn(token),220 download_krea2.spawn(token),221 download_minimax.spawn(token),222 download_minimax_runs.spawn(token),223 download_maskvid.spawn(token),224 ]225 for job in jobs:226 job.get()227 228 # Sincronizar todos os LoRAs locais (como Synthstep00008300, Creampie, etc.)229 local_safetensors = list(Path(".").glob("*.safetensors"))230 if local_safetensors:231 print(f"\nSincronizando {len(local_safetensors)} LoRAs locais para todos os volumes...")232 for sf in local_safetensors:233 print(f" -> Sincronizando {sf.name} ({sf.stat().st_size / (1024*1024):.1f} MB)...")234 sync_single_local_lora.remote(sf.name, sf.read_bytes())235 236 print("\n๐ RESTAURACAO COMPLETA: Todos os volumes, LoRAs (incluindo Synthstep e Krea2) e modelos MMAudio sincronizados sem erros!")237 