|
import gradio as gr |
|
from huggingface_hub import list_models |
|
from sentence_transformers import SentenceTransformer, util |
|
import numpy as np |
|
|
|
|
|
semantic_model = SentenceTransformer('all-MiniLM-L6-v2') |
|
|
|
|
|
def fetch_models_from_hf(task_filter, limit=10): |
|
models = list_models(filter=task_filter, limit=limit) |
|
model_data = [ |
|
{ |
|
"model_id": model.modelId, |
|
"tags": model.tags, |
|
"downloads": model.downloads, |
|
"likes": model.likes, |
|
"last_modified": model.lastModified |
|
} |
|
for model in models |
|
] |
|
return model_data |
|
|
|
|
|
def normalize(values): |
|
min_val, max_val = min(values), max(values) |
|
return [(v - min_val) / (max_val - min_val) if max_val > min_val else 0 for v in values] |
|
|
|
|
|
def get_weighted_recommendations_from_hf(task_filter, weights=None): |
|
if weights is None: |
|
weights = {"similarity": 0.7, "downloads": 0.2, "likes": 0.1} |
|
|
|
model_data = fetch_models_from_hf(task_filter) |
|
|
|
if len(model_data) == 0: |
|
return "No models found for the specified task filter." |
|
|
|
model_ids = [model["model_id"] for model in model_data] |
|
model_tags = [' '.join(model["tags"]) for model in model_data] |
|
|
|
|
|
user_query = f"best model for {task_filter}" |
|
|
|
model_embeddings = semantic_model.encode(model_tags) |
|
user_embedding = semantic_model.encode(user_query) |
|
|
|
similarities = util.pytorch_cos_sim(user_embedding, model_embeddings)[0].numpy() |
|
|
|
downloads = normalize([model["downloads"] for model in model_data]) |
|
likes = normalize([model["likes"] for model in model_data]) |
|
|
|
final_scores = [] |
|
for i in range(len(model_data)): |
|
score = ( |
|
weights["similarity"] * similarities[i] + |
|
weights["downloads"] * downloads[i] + |
|
weights["likes"] * likes[i] |
|
) |
|
final_scores.append((model_ids[i], score, similarities[i], downloads[i], likes[i])) |
|
|
|
ranked_recommendations = sorted(final_scores, key=lambda x: x[1], reverse=True) |
|
|
|
result = [] |
|
for rank, (model_id, final_score, sim, downloads, likes) in enumerate(ranked_recommendations, 1): |
|
result.append(f"Rank {rank}: Model ID: {model_id}") |
|
|
|
return '\n'.join(result) |
|
|
|
|
|
def respond(task_filter, history=None, weights=None): |
|
|
|
return get_weighted_recommendations_from_hf(task_filter, weights) |
|
|
|
|
|
demo = gr.Interface( |
|
fn=respond, |
|
inputs=[ |
|
gr.Textbox(label="Task Filter", placeholder="Enter the task, e.g., text-classification, atari, question-answering"), |
|
gr.Textbox(value="You are using the Hugging Face model recommender system.", label="System message") |
|
], |
|
outputs=gr.Textbox(label="Model Recommendations"), |
|
title="Hugging Face Model Recommender", |
|
description="This chatbot recommends models from Hugging Face based on the task or tag you're interested in. It combines various attributes of a model on hub like downloads, likes, etc. to suggest models with ranks from 1-10. In general term basically it intelligently combines the search filter for recommendation" |
|
) |
|
|
|
if __name__ == "__main__": |
|
demo.launch(share=True) |
|
|