Spaces:
Running
Running
| import argparse | |
| import json | |
| import os | |
| import shutil | |
| import subprocess | |
| from huggingface_hub import HfApi, snapshot_download | |
| from loguru import logger | |
| from competitions import utils | |
| from competitions.compute_metrics import compute_metrics | |
| from competitions.params import EvalParams | |
| def parse_args(): | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument("--config", type=str, required=True) | |
| return parser.parse_args() | |
| def upload_submission_file(params, file_path): | |
| logger.info("Uploading submission file") | |
| pass | |
| def generate_submission_file(params): | |
| logger.info("Downloading submission dataset") | |
| submission_dir = snapshot_download( | |
| repo_id=params.submission_repo, | |
| local_dir=params.output_path, | |
| token=os.environ.get("USER_TOKEN"), | |
| repo_type="model", | |
| ) | |
| # submission_dir has a script.py file | |
| # start a subprocess to run the script.py | |
| # the script.py will generate a submission.csv file in the submission_dir | |
| # push the submission.csv file to the repo using upload_submission_file | |
| logger.info("Generating submission file") | |
| # Copy socket-kit.so to submission_dir | |
| shutil.copyfile("socket-kit.so", f"{submission_dir}/socket-kit.so") | |
| # Define your command | |
| cmd = "python script.py" | |
| socket_kit_path = os.path.abspath(f"{submission_dir}/socket-kit.so") | |
| # Copy the current environment and modify it | |
| env = os.environ.copy() | |
| env["LD_PRELOAD"] = socket_kit_path | |
| # Start the subprocess | |
| process = subprocess.Popen(cmd, cwd=submission_dir, shell=True, env=env) | |
| # Wait for the process to complete or timeout | |
| try: | |
| process.wait(timeout=params.time_limit) | |
| except subprocess.TimeoutExpired: | |
| logger.info(f"Process exceeded {params.time_limit} seconds time limit. Terminating...") | |
| process.kill() | |
| process.wait() | |
| # Check if process terminated due to timeout | |
| if process.returncode and process.returncode != 0: | |
| logger.error("Subprocess didn't terminate successfully") | |
| api = HfApi(token=params.token) | |
| api.upload_file( | |
| path_or_fileobj=f"{submission_dir}/submission.csv", | |
| path_in_repo=f"submissions/{params.team_id}-{params.submission_id}.csv", | |
| repo_id=params.competition_id, | |
| repo_type="dataset", | |
| ) | |
| def run(params): | |
| logger.info(params) | |
| if isinstance(params, dict): | |
| params = EvalParams(**params) | |
| utils.update_submission_status(params, "processing") | |
| if params.competition_type == "code": | |
| generate_submission_file(params) | |
| evaluation = compute_metrics(params) | |
| utils.update_submission_score(params, evaluation["public_score"], evaluation["private_score"]) | |
| utils.update_submission_status(params, "success") | |
| utils.pause_space(params) | |
| if __name__ == "__main__": | |
| args = parse_args() | |
| _params = json.load(open(args.config, encoding="utf-8")) | |
| _params = EvalParams(**_params) | |
| run(_params) | |