Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
pr_3_add_button_readme_and_better_logs
#3
by
derek-thomas
HF staff
- opened
- .gitignore +1 -0
- app.py +40 -6
- main_backend_lighteval.py +3 -0
- src/backend/run_eval_suite_lighteval.py +1 -1
- src/display/log_visualizer.py +9 -11
- src/logging.py +13 -29
.gitignore
CHANGED
@@ -12,3 +12,4 @@ eval-results/
|
|
12 |
eval-queue-bk/
|
13 |
eval-results-bk/
|
14 |
logs/
|
|
|
|
12 |
eval-queue-bk/
|
13 |
eval-results-bk/
|
14 |
logs/
|
15 |
+
output.log
|
app.py
CHANGED
@@ -1,26 +1,60 @@
|
|
1 |
import logging
|
2 |
-
import
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
|
4 |
import gradio as gr
|
5 |
from main_backend_lighteval import run_auto_eval
|
6 |
from src.display.log_visualizer import log_file_to_html_string
|
7 |
from src.display.css_html_js import dark_mode_gradio_js
|
8 |
-
from src.envs import REFRESH_RATE
|
|
|
9 |
|
10 |
logging.basicConfig(level=logging.INFO)
|
|
|
11 |
|
12 |
|
13 |
intro_md = f"""
|
14 |
# Intro
|
15 |
-
This is
|
16 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
"""
|
18 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
with gr.Blocks(js=dark_mode_gradio_js) as demo:
|
|
|
20 |
with gr.Tab("Application"):
|
21 |
-
gr.
|
22 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
23 |
dummy = gr.Markdown(run_auto_eval, every=REFRESH_RATE, visible=False)
|
24 |
|
|
|
|
|
|
|
25 |
if __name__ == '__main__':
|
26 |
demo.queue(default_concurrency_limit=40).launch(server_name="0.0.0.0", show_error=True, server_port=7860)
|
|
|
1 |
import logging
|
2 |
+
from src.logging import configure_root_logger
|
3 |
+
logging.getLogger("httpx").setLevel(logging.WARNING)
|
4 |
+
logging.getLogger("numexpr").setLevel(logging.WARNING)
|
5 |
+
logging.getLogger("absl").setLevel(logging.WARNING)
|
6 |
+
configure_root_logger()
|
7 |
+
|
8 |
+
from functools import partial
|
9 |
|
10 |
import gradio as gr
|
11 |
from main_backend_lighteval import run_auto_eval
|
12 |
from src.display.log_visualizer import log_file_to_html_string
|
13 |
from src.display.css_html_js import dark_mode_gradio_js
|
14 |
+
from src.envs import REFRESH_RATE, REPO_ID, QUEUE_REPO, RESULTS_REPO
|
15 |
+
from src.logging import setup_logger, log_file
|
16 |
|
17 |
logging.basicConfig(level=logging.INFO)
|
18 |
+
logger = setup_logger(__name__)
|
19 |
|
20 |
|
21 |
intro_md = f"""
|
22 |
# Intro
|
23 |
+
This is a visual for the auto evaluator.
|
24 |
+
"""
|
25 |
+
|
26 |
+
links_md = f"""
|
27 |
+
# Important links
|
28 |
+
| Description | Link |
|
29 |
+
|-----------------|------|
|
30 |
+
| Leaderboard | [{REPO_ID}](https://huggingface.co/spaces/{REPO_ID}) |
|
31 |
+
| Queue Repo | [{QUEUE_REPO}](https://huggingface.co/datasets/{QUEUE_REPO}) |
|
32 |
+
| Results Repo | [{RESULTS_REPO}](https://huggingface.co/datasets/{RESULTS_REPO}) |
|
33 |
"""
|
34 |
|
35 |
+
def button_auto_eval():
|
36 |
+
logger.info("Manually triggering Auto Eval")
|
37 |
+
run_auto_eval()
|
38 |
+
|
39 |
+
|
40 |
+
reverse_order_checkbox = gr.Checkbox(label="Reverse Order", value=True)
|
41 |
+
|
42 |
with gr.Blocks(js=dark_mode_gradio_js) as demo:
|
43 |
+
gr.Markdown(intro_md)
|
44 |
with gr.Tab("Application"):
|
45 |
+
output_html = gr.HTML(partial(log_file_to_html_string, reverse=reverse_order_checkbox), every=1)
|
46 |
+
with gr.Row():
|
47 |
+
download_button = gr.DownloadButton("Download Log File", value=log_file)
|
48 |
+
with gr.Accordion('Log View Configuration', open=False):
|
49 |
+
reverse_order_checkbox.render()
|
50 |
+
# Add a button that when pressed, triggers run_auto_eval
|
51 |
+
button = gr.Button("Manually Run Evaluation")
|
52 |
+
gr.Markdown(links_md)
|
53 |
+
|
54 |
dummy = gr.Markdown(run_auto_eval, every=REFRESH_RATE, visible=False)
|
55 |
|
56 |
+
button.click(fn=button_auto_eval, inputs=[], outputs=[])
|
57 |
+
|
58 |
+
|
59 |
if __name__ == '__main__':
|
60 |
demo.queue(default_concurrency_limit=40).launch(server_name="0.0.0.0", show_error=True, server_port=7860)
|
main_backend_lighteval.py
CHANGED
@@ -70,6 +70,7 @@ def run_auto_eval():
|
|
70 |
# instance_size, instance_type = "small", "g4dn.xlarge"
|
71 |
# For CPU
|
72 |
instance_size, instance_type = "medium", "c6i"
|
|
|
73 |
|
74 |
run_evaluation(
|
75 |
eval_request=eval_request,
|
@@ -84,6 +85,8 @@ def run_auto_eval():
|
|
84 |
limit=LIMIT
|
85 |
)
|
86 |
|
|
|
|
|
87 |
|
88 |
if __name__ == "__main__":
|
89 |
run_auto_eval()
|
|
|
70 |
# instance_size, instance_type = "small", "g4dn.xlarge"
|
71 |
# For CPU
|
72 |
instance_size, instance_type = "medium", "c6i"
|
73 |
+
logger.info(f'Starting Evaluation of {eval_request.json_filepath} on Inference endpoints: {instance_size} {instance_type}')
|
74 |
|
75 |
run_evaluation(
|
76 |
eval_request=eval_request,
|
|
|
85 |
limit=LIMIT
|
86 |
)
|
87 |
|
88 |
+
logger.info(f'Completed Evaluation of {eval_request.json_filepath} on Inference endpoints: {instance_size} {instance_type}')
|
89 |
+
|
90 |
|
91 |
if __name__ == "__main__":
|
92 |
run_auto_eval()
|
src/backend/run_eval_suite_lighteval.py
CHANGED
@@ -61,7 +61,7 @@ def run_evaluation(eval_request: EvalRequest, task_names: str, batch_size: int,
|
|
61 |
|
62 |
dumped = json.dumps(results, indent=2)
|
63 |
logger.info(dumped)
|
64 |
-
except Exception: # if eval failed, we force a cleanup
|
65 |
env_config = EnvConfig(token=TOKEN, cache_dir=args.cache_dir)
|
66 |
|
67 |
model_config = create_model_config(args=args, accelerator=accelerator)
|
|
|
61 |
|
62 |
dumped = json.dumps(results, indent=2)
|
63 |
logger.info(dumped)
|
64 |
+
except Exception as e: # if eval failed, we force a cleanup
|
65 |
env_config = EnvConfig(token=TOKEN, cache_dir=args.cache_dir)
|
66 |
|
67 |
model_config = create_model_config(args=args, accelerator=accelerator)
|
src/display/log_visualizer.py
CHANGED
@@ -9,19 +9,17 @@ from src.display.css_html_js import style_content
|
|
9 |
from src.envs import NUM_LINES_VISUALIZE
|
10 |
from src.logging import log_file
|
11 |
|
12 |
-
proj_dir = Path(__name__).parent
|
13 |
|
14 |
-
|
15 |
-
def log_file_to_html_string():
|
16 |
with open(log_file, "rt") as f:
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
|
|
21 |
|
22 |
-
|
23 |
-
|
24 |
-
syntax = Syntax(output, "python", theme="monokai", word_wrap=True)
|
25 |
|
26 |
console = Console(record=True, width=150, style="#272822", file=StringIO())
|
27 |
console.print(syntax)
|
@@ -30,7 +28,7 @@ def log_file_to_html_string():
|
|
30 |
# Parse the HTML content using BeautifulSoup
|
31 |
soup = BeautifulSoup(html_content, 'lxml')
|
32 |
|
33 |
-
# Modify the <pre> tag
|
34 |
pre_tag = soup.pre
|
35 |
pre_tag['class'] = 'scrollable'
|
36 |
del pre_tag['style']
|
|
|
9 |
from src.envs import NUM_LINES_VISUALIZE
|
10 |
from src.logging import log_file
|
11 |
|
|
|
12 |
|
13 |
+
def log_file_to_html_string(reverse=True):
|
|
|
14 |
with open(log_file, "rt") as f:
|
15 |
+
lines = f.readlines()
|
16 |
+
lines = lines[-NUM_LINES_VISUALIZE:]
|
17 |
+
|
18 |
+
if reverse:
|
19 |
+
lines = reversed(lines)
|
20 |
|
21 |
+
output = "".join(lines)
|
22 |
+
syntax = Syntax(output, "python", theme="monokai", word_wrap=True)
|
|
|
23 |
|
24 |
console = Console(record=True, width=150, style="#272822", file=StringIO())
|
25 |
console.print(syntax)
|
|
|
28 |
# Parse the HTML content using BeautifulSoup
|
29 |
soup = BeautifulSoup(html_content, 'lxml')
|
30 |
|
31 |
+
# Modify the <pre> tag and add custom styles
|
32 |
pre_tag = soup.pre
|
33 |
pre_tag['class'] = 'scrollable'
|
34 |
del pre_tag['style']
|
src/logging.py
CHANGED
@@ -23,32 +23,16 @@ def setup_logger(name: str):
|
|
23 |
|
24 |
return logger
|
25 |
|
26 |
-
|
27 |
-
|
28 |
-
#
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
# def isatty(self):
|
40 |
-
# return False
|
41 |
-
#
|
42 |
-
# def read_logs():
|
43 |
-
# sys.stdout.flush()
|
44 |
-
# #API.upload_file(
|
45 |
-
# # path_or_fileobj="output.log",
|
46 |
-
# # path_in_repo="demo-backend.log",
|
47 |
-
# # repo_id="demo-leaderboard-backend/logs",
|
48 |
-
# # repo_type="dataset",
|
49 |
-
# #)
|
50 |
-
#
|
51 |
-
# with open(log_file, "r") as f:
|
52 |
-
# return f.read()
|
53 |
-
#
|
54 |
-
# LOGGER = Logger()
|
|
|
23 |
|
24 |
return logger
|
25 |
|
26 |
+
|
27 |
+
def configure_root_logger():
|
28 |
+
# Configure the root logger
|
29 |
+
logging.basicConfig(level=logging.INFO)
|
30 |
+
root_logger = logging.getLogger()
|
31 |
+
|
32 |
+
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
33 |
+
|
34 |
+
file_handler = logging.FileHandler(log_file)
|
35 |
+
file_handler.setLevel(logging.INFO)
|
36 |
+
file_handler.setFormatter(formatter)
|
37 |
+
|
38 |
+
root_logger.addHandler(file_handler)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|