File size: 5,256 Bytes
12efa10
 
 
 
 
 
 
 
 
 
 
 
582e545
12efa10
 
 
 
 
 
f81f755
 
 
 
 
12efa10
 
 
 
 
 
 
 
 
 
 
 
f81f755
12efa10
 
f81f755
 
 
 
12efa10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f81f755
12efa10
 
f81f755
12efa10
 
 
f81f755
12efa10
261867e
 
 
12efa10
 
 
 
 
 
 
 
 
 
 
f81f755
12efa10
 
 
f81f755
 
 
 
 
12efa10
 
f81f755
12efa10
 
 
f81f755
12efa10
 
 
f81f755
12efa10
 
 
 
 
f81f755
12efa10
 
 
 
 
261867e
3b20ce8
f81f755
 
582e545
3b20ce8
14eb45b
 
3b20ce8
 
 
 
14eb45b
 
f81f755
14eb45b
 
f81f755
14eb45b
f81f755
3b20ce8
f81f755
3b20ce8
 
f81f755
 
14eb45b
3b20ce8
 
14eb45b
f81f755
 
14eb45b
261867e
1bbf089
 
 
 
 
 
 
f81f755
1bbf089
 
 
12efa10
 
 
f81f755
12efa10
8814dd6
12efa10
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
import json
import os
from datetime import datetime, timezone

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,
    #base_model: str,
    #revision: str,
    #precision: str,
    #weight_type: str,
    #model_type: str,
):
    global REQUESTED_MODELS
    global USERS_TO_SUBMISSION_DATES
    if not REQUESTED_MODELS:
        REQUESTED_MODELS, USERS_TO_SUBMISSION_DATES = already_submitted_models(EVAL_REQUESTS_PATH)

    user_name = ""
    model_path = model
    if "/" in model:
        user_name = model.split("/")[0]
        model_path = model.split("/")[1]

    #precision = precision.split(" ")[0]
    current_time = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")

    if not is_model_on_hub(model_name=model, token=TOKEN, test_tokenizer=True): #revision=revision
        return styled_error("Model does not exist on HF Hub. Please select a valid model name.")
    
    """
    if model_type is None or model_type == "":
        return styled_error("Please select a model type.")

    # Does the model actually exist?
    if revision == "":
        revision = "main"

    # Is the model on the hub?
    if weight_type in ["Delta", "Adapter"]:
        base_model_on_hub, error, _ = is_model_on_hub(model_name=base_model, revision=revision, token=TOKEN, test_tokenizer=True)
        if not base_model_on_hub:
            return styled_error(f'Base model "{base_model}" {error}')

    if not weight_type == "Adapter":
        model_on_hub, error, _ = is_model_on_hub(model_name=model, revision=revision, token=TOKEN, test_tokenizer=True)
        if not model_on_hub:
            return styled_error(f'Model "{model}" {error}')
    """
    # Is the model info correctly filled?
    try:
        model_info = API.model_info(repo_id=model)#, revision=revision
    except Exception:
        return styled_error("Could not get your model information. Please fill it up properly.")

    model_size = get_model_size(model_info=model_info)#, precision=precision

    if model_size>30:
        return styled_error("Due to limited GPU availability, evaluations for models larger than 30B are currently not automated. Please open a ticket here so we do it manually for you. https://huggingface.co/spaces/silma-ai/Arabic-Broad-Leaderboard/discussions")

    # Were the model card and license filled?
    try:
        license = model_info.cardData["license"]
    except Exception:
        return styled_error("Please select a license for your model")

    modelcard_OK, error_msg = check_model_card(model)
    if not modelcard_OK:
        return styled_error(error_msg)

    # Seems good, creating the eval
    print("Preparing a new eval")

    eval_entry = {
        "model": model,
        "model_sha": model_info.sha,
        #"base_model": base_model,
        #"revision": revision,
        #"precision": precision,
        #"weight_type": weight_type,
        "status": "PENDING",
        "submitted_time": current_time,
        #"model_type": model_type,
        "likes": model_info.likes,
        "params": model_size,
        "license": license,
        #"private": False,
    }

    # Check for duplicate submission
    if f"{model}" in REQUESTED_MODELS: #_{revision}_{precision}
        return styled_warning("This model has been already submitted.")

    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" #_{precision}_{weight_type}

    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)

    if len(queue_data) == 0:
        queue_data = []

    queue_data.append(eval_entry)

    print(queue_data)

    #with open(queue_file, "w") as f:
    #    json.dump(queue_data, f)

    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)


    return styled_message(
        "Your request has been submitted to the evaluation queue!\nPlease wait for up to an 15 minutes for the model to show in the PENDING list."
    )