hysts HF Staff commited on
Commit
46b4a9e
·
1 Parent(s): dc6d68c

feat: migrate to ZeroGPU on Python 3.12 + PyTorch 2.8.

Browse files

- Switch hardware target to ZeroGPU; add suggested_hardware in README.
- Pin python_version to 3.12.12 (ZeroGPU-supported).
- Manage all dependencies via uv-managed pyproject.toml instead of
subprocess-based runtime wheel installs.
- Rebuild CUDA wheels (diff_gaussian_rasterization, grid_encoder,
voxlib_ext) against cp312 + torch 2.8 + cu128.
- Resolve flash-attn 2.8.3 and torch_scatter 2.1.2 from external
wheel URLs matching the new torch / Python combo.
- Refactor app.py: unconditional 'import spaces', drop the legacy
setup_runtime_env plumbing.
- Bump Gradio SDK to 6.14.0.

.gitignore CHANGED
@@ -20,7 +20,6 @@ lib64/
20
  parts/
21
  sdist/
22
  var/
23
- wheels/
24
  share/python-wheels/
25
  *.egg-info/
26
  .installed.cfg
@@ -182,3 +181,6 @@ output/
182
  flagged/
183
  *.pth
184
  *.pkl
 
 
 
 
20
  parts/
21
  sdist/
22
  var/
 
23
  share/python-wheels/
24
  *.egg-info/
25
  .installed.cfg
 
181
  flagged/
182
  *.pth
183
  *.pkl
184
+
185
+ # Claude tooling
186
+ .claude/
.python-version ADDED
@@ -0,0 +1 @@
 
 
1
+ 3.12
README.md CHANGED
@@ -2,12 +2,13 @@
2
  title: GaussianCity
3
  emoji: 🌇
4
  colorFrom: red
5
- python_version: 3.10.16
6
  colorTo: blue
7
  sdk: gradio
8
- sdk_version: 6.13.0
 
9
  app_file: app.py
10
  pinned: false
 
11
  short_description: Efficient 3D city generation in seconds!
12
  ---
13
 
@@ -16,4 +17,3 @@ Official demo for **[Generative Gaussian Splatting for Unbounded 3D City Generat
16
  - 🔥 GaussianCity is a unbounded 3D city generator based on 3D Gaussian Splatting.
17
  - 🤗 Try GaussianCity to generate photolistic 3D cities.
18
  - ⚠️ Due to the limited computational resources at Hugging Face, this demo only generates **A SINGLE IMAGE** based on the New York City layout.
19
-
 
2
  title: GaussianCity
3
  emoji: 🌇
4
  colorFrom: red
 
5
  colorTo: blue
6
  sdk: gradio
7
+ sdk_version: 6.14.0
8
+ python_version: 3.12.12
9
  app_file: app.py
10
  pinned: false
11
+ suggested_hardware: zero-a10g
12
  short_description: Efficient 3D city generation in seconds!
13
  ---
14
 
 
17
  - 🔥 GaussianCity is a unbounded 3D city generator based on 3D Gaussian Splatting.
18
  - 🤗 Try GaussianCity to generate photolistic 3D cities.
19
  - ⚠️ Due to the limited computational resources at Hugging Face, this demo only generates **A SINGLE IMAGE** based on the New York City layout.
 
app.py CHANGED
@@ -1,107 +1,19 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
- # @File: app.py
4
- # @Author: Haozhe Xie
5
- # @Date: 2024-03-02 16:30:00
6
- # @Last Modified by: Haozhe Xie
7
- # @Last Modified at: 2024-10-13 15:36:50
8
- # @Email: root@haozhexie.com
9
-
10
- import gradio as gr
11
  import logging
12
- import numpy as np
13
  import os
14
  import pickle
15
  import ssl
16
- import subprocess
17
  import sys
18
  import urllib.request
19
 
20
- from PIL import Image
21
-
22
- # Reinstall PyTorch with CUDA 11.8 (Default version is 12.1)
23
- # subprocess.call(
24
- # [
25
- # "pip",
26
- # "install",
27
- # "torch==2.2.2",
28
- # "torchvision==0.17.2",
29
- # "--index-url",
30
- # "https://download.pytorch.org/whl/cu118",
31
- # ]
32
- # )
33
  import torch
 
34
 
35
- # Create a dummy decorator for Non-ZeroGPU environments
36
- if os.environ.get("SPACES_ZERO_GPU") is not None:
37
- import spaces
38
- else:
39
-
40
- class spaces:
41
- @staticmethod
42
- def GPU(func):
43
- # This is a dummy wrapper that just calls the function.
44
- def wrapper(*args, **kwargs):
45
- return func(*args, **kwargs)
46
-
47
- return wrapper
48
-
49
-
50
- # Fix: ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed
51
  ssl._create_default_https_context = ssl._create_unverified_context
52
- # Import GaussianCity modules
53
- sys.path.append(os.path.join(os.path.dirname(__file__), "gaussiancity"))
54
-
55
-
56
- def _get_output(cmd):
57
- try:
58
- return subprocess.check_output(cmd).decode("utf-8")
59
- except Exception as ex:
60
- logging.exception(ex)
61
 
62
- return None
63
-
64
-
65
- def install_cuda_toolkit():
66
- # CUDA_TOOLKIT_URL = "https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run"
67
- CUDA_TOOLKIT_URL = "https://developer.download.nvidia.com/compute/cuda/12.2.0/local_installers/cuda_12.2.0_535.54.03_linux.run"
68
- CUDA_TOOLKIT_FILE = "/tmp/%s" % os.path.basename(CUDA_TOOLKIT_URL)
69
- subprocess.call(["wget", "-q", CUDA_TOOLKIT_URL, "-O", CUDA_TOOLKIT_FILE])
70
- subprocess.call(["chmod", "+x", CUDA_TOOLKIT_FILE])
71
- subprocess.call([CUDA_TOOLKIT_FILE, "--silent", "--toolkit"])
72
-
73
- os.environ["CUDA_HOME"] = "/usr/local/cuda"
74
- os.environ["PATH"] = "%s/bin:%s" % (os.environ["CUDA_HOME"], os.environ["PATH"])
75
- os.environ["LD_LIBRARY_PATH"] = "%s/lib:%s" % (
76
- os.environ["CUDA_HOME"],
77
- "" if "LD_LIBRARY_PATH" not in os.environ else os.environ["LD_LIBRARY_PATH"],
78
- )
79
- # Fix: arch_list[-1] += '+PTX'; IndexError: list index out of range
80
- os.environ["TORCH_CUDA_ARCH_LIST"] = "8.0;8.6"
81
-
82
-
83
- def setup_runtime_env():
84
- logging.info("Python Version: %s" % _get_output(["python", "--version"]))
85
- logging.info("CUDA Version: %s" % _get_output(["nvcc", "--version"]))
86
- logging.info("GCC Version: %s" % _get_output(["gcc", "--version"]))
87
- logging.info("CUDA is available: %s" % torch.cuda.is_available())
88
- logging.info("CUDA Device Capability: %s" % (torch.cuda.get_device_capability(),))
89
-
90
- # Install Pre-compiled CUDA extensions
91
- # Ref: https://huggingface.co/spaces/zero-gpu-explorers/README/discussions/110
92
- ext_dir = os.path.join(os.path.dirname(__file__), "wheels")
93
- for e in os.listdir(ext_dir):
94
- logging.info("Installing Extensions from %s" % e)
95
- subprocess.call(
96
- ["pip", "install", os.path.join(ext_dir, e)], stderr=subprocess.STDOUT
97
- )
98
- # Compile CUDA extensions
99
- # ext_dir = os.path.join(os.path.dirname(__file__), "gaussiancity", "extensions")
100
- # for e in os.listdir(ext_dir):
101
- # if os.path.isdir(os.path.join(ext_dir, e)):
102
- # subprocess.call(["pip", "install", "."], cwd=os.path.join(ext_dir, e))
103
-
104
- logging.info("Installed Python Packages: %s" % _get_output(["pip", "list"]))
105
 
106
 
107
  def get_models(file_name):
@@ -109,20 +21,17 @@ def get_models(file_name):
109
 
110
  if not os.path.exists(file_name):
111
  urllib.request.urlretrieve(
112
- "https://huggingface.co/hzxie/gaussian-city/resolve/main/%s" % file_name,
113
  file_name,
114
  )
115
 
116
- device = "cuda" if torch.cuda.is_available() else "cpu"
117
- ckpt = torch.load(file_name, map_location=torch.device(device), weights_only=False)
118
  model = gaussiancity.generator.Generator(
119
  ckpt["cfg"].NETWORK.GAUSSIAN,
120
  n_classes=ckpt["cfg"].DATASETS.GOOGLE_EARTH.N_CLASSES,
121
  proj_size=ckpt["cfg"].DATASETS.GOOGLE_EARTH.PROJ_SIZE,
122
  )
123
- if torch.cuda.is_available():
124
- model = torch.nn.DataParallel(model).cuda().eval()
125
-
126
  model.load_state_dict(ckpt["gaussian_g"], strict=False)
127
  return model
128
 
@@ -130,7 +39,6 @@ def get_models(file_name):
130
  def get_city_layout():
131
  import gaussiancity.inference
132
 
133
- layout = None
134
  if os.path.exists("assets/NYC.pkl"):
135
  with open("assets/NYC.pkl", "rb") as fp:
136
  layout = pickle.load(fp)
@@ -139,9 +47,7 @@ def get_city_layout():
139
  # Fix: nonzero is not supported for tensors with more than INT_MAX elements
140
  td_hf[td_hf > 500] = 500
141
  bu_hf = np.zeros_like(td_hf)
142
- seg_map = np.array(Image.open("assets/NYC-SegMap.png").convert("P")).astype(
143
- np.int32
144
- )
145
  ins_map = gaussiancity.inference.get_instance_seg_map(seg_map.copy())
146
  pts_map = gaussiancity.inference.get_point_map(seg_map)
147
  layout = {
@@ -154,7 +60,6 @@ def get_city_layout():
154
  with open("assets/NYC.pkl", "wb") as fp:
155
  pickle.dump(layout, fp)
156
 
157
- centers = None
158
  if os.path.exists("assets/CENTERS.pkl"):
159
  with open("assets/CENTERS.pkl", "rb") as fp:
160
  centers = pickle.load(fp)
@@ -167,17 +72,24 @@ def get_city_layout():
167
  return layout
168
 
169
 
 
 
 
 
 
 
 
 
 
 
170
  @spaces.GPU
171
  def get_generated_city(radius, altitude, azimuth, map_center):
172
- logging.info("CUDA is available: %s" % torch.cuda.is_available())
173
- logging.info("PyTorch is built with CUDA: %s" % torch.version.cuda)
174
- # The import must be done after CUDA extension compilation
175
  import gaussiancity.inference
176
 
177
  return gaussiancity.inference.generate_city(
178
- get_generated_city.fgm.to("cuda"),
179
- get_generated_city.bgm.to("cuda"),
180
- get_generated_city.city_layout,
181
  map_center,
182
  map_center,
183
  radius,
@@ -186,7 +98,7 @@ def get_generated_city(radius, altitude, azimuth, map_center):
186
  )
187
 
188
 
189
- def main(debug):
190
  title = "Generative Gaussian Splatting for Unbounded 3D City Generation"
191
  with open("README.md", "r") as f:
192
  markdown = f.read()
@@ -208,33 +120,9 @@ def main(debug):
208
  article=arti,
209
  flagging_mode="never",
210
  )
211
- app.queue(api_open=False)
212
- app.launch(debug=debug)
213
 
214
 
215
  if __name__ == "__main__":
216
- logging.basicConfig(
217
- format="[%(levelname)s] %(asctime)s %(message)s", level=logging.INFO
218
- )
219
- logging.info("Environment Variables: %s" % os.environ)
220
- # if _get_output(["nvcc", "--version"]) is None:
221
- # logging.info("Installing CUDA toolkit...")
222
- # install_cuda_toolkit()
223
- # else:
224
- # logging.info("Detected CUDA: %s" % _get_output(["nvcc", "--version"]))
225
-
226
- logging.info("Compiling CUDA extensions...")
227
- setup_runtime_env()
228
-
229
- logging.info("Downloading pretrained models...")
230
- fgm = get_models("GaussianCity-Fgnd.pth")
231
- bgm = get_models("GaussianCity-Bgnd.pth")
232
- get_generated_city.fgm = fgm
233
- get_generated_city.bgm = bgm
234
-
235
- logging.info("Loading New York city layout to RAM...")
236
- city_layout = get_city_layout()
237
- get_generated_city.city_layout = city_layout
238
-
239
- logging.info("Starting the main application...")
240
- main(os.getenv("DEBUG") == "1")
 
 
 
 
 
 
 
 
 
 
 
1
  import logging
 
2
  import os
3
  import pickle
4
  import ssl
 
5
  import sys
6
  import urllib.request
7
 
8
+ import gradio as gr
9
+ import numpy as np
10
+ import spaces
 
 
 
 
 
 
 
 
 
 
11
  import torch
12
+ from PIL import Image
13
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
  ssl._create_default_https_context = ssl._create_unverified_context
 
 
 
 
 
 
 
 
 
15
 
16
+ sys.path.append(os.path.join(os.path.dirname(__file__), "gaussiancity"))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
 
18
 
19
  def get_models(file_name):
 
21
 
22
  if not os.path.exists(file_name):
23
  urllib.request.urlretrieve(
24
+ f"https://huggingface.co/hzxie/gaussian-city/resolve/main/{file_name}",
25
  file_name,
26
  )
27
 
28
+ ckpt = torch.load(file_name, map_location="cpu", weights_only=False)
 
29
  model = gaussiancity.generator.Generator(
30
  ckpt["cfg"].NETWORK.GAUSSIAN,
31
  n_classes=ckpt["cfg"].DATASETS.GOOGLE_EARTH.N_CLASSES,
32
  proj_size=ckpt["cfg"].DATASETS.GOOGLE_EARTH.PROJ_SIZE,
33
  )
34
+ model = torch.nn.DataParallel(model).cuda().eval()
 
 
35
  model.load_state_dict(ckpt["gaussian_g"], strict=False)
36
  return model
37
 
 
39
  def get_city_layout():
40
  import gaussiancity.inference
41
 
 
42
  if os.path.exists("assets/NYC.pkl"):
43
  with open("assets/NYC.pkl", "rb") as fp:
44
  layout = pickle.load(fp)
 
47
  # Fix: nonzero is not supported for tensors with more than INT_MAX elements
48
  td_hf[td_hf > 500] = 500
49
  bu_hf = np.zeros_like(td_hf)
50
+ seg_map = np.array(Image.open("assets/NYC-SegMap.png").convert("P")).astype(np.int32)
 
 
51
  ins_map = gaussiancity.inference.get_instance_seg_map(seg_map.copy())
52
  pts_map = gaussiancity.inference.get_point_map(seg_map)
53
  layout = {
 
60
  with open("assets/NYC.pkl", "wb") as fp:
61
  pickle.dump(layout, fp)
62
 
 
63
  if os.path.exists("assets/CENTERS.pkl"):
64
  with open("assets/CENTERS.pkl", "rb") as fp:
65
  centers = pickle.load(fp)
 
72
  return layout
73
 
74
 
75
+ logging.basicConfig(format="[%(levelname)s] %(asctime)s %(message)s", level=logging.INFO)
76
+
77
+ logging.info("Loading pretrained models...")
78
+ fgm = get_models("GaussianCity-Fgnd.pth")
79
+ bgm = get_models("GaussianCity-Bgnd.pth")
80
+
81
+ logging.info("Loading New York city layout to RAM...")
82
+ city_layout = get_city_layout()
83
+
84
+
85
  @spaces.GPU
86
  def get_generated_city(radius, altitude, azimuth, map_center):
 
 
 
87
  import gaussiancity.inference
88
 
89
  return gaussiancity.inference.generate_city(
90
+ fgm.to("cuda"),
91
+ bgm.to("cuda"),
92
+ city_layout,
93
  map_center,
94
  map_center,
95
  radius,
 
98
  )
99
 
100
 
101
+ def main():
102
  title = "Generative Gaussian Splatting for Unbounded 3D City Generation"
103
  with open("README.md", "r") as f:
104
  markdown = f.read()
 
120
  article=arti,
121
  flagging_mode="never",
122
  )
123
+ app.queue()
124
+ app.launch()
125
 
126
 
127
  if __name__ == "__main__":
128
+ main()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
pyproject.toml ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [project]
2
+ name = "gaussian-city"
3
+ version = "0.1.0"
4
+ description = "GaussianCity 3D city generation Space"
5
+ readme = "README.md"
6
+ requires-python = "==3.12.*"
7
+ dependencies = [
8
+ "addict>=2.4.0",
9
+ "diff-gaussian-rasterization",
10
+ "easydict>=1.13",
11
+ "flash-attn==2.8.3",
12
+ "gradio[mcp,oauth]==6.14.0",
13
+ "grid-encoder",
14
+ "huggingface-hub>=0.36.0",
15
+ "numpy<2",
16
+ "opencv-python-headless>=4.10.0.84",
17
+ "pillow>=11.0.0",
18
+ "scipy>=1.14.1",
19
+ "spaces>=0.50.2",
20
+ "spconv-cu126>=2.3.8",
21
+ "torch==2.8.0",
22
+ "torch-scatter==2.1.2",
23
+ "torchvision==0.23.0",
24
+ "tqdm>=4.66.5",
25
+ "voxlib-ext",
26
+ ]
27
+
28
+ [tool.uv]
29
+ no-build-isolation-package = ["flash-attn", "torch-scatter"]
30
+
31
+ [tool.uv.sources]
32
+ torch = [{ index = "pytorch-cu128" }]
33
+ torchvision = [{ index = "pytorch-cu128" }]
34
+ torch-scatter = { url = "https://data.pyg.org/whl/torch-2.8.0+cu128/torch_scatter-2.1.2+pt28cu128-cp312-cp312-linux_x86_64.whl" }
35
+ flash-attn = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.3/flash_attn-2.8.3+cu12torch2.8cxx11abiTRUE-cp312-cp312-linux_x86_64.whl" }
36
+ diff-gaussian-rasterization = { path = "wheels/diff_gaussian_rasterization-1.0.0-cp312-cp312-linux_x86_64.whl" }
37
+ grid-encoder = { path = "wheels/grid_encoder-1.0.0-cp312-cp312-linux_x86_64.whl" }
38
+ voxlib-ext = { path = "wheels/voxlib_ext-3.0.0-cp312-cp312-linux_x86_64.whl" }
39
+
40
+ [[tool.uv.index]]
41
+ name = "pytorch-cu128"
42
+ url = "https://download.pytorch.org/whl/cu128"
43
+ explicit = true
requirements.txt CHANGED
@@ -1,13 +1,359 @@
1
- --extra-index-url https://download.pytorch.org/whl/cu121
2
- easydict
3
- gradio
4
- numpy<2.0.0
5
- opencv-python
6
- pillow
7
- scipy
8
- torch==2.2.2
9
- torchvision==0.17.2
10
-
11
- addict
12
- spconv-cu121
13
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This file was autogenerated by uv via the following command:
2
+ # uv export --no-hashes --no-dev --no-emit-package typer-slim --no-emit-package spaces --no-emit-project -o requirements.txt
3
+ ./wheels/diff_gaussian_rasterization-1.0.0-cp312-cp312-linux_x86_64.whl
4
+ # via gaussian-city
5
+ ./wheels/grid_encoder-1.0.0-cp312-cp312-linux_x86_64.whl
6
+ # via gaussian-city
7
+ ./wheels/voxlib_ext-3.0.0-cp312-cp312-linux_x86_64.whl
8
+ # via gaussian-city
9
+ addict==2.4.0
10
+ # via gaussian-city
11
+ annotated-doc==0.0.4
12
+ # via
13
+ # fastapi
14
+ # typer
15
+ annotated-types==0.7.0
16
+ # via pydantic
17
+ anyio==4.13.0
18
+ # via
19
+ # gradio
20
+ # httpx
21
+ # mcp
22
+ # sse-starlette
23
+ # starlette
24
+ attrs==26.1.0
25
+ # via
26
+ # jsonschema
27
+ # referencing
28
+ authlib==1.7.2
29
+ # via gradio
30
+ brotli==1.2.0
31
+ # via gradio
32
+ ccimport==0.4.4
33
+ # via
34
+ # pccm
35
+ # spconv-cu126
36
+ certifi==2026.5.20
37
+ # via
38
+ # httpcore
39
+ # httpx
40
+ # requests
41
+ cffi==2.0.0 ; platform_python_implementation != 'PyPy'
42
+ # via cryptography
43
+ charset-normalizer==3.4.7
44
+ # via requests
45
+ click==8.4.1
46
+ # via
47
+ # typer
48
+ # uvicorn
49
+ colorama==0.4.6 ; sys_platform == 'win32'
50
+ # via
51
+ # click
52
+ # tqdm
53
+ cryptography==48.0.0
54
+ # via
55
+ # authlib
56
+ # joserfc
57
+ # pyjwt
58
+ cumm-cu126==0.7.11
59
+ # via spconv-cu126
60
+ easydict==1.13
61
+ # via gaussian-city
62
+ einops==0.8.2
63
+ # via flash-attn
64
+ fastapi==0.136.3
65
+ # via gradio
66
+ filelock==3.29.0
67
+ # via
68
+ # huggingface-hub
69
+ # torch
70
+ fire==0.7.1
71
+ # via
72
+ # cumm-cu126
73
+ # pccm
74
+ # spconv-cu126
75
+ flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.3/flash_attn-2.8.3+cu12torch2.8cxx11abiTRUE-cp312-cp312-linux_x86_64.whl
76
+ # via gaussian-city
77
+ fsspec==2026.4.0
78
+ # via
79
+ # gradio-client
80
+ # huggingface-hub
81
+ # torch
82
+ gradio==6.14.0
83
+ # via
84
+ # gaussian-city
85
+ # spaces
86
+ gradio-client==2.5.0
87
+ # via
88
+ # gradio
89
+ # hf-gradio
90
+ groovy==0.1.2
91
+ # via gradio
92
+ h11==0.16.0
93
+ # via
94
+ # httpcore
95
+ # uvicorn
96
+ hf-gradio==0.4.1
97
+ # via gradio
98
+ hf-xet==1.5.0 ; platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'
99
+ # via huggingface-hub
100
+ httpcore==1.0.9
101
+ # via httpx
102
+ httpx==0.28.1
103
+ # via
104
+ # gradio
105
+ # gradio-client
106
+ # huggingface-hub
107
+ # mcp
108
+ # safehttpx
109
+ # spaces
110
+ httpx-sse==0.4.3
111
+ # via mcp
112
+ huggingface-hub==1.16.1
113
+ # via
114
+ # gaussian-city
115
+ # gradio
116
+ # gradio-client
117
+ idna==3.16
118
+ # via
119
+ # anyio
120
+ # httpx
121
+ # requests
122
+ itsdangerous==2.2.0
123
+ # via gradio
124
+ jinja2==3.1.6
125
+ # via
126
+ # gradio
127
+ # torch
128
+ joserfc==1.6.7
129
+ # via authlib
130
+ jsonschema==4.26.0
131
+ # via mcp
132
+ jsonschema-specifications==2025.9.1
133
+ # via jsonschema
134
+ lark==1.3.1
135
+ # via pccm
136
+ markdown-it-py==4.2.0
137
+ # via rich
138
+ markupsafe==3.0.3
139
+ # via
140
+ # gradio
141
+ # jinja2
142
+ mcp==1.27.1
143
+ # via gradio
144
+ mdurl==0.1.2
145
+ # via markdown-it-py
146
+ mpmath==1.3.0
147
+ # via sympy
148
+ networkx==3.6.1
149
+ # via torch
150
+ ninja==1.13.0
151
+ # via ccimport
152
+ numpy==1.26.4
153
+ # via
154
+ # cumm-cu126
155
+ # gaussian-city
156
+ # gradio
157
+ # opencv-python-headless
158
+ # pandas
159
+ # scipy
160
+ # spconv-cu126
161
+ # torchvision
162
+ nvidia-cublas-cu12==12.8.4.1 ; platform_machine == 'x86_64' and sys_platform == 'linux'
163
+ # via
164
+ # nvidia-cudnn-cu12
165
+ # nvidia-cusolver-cu12
166
+ # torch
167
+ nvidia-cuda-cupti-cu12==12.8.90 ; platform_machine == 'x86_64' and sys_platform == 'linux'
168
+ # via torch
169
+ nvidia-cuda-nvrtc-cu12==12.8.93 ; platform_machine == 'x86_64' and sys_platform == 'linux'
170
+ # via torch
171
+ nvidia-cuda-runtime-cu12==12.8.90 ; platform_machine == 'x86_64' and sys_platform == 'linux'
172
+ # via torch
173
+ nvidia-cudnn-cu12==9.10.2.21 ; platform_machine == 'x86_64' and sys_platform == 'linux'
174
+ # via torch
175
+ nvidia-cufft-cu12==11.3.3.83 ; platform_machine == 'x86_64' and sys_platform == 'linux'
176
+ # via torch
177
+ nvidia-cufile-cu12==1.13.1.3 ; platform_machine == 'x86_64' and sys_platform == 'linux'
178
+ # via torch
179
+ nvidia-curand-cu12==10.3.9.90 ; platform_machine == 'x86_64' and sys_platform == 'linux'
180
+ # via torch
181
+ nvidia-cusolver-cu12==11.7.3.90 ; platform_machine == 'x86_64' and sys_platform == 'linux'
182
+ # via torch
183
+ nvidia-cusparse-cu12==12.5.8.93 ; platform_machine == 'x86_64' and sys_platform == 'linux'
184
+ # via
185
+ # nvidia-cusolver-cu12
186
+ # torch
187
+ nvidia-cusparselt-cu12==0.7.1 ; platform_machine == 'x86_64' and sys_platform == 'linux'
188
+ # via torch
189
+ nvidia-nccl-cu12==2.27.3 ; platform_machine == 'x86_64' and sys_platform == 'linux'
190
+ # via torch
191
+ nvidia-nvjitlink-cu12==12.8.93 ; platform_machine == 'x86_64' and sys_platform == 'linux'
192
+ # via
193
+ # nvidia-cufft-cu12
194
+ # nvidia-cusolver-cu12
195
+ # nvidia-cusparse-cu12
196
+ # torch
197
+ nvidia-nvtx-cu12==12.8.90 ; platform_machine == 'x86_64' and sys_platform == 'linux'
198
+ # via torch
199
+ opencv-python-headless==4.11.0.86
200
+ # via gaussian-city
201
+ orjson==3.11.9
202
+ # via gradio
203
+ packaging==26.2
204
+ # via
205
+ # gradio
206
+ # gradio-client
207
+ # huggingface-hub
208
+ # spaces
209
+ pandas==3.0.3
210
+ # via gradio
211
+ pccm==0.4.16
212
+ # via
213
+ # cumm-cu126
214
+ # spconv-cu126
215
+ pillow==12.2.0
216
+ # via
217
+ # gaussian-city
218
+ # gradio
219
+ # torchvision
220
+ portalocker==3.2.0
221
+ # via pccm
222
+ pybind11==3.0.4
223
+ # via
224
+ # ccimport
225
+ # cumm-cu126
226
+ # pccm
227
+ # spconv-cu126
228
+ pycparser==3.0 ; implementation_name != 'PyPy' and platform_python_implementation != 'PyPy'
229
+ # via cffi
230
+ pydantic==2.12.5
231
+ # via
232
+ # fastapi
233
+ # gradio
234
+ # mcp
235
+ # pydantic-settings
236
+ # spaces
237
+ pydantic-core==2.41.5
238
+ # via pydantic
239
+ pydantic-settings==2.14.1
240
+ # via mcp
241
+ pydub==0.25.1
242
+ # via gradio
243
+ pygments==2.20.0
244
+ # via rich
245
+ pyjwt==2.13.0
246
+ # via mcp
247
+ python-dateutil==2.9.0.post0
248
+ # via pandas
249
+ python-dotenv==1.2.2
250
+ # via pydantic-settings
251
+ python-multipart==0.0.29
252
+ # via
253
+ # gradio
254
+ # mcp
255
+ pytz==2026.2
256
+ # via gradio
257
+ pywin32==311 ; sys_platform == 'win32'
258
+ # via
259
+ # mcp
260
+ # portalocker
261
+ pyyaml==6.0.3
262
+ # via
263
+ # gradio
264
+ # huggingface-hub
265
+ referencing==0.37.0
266
+ # via
267
+ # jsonschema
268
+ # jsonschema-specifications
269
+ requests==2.34.2
270
+ # via
271
+ # ccimport
272
+ # spaces
273
+ rich==15.0.0
274
+ # via typer
275
+ rpds-py==0.30.0
276
+ # via
277
+ # jsonschema
278
+ # referencing
279
+ safehttpx==0.1.7
280
+ # via gradio
281
+ scipy==1.17.1
282
+ # via gaussian-city
283
+ semantic-version==2.10.0
284
+ # via gradio
285
+ setuptools==82.0.1
286
+ # via
287
+ # torch
288
+ # triton
289
+ shellingham==1.5.4
290
+ # via typer
291
+ six==1.17.0
292
+ # via python-dateutil
293
+ spconv-cu126==2.3.8
294
+ # via gaussian-city
295
+ sse-starlette==3.4.4
296
+ # via mcp
297
+ starlette==1.1.0
298
+ # via
299
+ # fastapi
300
+ # gradio
301
+ # mcp
302
+ # sse-starlette
303
+ sympy==1.14.0
304
+ # via
305
+ # cumm-cu126
306
+ # torch
307
+ termcolor==3.3.0
308
+ # via fire
309
+ tomlkit==0.14.0
310
+ # via gradio
311
+ torch==2.8.0+cu128
312
+ # via
313
+ # flash-attn
314
+ # gaussian-city
315
+ # torchvision
316
+ torch-scatter @ https://data.pyg.org/whl/torch-2.8.0+cu128/torch_scatter-2.1.2+pt28cu128-cp312-cp312-linux_x86_64.whl
317
+ # via gaussian-city
318
+ torchvision==0.23.0+cu128
319
+ # via gaussian-city
320
+ tqdm==4.67.3
321
+ # via
322
+ # gaussian-city
323
+ # huggingface-hub
324
+ triton==3.4.0 ; platform_machine == 'x86_64' and sys_platform == 'linux'
325
+ # via torch
326
+ typer==0.25.1
327
+ # via
328
+ # gradio
329
+ # hf-gradio
330
+ # huggingface-hub
331
+ typing-extensions==4.15.0
332
+ # via
333
+ # anyio
334
+ # fastapi
335
+ # gradio
336
+ # gradio-client
337
+ # huggingface-hub
338
+ # mcp
339
+ # pydantic
340
+ # pydantic-core
341
+ # referencing
342
+ # spaces
343
+ # starlette
344
+ # torch
345
+ # typing-inspection
346
+ typing-inspection==0.4.2
347
+ # via
348
+ # fastapi
349
+ # mcp
350
+ # pydantic
351
+ # pydantic-settings
352
+ tzdata==2026.2 ; sys_platform == 'emscripten' or sys_platform == 'win32'
353
+ # via pandas
354
+ urllib3==2.7.0
355
+ # via requests
356
+ uvicorn==0.48.0
357
+ # via
358
+ # gradio
359
+ # mcp
uv.lock ADDED
The diff for this file is too large to render. See raw diff
 
wheels/{diff_gaussian_rasterization-1.0.0-cp310-cp310-linux_x86_64.whl → diff_gaussian_rasterization-1.0.0-cp312-cp312-linux_x86_64.whl} RENAMED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:8ad2c22c1a8437a9bdc73f20ecf600efb41c1082bcdb456086fa460cae8bb44d
3
- size 618661
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8e54cc7aaa6ab9a5b56df9ddbf9f6b4f76590f266de1f036809847ada30138f1
3
+ size 3950877
wheels/flash_attn-2.7.4.post1-cp310-cp310-linux_x86_64.whl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:72a051b8c68c8e3b670694150ae0cfd3881a4573f2f1b175feb26fb561a3a984
3
- size 187623314
 
 
 
 
wheels/{voxlib_ext-3.0.0-cp310-cp310-linux_x86_64.whl → grid_encoder-1.0.0-cp312-cp312-linux_x86_64.whl} RENAMED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:2d98865dcd2a8cc7a8d4252eb8aaddc684d1ef40e38aa5d7c0081f789128f20b
3
- size 556120
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:646df1a1b6aa0b8b3a1f043f2a7a18d147fbb57ba56e37943398e7556d2606de
3
+ size 7682219
wheels/torch_scatter-2.1.2+pt22cu121-cp310-cp310-linux_x86_64.whl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:caab7dd4a8783d49b2a983331e93ebf968c9c76ff4daaca158e2f6fb9c8028bf
3
- size 10864848
 
 
 
 
wheels/{grid_encoder-1.0.0-cp310-cp310-linux_x86_64.whl → voxlib_ext-3.0.0-cp312-cp312-linux_x86_64.whl} RENAMED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:fe8202277d207d016f557b5b2910d008521e2275be589f2b07f3f3c74f4b84a8
3
- size 1865230
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f845d50463d31acfd93a5a3c7c3a2f62058d5c69d050715470fd5ea5710600da
3
+ size 3826906