Spaces:
Running on Zero
Running on Zero
[Admin maintenance] Support new ZeroGPU hardware
Browse filesThank you so much for having shared this Space with the community on this demo. We have upgraded the ZeroGPU infra-structure to run on modern blackwell architecture.
For that, we need to upgrade your demo to support that. This PR fixes your demo to work with the new architecture. As this is something we broke on our end, we may merge this PR autonomously. If this breaks unexpectedly or brings unintended consequences, feel free to revert, modify or otherwise. Any issues you can email apolinario@huggingface.co
- app.py +8 -0
- requirements.txt +15 -0
- src/util.py +21 -1
app.py
CHANGED
|
@@ -2,6 +2,13 @@
|
|
| 2 |
# -*- coding: utf-8 -*-
|
| 3 |
# @Time : 2023-06-01
|
| 4 |
# @Author : ashui(Binghui Chen)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
from sympy import im
|
| 6 |
from versions import RELEASE_NOTE, VERSION
|
| 7 |
|
|
@@ -208,6 +215,7 @@ with block:
|
|
| 208 |
)
|
| 209 |
|
| 210 |
# user click the image to get points, and show the points on the image
|
|
|
|
| 211 |
def segmentation(img, sel_pix):
|
| 212 |
# online show seg mask
|
| 213 |
points = []
|
|
|
|
| 2 |
# -*- coding: utf-8 -*-
|
| 3 |
# @Time : 2023-06-01
|
| 4 |
# @Author : ashui(Binghui Chen)
|
| 5 |
+
# `spaces` MUST be imported before torch/cv2/anything that touches CUDA --
|
| 6 |
+
# it monkeypatches torch.cuda so module-scope `.to("cuda")` calls below are
|
| 7 |
+
# safely deferred instead of doing a real (and here, absent) CUDA init on the
|
| 8 |
+
# CPU process. This app previously had no `import spaces` and no
|
| 9 |
+
# `@spaces.GPU` decorator at all, so `mobile_sam = ...to("cuda")` a few lines
|
| 10 |
+
# down triggered `RuntimeError: No CUDA GPUs are available`.
|
| 11 |
+
import spaces
|
| 12 |
from sympy import im
|
| 13 |
from versions import RELEASE_NOTE, VERSION
|
| 14 |
|
|
|
|
| 215 |
)
|
| 216 |
|
| 217 |
# user click the image to get points, and show the points on the image
|
| 218 |
+
@spaces.GPU
|
| 219 |
def segmentation(img, sel_pix):
|
| 220 |
# online show seg mask
|
| 221 |
points = []
|
requirements.txt
CHANGED
|
@@ -2,6 +2,21 @@ dashscope
|
|
| 2 |
sympy
|
| 3 |
Pillow==9.5.0
|
| 4 |
gradio==3.50.2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
opencv-python
|
| 6 |
omegaconf
|
| 7 |
sentencepiece
|
|
|
|
| 2 |
sympy
|
| 3 |
Pillow==9.5.0
|
| 4 |
gradio==3.50.2
|
| 5 |
+
# gradio 3.50.2's routes.py calls Starlette's old
|
| 6 |
+
# TemplateResponse(name, context) positional signature. Modern Starlette
|
| 7 |
+
# (bundled with the current ZeroGPU base image) swapped to
|
| 8 |
+
# TemplateResponse(request, name, context) -- under the old call convention
|
| 9 |
+
# the dict `context` lands in the `name` slot, and Jinja2's template cache
|
| 10 |
+
# then tries to hash that dict -> `TypeError: unhashable type: 'dict'` on
|
| 11 |
+
# every request to "/". Pin an older, gradio-3.50.2-compatible Starlette/
|
| 12 |
+
# FastAPI pair to match what this SDK version actually expects.
|
| 13 |
+
starlette==0.27.0
|
| 14 |
+
fastapi==0.104.1
|
| 15 |
+
# fastapi 0.104.1 uses pydantic's old FieldInfo API (field_info.in_); the base
|
| 16 |
+
# image otherwise installs pydantic 2.13.x which removed it -> at Blocks()
|
| 17 |
+
# construction: AttributeError: 'FieldInfo' object has no attribute 'in_'.
|
| 18 |
+
# Pin pydantic to the release fastapi 0.104.1 / gradio 3.50.2 were built against.
|
| 19 |
+
pydantic==2.4.2
|
| 20 |
opencv-python
|
| 21 |
omegaconf
|
| 22 |
sentencepiece
|
src/util.py
CHANGED
|
@@ -23,7 +23,22 @@ access_key_secret = os.getenv("ACCESS_KEY_SECRET")
|
|
| 23 |
bucket_name = os.getenv("BUCKET_NAME")
|
| 24 |
endpoint = os.getenv("ENDPOINT")
|
| 25 |
|
| 26 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
oss_path = "ashui"
|
| 28 |
oss_path_img_gallery = "ashui_img_gallery"
|
| 29 |
|
|
@@ -55,6 +70,11 @@ def download_images(img_urls, batch_size):
|
|
| 55 |
return imgs_pil
|
| 56 |
|
| 57 |
def upload_np_2_oss(input_image, name="cache.png", gallery=False):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 58 |
imgByteArr = io.BytesIO()
|
| 59 |
Image.fromarray(input_image).save(imgByteArr, format="PNG")
|
| 60 |
imgByteArr = imgByteArr.getvalue()
|
|
|
|
| 23 |
bucket_name = os.getenv("BUCKET_NAME")
|
| 24 |
endpoint = os.getenv("ENDPOINT")
|
| 25 |
|
| 26 |
+
# The original Space depends on a private Alibaba Cloud OSS bucket
|
| 27 |
+
# (ACCESS_KEY_ID / ACCESS_KEY_SECRET / BUCKET_NAME / ENDPOINT secrets) that
|
| 28 |
+
# isn't available here. Without this guard, `oss2.Bucket(...)` raises
|
| 29 |
+
# AttributeError: 'NoneType' object has no attribute 'strip' at import time,
|
| 30 |
+
# crashing the whole app before it ever reaches the (unrelated) CUDA bug this
|
| 31 |
+
# duplicate is meant to repro. Degrade to `bucket = None` instead so import
|
| 32 |
+
# succeeds; only the OSS-upload path (unreachable without those secrets)
|
| 33 |
+
# fails at call time with a clear error.
|
| 34 |
+
if access_key_id and access_key_secret and bucket_name and endpoint:
|
| 35 |
+
bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
|
| 36 |
+
else:
|
| 37 |
+
logger.error(
|
| 38 |
+
"OSS credentials (ACCESS_KEY_ID/ACCESS_KEY_SECRET/BUCKET_NAME/ENDPOINT) "
|
| 39 |
+
"are not set; image-upload features will be disabled."
|
| 40 |
+
)
|
| 41 |
+
bucket = None
|
| 42 |
oss_path = "ashui"
|
| 43 |
oss_path_img_gallery = "ashui_img_gallery"
|
| 44 |
|
|
|
|
| 70 |
return imgs_pil
|
| 71 |
|
| 72 |
def upload_np_2_oss(input_image, name="cache.png", gallery=False):
|
| 73 |
+
if bucket is None:
|
| 74 |
+
raise RuntimeError(
|
| 75 |
+
"OSS bucket is not configured (missing ACCESS_KEY_ID/ACCESS_KEY_SECRET/"
|
| 76 |
+
"BUCKET_NAME/ENDPOINT secrets); cannot upload images."
|
| 77 |
+
)
|
| 78 |
imgByteArr = io.BytesIO()
|
| 79 |
Image.fromarray(input_image).save(imgByteArr, format="PNG")
|
| 80 |
imgByteArr = imgByteArr.getvalue()
|