SplatAnything / app.py
ritianyu's picture
Register mounted FastAPI app with the ZeroGPU startup lifecycle
3ed7361 verified
Raw History Blame Contribute Delete
2.9 kB
#!/usr/bin/env python3
"""SplatAnything Gradio demo: python app.py (local GPU or CPU smoke run)."""
import argparse
import os
from pathlib import Path
ROOT = Path(__file__).resolve().parent
def parse_args(argv=None):
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--host', default=os.environ.get('HOST', '127.0.0.1'))
parser.add_argument('--port', type=int, default=int(os.environ.get('PORT', '7860')))
parser.add_argument('--device', default=os.environ.get('SPLATANYTHING_DEVICE', 'cuda'))
parser.add_argument('--config_path', default=os.environ.get('SPLATANYTHING_CONFIG', str(ROOT / 'configs/inference.yaml')))
parser.add_argument('--ckpt_path', default=os.environ.get('SPLATANYTHING_CKPT'))
parser.add_argument('--geometry_ckpt_path', default=os.environ.get('WORLDMIRROR2_CKPT'))
parser.add_argument('--sky_onnx_path', default=os.environ.get('SPLATANYTHING_SKY_CKPT'))
parser.add_argument('--output_dir', default=os.environ.get('SPLATANYTHING_OUTPUT_DIR'))
parser.add_argument('--examples_dir', default=os.environ.get('SPLATANYTHING_EXAMPLES_DIR', str(ROOT / 'examples')))
parser.add_argument('--install-viewer', action='store_true', help='Install the pinned npm viewer dependencies before launch.')
args = parser.parse_args(argv)
return args
def build_app(args):
# ZeroGPU must initialize CUDA emulation before Gradio or inference imports torch.
zero = os.environ.get('SPLATANYTHING_ZEROGPU', os.environ.get('SPACES_ZERO_GPU', '0')).lower() in ('1', 'true')
if zero:
import spaces # noqa: F401
from demo.runtime import Pipeline
from demo.ui import create_app
pipeline = Pipeline(args.config_path, args.device, args.ckpt_path, args.geometry_ckpt_path, args.sky_onnx_path)
predict_fn = None
if zero:
from demo.zero_gpu import initialize, predict
initialize(pipeline)
predict_fn = predict
app = create_app(pipeline, args.output_dir, args.examples_dir, predict_fn=predict_fn)
app.state.zero_gpu = zero
return app
def main(argv=None):
args = parse_args(argv)
if args.install_viewer:
from demo.viewer import install_converter
install_converter()
app = build_app(args)
import uvicorn
if app.state.zero_gpu:
# mount_gradio_app does not call Blocks.launch(), whose spaces SDK hook
# packs preloaded CUDA tensors and reports the GPU functions to the host.
# Expose the server as well so ZeroGPU workers close inherited listener FDs.
server = uvicorn.Server(uvicorn.Config(app, host=args.host, port=args.port, access_log=False))
app.state.demo.server = server
from demo.zero_gpu import startup
startup()
server.run()
else:
uvicorn.run(app, host=args.host, port=args.port, access_log=False)
if __name__ == '__main__':
main()