This directory contains the Modal wrapper for running the registry-built Dreamverse Docker image on a Modal B200 container. The wrapper pulls a prebuilt Docker image and exposes the dreamverse application running inside.
Install and configure the Modal CLI for the target workspace/profile:
pip install modal
modal token set --token-id <token-id> --token-secret <token-secret> --profile=<profile-name>
modal profile activate <profile-name>Dreamverse needs several API keys for prompt-rewriter LLMs and model access in the Modal secret named
dreamverse-api-keys. Create or replace it with placeholders like this:
modal secret create dreamverse-api-keys \
CEREBRAS_API_KEY=<your-cerebras-key> \
GROQ_API_KEY=<your-groq-key> \
HF_TOKEN=<your-huggingface-token> \
--forceDREAMVERSE_IMAGE is required at deploy time:
DREAMVERSE_IMAGE=ghcr.io/<org>/<repo>/dreamverse:<tag> \
modal deploy apps/dreamverse/scripts/modal/modal_app.pyUse a SHA-specific tag, not latest. Use a dreamverse-backend-cuda12.9.1-sha-*
tag for backend-only deploys, or a dreamverse-ui-cuda12.9.1-sha-* tag for an
image that includes the static UI served by the backend.
For local image build details, see
apps/dreamverse/docker/README.md and apps/dreamverse/docker/docker_build.sh.
Set the URL returned by modal deploy, then probe the backend:
URL=https://<workspace>--dreamverse-b200-serve.modal.run
curl -fsS --max-time 300 "$URL/healthz"
curl -fsS --max-time 300 "$URL/status"
curl -fsS --max-time 300 "$URL/readyz"Check logs with function and container IDs so you can confirm only one container is active:
modal app logs dreamverse-b200 \
--tail 200 \
--timestamps \
--show-function-id \
--show-container-idUseful Modal commands:
modal app list
modal app list --json
modal billing report --for today --resolution h
modal app stop dreamverse-b200modal_app.py creates the named volumes if they do not exist and mounts them at
the locations expected by the image:
| Modal volume | Container path | Environment variable | Purpose |
|---|---|---|---|
dreamverse-hf-cache |
/root/.cache/huggingface |
HF_HOME |
Hugging Face model/cache data |
dreamverse-state |
/var/lib/dreamverse |
FASTVIDEO_DREAMVERSE_HOME |
Dreamverse outputs, session logs, and runtime state |
Most deploys only need the Modal secret and required DREAMVERSE_IMAGE.
DREAMVERSE_IMAGE is read from your local shell at deploy time; the runtime
knobs below live in the image or modal_app.py unless you intentionally change them:
DREAMVERSE_IMAGE: deploy a prebuilt SHA-specific image tag without editingmodal_app.py.FASTVIDEO_ENABLE_DEVTOOLS: enable Dreamverse devtools behavior.FASTVIDEO_PROMPT_PROVIDER/FASTVIDEO_PROMPT_*_MODEL: try prompt-rewriter provider or model choices.FASTVIDEO_ENABLE_STARTUP_WARMUP: trade slower startup for a warmer first request.DREAMVERSE_MAX_AUTOTUNE: enable or disable PyTorch Inductor max-autotune for the compiled Dreamverse runtime.
The Modal wrapper defaults to torch compile with Inductor max-autotune enabled for the fastest generation after startup warmup. If you need shorter compile/warmup time, disable max-autotune via:
DREAMVERSE_IMAGE=ghcr.io/<org>/<repo>/dreamverse:<tag> \
DREAMVERSE_MAX_AUTOTUNE=0 \
modal deploy apps/dreamverse/scripts/modal/modal_app.pyThe current deployed script keeps exactly one B200 container warm by setting
min_containers=1 and max_containers=1. min_containers=1 prevents Modal
from scaling the deployment down to zero after idle periods, which avoids paying
the expensive torch-compile/startup-warmup cost again on the next request.
max_containers=1 caps concurrency so concurrent requests queue onto the warm
container instead of spawning additional B200 containers and multiplying cost.
- Modal profile/workspace matters: create the secret and deploy with the same active profile.
modal secret create ... --forcereplaces the existingdreamverse-api-keyssecret.- Use the exact URL printed by
modal deploy; the placeholder URL above is only an example shape. - B200 cold starts and first model downloads can make
/readyzslow. Check logs before redeploying. modal app stop dreamverse-b200stops the app; it is not a read-only inspection command.