File size: 4,207 Bytes
1094cbb 8ec4d2d 1094cbb 815b0dc 1094cbb 8ec4d2d 156ba7d 8ec4d2d 156ba7d 8ec4d2d 815b0dc 8ec4d2d 74e3d2f 1094cbb 42c2745 1094cbb a2fa160 1094cbb a2fa160 1094cbb |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
import io
import json
import os
import subprocess
import traceback
import requests
from huggingface_hub import HfApi, hf_hub_download
from loguru import logger
from competitions.params import EvalParams
from . import HF_URL
def user_authentication(token):
headers = {}
cookies = {}
if token.startswith("hf_"):
headers["Authorization"] = f"Bearer {token}"
else:
cookies = {"token": token}
try:
response = requests.get(
HF_URL + "/api/whoami-v2",
headers=headers,
cookies=cookies,
timeout=3,
)
except (requests.Timeout, ConnectionError) as err:
logger.error(f"Failed to request whoami-v2 - {repr(err)}")
raise Exception("Hugging Face Hub is unreachable, please try again later.")
return response.json()
def make_clickable_user(user_id):
link = "https://huggingface.co/" + user_id
return f'<a target="_blank" href="{link}">{user_id}</a>'
def run_evaluation(params, local=False, wait=False):
params = json.loads(params)
if isinstance(params, str):
params = json.loads(params)
params = EvalParams(**params)
if not local:
params.output_path = "/tmp/model"
params.save(output_dir=params.output_path)
cmd = [
"python",
"-m",
"competitions.evaluate",
"--config",
os.path.join(params.output_path, "params.json"),
]
cmd = [str(c) for c in cmd]
logger.info(cmd)
env = os.environ.copy()
process = subprocess.Popen(" ".join(cmd), shell=True, env=env)
if wait:
process.wait()
return process.pid
def pause_space(params):
if "SPACE_ID" in os.environ:
if os.environ["SPACE_ID"].split("/")[-1].startswith("comp-"):
logger.info("Pausing space...")
api = HfApi(token=params.token)
api.pause_space(repo_id=os.environ["SPACE_ID"])
def download_submission_info(params):
user_fname = hf_hub_download(
repo_id=params.competition_id,
filename=f"submission_info/{params.team_id}.json",
token=params.token,
repo_type="dataset",
)
with open(user_fname, "r", encoding="utf-8") as f:
user_submission_info = json.load(f)
return user_submission_info
def upload_submission_info(params, user_submission_info):
user_submission_info_json = json.dumps(user_submission_info, indent=4)
user_submission_info_json_bytes = user_submission_info_json.encode("utf-8")
user_submission_info_json_buffer = io.BytesIO(user_submission_info_json_bytes)
api = HfApi(token=params.token)
api.upload_file(
path_or_fileobj=user_submission_info_json_buffer,
path_in_repo=f"submission_info/{params.team_id}.json",
repo_id=params.competition_id,
repo_type="dataset",
)
def update_submission_status(params, status):
user_submission_info = download_submission_info(params)
for submission in user_submission_info["submissions"]:
if submission["submission_id"] == params.submission_id:
submission["status"] = status
break
upload_submission_info(params, user_submission_info)
def update_submission_score(params, public_score, private_score):
user_submission_info = download_submission_info(params)
for submission in user_submission_info["submissions"]:
if submission["submission_id"] == params.submission_id:
submission["public_score"] = public_score
submission["private_score"] = private_score
submission["status"] = "done"
break
upload_submission_info(params, user_submission_info)
def monitor(func):
def wrapper(*args, **kwargs):
params = kwargs.get("params", None)
if params is None and len(args) > 0:
params = args[0]
try:
return func(*args, **kwargs)
except Exception as e:
error_message = f"""{func.__name__} has failed due to an exception: {traceback.format_exc()}"""
logger.error(error_message)
logger.error(str(e))
update_submission_status(params, "failed")
pause_space(params)
return wrapper
|