|
import os |
|
import yaml |
|
import gradio as gr |
|
import pandas as pd |
|
|
|
|
|
class Model: |
|
def __init__(self, model_data): |
|
""" |
|
Initializes the model with the provided model_data dictionary (from YAML). |
|
""" |
|
self.data = model_data |
|
|
|
def get_name(self): |
|
return self.data.get("release", {}).get("name", "Unknown") |
|
|
|
def get_producer(self): |
|
return self.data.get("release", {}).get("producer", "Unknown") |
|
|
|
def get_classification(self): |
|
return self.data.get("release", {}).get("classification", "Unclassified") |
|
|
|
def get_last_updated(self): |
|
return self.data.get("release", {}).get("date", "Unknown") |
|
|
|
def get_badge(self): |
|
return self.data.get("release", {}).get("badge", "") |
|
|
|
|
|
def load_all_models(directory): |
|
""" |
|
Load all models from the specified directory. |
|
Each model is expected to have a .yml file. |
|
""" |
|
models_data = [] |
|
|
|
for filename in os.listdir(directory): |
|
if filename.endswith(".yml"): |
|
filepath = os.path.join(directory, filename) |
|
|
|
with open(filepath, 'r', encoding='utf-8') as file: |
|
model_data = yaml.safe_load(file) |
|
model = Model(model_data) |
|
|
|
|
|
models_data.append({ |
|
"Name": model.get_name(), |
|
"Organization": model.get_producer(), |
|
"Classification": model.get_classification(), |
|
"Last Updated": model.get_last_updated(), |
|
"Badge": model.get_badge() |
|
}) |
|
|
|
return models_data |
|
|
|
|
|
def get_model_table(directory): |
|
""" |
|
Get a table of all models and their information. |
|
""" |
|
models_data = load_all_models(directory) |
|
|
|
|
|
df = pd.DataFrame(models_data) |
|
return df |
|
|
|
|
|
|
|
directory = "./models" |
|
global_df = get_model_table(directory) |
|
|
|
|
|
def filter_data(name_query, org_query): |
|
""" |
|
Filter the global dataframe based on the search queries. |
|
""" |
|
df = global_df.copy() |
|
if name_query: |
|
df = df[df['Name'].str.contains(name_query, case=False, na=False)] |
|
if org_query: |
|
df = df[df['Organization'].str.contains(org_query, case=False, na=False)] |
|
return df.reset_index(drop=True) |
|
|
|
def paginate_data(df, page_size, page_number): |
|
""" |
|
Paginate the filtered dataframe. |
|
""" |
|
total_rows = len(df) |
|
total_pages = (total_rows + page_size - 1) // page_size |
|
|
|
|
|
if page_number < 1: |
|
page_number = 1 |
|
elif page_number > total_pages: |
|
page_number = total_pages |
|
|
|
start_row = (page_number - 1) * page_size |
|
end_row = start_row + page_size |
|
page_data = df.iloc[start_row:end_row] |
|
return page_data, total_pages |
|
|
|
|
|
def update_table(name_query, org_query, page_size, page_number): |
|
""" |
|
Update the table based on search queries and pagination. |
|
""" |
|
filtered_df = filter_data(name_query, org_query) |
|
page_size = int(page_size) |
|
page_number = int(page_number) |
|
page_data, total_pages = paginate_data(filtered_df, page_size, page_number) |
|
return page_data, total_pages |
|
|
|
def go_to_page(name_query, org_query, page_size, go_to_page_number): |
|
""" |
|
Go to a specific page number. |
|
""" |
|
return update_table(name_query, org_query, page_size, go_to_page_number) |
|
|
|
|
|
with gr.Blocks() as demo: |
|
|
|
gr.Markdown(""" |
|
# Model Openness Framework (MOF) |
|
|
|
The Generative AI Commons at the LF AI & Data Foundation has designed and developed the **Model Openness Framework (MOF)**, a comprehensive system for evaluating and classifying the completeness and openness of machine learning models. This framework assesses which components of the model development lifecycle are publicly released and under what licenses, ensuring an objective evaluation. The framework is constantly evolving. Please participate in the Generative AI Commons to provide feedback and suggestions. |
|
|
|
## Model Openness Tool (MOT) |
|
|
|
To implement the MOF, we’ve created the **Model Openness Tool (MOT)**. This tool evaluates each criterion from the MOF and generates a score based on how well each item is met. The MOT provides a practical, user-friendly way to apply the MOF framework to your model and produce a clear, self-service score. |
|
|
|
### How It Works |
|
|
|
The MOT presents users with 16 questions about their model. Users need to provide detailed responses for each question. Based on these inputs, the tool calculates a score, classifying the model’s openness on a scale of 1, 2, or 3. |
|
|
|
### Why We Developed MOT |
|
|
|
Our goal in developing the MOT was to offer a straightforward tool for evaluating machine learning models against the MOF framework. This tool helps users understand what components are included with each model and the licenses associated with those components, providing clarity on what can and cannot be done with the model and its parts. |
|
|
|
**Explore the Model Openness Framework and try the [Model Openness Tool](https://mot.isitopen.ai/) today to see how your models measure up.** |
|
""") |
|
|
|
|
|
with gr.Row(): |
|
name_query = gr.Textbox(label="Search by Name") |
|
org_query = gr.Textbox(label="Search by Organization") |
|
|
|
|
|
with gr.Column(): |
|
|
|
initial_page_data, initial_total_pages = paginate_data(global_df, page_size=50, page_number=1) |
|
table_output = gr.Dataframe( |
|
value=initial_page_data, |
|
headers=["Name", "Organization", "Classification", "Last Updated", "Badge"], |
|
label="Models Table" |
|
) |
|
|
|
|
|
with gr.Row(): |
|
prev_button = gr.Button("← Previous") |
|
next_button = gr.Button("Next →") |
|
page_numbers = gr.State(value=1) |
|
total_pages_text = gr.Markdown(value=f"Page 1 of {initial_total_pages}") |
|
go_to_input = gr.Number(label="Go to Page", value=1, precision=0) |
|
go_to_button = gr.Button("Go") |
|
|
|
|
|
def update_pagination(name_query, org_query, page_size, page_number): |
|
page_data, total_pages = update_table(name_query, org_query, page_size, page_number) |
|
total_pages_text.value = f"Page {page_number} of {total_pages}" |
|
return page_data, total_pages_text.value, page_number |
|
|
|
|
|
def on_search_change(name_query, org_query): |
|
page_data, total_pages = update_table(name_query, org_query, page_size=50, page_number=1) |
|
total_pages_text.value = f"Page 1 of {total_pages}" |
|
return page_data, total_pages_text.value, 1 |
|
|
|
name_query.change( |
|
fn=on_search_change, |
|
inputs=[name_query, org_query], |
|
outputs=[table_output, total_pages_text, page_numbers] |
|
) |
|
org_query.change( |
|
fn=on_search_change, |
|
inputs=[name_query, org_query], |
|
outputs=[table_output, total_pages_text, page_numbers] |
|
) |
|
|
|
|
|
def on_prev(name_query, org_query, page_size, current_page): |
|
new_page = max(1, current_page - 1) |
|
return update_pagination(name_query, org_query, page_size, new_page) |
|
|
|
prev_button.click( |
|
fn=on_prev, |
|
inputs=[name_query, org_query, gr.State(value=50), page_numbers], |
|
outputs=[table_output, total_pages_text, page_numbers] |
|
) |
|
|
|
|
|
def on_next(name_query, org_query, page_size, current_page): |
|
new_page = current_page + 1 |
|
return update_pagination(name_query, org_query, page_size, new_page) |
|
|
|
next_button.click( |
|
fn=on_next, |
|
inputs=[name_query, org_query, gr.State(value=50), page_numbers], |
|
outputs=[table_output, total_pages_text, page_numbers] |
|
) |
|
|
|
|
|
def on_go(name_query, org_query, page_size, go_to_page_number): |
|
return update_pagination(name_query, org_query, page_size, int(go_to_page_number)) |
|
|
|
go_to_button.click( |
|
fn=on_go, |
|
inputs=[name_query, org_query, gr.State(value=50), go_to_input], |
|
outputs=[table_output, total_pages_text, page_numbers] |
|
) |
|
|
|
|
|
demo.launch() |
|
|