44from pathlib import Path
55
66import numpy
7+ import pandas as pd
78import pytest
89import torch
910import yaml
1314from llmcompressor .core import active_session
1415from tests .e2e .e2e_utils import run_oneshot_for_e2e_testing
1516from tests .examples .utils import requires_gpu_count
17+ from tests .test_timer .timer_utils import get_singleton_manager , log_time
1618
1719
1820class LmEvalConfig (BaseModel ):
@@ -34,6 +36,7 @@ class LmEvalConfig(BaseModel):
3436 logger .warning ("lm_eval is not installed. This test will be skipped" )
3537
3638TEST_DATA_FILE = os .environ .get ("TEST_DATA_FILE" , None )
39+ TIMINGS_DIR = os .environ .get ("TIMINGS_DIR" , "timings/lm-eval" )
3740
3841
3942# Will run each test case in its own process through run_tests.sh
@@ -94,6 +97,7 @@ def set_up(self, test_data_file: str):
9497 def test_lm_eval (self , test_data_file : str ):
9598 # Run vLLM with saved model
9699 self .set_up (test_data_file )
100+
97101 if not self .save_dir :
98102 self .save_dir = self .model .split ("/" )[1 ] + f"-{ self .scheme } "
99103 oneshot_model , processor = run_oneshot_for_e2e_testing (
@@ -111,20 +115,33 @@ def test_lm_eval(self, test_data_file: str):
111115 )
112116
113117 logger .info ("================= SAVING TO DISK ======================" )
114- oneshot_model .save_pretrained (self .save_dir )
115- processor .save_pretrained (self .save_dir )
116- recipe_path = os .path .join (self .save_dir , "recipe.yaml" )
118+ self ._save_compressed_model (oneshot_model , processor )
117119
118120 # Use the session to fetch the recipe;
119121 # Reset session for next test case
122+ self ._handle_recipe ()
123+
124+ logger .info ("================= Running LM Eval ======================" )
125+ self ._run_lm_eval ()
126+
127+ self .tear_down ()
128+
129+ @log_time
130+ def _save_compressed_model (self , oneshot_model , processor ):
131+ oneshot_model .save_pretrained (self .save_dir )
132+ processor .save_pretrained (self .save_dir )
133+
134+ @log_time
135+ def _handle_recipe (self ):
136+ recipe_path = os .path .join (self .save_dir , "recipe.yaml" )
120137 session = active_session ()
121138 recipe_yaml_str = session .get_serialized_recipe ()
122139 with open (recipe_path , "w" ) as fp :
123140 fp .write (recipe_yaml_str )
124141 session .reset ()
125142
126- logger . info ( "================= Running LM Eval ======================" )
127-
143+ @ log_time
144+ def _run_lm_eval ( self ):
128145 model_args = {"pretrained" : self .save_dir }
129146 model_args .update (self .lmeval .model_args )
130147 results = lm_eval .simple_evaluate (
@@ -145,8 +162,18 @@ def test_lm_eval(self, test_data_file: str):
145162 )
146163 assert numpy .isclose (expected_val , actual_val , rtol = 0.05 )
147164
148- self .tear_down ()
149-
150165 def tear_down (self ):
166+ timer = get_singleton_manager ()
167+ # fetch dictionary of measurements, where keys are func names
168+ # and values are the time it took to run the method, each
169+ # time it was called
170+ measurements = timer .measurements
171+ if measurements :
172+ p = Path (TIMINGS_DIR )
173+ p .mkdir (parents = True , exist_ok = True )
174+
175+ df = pd .DataFrame (measurements )
176+ df .to_csv (p / f"{ self .save_dir } .csv" , index = False )
177+
151178 if self .save_dir is not None :
152179 shutil .rmtree (self .save_dir )
0 commit comments