diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..1aa1c2a --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,52 @@ +[project] +name = "wan2gp" +version = "0.1.0" +description = "Add your description here" +requires-python = ">=3.11" +dependencies = [ + "accelerate>=1.1.1", + "av>=15.0.0", + "dashscope>=1.24.0", + "decord>=0.6.0", + "diffusers>=0.31.0", + "easydict>=1.13", + "einops>=0.8.1", + "ffmpeg-python>=0.2.0", + "ftfy>=6.3.1", + "gradio==5.23.0", + "hydra-core>=1.3.2", + "imageio>=2.37.0", + "imageio-ffmpeg>=0.6.0", + "librosa==0.11.0", + "loguru>=0.7.3", + "matplotlib>=3.10.3", + "misaki>=0.9.4", + "mmgp==3.5.1", + "modal>=1.1.0", + "moviepy==1.0.3", + "mutagen>=1.47.0", + "numpy>=1.23.5,<2", + "omegaconf>=2.3.0", + "onnxruntime-gpu>=1.22.0", + "open-clip-torch>=2.29.0", + "opencv-python>=4.9.0.80", + "peft==0.15.0", + "pyannote-audio>=3.3.2", + "pydantic==2.10.6", + "pygame>=2.1.0", + "pyloudnorm>=0.1.1", + "rembg[gpu]==2.0.65", + "segment-anything>=1.0", + "sentencepiece>=0.2.0", + "sounddevice>=0.4.0", + "soundfile>=0.13.1", + "tensordict>=0.6.1", + "timm>=1.0.19", + "tokenizers>=0.20.3", + "torch>=2.4.0", + "torchdiffeq>=0.2.5", + "torchvision>=0.19.0", + "tqdm>=4.67.1", + "transformers==4.51.3", +] + diff --git a/serve.py b/serve.py new file mode 100644 index 0000000..daac78b --- /dev/null +++ b/serve.py @@ -0,0 +1,67 @@ +import modal + +image = ( + modal.Image.debian_slim() + .apt_install("libgl1", "libglib2.0-0", "libsm6", "libxrender1", "libxext6", "ffmpeg") + .pip_install("torch", "torchvision", "torchaudio", index_url="https://download.pytorch.org/whl/cu128") + .pip_install_from_pyproject("./pyproject.toml") + .pip_install("sageattention") + .add_local_dir(local_path="../Wan2GP", remote_path="/root/Wan2GP", ignore=["*.venv"]) +) + +app = modal.App(name="Wan2GP", image=image) + +vol = modal.Volume.from_name("wan2gp-ckpts", create_if_missing=True, environment_name="dev") +outputs = modal.Volume.from_name("wan2gp-outputs", create_if_missing=True, environment_name="dev") + +with image.imports(): + import subprocess + import os + + + # @app.function(max_containers=1, gpu="L40S", + # scaledown_window=900, + # timeout=3600, + # volumes={"/root/Wan2GP/ckpts": vol, + # "/root/Wan2GP/outputs": outputs}) + # @modal.concurrent(max_inputs=50) + # @modal.web_server(8000, startup_timeout=2400) + # def ui(): + # os.chdir("/root/Wan2GP") + # subprocess.Popen( + # "python /root/Wan2GP/wgp.py --listen --server-port 8000 --compile --attention sage --profile 1", + # shell=True) + + @app.function(max_containers=1, gpu="L40S", + scaledown_window=900, + timeout=60 * 60 * 18, + volumes={"/root/Wan2GP/ckpts": vol, + "/root/Wan2GP/outputs": outputs}) + @modal.concurrent(max_inputs=1000) + @modal.asgi_app() + def serve(): + import asyncio + import atexit + from fastapi import FastAPI + from gradio import mount_gradio_app + os.chdir("/root/Wan2GP") + import sys + sys.path.append('/root/Wan2GP') + sys.argv = ["--listen", "--server-port", "8000", "--compile", "--attention", "sage", "--profile", "1"] + from wgp import autosave_queue, create_ui, save_path + + app = FastAPI() + + atexit.register(autosave_queue) + # download_ffmpeg() + # threading.Thread(target=runner, daemon=True).start() + os.environ["GRADIO_ANALYTICS_ENABLED"] = "False" + server_port = 8000 + if os.name == "nt": + asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) + server_name = "0.0.0.0" + demo = create_ui() + demo.queue(max_size=5) + return mount_gradio_app(app=app, blocks=demo, path="/", + server_name=server_name, server_port=server_port, + allowed_paths=[save_path])