@@ -23,6 +23,11 @@ def __call__(self, *args, **kwds):
2323 return "analysis"
2424
2525
26+ def analyze (exp_result , episode_summarizer , save_analysis_func ):
27+ error_analysis = episode_summarizer (exp_result )
28+ save_analysis_func (exp_result , error_analysis )
29+
30+
2631@dataclass
2732class ErrorAnalysisPipeline :
2833 exp_dir : Path
@@ -36,12 +41,21 @@ def filter_exp_results(self) -> Generator[ExpResult, None, None]:
3641 if self .filter is None or self .filter in str (exp_result .exp_dir ):
3742 yield exp_result
3843
39- def run_analysis (self ):
44+ def run_analysis (self , parallel = False , jobs = - 1 ):
4045 filtered_results = self .filter_exp_results ()
4146
42- for exp_result in filtered_results :
43- error_analysis = self .episode_summarizer (exp_result )
44- self .save_analysis (exp_result , error_analysis )
47+ if parallel :
48+ import joblib
49+
50+ joblib .Parallel (n_jobs = jobs , backend = "threading" )(
51+ joblib .delayed (analyze )(exp_result , self .episode_summarizer , self .save_analysis )
52+ for exp_result in filtered_results
53+ )
54+
55+ else :
56+ for exp_result in filtered_results :
57+ error_analysis = self .episode_summarizer (exp_result )
58+ self .save_analysis (exp_result , error_analysis )
4559
4660 def save_analysis (self , exp_result : ExpResult , error_analysis : dict , exists_ok = True ):
4761 """Save the analysis to json"""
@@ -56,28 +70,37 @@ def save_analysis(self, exp_result: ExpResult, error_analysis: dict, exists_ok=T
5670HTML_FORMATTER = lambda x : x .get ("pruned_html" , "No HTML available" )
5771
5872
59- if __name__ == "__main__" :
73+ def main () :
6074 import argparse
6175
6276 parser = argparse .ArgumentParser ()
6377 parser .add_argument ("-e" , "--exp_dir" , type = str )
6478 parser .add_argument ("-f" , "--filter" , type = str , default = None )
79+ parser .add_argument ("-p" , "--parallel" , action = "store_true" )
80+ parser .add_argument ("-j" , "--jobs" , type = int , default = - 1 )
6581
6682 args = parser .parse_args ()
83+
84+ assert args .exp_dir is not None , "Please provide an exp_dir, e.g., -e /path/to/exp_dir"
85+
6786 exp_dir = Path (args .exp_dir )
6887 filter = args .filter
88+ parallel = args .parallel
89+ jobs = args .jobs
6990
7091 from agentlab .llm .llm_configs import CHAT_MODEL_ARGS_DICT
7192
7293 llm = CHAT_MODEL_ARGS_DICT ["azure/gpt-4o-2024-08-06" ].make_model ()
7394
74- step_summarizer = ChangeSummarizer (llm , lambda x : x )
75- episode_summarizer = EpisodeSummarizer ()
76-
7795 pipeline = ErrorAnalysisPipeline (
7896 exp_dir = exp_dir ,
7997 filter = filter ,
8098 episode_summarizer = EpisodeErrorSummarizer (ChangeSummarizer (llm , AXTREE_FORMATTER ), llm ),
8199 )
82100
83- pipeline .run_analysis ()
101+ pipeline .run_analysis (parallel = parallel , jobs = jobs )
102+
103+
104+ if __name__ == "__main__" :
105+
106+ main ()
0 commit comments