Spaces:
Runtime error
Runtime error
Commit
·
d2e5b38
1
Parent(s):
589cdf6
adjust caches, update spaces card
Browse files- README.md +27 -9
- app.py +9 -88
- charts.py +47 -0
- dashboard_utils/bubbles.py +1 -1
- dashboard_utils/main_metrics.py +1 -1
- st_helpers.py +34 -0
README.md
CHANGED
|
@@ -1,19 +1,37 @@
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
-
emoji:
|
| 4 |
-
colorFrom:
|
| 5 |
-
colorTo:
|
| 6 |
sdk: streamlit
|
| 7 |
app_file: app.py
|
| 8 |
pinned: false
|
| 9 |
---
|
| 10 |
|
| 11 |
-
#
|
| 12 |
|
| 13 |
-
|
|
|
|
| 14 |
|
| 15 |
-
|
|
|
|
| 16 |
|
| 17 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 18 |
|
| 19 |
-
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
title: NeurIPS Demo
|
| 3 |
+
emoji: ⚡
|
| 4 |
+
colorFrom: green
|
| 5 |
+
colorTo: blue
|
| 6 |
sdk: streamlit
|
| 7 |
app_file: app.py
|
| 8 |
pinned: false
|
| 9 |
---
|
| 10 |
|
| 11 |
+
# Configuration
|
| 12 |
|
| 13 |
+
`title`: _string_
|
| 14 |
+
Display title for the Space
|
| 15 |
|
| 16 |
+
`emoji`: _string_
|
| 17 |
+
Space emoji (emoji-only character allowed)
|
| 18 |
|
| 19 |
+
`colorFrom`: _string_
|
| 20 |
+
Color for Thumbnail gradient (red, yellow, green, blue, indigo, purple, pink, gray)
|
| 21 |
+
|
| 22 |
+
`colorTo`: _string_
|
| 23 |
+
Color for Thumbnail gradient (red, yellow, green, blue, indigo, purple, pink, gray)
|
| 24 |
+
|
| 25 |
+
`sdk`: _string_
|
| 26 |
+
Can be either `gradio` or `streamlit`
|
| 27 |
+
|
| 28 |
+
`sdk_version` : _string_
|
| 29 |
+
Only applicable for `streamlit` SDK.
|
| 30 |
+
See [doc](https://hf.co/docs/hub/spaces) for more info on supported versions.
|
| 31 |
+
|
| 32 |
+
`app_file`: _string_
|
| 33 |
+
Path to your main application file (which contains either `gradio` or `streamlit` Python code).
|
| 34 |
+
Path is relative to the root of the repository.
|
| 35 |
|
| 36 |
+
`pinned`: _boolean_
|
| 37 |
+
Whether the Space stays on top of your list.
|
app.py
CHANGED
|
@@ -1,109 +1,30 @@
|
|
| 1 |
"""
|
| 2 |
-
This
|
| 3 |
If you're not a hedgehog, you shouldn't reuse this code. Use this instead: https://docs.streamlit.io/library/get-started
|
| 4 |
"""
|
| 5 |
-
import os
|
| 6 |
|
| 7 |
import streamlit as st
|
| 8 |
-
import streamlit.components.v1 as components
|
| 9 |
-
import wandb
|
| 10 |
|
| 11 |
-
from dashboard_utils.bubbles import get_new_bubble_data
|
| 12 |
-
from dashboard_utils.main_metrics import get_main_metrics
|
| 13 |
-
from streamlit_observable import observable
|
| 14 |
|
|
|
|
|
|
|
| 15 |
|
| 16 |
st.set_page_config(page_title="Training Transformers Together", layout="centered")
|
| 17 |
-
with open("static/header.html", 'r', encoding='utf-8') as f:
|
| 18 |
-
header_html = f.read()
|
| 19 |
-
with open("static/header_style.css", 'r', encoding='utf-8') as f:
|
| 20 |
-
header_style_css = f.read()
|
| 21 |
-
with open("static/header_animate.js") as f:
|
| 22 |
-
header_animate_js = f.read()
|
| 23 |
-
with open("static/content_style.css", 'r', encoding='utf-8') as f:
|
| 24 |
-
content_style_css = f.read()
|
| 25 |
-
with open("static/meta.html", 'r', encoding='utf-8') as f:
|
| 26 |
-
meta_html = f.read()
|
| 27 |
|
| 28 |
-
st.markdown("## Full demo content will be posted here on December 7th!")
|
| 29 |
-
|
| 30 |
-
components.html(f"<style>{header_style_css}</style>{header_html}<script>{header_animate_js}</script>", height=260)
|
| 31 |
|
| 32 |
-
st.markdown(
|
| 33 |
-
st.markdown(f"<style>{content_style_css}</style>", unsafe_allow_html=True) # apply css to the rest of the document
|
| 34 |
|
| 35 |
-
|
| 36 |
-
st.markdown(f'<center><div class="padded faded main_text" '
|
| 37 |
-
f'style="padding-top: {vspace_before}px;padding-bottom: {vspace_after}px;">'
|
| 38 |
-
f'{text}</div><center>',
|
| 39 |
-
unsafe_allow_html=True)
|
| 40 |
-
CITATIONS = {}
|
| 41 |
-
def cite(tag):
|
| 42 |
-
CITATIONS[tag] = len(CITATIONS) + 1
|
| 43 |
-
return f"[{CITATIONS[tag]}]"
|
| 44 |
|
| 45 |
content_text(f"""
|
| 46 |
There was a time when you could comfortably train SoTA vision and language models at home on your workstation.
|
| 47 |
-
The first ConvNet to beat ImageNet took in 5-6 days on two gamer-grade GPUs
|
| 48 |
-
took 20,000 TPU-v3 days
|
| 49 |
-
with 8 A100 would still take decades
|
| 50 |
|
| 51 |
content_text(f"""
|
| 52 |
So, can individual researchers and small labs still train state-of-the-art? Yes we can!
|
| 53 |
All it takes is for a bunch of us to come together. In fact, we're doing it right now and <b>you're invited to join!</b>
|
| 54 |
""", vspace_before=12, vspace_after=16)
|
| 55 |
|
| 56 |
-
|
| 57 |
-
st.vega_lite_chart(
|
| 58 |
-
source, {
|
| 59 |
-
"height": 200,
|
| 60 |
-
"title": "Training DALLE with volunteers. Updated every few minutes during NeurIPS.",
|
| 61 |
-
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
|
| 62 |
-
"description": "Current training progress",
|
| 63 |
-
"encoding": {"x": {"field": "date", "type": "temporal"}},
|
| 64 |
-
"config": {"axisX": {"labelAngle": -40}},
|
| 65 |
-
"resolve": {"scale": {"y": "independent"}},
|
| 66 |
-
"layer": [
|
| 67 |
-
{
|
| 68 |
-
"mark": {"type": "line", "point": {"tooltip": True, "filled": False, "strokeOpacity": 0},
|
| 69 |
-
"color": "#85A9C5"},
|
| 70 |
-
"encoding": {"y": {"field": "training loss", "type": "quantitative", "axis": {"titleColor": "#85A9C5"}}},
|
| 71 |
-
},
|
| 72 |
-
{
|
| 73 |
-
"mark": {"type": "line", "point": {"tooltip": True, "filled": False, "strokeOpacity": 0.0},
|
| 74 |
-
"color": "#85C5A6", "opacity": 0.5},
|
| 75 |
-
"encoding": {
|
| 76 |
-
"y": {"field": "active participants", "type": "quantitative", "axis": {"titleColor": "#85C5A6"}}},
|
| 77 |
-
},
|
| 78 |
-
],
|
| 79 |
-
},
|
| 80 |
-
use_container_width=True,
|
| 81 |
-
)
|
| 82 |
-
|
| 83 |
-
#
|
| 84 |
-
# st.caption("Number of alive runs over time")
|
| 85 |
-
# st.vega_lite_chart(
|
| 86 |
-
# source,
|
| 87 |
-
# use_container_width=True,
|
| 88 |
-
# )
|
| 89 |
-
# st.caption("Number of steps")
|
| 90 |
-
# st.vega_lite_chart(
|
| 91 |
-
# source,
|
| 92 |
-
# {
|
| 93 |
-
# "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
|
| 94 |
-
# "description": "Training Loss",
|
| 95 |
-
# "mark": {"type": "line", "point": {"tooltip": True, "filled": False, "strokeOpacity": 0}},
|
| 96 |
-
# "encoding": {"x": {"field": "date", "type": "temporal"}, "y": {"field": "steps", "type": "quantitative"}},
|
| 97 |
-
# "config": {"axisX": {"labelAngle": -40}},
|
| 98 |
-
# },
|
| 99 |
-
# use_container_width=True,
|
| 100 |
-
# )
|
| 101 |
-
#
|
| 102 |
-
# st.header("Collaborative training participants")
|
| 103 |
-
# serialized_data, profiles = get_new_bubble_data()
|
| 104 |
-
# observable(
|
| 105 |
-
# "Participants",
|
| 106 |
-
# notebook="d/9ae236a507f54046", # "@huggingface/participants-bubbles-chart",
|
| 107 |
-
# targets=["c_noaws"],
|
| 108 |
-
# redefine={"serializedData": serialized_data, "profileSimple": profiles},
|
| 109 |
-
# )
|
|
|
|
| 1 |
"""
|
| 2 |
+
This specific file was bodged together by ham-handed hedgehogs. If something looks wrong, it's because it is.
|
| 3 |
If you're not a hedgehog, you shouldn't reuse this code. Use this instead: https://docs.streamlit.io/library/get-started
|
| 4 |
"""
|
|
|
|
| 5 |
|
| 6 |
import streamlit as st
|
|
|
|
|
|
|
| 7 |
|
|
|
|
|
|
|
|
|
|
| 8 |
|
| 9 |
+
from st_helpers import make_header, content_text, cite
|
| 10 |
+
from charts import draw_current_progress
|
| 11 |
|
| 12 |
st.set_page_config(page_title="Training Transformers Together", layout="centered")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 13 |
|
|
|
|
|
|
|
|
|
|
| 14 |
|
| 15 |
+
st.markdown("## Full demo content will be posted here on December 7th!")
|
|
|
|
| 16 |
|
| 17 |
+
make_header()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 18 |
|
| 19 |
content_text(f"""
|
| 20 |
There was a time when you could comfortably train SoTA vision and language models at home on your workstation.
|
| 21 |
+
The first ConvNet to beat ImageNet took in 5-6 days on two gamer-grade GPUs{cite("alexnet")}. Today's top-1 imagenet model
|
| 22 |
+
took 20,000 TPU-v3 days{cite("coatnet")}. And things are even worse in the NLP world: training GPT-3 on a top-tier server
|
| 23 |
+
with 8 A100 would still take decades{cite("gpt-3")}.""")
|
| 24 |
|
| 25 |
content_text(f"""
|
| 26 |
So, can individual researchers and small labs still train state-of-the-art? Yes we can!
|
| 27 |
All it takes is for a bunch of us to come together. In fact, we're doing it right now and <b>you're invited to join!</b>
|
| 28 |
""", vspace_before=12, vspace_after=16)
|
| 29 |
|
| 30 |
+
draw_current_progress()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
charts.py
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
|
| 3 |
+
from dashboard_utils.bubbles import get_new_bubble_data
|
| 4 |
+
from dashboard_utils.main_metrics import get_main_metrics
|
| 5 |
+
from streamlit_observable import observable
|
| 6 |
+
|
| 7 |
+
|
| 8 |
+
def draw_current_progress():
|
| 9 |
+
source = get_main_metrics()
|
| 10 |
+
st.vega_lite_chart(
|
| 11 |
+
source, {
|
| 12 |
+
"height": 200,
|
| 13 |
+
"title": "Training DALLE with volunteers. Updated every few minutes during NeurIPS.",
|
| 14 |
+
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
|
| 15 |
+
"description": "Current training progress",
|
| 16 |
+
"encoding": {"x": {"field": "wall time", "type": "temporal"}},
|
| 17 |
+
"config": {"axisX": {"labelAngle": -40}},
|
| 18 |
+
"resolve": {"scale": {"y": "independent"}},
|
| 19 |
+
"layer": [
|
| 20 |
+
{
|
| 21 |
+
"mark": {"type": "line", "point": {"tooltip": True, "filled": False, "strokeOpacity": 0},
|
| 22 |
+
"color": "#85A9C5"},
|
| 23 |
+
"encoding": {
|
| 24 |
+
"y": {"field": "training loss", "type": "quantitative", "axis": {"titleColor": "#85A9C5"}}},
|
| 25 |
+
},
|
| 26 |
+
{
|
| 27 |
+
"mark": {"type": "line", "point": {"tooltip": True, "filled": False, "strokeOpacity": 0.0},
|
| 28 |
+
"color": "#85C5A6", "opacity": 0.5},
|
| 29 |
+
"encoding": {
|
| 30 |
+
"y": {"field": "active participants", "type": "quantitative",
|
| 31 |
+
"axis": {"titleColor": "#85C5A6"}}},
|
| 32 |
+
},
|
| 33 |
+
],
|
| 34 |
+
},
|
| 35 |
+
use_container_width=True,
|
| 36 |
+
)
|
| 37 |
+
|
| 38 |
+
with st.expander("Who's training?", expanded=False):
|
| 39 |
+
st.markdown("### Collaborative training participants\n(may take a few seconds to load)")
|
| 40 |
+
|
| 41 |
+
serialized_data, profiles = get_new_bubble_data()
|
| 42 |
+
observable(
|
| 43 |
+
"Participants",
|
| 44 |
+
notebook="d/9ae236a507f54046", # "@huggingface/participants-bubbles-chart",
|
| 45 |
+
targets=["c_noaws"],
|
| 46 |
+
redefine={"serializedData": serialized_data, "profileSimple": profiles},
|
| 47 |
+
)
|
dashboard_utils/bubbles.py
CHANGED
|
@@ -10,7 +10,7 @@ from dashboard_utils.time_tracker import _log, simple_time_tracker
|
|
| 10 |
|
| 11 |
URL_QUICKSEARCH = "https://huggingface.co/api/quicksearch?"
|
| 12 |
WANDB_REPO = "learning-at-home/Worker_logs"
|
| 13 |
-
CACHE_TTL =
|
| 14 |
|
| 15 |
|
| 16 |
@st.cache(ttl=CACHE_TTL)
|
|
|
|
| 10 |
|
| 11 |
URL_QUICKSEARCH = "https://huggingface.co/api/quicksearch?"
|
| 12 |
WANDB_REPO = "learning-at-home/Worker_logs"
|
| 13 |
+
CACHE_TTL = 600
|
| 14 |
|
| 15 |
|
| 16 |
@st.cache(ttl=CACHE_TTL)
|
dashboard_utils/main_metrics.py
CHANGED
|
@@ -30,4 +30,4 @@ def get_main_metrics():
|
|
| 30 |
alive_peers.append(row["alive peers"])
|
| 31 |
dates.append(datetime.datetime.utcfromtimestamp(row["_timestamp"]))
|
| 32 |
|
| 33 |
-
return pd.DataFrame({"steps": steps, "training loss": losses, "active participants": alive_peers, "
|
|
|
|
| 30 |
alive_peers.append(row["alive peers"])
|
| 31 |
dates.append(datetime.datetime.utcfromtimestamp(row["_timestamp"]))
|
| 32 |
|
| 33 |
+
return pd.DataFrame({"steps": steps, "training loss": losses, "active participants": alive_peers, "wall time": dates})
|
st_helpers.py
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
import streamlit.components.v1 as components
|
| 3 |
+
|
| 4 |
+
with open("static/header.html", 'r', encoding='utf-8') as f:
|
| 5 |
+
header_html = f.read()
|
| 6 |
+
with open("static/header_style.css", 'r', encoding='utf-8') as f:
|
| 7 |
+
header_style_css = f.read()
|
| 8 |
+
with open("static/header_animate.js") as f:
|
| 9 |
+
header_animate_js = f.read()
|
| 10 |
+
with open("static/content_style.css", 'r', encoding='utf-8') as f:
|
| 11 |
+
content_style_css = f.read()
|
| 12 |
+
with open("static/meta.html", 'r', encoding='utf-8') as f:
|
| 13 |
+
meta_html = f.read()
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
def make_header():
|
| 17 |
+
components.html(f"<style>{header_style_css}</style>{header_html}<script>{header_animate_js}</script>", height=260)
|
| 18 |
+
st.markdown(meta_html, unsafe_allow_html=True)
|
| 19 |
+
st.markdown(f"<style>{content_style_css}</style>", unsafe_allow_html=True) # apply css to the rest of the document
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
def content_text(text: str, vspace_before: int = 0, vspace_after: int = 0):
|
| 23 |
+
st.markdown(f'<center><div class="padded faded main_text" '
|
| 24 |
+
f'style="padding-top: {vspace_before}px; padding-bottom: {vspace_after}px; text-align: justify;">'
|
| 25 |
+
f'{text}</div><center>',
|
| 26 |
+
unsafe_allow_html=True)
|
| 27 |
+
|
| 28 |
+
|
| 29 |
+
CITATIONS = {}
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
def cite(tag):
|
| 33 |
+
CITATIONS[tag] = len(CITATIONS) + 1
|
| 34 |
+
return f" [{CITATIONS[tag]}]"
|