| 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 MOONLANDING_URL | |
| def user_authentication(token): | |
| headers = {} | |
| cookies = {} | |
| if token.startswith("hf_"): | |
| headers["Authorization"] = f"Bearer {token}" | |
| else: | |
| cookies = {"token": token} | |
| try: | |
| response = requests.get( | |
| MOONLANDING_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 | |