chore: fit more competition (#723)

1. Remove potential <code> tags from the generated code.
2. Use return codes in data_loader, feature, and model.
3. Configure the debug timeout.
This commit is contained in:
Tim
2025-04-10 17:56:57 +08:00
committed by GitHub
parent 612621f393
commit a6ae88fb42
11 changed files with 53 additions and 32 deletions
@@ -24,7 +24,11 @@ class DSCoderCoSTEERSettings(CoSTEERSettings):
# TODO: extract a function for env and conf.
def get_ds_env(conf_type: Literal["kaggle", "mlebench"] = "kaggle") -> Env:
def get_ds_env(
conf_type: Literal["kaggle", "mlebench"] = "kaggle",
extra_volumes: dict = {},
running_timeout_period: int = DS_RD_SETTING.debug_timeout,
) -> Env:
"""
Retrieve the appropriate environment configuration based on the env_type setting.
@@ -48,6 +52,8 @@ def get_ds_env(conf_type: Literal["kaggle", "mlebench"] = "kaggle") -> Env:
)
else:
raise ValueError(f"Unknown env type: {conf.env_type}")
env.conf.extra_volumes = extra_volumes
env.conf.running_timeout_period = running_timeout_period
return env
@@ -46,8 +46,9 @@ class EnsembleCoSTEEREvaluator(CoSTEEREvaluator):
final_decision=False,
)
env = get_ds_env()
env.conf.extra_volumes = {f"{DS_RD_SETTING.local_data_path}/sample/{self.scen.competition}": "/kaggle/input"}
env = get_ds_env(
extra_volumes={f"{DS_RD_SETTING.local_data_path}/sample/{self.scen.competition}": "/kaggle/input"}
)
fname = "test/ensemble_test.txt"
test_code = (DIRNAME / "eval_tests" / "ensemble_test.txt").read_text()
@@ -20,7 +20,6 @@ FeatureEvalFeedback = CoSTEERSingleFeedback
class FeatureCoSTEEREvaluator(CoSTEEREvaluator):
def evaluate(
self,
target_task: Task,
@@ -29,7 +28,6 @@ class FeatureCoSTEEREvaluator(CoSTEEREvaluator):
queried_knowledge: QueriedKnowledge = None,
**kwargs,
) -> FeatureEvalFeedback:
target_task_information = target_task.get_task_information()
if (
queried_knowledge is not None
@@ -44,8 +42,9 @@ class FeatureCoSTEEREvaluator(CoSTEEREvaluator):
final_decision=False,
)
env = get_ds_env()
env.conf.extra_volumes = {f"{DS_RD_SETTING.local_data_path}/sample/{self.scen.competition}": "/kaggle/input"}
env = get_ds_env(
extra_volumes={f"{DS_RD_SETTING.local_data_path}/sample/{self.scen.competition}": "/kaggle/input"}
)
# TODO: do we need to clean the generated temporary content?
fname = "test/feature_test.py"
@@ -72,9 +71,12 @@ class FeatureCoSTEEREvaluator(CoSTEEREvaluator):
workflow_stdout=workflow_stdout,
)
return build_cls_from_json_with_retry(
fb = build_cls_from_json_with_retry(
FeatureEvalFeedback,
system_prompt=system_prompt,
user_prompt=user_prompt,
init_kwargs_update_func=FeatureEvalFeedback.val_and_update_init_dict,
)
fb.final_decision = fb.final_decision and ret_code == 0
return fb
@@ -56,8 +56,9 @@ class ModelGeneralCaseSpecEvaluator(CoSTEEREvaluator):
final_decision=False,
)
env = get_ds_env()
env.conf.extra_volumes = {f"{DS_RD_SETTING.local_data_path}/sample/{self.scen.competition}": "/kaggle/input"}
env = get_ds_env(
extra_volumes={f"{DS_RD_SETTING.local_data_path}/sample/{self.scen.competition}": "/kaggle/input"}
)
if_model_removed = False
@@ -107,9 +108,12 @@ class ModelGeneralCaseSpecEvaluator(CoSTEEREvaluator):
workflow_stdout=workflow_stdout,
)
return build_cls_from_json_with_retry(
fb = build_cls_from_json_with_retry(
ModelSingleFeedback,
system_prompt=system_prompt,
user_prompt=user_prompt,
init_kwargs_update_func=ModelSingleFeedback.val_and_update_init_dict,
)
fb.final_decision = fb.final_decision and ret_code == 0
return fb
@@ -51,8 +51,9 @@ class PipelineCoSTEEREvaluator(CoSTEEREvaluator):
final_decision=False,
)
env = get_ds_env()
env.conf.extra_volumes = {f"{DS_RD_SETTING.local_data_path}/sample/{self.scen.competition}": "/kaggle/input"}
env = get_ds_env(
extra_volumes={f"{DS_RD_SETTING.local_data_path}/sample/{self.scen.competition}": "/kaggle/input"}
)
# Clean the scores.csv & submission.csv.
implementation.execute(env=env, entry=get_clear_ws_cmd())
@@ -225,8 +225,10 @@ class DataLoaderCoSTEER(CoSTEER):
def develop(self, exp):
new_exp = super().develop(exp)
env = get_ds_env()
env.conf.extra_volumes = {f"{DS_RD_SETTING.local_data_path}/{self.scen.competition}": "/kaggle/input"}
env = get_ds_env(
extra_volumes={f"{DS_RD_SETTING.local_data_path}/{self.scen.competition}": "/kaggle/input"},
running_timeout_period=DS_RD_SETTING.full_timeout,
)
stdout = new_exp.experiment_workspace.execute(env=env, entry=f"python test/data_loader_test.py")
match = re.search(r"(.*?)=== Start of EDA part ===(.*)=== End of EDA part ===", stdout, re.DOTALL)
@@ -23,7 +23,6 @@ DataLoaderEvalFeedback = CoSTEERSingleFeedback
class DataLoaderCoSTEEREvaluator(CoSTEEREvaluator):
def evaluate(
self,
target_task: Task,
@@ -32,7 +31,6 @@ class DataLoaderCoSTEEREvaluator(CoSTEEREvaluator):
queried_knowledge: CoSTEERQueriedKnowledgeV2 = None,
**kwargs,
) -> DataLoaderEvalFeedback:
target_task_information = target_task.get_task_information()
if (
queried_knowledge is not None
@@ -47,8 +45,9 @@ class DataLoaderCoSTEEREvaluator(CoSTEEREvaluator):
final_decision=False,
)
env = get_ds_env()
env.conf.extra_volumes = {f"{DS_RD_SETTING.local_data_path}/sample/{self.scen.competition}": "/kaggle/input"}
env = get_ds_env(
extra_volumes={f"{DS_RD_SETTING.local_data_path}/sample/{self.scen.competition}": "/kaggle/input"}
)
# TODO: do we need to clean the generated temporary content?
fname = "test/data_loader_test.py"
@@ -80,9 +79,12 @@ class DataLoaderCoSTEEREvaluator(CoSTEEREvaluator):
workflow_stdout=workflow_stdout,
)
return build_cls_from_json_with_retry(
fb = build_cls_from_json_with_retry(
DataLoaderEvalFeedback,
system_prompt=system_prompt,
user_prompt=user_prompt,
init_kwargs_update_func=DataLoaderEvalFeedback.val_and_update_init_dict,
)
fb.final_decision = fb.final_decision and ret_code == 0
return fb
@@ -54,8 +54,9 @@ class WorkflowGeneralCaseSpecEvaluator(CoSTEEREvaluator):
final_decision=False,
)
env = get_ds_env()
env.conf.extra_volumes = {f"{DS_RD_SETTING.local_data_path}/sample/{self.scen.competition}": "/kaggle/input"}
env = get_ds_env(
extra_volumes={f"{DS_RD_SETTING.local_data_path}/sample/{self.scen.competition}": "/kaggle/input"}
)
# # DockerEnv for MLEBench submission validation
# mle_de_conf = MLEBDockerConf()
+1 -2
View File
@@ -16,8 +16,7 @@ from rdagent.scenarios.data_science.experiment.experiment import DSExperiment
from rdagent.scenarios.kaggle.kaggle_crawler import score_rank
from rdagent.utils.env import DockerEnv, MLEBDockerConf
de = get_ds_env("mlebench")
de.conf.extra_volumes = {f"{DS_RD_SETTING.local_data_path}/zip_files": "/mle/data"}
de = get_ds_env(conf_type="mlebench", extra_volumes={f"{DS_RD_SETTING.local_data_path}/zip_files": "/mle/data"})
de.prepare()
@@ -33,9 +33,10 @@ class DSCoSTEERCoSTEEREvaluator(CoSTEEREvaluator):
**kwargs,
) -> DSCoSTEEREvalFeedback:
env = get_ds_env()
env.conf.extra_volumes = {f"{DS_RD_SETTING.local_data_path}/{self.scen.competition}": "/kaggle/input"}
env.conf.running_timeout_period = DS_RD_SETTING.full_timeout
env = get_ds_env(
extra_volumes={f"{DS_RD_SETTING.local_data_path}/{self.scen.competition}": "/kaggle/input"},
running_timeout_period=DS_RD_SETTING.full_timeout,
)
stdout = implementation.execute(
env=env, entry=get_clear_ws_cmd()
@@ -94,10 +95,12 @@ class DSCoSTEERCoSTEEREvaluator(CoSTEEREvaluator):
submission_check_out = ""
if DS_RD_SETTING.if_using_mle_data:
mde = get_ds_env("mlebench")
mde.conf.extra_volumes = {
f"{DS_RD_SETTING.local_data_path}/zip_files": "/mle/data",
}
mde = get_ds_env(
conf_type="mlebench",
extra_volumes={
f"{DS_RD_SETTING.local_data_path}/zip_files": "/mle/data",
},
)
mde.prepare()
# MLEBench Check
mle_check_code = (
+1 -1
View File
@@ -34,6 +34,7 @@ class PythonAgentOut(AgentOut):
match = re.search(r".*```[Pp]ython\n(.*)\n```.*", resp, re.DOTALL)
if match:
code = match.group(1)
code = re.sub(r"</?code>", "", code, flags=re.IGNORECASE)
return code
return resp
@@ -51,7 +52,6 @@ class BatchEditOut(AgentOut):
class PythonBatchEditOut(AgentOut):
@classmethod
def get_spec(cls, with_del=True):
return T(".tpl:PythonBatchEditOut").r(with_del=with_del)