import time import modal 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.bark_worker_v2 import BarkV2Worker aws_secret = modal.Secret.from_name("studio-aws") def download_model_wrapper_1(): BarkV2Worker.download_models() image = get_modal_base_image().run_function(download_model_wrapper_1, secret=aws_secret) STUB_NAME = "bark-v2-test" 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, ), ) class BarkV2Stub: def __enter__(self): import torch num_gpus = torch.cuda.device_count() print(f"Found {num_gpus} GPUs.") recursive_ls_dir("/suno/models") self.worker = BarkV2Worker(0, bg_image="/suno/models/assets/wave-bg-3.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) ids = [] try: audios, (semantic_arrs, coarse_arrs) = 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, ) self.worker._write_npz( item, [ semantic_arrs[i], coarse_arrs[i], ], ) video_time = time.time() f = modal.Function.lookup("dummy-v0-test", "DummyV0Stub.write_video") list(f.starmap([(item, None, False) for item in items])) print("Videos took", time.time() - video_time) ok = True except Exception as e: import traceback finish_time = time.time() self.worker.notify_finish( item, { "id": item_id, "model": "bark-v2-xl", "n_audios": len(ids), "ok": 0, "gen_duration": finish_time - start_time, }, queue_name="results:q", ) traceback.print_exc() ok = False raise e finish_time = time.time() self.worker.notify_finish( item, { "id": item_id, "model": "bark-v2-xl", "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(): from uuid import uuid4 import json uid = str(uuid4()) inputs = [ json.dumps( dict( id=uid, prompt_text="""bark woof woof""", metadata={}, ) ) ] model = BarkV2Stub() print(uid) # TODO: this won't pass. sth is still broken. for input in inputs: model.generate.remote( input, )