karimouda's picture
Code cleanup
dcc7731
import json
import os
from datetime import datetime, timedelta, timezone
import gradio as gr
from src.display.formatting import styled_error, styled_message, styled_warning
from src.envs import API, EVAL_REQUESTS_PATH, TOKEN, QUEUE_REPO
from src.submission.check_validity import (
already_submitted_models,
check_model_card,
get_model_size,
is_model_on_hub,
)
from huggingface_hub import hf_hub_download
REQUESTED_MODELS = None
USERS_TO_SUBMISSION_DATES = None
def add_new_eval(
model: str,
progress=gr.Progress()
):
global REQUESTED_MODELS
global USERS_TO_SUBMISSION_DATES
if not REQUESTED_MODELS:
REQUESTED_MODELS, USERS_TO_SUBMISSION_DATES = already_submitted_models(EVAL_REQUESTS_PATH)
yield "..."
user_name = ""
model_path = model
if "/" in model:
user_name = model.split("/")[0]
model_path = model.split("/")[1]
current_time = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
progress(0.1, desc=f"Checking model {model} on hub")
if not is_model_on_hub(model_name=model, token=TOKEN, test_tokenizer=True):
yield styled_error("Model does not exist on HF Hub. Please select a valid model name.")
return
progress(0.2, desc=f"Checking for banned orgs")
##check for org banning
banned_orgs = [{
'org_name':'TEMPLATE',
'banning_reason':'Submitting contaminated models'
}]
if user_name in [banned_org['org_name'] for banned_org in banned_orgs]:
yield styled_error(
f"Your org \"{user_name}\" is banned from submitting models on ABL. If you think this is a mistake then please contact [email protected]"
)
return
# Is the model info correctly filled?
try:
model_info = API.model_info(repo_id=model)
except Exception:
yield styled_error("Could not get your model information. Please fill it up properly.")
return
progress(0.3, desc=f"Checking model size")
model_size = get_model_size(model_info=model_info)
if model_size>15:
yield styled_error("We currently accept community-submitted models up to 15 billion parameters only. If you represent an organization then please contact us at [email protected]")
return
# Were the model card and license filled?
try:
license = model_info.cardData["license"]
except Exception:
yield styled_error("Please select a license for your model")
return
progress(0.5, desc=f"Checking model card")
modelcard_OK, error_msg = check_model_card(model)
if not modelcard_OK:
yield styled_error(error_msg)
return
##check if org have submitted in the last 30 days
progress(0.6, desc=f"Checking last submission date")
previous_user_submissions = USERS_TO_SUBMISSION_DATES.get(user_name)
if previous_user_submissions:
previous_user_submission_dates = [datetime.strptime(date.replace("T"," ").split(" ")[0], "%Y-%m-%d") for date in previous_user_submissions]
previous_user_submission_dates.sort(reverse=True)
most_recent_submission = previous_user_submission_dates[0]
time_since_last_submission = datetime.now() - most_recent_submission
if time_since_last_submission < timedelta(days=30):
yield styled_warning(
f"Your org \"{user_name}\" have already submitted a model in the last 30 days. Please wait before submitting another model. For exceptions please contact [email protected]"
)
return
progress(0.8, desc=f"Checking same model submissions")
# Check for duplicate submission
if f"{model}" in REQUESTED_MODELS:
yield styled_warning("This model has already been submitted.")
return
# Seems good, creating the eval
print("Preparing a new eval")
eval_entry = {
"model": model,
"model_sha": model_info.sha,
"status": "PENDING",
"submitted_time": current_time,
"likes": model_info.likes,
"params": model_size,
"license": license,
}
progress(0.9, desc=f"Creating Eval ...")
print("Creating eval file")
OUT_DIR = f"{EVAL_REQUESTS_PATH}/{user_name}"
os.makedirs(OUT_DIR, exist_ok=True)
out_path = f"{OUT_DIR}/{model_path}_eval_request.json"
with open(out_path, "w") as f:
f.write(json.dumps(eval_entry))
##update queue file
queue_file_path = "./eval_queue.json"
## download queue_file from repo using HuggingFace hub API, update it and upload again
queue_file = hf_hub_download(
filename=queue_file_path,
repo_id=QUEUE_REPO,
repo_type="space",
token=TOKEN
)
with open(queue_file, "r") as f:
queue_data = json.load(f)
queue_len = len(queue_data)
if queue_len == 0:
queue_data = []
elif queue_len >= 1:
yield styled_warning("The evaluation queue is full at the moment. Please try again in one hour")
return
queue_data.append(eval_entry)
print("Updating eval queue file")
API.upload_file(
path_or_fileobj=json.dumps(queue_data, indent=2).encode("utf-8"),
path_in_repo=queue_file_path,
repo_id=QUEUE_REPO,
repo_type="space",
commit_message=f"Add {model} to eval queue"
)
print("Uploading eval file")
API.upload_file(
path_or_fileobj=out_path,
path_in_repo=out_path,
repo_id=QUEUE_REPO,
repo_type="space",
commit_message=f"Add {model} request file",
)
# Remove the local file
os.remove(out_path)
yield styled_message(
"✅ Good news! Your model has been added to the evaluation queue.<br>If you do not see the results after 3 hours then please let us know by opening a community discussion."
)
return