import time import json from uuid import uuid4 import modal from modal.cls import ClsMixin from suno_utils.worker.modal_base import get_modal_base_image, MODAL_MOUNTS from suno_utils.worker.utils import recursive_ls_dir from suno_utils.worker.chirp_worker import ChirpV0Worker aws_secret = modal.Secret.from_name("studio-aws") def download_model_wrapper_1(): ChirpV0Worker.download_models() image = get_modal_base_image().run_function(download_model_wrapper_1, secret=aws_secret) STUB_NAME = "chirp-v0" stub = modal.Stub(STUB_NAME, image=image) @stub.cls( cpu=2.0, # memory=16384, gpu=modal.gpu.A10G(count=1), secrets=[ aws_secret, modal.Secret.from_dict({"SUNO_ASSETS_PATH": "/suno/models/assets"}), ], timeout=800, container_idle_timeout=400, mounts=MODAL_MOUNTS, retries=modal.Retries( max_retries=3, backoff_coefficient=2.0, initial_delay=10.0, ), keep_warm=1, ) class ChirpV0Stub(ClsMixin): def __enter__(self): import torch num_gpus = torch.cuda.device_count() print(f"Found {num_gpus} GPUs.") recursive_ls_dir("/suno/models") self.worker = ChirpV0Worker(0, bg_image="/suno/models/assets/wave-bg-2.png") self.worker.preload() @modal.method() def generate(self, queue_item: str): import json from suno_utils.worker.schema import QueueItem print(queue_item) start_time = time.time() item = QueueItem(**json.loads(queue_item)) item_id = item.id print(item.metadata) is_square = item.metadata["is_square"] if "is_square" in item.metadata.keys() else False ids = [] f = modal.Function.lookup("stable-diffusion-cli", "StableDiffusion.generate_image") fn_call = f.spawn(queue_item) try: audios = self.worker.process_item(item) items = [] for i, audio in enumerate(audios): new_id = f"{item_id}_{i}" ids.append(new_id) item.id = new_id items.append(item.json()) self.worker._write_audio_only( item, audio, ) image_url = fn_call.get(timeout=None) print("image located", image_url) video_time = time.time() f = modal.Function.lookup("dummy-v0", "DummyV0Stub.write_video") list(f.starmap([(item, image_url.split("/")[-1], is_square) for item in items])) print("Videos took", time.time() - video_time) ok = True except Exception: import traceback traceback.print_exc() ok = False finish_time = time.time() self.worker.notify_finish( item, { "id": item_id, "model": "chirp_v0", "n_audios": len(ids), "ok": 1 if ok else 0, "gen_duration": finish_time - start_time, }, queue_name="results:q", ) return item.id @stub.local_entrypoint() def main(): uid = str(uuid4()) inputs = [ json.dumps( dict( id=uid, # prompt_audio="5d9025f4-2158-4219-b9d6-abfbcc178db2.mp3", prompt_text=""" Yo, let me tell you 'bout my favorite dish It's the sizzling, spicy fajitas that I wish I chop up peppers and onions with glee And grill that chicken 'til it's just right, you see """, metadata={}, ) ) ] model = ChirpV0Stub() print(uid) for input in inputs: model.generate.call( input, )