Spaces:
Running
Running
David Pomerenke
commited on
Commit
·
d91b022
1
Parent(s):
c1db7ba
Language selection checkboxes & filtering in backend
Browse files- evals/backend.py +14 -4
- evals/main.py +1 -2
- evals/models.py +1 -0
- evals/tables.py +0 -13
- frontend/src/App.js +11 -38
- frontend/src/components/AutoComplete.js +0 -1
- frontend/src/components/LanguageTable.js +12 -1
- frontend/src/components/ModelTable.js +15 -3
- results.json +0 -0
evals/backend.py
CHANGED
|
@@ -3,11 +3,12 @@ import json
|
|
| 3 |
import numpy as np
|
| 4 |
import pandas as pd
|
| 5 |
import uvicorn
|
| 6 |
-
from fastapi import FastAPI
|
| 7 |
from fastapi.middleware.cors import CORSMiddleware
|
| 8 |
from fastapi.middleware.gzip import GZipMiddleware
|
| 9 |
from fastapi.responses import JSONResponse
|
| 10 |
from fastapi.staticfiles import StaticFiles
|
|
|
|
| 11 |
from languages import languages
|
| 12 |
from models import models
|
| 13 |
from tables import aggregate, make_country_table, make_language_table, make_model_table
|
|
@@ -18,7 +19,7 @@ app.add_middleware(CORSMiddleware, allow_origins=["*"])
|
|
| 18 |
app.add_middleware(GZipMiddleware, minimum_size=1000)
|
| 19 |
|
| 20 |
with open("results.json", "r") as f:
|
| 21 |
-
results = json.load(f)
|
| 22 |
|
| 23 |
|
| 24 |
def serialize(df):
|
|
@@ -26,8 +27,17 @@ def serialize(df):
|
|
| 26 |
|
| 27 |
|
| 28 |
@app.post("/api/data")
|
| 29 |
-
def data():
|
| 30 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 31 |
model_table = make_model_table(model_results, models)
|
| 32 |
language_table = make_language_table(lang_results, languages)
|
| 33 |
datasets_df = pd.read_json("data/datasets.json")
|
|
|
|
| 3 |
import numpy as np
|
| 4 |
import pandas as pd
|
| 5 |
import uvicorn
|
| 6 |
+
from fastapi import FastAPI, Request
|
| 7 |
from fastapi.middleware.cors import CORSMiddleware
|
| 8 |
from fastapi.middleware.gzip import GZipMiddleware
|
| 9 |
from fastapi.responses import JSONResponse
|
| 10 |
from fastapi.staticfiles import StaticFiles
|
| 11 |
+
|
| 12 |
from languages import languages
|
| 13 |
from models import models
|
| 14 |
from tables import aggregate, make_country_table, make_language_table, make_model_table
|
|
|
|
| 19 |
app.add_middleware(GZipMiddleware, minimum_size=1000)
|
| 20 |
|
| 21 |
with open("results.json", "r") as f:
|
| 22 |
+
results = pd.DataFrame(json.load(f))
|
| 23 |
|
| 24 |
|
| 25 |
def serialize(df):
|
|
|
|
| 27 |
|
| 28 |
|
| 29 |
@app.post("/api/data")
|
| 30 |
+
async def data(request: Request):
|
| 31 |
+
body = await request.body()
|
| 32 |
+
data = json.loads(body)
|
| 33 |
+
selected_languages = data.get("selectedLanguages", {})
|
| 34 |
+
df = results
|
| 35 |
+
if selected_languages:
|
| 36 |
+
df = df[df["bcp_47"].isin(l["bcp_47"] for l in selected_languages)]
|
| 37 |
+
|
| 38 |
+
_, lang_results, model_results, task_results = aggregate(df)
|
| 39 |
+
print(lang_results)
|
| 40 |
+
# lang_results = pd.merge(languages, lang_results, on="bcp_47", how="outer")
|
| 41 |
model_table = make_model_table(model_results, models)
|
| 42 |
language_table = make_language_table(lang_results, languages)
|
| 43 |
datasets_df = pd.read_json("data/datasets.json")
|
evals/main.py
CHANGED
|
@@ -1,10 +1,8 @@
|
|
| 1 |
import asyncio
|
| 2 |
import json
|
| 3 |
|
| 4 |
-
import numpy as np
|
| 5 |
from languages import languages
|
| 6 |
from models import model_fast, models
|
| 7 |
-
from rich import print
|
| 8 |
from tasks import tasks
|
| 9 |
from tqdm.asyncio import tqdm_asyncio
|
| 10 |
|
|
@@ -39,6 +37,7 @@ async def evaluate():
|
|
| 39 |
|
| 40 |
async def main():
|
| 41 |
results = await evaluate()
|
|
|
|
| 42 |
with open("results.json", "w") as f:
|
| 43 |
json.dump(results, f, indent=2, ensure_ascii=False)
|
| 44 |
|
|
|
|
| 1 |
import asyncio
|
| 2 |
import json
|
| 3 |
|
|
|
|
| 4 |
from languages import languages
|
| 5 |
from models import model_fast, models
|
|
|
|
| 6 |
from tasks import tasks
|
| 7 |
from tqdm.asyncio import tqdm_asyncio
|
| 8 |
|
|
|
|
| 37 |
|
| 38 |
async def main():
|
| 39 |
results = await evaluate()
|
| 40 |
+
results = [r for group in results for r in group]
|
| 41 |
with open("results.json", "w") as f:
|
| 42 |
json.dump(results, f, indent=2, ensure_ascii=False)
|
| 43 |
|
evals/models.py
CHANGED
|
@@ -96,6 +96,7 @@ models = pd.DataFrame(models, columns=["id"])
|
|
| 96 |
|
| 97 |
api = HfApi()
|
| 98 |
|
|
|
|
| 99 |
def get_metadata(id):
|
| 100 |
try:
|
| 101 |
info = api.model_info(id)
|
|
|
|
| 96 |
|
| 97 |
api = HfApi()
|
| 98 |
|
| 99 |
+
@cache
|
| 100 |
def get_metadata(id):
|
| 101 |
try:
|
| 102 |
info = api.model_info(id)
|
evals/tables.py
CHANGED
|
@@ -5,7 +5,6 @@ make_country_table = make_country_table
|
|
| 5 |
|
| 6 |
|
| 7 |
def aggregate(results):
|
| 8 |
-
results = pd.DataFrame([r for rs in results for r in rs])
|
| 9 |
results = (
|
| 10 |
results.groupby(["model", "bcp_47", "task", "metric"]).mean().reset_index()
|
| 11 |
)
|
|
@@ -14,7 +13,6 @@ def aggregate(results):
|
|
| 14 |
.agg({"score": "mean", "model": "nunique"})
|
| 15 |
.reset_index()
|
| 16 |
)
|
| 17 |
-
# lang_results = pd.merge(languages, lang_results, on="bcp_47", how="outer")
|
| 18 |
model_results = (
|
| 19 |
results.groupby(["model", "task", "metric"])
|
| 20 |
.agg({"score": "mean", "bcp_47": "nunique"})
|
|
@@ -32,14 +30,6 @@ def mean(lst):
|
|
| 32 |
return sum(lst) / len(lst) if lst else None
|
| 33 |
|
| 34 |
|
| 35 |
-
def fmt_name(s):
|
| 36 |
-
return (
|
| 37 |
-
" ".join(w.capitalize() for w in s.split("-"))
|
| 38 |
-
.replace("Gpt", "GPT")
|
| 39 |
-
.replace("ai", "AI")
|
| 40 |
-
)
|
| 41 |
-
|
| 42 |
-
|
| 43 |
def make_model_table(df, models):
|
| 44 |
df["task_metric"] = df["task"] + "_" + df["metric"]
|
| 45 |
df = df.drop(columns=["task", "metric"])
|
|
@@ -51,13 +41,10 @@ def make_model_table(df, models):
|
|
| 51 |
df[row] = df[row].round(2)
|
| 52 |
df = pd.merge(df, models, left_on="model", right_on="id", how="left")
|
| 53 |
df["creation_date"] = df["creation_date"].dt.strftime("%Y-%m-%d")
|
| 54 |
-
df["provider"] = df["model"].str.split("/").str[0].apply(fmt_name)
|
| 55 |
-
df["model"] = df["model"].str.split("/").str[1].apply(fmt_name)
|
| 56 |
df["rank"] = df.index + 1
|
| 57 |
df = df[
|
| 58 |
[
|
| 59 |
"rank",
|
| 60 |
-
"provider",
|
| 61 |
"model",
|
| 62 |
"hf_id",
|
| 63 |
"creation_date",
|
|
|
|
| 5 |
|
| 6 |
|
| 7 |
def aggregate(results):
|
|
|
|
| 8 |
results = (
|
| 9 |
results.groupby(["model", "bcp_47", "task", "metric"]).mean().reset_index()
|
| 10 |
)
|
|
|
|
| 13 |
.agg({"score": "mean", "model": "nunique"})
|
| 14 |
.reset_index()
|
| 15 |
)
|
|
|
|
| 16 |
model_results = (
|
| 17 |
results.groupby(["model", "task", "metric"])
|
| 18 |
.agg({"score": "mean", "bcp_47": "nunique"})
|
|
|
|
| 30 |
return sum(lst) / len(lst) if lst else None
|
| 31 |
|
| 32 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 33 |
def make_model_table(df, models):
|
| 34 |
df["task_metric"] = df["task"] + "_" + df["metric"]
|
| 35 |
df = df.drop(columns=["task", "metric"])
|
|
|
|
| 41 |
df[row] = df[row].round(2)
|
| 42 |
df = pd.merge(df, models, left_on="model", right_on="id", how="left")
|
| 43 |
df["creation_date"] = df["creation_date"].dt.strftime("%Y-%m-%d")
|
|
|
|
|
|
|
| 44 |
df["rank"] = df.index + 1
|
| 45 |
df = df[
|
| 46 |
[
|
| 47 |
"rank",
|
|
|
|
| 48 |
"model",
|
| 49 |
"hf_id",
|
| 50 |
"creation_date",
|
frontend/src/App.js
CHANGED
|
@@ -15,20 +15,11 @@ function App () {
|
|
| 15 |
const [loading, setLoading] = useState(true)
|
| 16 |
const [error, setError] = useState(null)
|
| 17 |
const [allSuggestions, setAllSuggestions] = useState([])
|
| 18 |
-
const [
|
| 19 |
-
language_name: { value: null, matchMode: FilterMatchMode.EQUALS }, // via global search
|
| 20 |
-
family: { value: null, matchMode: FilterMatchMode.IN },
|
| 21 |
-
speakers: { value: null, matchMode: FilterMatchMode.BETWEEN }
|
| 22 |
-
})
|
| 23 |
-
const [modelFilters, setModelFilters] = useState({
|
| 24 |
-
model: { value: null, matchMode: FilterMatchMode.ENDS_WITH }, // via global search
|
| 25 |
-
type: { value: null, matchMode: FilterMatchMode.IN },
|
| 26 |
-
size: { value: null, matchMode: FilterMatchMode.BETWEEN }
|
| 27 |
-
})
|
| 28 |
useEffect(() => {
|
| 29 |
fetch('/api/data', {
|
| 30 |
method: 'POST',
|
| 31 |
-
|
| 32 |
})
|
| 33 |
.then(response => {
|
| 34 |
if (!response.ok) {
|
|
@@ -44,7 +35,7 @@ function App () {
|
|
| 44 |
setError(err.message)
|
| 45 |
setLoading(false)
|
| 46 |
})
|
| 47 |
-
}, [
|
| 48 |
|
| 49 |
useEffect(() => {
|
| 50 |
if (data) {
|
|
@@ -52,14 +43,15 @@ function App () {
|
|
| 52 |
type: 'Model',
|
| 53 |
value: item.model,
|
| 54 |
detail: item.provider,
|
| 55 |
-
searchText: item.
|
| 56 |
}))
|
| 57 |
const languages = data.language_table.map(item => ({
|
| 58 |
type: 'Language',
|
| 59 |
value: item.autonym,
|
| 60 |
detail: item.language_name,
|
| 61 |
searchText:
|
| 62 |
-
item.language_name.toLowerCase() + ' ' + item.autonym.toLowerCase()
|
|
|
|
| 63 |
}))
|
| 64 |
const datasets = data.dataset_table.map(item => ({
|
| 65 |
type: 'Dataset',
|
|
@@ -107,25 +99,10 @@ function App () {
|
|
| 107 |
<AutoComplete
|
| 108 |
allSuggestions={allSuggestions}
|
| 109 |
onComplete={item => {
|
| 110 |
-
|
| 111 |
-
item.type === 'Language' ? item.detail : null
|
| 112 |
-
const modelValue = item.type === 'Model' ? item.value : null
|
| 113 |
-
setLanguageFilters(prevFilters => ({
|
| 114 |
-
...prevFilters,
|
| 115 |
-
language_name: {
|
| 116 |
-
value: languageValue,
|
| 117 |
-
matchMode: FilterMatchMode.EQUALS
|
| 118 |
-
}
|
| 119 |
-
}))
|
| 120 |
-
setModelFilters(prevFilters => ({
|
| 121 |
-
...prevFilters,
|
| 122 |
-
model: {
|
| 123 |
-
value: modelValue,
|
| 124 |
-
matchMode: FilterMatchMode.ENDS_WITH
|
| 125 |
-
}
|
| 126 |
-
}))
|
| 127 |
}}
|
| 128 |
/>
|
|
|
|
| 129 |
</header>
|
| 130 |
<main
|
| 131 |
style={{
|
|
@@ -152,11 +129,7 @@ function App () {
|
|
| 152 |
maxWidth: 'min(100vw, 800px)'
|
| 153 |
}}
|
| 154 |
>
|
| 155 |
-
<ModelTable
|
| 156 |
-
data={data.model_table}
|
| 157 |
-
filters={modelFilters}
|
| 158 |
-
setFilters={setModelFilters}
|
| 159 |
-
/>
|
| 160 |
</div>
|
| 161 |
<div
|
| 162 |
style={{
|
|
@@ -166,8 +139,8 @@ function App () {
|
|
| 166 |
>
|
| 167 |
<LanguageTable
|
| 168 |
data={data.language_table}
|
| 169 |
-
|
| 170 |
-
|
| 171 |
/>
|
| 172 |
</div>
|
| 173 |
<div
|
|
|
|
| 15 |
const [loading, setLoading] = useState(true)
|
| 16 |
const [error, setError] = useState(null)
|
| 17 |
const [allSuggestions, setAllSuggestions] = useState([])
|
| 18 |
+
const [selectedLanguages, setSelectedLanguages] = useState([])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
useEffect(() => {
|
| 20 |
fetch('/api/data', {
|
| 21 |
method: 'POST',
|
| 22 |
+
body: JSON.stringify({ selectedLanguages })
|
| 23 |
})
|
| 24 |
.then(response => {
|
| 25 |
if (!response.ok) {
|
|
|
|
| 35 |
setError(err.message)
|
| 36 |
setLoading(false)
|
| 37 |
})
|
| 38 |
+
}, [selectedLanguages])
|
| 39 |
|
| 40 |
useEffect(() => {
|
| 41 |
if (data) {
|
|
|
|
| 43 |
type: 'Model',
|
| 44 |
value: item.model,
|
| 45 |
detail: item.provider,
|
| 46 |
+
searchText: item.model.toLowerCase()
|
| 47 |
}))
|
| 48 |
const languages = data.language_table.map(item => ({
|
| 49 |
type: 'Language',
|
| 50 |
value: item.autonym,
|
| 51 |
detail: item.language_name,
|
| 52 |
searchText:
|
| 53 |
+
item.language_name.toLowerCase() + ' ' + item.autonym.toLowerCase(),
|
| 54 |
+
bcp_47: item.bcp_47
|
| 55 |
}))
|
| 56 |
const datasets = data.dataset_table.map(item => ({
|
| 57 |
type: 'Dataset',
|
|
|
|
| 99 |
<AutoComplete
|
| 100 |
allSuggestions={allSuggestions}
|
| 101 |
onComplete={item => {
|
| 102 |
+
if (item.type === 'Language') setSelectedLanguages(() => [item])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 103 |
}}
|
| 104 |
/>
|
| 105 |
+
<pre>{JSON.stringify(selectedLanguages, null, 2)}</pre>
|
| 106 |
</header>
|
| 107 |
<main
|
| 108 |
style={{
|
|
|
|
| 129 |
maxWidth: 'min(100vw, 800px)'
|
| 130 |
}}
|
| 131 |
>
|
| 132 |
+
<ModelTable data={data.model_table} />
|
|
|
|
|
|
|
|
|
|
|
|
|
| 133 |
</div>
|
| 134 |
<div
|
| 135 |
style={{
|
|
|
|
| 139 |
>
|
| 140 |
<LanguageTable
|
| 141 |
data={data.language_table}
|
| 142 |
+
selectedLanguages={selectedLanguages}
|
| 143 |
+
setSelectedLanguages={setSelectedLanguages}
|
| 144 |
/>
|
| 145 |
</div>
|
| 146 |
<div
|
frontend/src/components/AutoComplete.js
CHANGED
|
@@ -5,7 +5,6 @@ const AutoComplete = ({ allSuggestions, onComplete }) => {
|
|
| 5 |
const [suggestions, setSuggestions] = useState([])
|
| 6 |
|
| 7 |
const search = e => {
|
| 8 |
-
console.log(allSuggestions)
|
| 9 |
const matches = allSuggestions.filter(suggestion =>
|
| 10 |
suggestion.searchText.includes(e.query.toLowerCase())
|
| 11 |
)
|
|
|
|
| 5 |
const [suggestions, setSuggestions] = useState([])
|
| 6 |
|
| 7 |
const search = e => {
|
|
|
|
| 8 |
const matches = allSuggestions.filter(suggestion =>
|
| 9 |
suggestion.searchText.includes(e.query.toLowerCase())
|
| 10 |
)
|
frontend/src/components/LanguageTable.js
CHANGED
|
@@ -6,7 +6,13 @@ import { useState, useEffect } from 'react'
|
|
| 6 |
import { Slider } from 'primereact/slider'
|
| 7 |
import ScoreField from './ScoreField'
|
| 8 |
|
| 9 |
-
const LanguageTable = ({ data,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 10 |
const families = [...new Set(data.map(item => item.family))].slice(0, 10)
|
| 11 |
families.push("Other")
|
| 12 |
const familyRowFilterTemplate = options => {
|
|
@@ -124,10 +130,15 @@ const LanguageTable = ({ data, filters, setFilters }) => {
|
|
| 124 |
removableSort
|
| 125 |
filters={filters}
|
| 126 |
filterDisplay='menu'
|
|
|
|
|
|
|
|
|
|
|
|
|
| 127 |
scrollable
|
| 128 |
scrollHeight='600px'
|
| 129 |
id='language-table'
|
| 130 |
>
|
|
|
|
| 131 |
<Column
|
| 132 |
field='language_name'
|
| 133 |
header='Language'
|
|
|
|
| 6 |
import { Slider } from 'primereact/slider'
|
| 7 |
import ScoreField from './ScoreField'
|
| 8 |
|
| 9 |
+
const LanguageTable = ({ data, selectedLanguages, setSelectedLanguages }) => {
|
| 10 |
+
const [filters, setFilters] = useState({
|
| 11 |
+
language_name: { value: null, matchMode: FilterMatchMode.EQUALS }, // via global search
|
| 12 |
+
family: { value: null, matchMode: FilterMatchMode.IN },
|
| 13 |
+
speakers: { value: null, matchMode: FilterMatchMode.BETWEEN }
|
| 14 |
+
})
|
| 15 |
+
|
| 16 |
const families = [...new Set(data.map(item => item.family))].slice(0, 10)
|
| 17 |
families.push("Other")
|
| 18 |
const familyRowFilterTemplate = options => {
|
|
|
|
| 130 |
removableSort
|
| 131 |
filters={filters}
|
| 132 |
filterDisplay='menu'
|
| 133 |
+
selectionMode='checkbox'
|
| 134 |
+
selection={selectedLanguages}
|
| 135 |
+
onSelectionChange={e => setSelectedLanguages(e.value)}
|
| 136 |
+
frozenValue={selectedLanguages}
|
| 137 |
scrollable
|
| 138 |
scrollHeight='600px'
|
| 139 |
id='language-table'
|
| 140 |
>
|
| 141 |
+
<Column selectionMode="multiple" headerStyle={{ width: '3rem' }} />
|
| 142 |
<Column
|
| 143 |
field='language_name'
|
| 144 |
header='Language'
|
frontend/src/components/ModelTable.js
CHANGED
|
@@ -7,7 +7,11 @@ import Medal from './Medal'
|
|
| 7 |
import { Slider } from 'primereact/slider'
|
| 8 |
import ScoreField from './ScoreField'
|
| 9 |
|
| 10 |
-
const ModelTable = ({ data
|
|
|
|
|
|
|
|
|
|
|
|
|
| 11 |
const rankBodyTemplate = rowData => {
|
| 12 |
return <Medal rank={rowData.rank} />
|
| 13 |
}
|
|
@@ -99,9 +103,17 @@ const ModelTable = ({ data, filters, setFilters }) => {
|
|
| 99 |
return <div style={{ textAlign: 'center' }}>{sizeStr}</div>
|
| 100 |
}
|
| 101 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 102 |
const modelBodyTemplate = rowData => {
|
|
|
|
| 103 |
return (
|
| 104 |
-
<div style={{ fontWeight: 'bold', height: '100%' }}>{
|
| 105 |
)
|
| 106 |
}
|
| 107 |
|
|
@@ -135,7 +147,7 @@ const ModelTable = ({ data, filters, setFilters }) => {
|
|
| 135 |
id='model-table'
|
| 136 |
>
|
| 137 |
<Column field='rank' body={rankBodyTemplate} />
|
| 138 |
-
<Column field='provider' header='Provider' style={{ minWidth: '5rem' }} />
|
| 139 |
<Column
|
| 140 |
field='model'
|
| 141 |
header='Model'
|
|
|
|
| 7 |
import { Slider } from 'primereact/slider'
|
| 8 |
import ScoreField from './ScoreField'
|
| 9 |
|
| 10 |
+
const ModelTable = ({ data }) => {
|
| 11 |
+
const [filters, setFilters] = useState({
|
| 12 |
+
type: { value: null, matchMode: FilterMatchMode.IN },
|
| 13 |
+
size: { value: null, matchMode: FilterMatchMode.BETWEEN }
|
| 14 |
+
})
|
| 15 |
const rankBodyTemplate = rowData => {
|
| 16 |
return <Medal rank={rowData.rank} />
|
| 17 |
}
|
|
|
|
| 103 |
return <div style={{ textAlign: 'center' }}>{sizeStr}</div>
|
| 104 |
}
|
| 105 |
|
| 106 |
+
const capitalize = s => String(s).charAt(0).toUpperCase() + String(s).slice(1)
|
| 107 |
+
|
| 108 |
+
const providerBodyTemplate = rowData => {
|
| 109 |
+
const providerName = rowData.model.split('/')[0].split('-').map(capitalize).join(' ')
|
| 110 |
+
return providerName
|
| 111 |
+
}
|
| 112 |
+
|
| 113 |
const modelBodyTemplate = rowData => {
|
| 114 |
+
const modelName = rowData.model.split('/')[1].split('-').map(capitalize).join(' ')
|
| 115 |
return (
|
| 116 |
+
<div style={{ fontWeight: 'bold', height: '100%' }}>{modelName}</div>
|
| 117 |
)
|
| 118 |
}
|
| 119 |
|
|
|
|
| 147 |
id='model-table'
|
| 148 |
>
|
| 149 |
<Column field='rank' body={rankBodyTemplate} />
|
| 150 |
+
<Column field='provider' header='Provider' style={{ minWidth: '5rem' }} body={providerBodyTemplate} />
|
| 151 |
<Column
|
| 152 |
field='model'
|
| 153 |
header='Model'
|
results.json
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|