| # Hosting Time-to-Move on Hugging Face | |
| This guide explains how to mirror the Time-to-Move (TTM) codebase on the 🤗 Hub and how to expose an interactive demo through a Space. It assumes you already read the main `README.md`, understand how to run `run_wan.py`, and have access to Wan 2.2 weights through your Hugging Face account. | |
| --- | |
| ## 1. Prerequisites | |
| - Hugging Face account with access to the Wan 2.2 Image-to-Video model (`Wan-AI/Wan2.2-I2V-A14B-Diffusers` at the time of writing). | |
| - Local environment with Git, Git LFS, Python 3.10+, and the `huggingface_hub` CLI. | |
| - GPU-backed hardware both locally (for testing) and on Spaces (A100 or A10 is strongly recommended; CPU-only tiers are too slow for Wan 2.2). | |
| - Optional: organization namespace on the Hugging Face Hub (recommended if you want to publish under a team/org). | |
| Authenticate once locally (this stores a token in `~/.huggingface`): | |
| ```bash | |
| huggingface-cli login | |
| git lfs install | |
| ``` | |
| --- | |
| ## 2. Publish the code as a model repository | |
| 1. **Create an empty repo on the Hub.** Example: | |
| ```bash | |
| huggingface-cli repo create time-to-move/wan-ttm --type=model --yes | |
| git clone https://huggingface.co/time-to-move/wan-ttm | |
| cd wan-ttm | |
| ``` | |
| 2. **Copy the TTM sources.** From the project root, copy the files that users need to reproduce inference: | |
| ```bash | |
| rsync -av \ | |
| --exclude ".git/" \ | |
| --exclude "outputs/" \ | |
| /path/to/TTM/ \ | |
| /path/to/wan-ttm/ | |
| ``` | |
| Make sure `pipelines/`, `run_wan.py`, `run_cog.py`, `run_svd.py`, `examples/`, and the new `huggingface_space/` folder are included. Track large binary assets: | |
| ```bash | |
| git lfs track "*.mp4" "*.png" "*.gif" | |
| git add .gitattributes | |
| ``` | |
| 3. **Add a model card.** Reuse the main `README.md` or create a shorter version describing: | |
| - What Time-to-Move does. | |
| - How to run `run_wan.py` with the `motion_signal` + `mask`. | |
| - Which base model checkpoint the repo expects (Wan 2.2 I2V A14B). | |
| 4. **Push to the Hub.** | |
| ```bash | |
| git add . | |
| git commit -m "Initial commit of Time-to-Move Wan implementation" | |
| git push | |
| ``` | |
| Users can now do: | |
| ```python | |
| from huggingface_hub import snapshot_download | |
| snapshot_download("time-to-move/wan-ttm") | |
| ``` | |
| --- | |
| ## 3. Prepare a Hugging Face Space (Gradio) | |
| This repository now contains `huggingface_space/`, a ready-to-use Space template: | |
| ``` | |
| huggingface_space/ | |
| ├── README.md # Quickstart instructions | |
| ├── app.py # Gradio UI (loads Wan + Time-to-Move logic) | |
| └── requirements.txt # Runtime dependencies | |
| ``` | |
| ### 3.1 Create the Space | |
| ```bash | |
| huggingface-cli repo create time-to-move/wan-ttm-demo --type=space --sdk=gradio --yes | |
| git clone https://huggingface.co/spaces/time-to-move/wan-ttm-demo | |
| cd wan-ttm-demo | |
| ``` | |
| Copy everything from `huggingface_space/` into the Space repository (or keep the whole repo and set the Space’s working directory accordingly). Commit and push. | |
| ### 3.2 Configure hardware and secrets | |
| - **Hardware:** Select an A100 (preferred) or A10 GPU runtime in the Space settings. Wan 2.2 is too heavy for CPUs. | |
| - **WAN_MODEL_ID:** If you mirrored Wan 2.2 into your organization, set the environment variable to point to it. Otherwise leave the default (`Wan-AI/Wan2.2-I2V-A14B-Diffusers`). | |
| - **HF_TOKEN / WAN_ACCESS_TOKEN:** Add a Space secret only if the Wan checkpoint is private. The Gradio app reads from `HF_TOKEN` automatically when calling `from_pretrained`. | |
| - **PYTORCH_CUDA_ALLOC_CONF:** Recommended value `expandable_segments:True` to reduce CUDA fragmentation. | |
| ### 3.3 How the app works | |
| `huggingface_space/app.py` exposes: | |
| - A dropdown of the pre-packaged `examples/cutdrag_wan_*` prompts. | |
| - Optional custom uploads (`first_frame`, `mask.mp4`, `motion_signal.mp4`) following the README workflow. | |
| - Sliders for `tweak-index`, `tstrong-index`, guidance scale, seed, etc. | |
| - Live status messages and a generated MP4 preview using `diffusers.utils.export_to_video`. | |
| The UI lazily loads the `WanImageToVideoTTMPipeline` with tiling/slicing enabled to reduce VRAM usage. All preprocessing matches the logic in `run_wan.py` (the same `compute_hw_from_area` helper is reused). | |
| If you need to customize the experience (e.g., restrict to certain prompts, enforce shorter sequences), edit `huggingface_space/app.py` before pushing. | |
| --- | |
| ## 4. Testing checklist | |
| 1. **Local dry-run.** | |
| ```bash | |
| pip install -r huggingface_space/requirements.txt | |
| WAN_MODEL_ID=Wan-AI/Wan2.2-I2V-A14B-Diffusers \ | |
| python huggingface_space/app.py | |
| ``` | |
| Ensure you can generate at least one of the bundled examples. | |
| 2. **Space smoke test.** | |
| - Open the deployed Space. | |
| - Run the default example (`cutdrag_wan_Monkey`) and confirm you receive a video in ~2–3 minutes on A100 hardware. | |
| - Optionally upload a small custom mask/video pair and verify that `tweak-index`/`tstrong-index` are honored. | |
| 3. **Monitor logs.** Use the Space “Logs” tab to confirm: | |
| - The pipeline downloads from the expected `WAN_MODEL_ID`. | |
| - VRAM usage stays within the selected hardware tier. | |
| 4. **Freeze dependencies.** When satisfied, tag the Space (`v1`, `demo`) so users know which TTM commit it matches. | |
| You now have both a **model repository** (for anyone to clone/run) and a **public Space** for live demos. Feel free to adapt the instructions for the CogVideoX or Stable Video Diffusion pipelines if you plan to expose them as well; start by duplicating the provided Space template and swapping out `run_wan.py` for the relevant runner. | |