Spaces:
Runtime error
Runtime error
Benjamin Bossan
commited on
Commit
·
433130f
1
Parent(s):
1b701be
Add possibility to load existing model card
Browse files- app.py +54 -30
- requirements.txt +1 -0
app.py
CHANGED
|
@@ -15,6 +15,7 @@ from tempfile import mkdtemp
|
|
| 15 |
import pandas as pd
|
| 16 |
import sklearn
|
| 17 |
import streamlit as st
|
|
|
|
| 18 |
from sklearn.base import BaseEstimator
|
| 19 |
|
| 20 |
import skops.io as sio
|
|
@@ -31,10 +32,10 @@ PLOT_PREFIX = "__plot__:"
|
|
| 31 |
if "custom_sections" not in st.session_state:
|
| 32 |
st.session_state.custom_sections = {}
|
| 33 |
|
| 34 |
-
# the
|
| 35 |
-
|
| 36 |
-
# the
|
| 37 |
-
|
| 38 |
|
| 39 |
# a hacky way to "persist" custom sections
|
| 40 |
CUSTOM_SECTIONS_CACHE_FILE = ".custom-sections.json"
|
|
@@ -69,16 +70,16 @@ def _write_plot(plot_name, plot_file):
|
|
| 69 |
|
| 70 |
|
| 71 |
def init_repo():
|
| 72 |
-
_clear_repo(
|
| 73 |
|
| 74 |
try:
|
| 75 |
-
file_name =
|
| 76 |
sio.dump(model, file_name)
|
| 77 |
|
| 78 |
reqs = [r.strip().rstrip(",") for r in requirements.splitlines()]
|
| 79 |
hub_utils.init(
|
| 80 |
model=file_name,
|
| 81 |
-
dst=
|
| 82 |
task=task,
|
| 83 |
data=data,
|
| 84 |
requirements=reqs,
|
|
@@ -120,10 +121,18 @@ def _parse_metrics(metrics):
|
|
| 120 |
return metrics_table
|
| 121 |
|
| 122 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 123 |
def _create_model_card():
|
| 124 |
init_repo()
|
| 125 |
-
|
| 126 |
-
|
|
|
|
|
|
|
|
|
|
| 127 |
|
| 128 |
if model_description:
|
| 129 |
model_card.add(**{"Model description": model_description})
|
|
@@ -256,7 +265,7 @@ def add_custom_plot():
|
|
| 256 |
|
| 257 |
# store plot in temp repo
|
| 258 |
file_name = plot_file.name.replace(" ", "_")
|
| 259 |
-
file_path = str(
|
| 260 |
with open(file_path, "wb") as f:
|
| 261 |
f.write(plot_file.getvalue())
|
| 262 |
|
|
@@ -303,28 +312,43 @@ with st.sidebar:
|
|
| 303 |
if model is not None and data is not None:
|
| 304 |
init_repo()
|
| 305 |
|
| 306 |
-
|
| 307 |
-
|
| 308 |
-
"
|
| 309 |
-
|
| 310 |
-
metrics = st.text_area("Metrics (e.g. 'accuracy = 0.95'), one metric per line")
|
| 311 |
-
authors = st.text_area(
|
| 312 |
-
"Authors",
|
| 313 |
-
value="This model card is written by following authors:\n\n" + PLACEHOLDER,
|
| 314 |
-
)
|
| 315 |
-
contact = st.text_area(
|
| 316 |
-
"Contact",
|
| 317 |
-
value="You can contact the model card authors through following channels:\n\n"
|
| 318 |
-
+ PLACEHOLDER,
|
| 319 |
-
)
|
| 320 |
-
citation = st.text_area(
|
| 321 |
-
"Citation",
|
| 322 |
-
value="Below you can find information related to citation.\n\nBibTex:\n\n```\n"
|
| 323 |
-
+ PLACEHOLDER
|
| 324 |
-
+ "\n```",
|
| 325 |
-
height=5,
|
| 326 |
)
|
| 327 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 328 |
# ADD A CUSTOM SECTIONS
|
| 329 |
with st.form("custom-section", clear_on_submit=True):
|
| 330 |
section_name = st.text_input(
|
|
|
|
| 15 |
import pandas as pd
|
| 16 |
import sklearn
|
| 17 |
import streamlit as st
|
| 18 |
+
from huggingface_hub import hf_hub_download
|
| 19 |
from sklearn.base import BaseEstimator
|
| 20 |
|
| 21 |
import skops.io as sio
|
|
|
|
| 32 |
if "custom_sections" not in st.session_state:
|
| 33 |
st.session_state.custom_sections = {}
|
| 34 |
|
| 35 |
+
# the tmp_path is used to upload the sklearn model to
|
| 36 |
+
tmp_path = Path(mkdtemp(prefix="skops-"))
|
| 37 |
+
# the hf_path is the actual repo used for init()
|
| 38 |
+
hf_path = Path(mkdtemp(prefix="skops-"))
|
| 39 |
|
| 40 |
# a hacky way to "persist" custom sections
|
| 41 |
CUSTOM_SECTIONS_CACHE_FILE = ".custom-sections.json"
|
|
|
|
| 70 |
|
| 71 |
|
| 72 |
def init_repo():
|
| 73 |
+
_clear_repo(hf_path)
|
| 74 |
|
| 75 |
try:
|
| 76 |
+
file_name = tmp_path / "model.skops"
|
| 77 |
sio.dump(model, file_name)
|
| 78 |
|
| 79 |
reqs = [r.strip().rstrip(",") for r in requirements.splitlines()]
|
| 80 |
hub_utils.init(
|
| 81 |
model=file_name,
|
| 82 |
+
dst=hf_path,
|
| 83 |
task=task,
|
| 84 |
data=data,
|
| 85 |
requirements=reqs,
|
|
|
|
| 121 |
return metrics_table
|
| 122 |
|
| 123 |
|
| 124 |
+
def _load_model_card_from_repo(repo_id: str) -> Card:
|
| 125 |
+
path = hf_hub_download(repo_id, "README.md")
|
| 126 |
+
return card.parse_modelcard(path)
|
| 127 |
+
|
| 128 |
+
|
| 129 |
def _create_model_card():
|
| 130 |
init_repo()
|
| 131 |
+
if model_card_repo: # load existing model card
|
| 132 |
+
model_card = _load_model_card_from_repo(model_card_repo)
|
| 133 |
+
else: # create new model card
|
| 134 |
+
metadata = card.metadata_from_config(hf_path)
|
| 135 |
+
model_card = card.Card(model=model, metadata=metadata)
|
| 136 |
|
| 137 |
if model_description:
|
| 138 |
model_card.add(**{"Model description": model_description})
|
|
|
|
| 265 |
|
| 266 |
# store plot in temp repo
|
| 267 |
file_name = plot_file.name.replace(" ", "_")
|
| 268 |
+
file_path = str(tmp_path / file_name)
|
| 269 |
with open(file_path, "wb") as f:
|
| 270 |
f.write(plot_file.getvalue())
|
| 271 |
|
|
|
|
| 312 |
if model is not None and data is not None:
|
| 313 |
init_repo()
|
| 314 |
|
| 315 |
+
model_card_repo = st.text_input(
|
| 316 |
+
"Optional: HF repo to load model card from (e.g. 'gpt2'), "
|
| 317 |
+
"leave empty to use default skops template",
|
| 318 |
+
value="",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 319 |
)
|
| 320 |
|
| 321 |
+
# DEFAULT SKOPS SECTIONS
|
| 322 |
+
if not model_card_repo:
|
| 323 |
+
model_description = st.text_input("Model description", value=PLACEHOLDER)
|
| 324 |
+
intended_uses = st.text_area(
|
| 325 |
+
"Intended uses & limitations", height=2, value=PLACEHOLDER
|
| 326 |
+
)
|
| 327 |
+
metrics = st.text_area("Metrics (e.g. 'accuracy = 0.95'), one metric per line")
|
| 328 |
+
authors = st.text_area(
|
| 329 |
+
"Authors",
|
| 330 |
+
value="This model card is written by following authors:\n\n" + PLACEHOLDER,
|
| 331 |
+
)
|
| 332 |
+
contact = st.text_area(
|
| 333 |
+
"Contact",
|
| 334 |
+
value="You can contact the model card authors through following channels:\n\n"
|
| 335 |
+
+ PLACEHOLDER,
|
| 336 |
+
)
|
| 337 |
+
citation = st.text_area(
|
| 338 |
+
"Citation",
|
| 339 |
+
value="Below you can find information related to citation.\n\nBibTex:\n\n```\n"
|
| 340 |
+
+ PLACEHOLDER
|
| 341 |
+
+ "\n```",
|
| 342 |
+
height=5,
|
| 343 |
+
)
|
| 344 |
+
else:
|
| 345 |
+
model_description = None
|
| 346 |
+
intended_uses = None
|
| 347 |
+
metrics = None
|
| 348 |
+
authors = None
|
| 349 |
+
contact = None
|
| 350 |
+
citation = None
|
| 351 |
+
|
| 352 |
# ADD A CUSTOM SECTIONS
|
| 353 |
with st.form("custom-section", clear_on_submit=True):
|
| 354 |
section_name = st.text_input(
|
requirements.txt
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
|
|
| 1 |
pandas
|
| 2 |
scikit-learn
|
| 3 |
skops
|
|
|
|
| 1 |
+
huggingface_hub
|
| 2 |
pandas
|
| 3 |
scikit-learn
|
| 4 |
skops
|