项目文件夹

文件
wehub-resource-sync e64161ec32
CI / ci (3.11) (push) Has been cancelled
CI / ci (3.10) (push) Has been cancelled
CI / dependabot (push) Has been cancelled
Release / release_and_publish (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:36:15 +08:00

105 行
3.6 KiB
Python

"""
FT-specific Workspace implementation with minimal checkpoint strategy.
This module provides FTWorkspace, which configures checkpoint to only save
configuration files (train.yaml), excluding all training outputs.
Design Philosophy:
- Checkpoint is for code version control during CoSTEER evolution
- Model persistence is handled separately by Runner's save_model()
- This separation keeps concerns clear and checkpoints lightweight
"""
from typing import TYPE_CHECKING, Any
from rdagent.components.coder.finetune.conf import FT_YAML_FILE_NAME
from rdagent.core.conf import RD_AGENT_SETTINGS
from rdagent.core.experiment import FBWorkspace
from rdagent.log import rdagent_logger as logger
from rdagent.utils.env import CacheKeyFunc, DockerEnv, LocalEnv
if TYPE_CHECKING:
from rdagent.utils.env import Env
from rdagent.utils.env import EnvResult
class FTWorkspace(FBWorkspace):
"""
Fine-tuning workspace with minimal checkpoint strategy and unified Docker logging.
Checkpoint Strategy:
- Only saves configuration files (train.yaml) for version control
- Training outputs (models, checkpoints) are excluded by design
- Final model persistence is Runner's responsibility, not checkpoint's
"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Configure checkpoint to save essential files for training
# Training outputs (models, checkpoints) are managed separately by save_final_model()
RD_AGENT_SETTINGS.workspace_ckp_white_list_names = [
FT_YAML_FILE_NAME, # train.yaml - training config
"dataset_info.json", # LlamaFactory dataset config
]
RD_AGENT_SETTINGS.workspace_ckp_size_limit = 100 * 1024
def run(
self,
env: "Env",
entry: str,
env_vars: dict | None = None,
cache_key_extra_func: CacheKeyFunc | None = None,
cache_files_to_extract: list[str] | None = None,
) -> "EnvResult":
"""Execute the code in the environment with unified Docker logging.
Args:
env: The environment to run in (DockerEnv, LocalEnv, etc.)
entry: The command to execute
env_vars: Optional additional environment variables (e.g., LLM API keys)
Will be merged with default {"PYTHONPATH": "./"}
cache_key_extra_func: Optional extra function for cache key calculation
cache_files_to_extract: Optional list of files to extract from cache
Returns:
EnvResult with stdout, exit_code, running_time
"""
self.prepare()
self.inject_files(**self.file_dict)
# Merge default env with custom env_vars
run_env = {"PYTHONPATH": "./"}
if env_vars:
run_env.update(env_vars)
result = env.run(
entry,
str(self.workspace_path),
env=run_env,
cache_key_extra_func=cache_key_extra_func,
cache_files_to_extract=cache_files_to_extract,
)
# Unified execution logging for FT scenario (supports both Docker and Conda)
if isinstance(env, DockerEnv):
tag_prefix = "docker_run"
elif isinstance(env, LocalEnv):
tag_prefix = "conda_run"
else:
tag_prefix = "env_run"
logger.log_object(
{
"exit_code": result.exit_code,
"stdout": result.stdout or "",
"running_time": result.running_time,
"entry": entry,
"workspace_path": str(self.workspace_path),
},
tag=f"{tag_prefix}.FTWorkspace",
)
return result