Spaces:
Starting
on
T4
Starting
on
T4
Commit
·
79ef841
1
Parent(s):
d39f16b
update code
Browse files- Dockerfile +4 -1
- web_server.py +65 -7
Dockerfile
CHANGED
@@ -15,7 +15,6 @@ ENV PATH /app/miniconda/bin:$PATH
|
|
15 |
|
16 |
SHELL ["conda", "run","--no-capture-output", "-p","/app/env", "/bin/bash", "-c"]
|
17 |
|
18 |
-
COPY --chown=1000:1000 ./test_server.py /app/test_server.py
|
19 |
COPY --chown=1000:1000 ./web_server.py /app/web_server.py
|
20 |
COPY --chown=1000:1000 ./docker/web_server_config/scene-0383-medium-00.yaml /app/docker/web_server_config/scene-0383-medium-00.yaml
|
21 |
COPY --chown=1000:1000 ./download_pre_datas.py /app/download_pre_datas.py
|
@@ -27,6 +26,10 @@ ENV TORCH_CUDA_ARCH_LIST "7.5"
|
|
27 |
ENV http_proxy=
|
28 |
ENV https_proxy=
|
29 |
|
|
|
|
|
|
|
|
|
30 |
RUN ./.pixi/envs/default/bin/python /app/download_pre_datas.py
|
31 |
|
32 |
CMD ["./.pixi/envs/default/bin/python", "web_server.py"]
|
|
|
15 |
|
16 |
SHELL ["conda", "run","--no-capture-output", "-p","/app/env", "/bin/bash", "-c"]
|
17 |
|
|
|
18 |
COPY --chown=1000:1000 ./web_server.py /app/web_server.py
|
19 |
COPY --chown=1000:1000 ./docker/web_server_config/scene-0383-medium-00.yaml /app/docker/web_server_config/scene-0383-medium-00.yaml
|
20 |
COPY --chown=1000:1000 ./download_pre_datas.py /app/download_pre_datas.py
|
|
|
26 |
ENV http_proxy=
|
27 |
ENV https_proxy=
|
28 |
|
29 |
+
RUN ./.pixi/envs/default/bin/python3 -m ensurepip
|
30 |
+
|
31 |
+
RUN ./.pixi/envs/default/bin/python3 -m pip install psutil
|
32 |
+
|
33 |
RUN ./.pixi/envs/default/bin/python /app/download_pre_datas.py
|
34 |
|
35 |
CMD ["./.pixi/envs/default/bin/python", "web_server.py"]
|
web_server.py
CHANGED
@@ -7,23 +7,26 @@ import time
|
|
7 |
import io
|
8 |
import enum
|
9 |
import hugsim_env
|
|
|
10 |
from collections import deque, OrderedDict
|
11 |
from datetime import datetime
|
12 |
-
from typing import Any, Dict
|
13 |
sys.path.append(os.getcwd())
|
14 |
|
15 |
-
from fastapi import FastAPI, Body, Header, Depends, HTTPException
|
16 |
from fastapi.responses import HTMLResponse, Response
|
17 |
from omegaconf import OmegaConf
|
18 |
-
from huggingface_hub import HfApi
|
19 |
import open3d as o3d
|
20 |
import numpy as np
|
21 |
import gymnasium
|
22 |
import uvicorn
|
|
|
23 |
|
24 |
from sim.utils.sim_utils import traj2control, traj_transform_to_global
|
25 |
from sim.utils.score_calculator import hugsim_evaluate
|
26 |
|
|
|
27 |
HF_TOKEN = os.getenv('HF_TOKEN', None)
|
28 |
COMPETITION_ID = os.getenv('COMPETITION_ID', None)
|
29 |
|
@@ -38,6 +41,38 @@ class SubmissionStatus(enum.Enum):
|
|
38 |
FAILED = 4
|
39 |
|
40 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
41 |
def get_token_info(token: str) -> Dict[str, Any]:
|
42 |
token_info_path = hf_api.hf_hub_download(
|
43 |
repo_id=COMPETITION_ID,
|
@@ -276,9 +311,15 @@ _result_dict= FifoDict(max_size=100)
|
|
276 |
env_manager = EnvHandlerManager()
|
277 |
|
278 |
|
279 |
-
def _get_env_handler(
|
|
|
|
|
|
|
|
|
|
|
|
|
280 |
try:
|
281 |
-
token_info = get_token_info(
|
282 |
except Exception:
|
283 |
raise HTTPException(status_code=401)
|
284 |
return env_manager.get_env_handler(token_info["submission_id"])
|
@@ -376,13 +417,30 @@ def main_page_endpoint(env_handler: EnvHandler = Depends(_get_env_handler)):
|
|
376 |
|
377 |
|
378 |
@app.get("/")
|
379 |
-
def main_page_endpoint(
|
|
|
|
|
380 |
"""
|
381 |
Main page endpoint to display logs.
|
382 |
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
383 |
html_content = f"""
|
384 |
<html>
|
385 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
386 |
</html>
|
387 |
"""
|
388 |
return HTMLResponse(content=html_content)
|
|
|
7 |
import io
|
8 |
import enum
|
9 |
import hugsim_env
|
10 |
+
import subprocess as sp
|
11 |
from collections import deque, OrderedDict
|
12 |
from datetime import datetime
|
13 |
+
from typing import Any, Dict, Optional
|
14 |
sys.path.append(os.getcwd())
|
15 |
|
16 |
+
from fastapi import FastAPI, Body, Header, Depends, HTTPException, Query
|
17 |
from fastapi.responses import HTMLResponse, Response
|
18 |
from omegaconf import OmegaConf
|
19 |
+
from huggingface_hub import HfApi
|
20 |
import open3d as o3d
|
21 |
import numpy as np
|
22 |
import gymnasium
|
23 |
import uvicorn
|
24 |
+
import psutil
|
25 |
|
26 |
from sim.utils.sim_utils import traj2control, traj_transform_to_global
|
27 |
from sim.utils.score_calculator import hugsim_evaluate
|
28 |
|
29 |
+
ADMIN_TOKEN = os.getenv('ADMIN_TOKEN', None)
|
30 |
HF_TOKEN = os.getenv('HF_TOKEN', None)
|
31 |
COMPETITION_ID = os.getenv('COMPETITION_ID', None)
|
32 |
|
|
|
41 |
FAILED = 4
|
42 |
|
43 |
|
44 |
+
def get_gpu_memory():
|
45 |
+
output_to_list = lambda x: x.decode('ascii').split('\n')[:-1]
|
46 |
+
COMMAND = "nvidia-smi --query-gpu=memory.used --format=csv"
|
47 |
+
try:
|
48 |
+
memory_use_info = output_to_list(sp.check_output(COMMAND.split(),stderr=sp.STDOUT))[1:]
|
49 |
+
except sp.CalledProcessError as e:
|
50 |
+
raise RuntimeError("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output))
|
51 |
+
memory_use_values = [int(x.split()[0]) for x in memory_use_info]
|
52 |
+
return memory_use_values
|
53 |
+
|
54 |
+
|
55 |
+
def get_system_status():
|
56 |
+
cpu_percent = psutil.cpu_percent(interval=1)
|
57 |
+
cpu_count = psutil.cpu_count(logical=True)
|
58 |
+
|
59 |
+
virtual_mem = psutil.virtual_memory()
|
60 |
+
total_mem = virtual_mem.total / (1024 ** 3)
|
61 |
+
used_mem = virtual_mem.used / (1024 ** 3)
|
62 |
+
mem_percent = virtual_mem.percent
|
63 |
+
|
64 |
+
system_info = {
|
65 |
+
"cpu_percent": cpu_percent,
|
66 |
+
"cpu_count": cpu_count,
|
67 |
+
"total_memory_gb": round(total_mem, 2),
|
68 |
+
"used_memory_gb": round(used_mem, 2),
|
69 |
+
"memory_percent": mem_percent,
|
70 |
+
"gpus": get_gpu_memory(),
|
71 |
+
}
|
72 |
+
|
73 |
+
return system_info
|
74 |
+
|
75 |
+
|
76 |
def get_token_info(token: str) -> Dict[str, Any]:
|
77 |
token_info_path = hf_api.hf_hub_download(
|
78 |
repo_id=COMPETITION_ID,
|
|
|
311 |
env_manager = EnvHandlerManager()
|
312 |
|
313 |
|
314 |
+
def _get_env_handler(
|
315 |
+
auth_token: Optional[str] = Header(None),
|
316 |
+
query_token: Optional[str] = Query(None)
|
317 |
+
) -> EnvHandler:
|
318 |
+
token = auth_token or query_token
|
319 |
+
if not token:
|
320 |
+
raise HTTPException(status_code=401, detail="Authorization token is required.")
|
321 |
try:
|
322 |
+
token_info = get_token_info(token)
|
323 |
except Exception:
|
324 |
raise HTTPException(status_code=401)
|
325 |
return env_manager.get_env_handler(token_info["submission_id"])
|
|
|
417 |
|
418 |
|
419 |
@app.get("/")
|
420 |
+
def main_page_endpoint(
|
421 |
+
admin_token: Optional[str] = Query(None),
|
422 |
+
):
|
423 |
"""
|
424 |
Main page endpoint to display logs.
|
425 |
"""
|
426 |
+
if admin_token != ADMIN_TOKEN:
|
427 |
+
html_content = f"""
|
428 |
+
<html>
|
429 |
+
running
|
430 |
+
</html>
|
431 |
+
"""
|
432 |
+
return HTMLResponse(content=html_content)
|
433 |
+
|
434 |
+
system_info = get_system_status()
|
435 |
html_content = f"""
|
436 |
<html>
|
437 |
+
<head>
|
438 |
+
<title>System Status</title>
|
439 |
+
</head>
|
440 |
+
<body>
|
441 |
+
<h1>System Status</h1>
|
442 |
+
<pre>{json.dumps(system_info, indent=4)}</pre>
|
443 |
+
</body>
|
444 |
</html>
|
445 |
"""
|
446 |
return HTMLResponse(content=html_content)
|