Spaces:
Sleeping
Sleeping
| """ | |
| Run benchmark evaluation for ColiFormer. | |
| This script wraps benchmark_evaluation.py and evaluate_optimizer.py to provide | |
| a unified interface for running comprehensive evaluations. | |
| Usage: | |
| python scripts/run_benchmarks.py --config configs/benchmark.yaml | |
| python scripts/run_benchmarks.py --excel_path Benchmark_80_sequences.xlsx --checkpoint_path models/my_model.ckpt | |
| """ | |
| import argparse | |
| import os | |
| import sys | |
| from pathlib import Path | |
| # Add parent directory to path to import benchmark scripts | |
| sys.path.insert(0, str(Path(__file__).parent.parent)) | |
| def load_config(config_path: str) -> dict: | |
| """ | |
| Load configuration from YAML file. | |
| Args: | |
| config_path: Path to YAML config file | |
| Returns: | |
| Dictionary with configuration values | |
| """ | |
| # Lazy import so `python scripts/run_benchmarks.py --help` works without dependencies installed. | |
| import yaml | |
| if not os.path.exists(config_path): | |
| raise FileNotFoundError(f"Config file not found: {config_path}") | |
| with open(config_path, 'r') as f: | |
| config = yaml.safe_load(f) | |
| return config | |
| def config_to_args(config: dict) -> argparse.Namespace: | |
| """ | |
| Convert config dictionary to argparse.Namespace compatible with benchmark_evaluation.py. | |
| Args: | |
| config: Configuration dictionary from YAML | |
| Returns: | |
| argparse.Namespace with all required arguments | |
| """ | |
| model_config = config.get('model', {}) | |
| data_config = config.get('data', {}) | |
| output_config = config.get('output', {}) | |
| eval_config = config.get('evaluation', {}) | |
| args = argparse.Namespace() | |
| # Model paths | |
| args.checkpoint_path = model_config.get('checkpoint_path', 'models/alm-enhanced-training/balanced_alm_finetune.ckpt') | |
| # Data paths | |
| args.excel_path = data_config.get('excel_path', 'Benchmark 80 sequences.xlsx') | |
| args.natural_sequences_path = data_config.get('natural_sequences_path', 'data/ecoli_processed_genes.csv') | |
| args.name_col = data_config.get('name_col') | |
| args.seq_col = data_config.get('seq_col') | |
| args.sheet_name = data_config.get('sheet_name') | |
| # Output paths | |
| args.output_dir = output_config.get('output_dir', 'benchmark_results') | |
| # Evaluation parameters | |
| args.use_gpu = eval_config.get('use_gpu', True) | |
| args.compare_with_base = eval_config.get('compare_with_base', False) | |
| args.max_test_proteins = eval_config.get('max_test_proteins', 0) | |
| return args | |
| def validate_config(config: dict): | |
| """ | |
| Validate configuration before running benchmarks. | |
| Args: | |
| config: Configuration dictionary | |
| Raises: | |
| ValueError: If configuration is invalid | |
| """ | |
| data_config = config.get('data', {}) | |
| excel_path = data_config.get('excel_path', 'Benchmark 80 sequences.xlsx') | |
| if not os.path.exists(excel_path): | |
| raise ValueError( | |
| f"Benchmark Excel file not found: {excel_path}\n" | |
| "Please provide a valid path to your benchmark sequences file." | |
| ) | |
| model_config = config.get('model', {}) | |
| checkpoint_path = model_config.get('checkpoint_path') | |
| # Check if checkpoint exists locally, or will be downloaded from HF | |
| if checkpoint_path and os.path.exists(checkpoint_path): | |
| print(f"Using local checkpoint: {checkpoint_path}") | |
| else: | |
| print(f"Checkpoint not found locally: {checkpoint_path}") | |
| print("Will attempt to download from Hugging Face (saketh11/ColiFormer) if needed") | |
| def main(): | |
| """Main entry point for benchmark evaluation.""" | |
| parser = argparse.ArgumentParser( | |
| description="Run benchmark evaluation for ENCOT", | |
| formatter_class=argparse.RawDescriptionHelpFormatter, | |
| epilog=""" | |
| Examples: | |
| # Run with configuration file | |
| python scripts/run_benchmarks.py --config configs/benchmark.yaml | |
| # Run with command-line arguments | |
| python scripts/run_benchmarks.py --excel_path Benchmark_80_sequences.xlsx --checkpoint_path models/my_model.ckpt | |
| # Override config values | |
| python scripts/run_benchmarks.py --config configs/benchmark.yaml --use_gpu --max_test_proteins 50 | |
| """ | |
| ) | |
| parser.add_argument( | |
| "--config", | |
| type=str, | |
| default=None, | |
| help="Path to YAML configuration file" | |
| ) | |
| parser.add_argument( | |
| "--excel_path", | |
| type=str, | |
| default=None, | |
| help="Path to benchmark Excel file (overrides config)" | |
| ) | |
| parser.add_argument( | |
| "--checkpoint_path", | |
| type=str, | |
| default=None, | |
| help="Path to model checkpoint (overrides config)" | |
| ) | |
| parser.add_argument( | |
| "--output_dir", | |
| type=str, | |
| default=None, | |
| help="Output directory for results (overrides config)" | |
| ) | |
| parser.add_argument( | |
| "--use_gpu", | |
| action="store_true", | |
| help="Use GPU if available (overrides config)" | |
| ) | |
| parser.add_argument( | |
| "--max_test_proteins", | |
| type=int, | |
| default=None, | |
| help="Maximum number of proteins to test (overrides config)" | |
| ) | |
| args = parser.parse_args() | |
| try: | |
| # Lazy import so `--help` works even if plotting/ML deps are missing. | |
| from benchmark_evaluation import main as benchmark_main | |
| if args.config: | |
| # Load configuration from file | |
| print(f"Loading configuration from {args.config}...") | |
| config = load_config(args.config) | |
| # Override with command-line arguments if provided | |
| if args.excel_path: | |
| config.setdefault('data', {})['excel_path'] = args.excel_path | |
| if args.checkpoint_path: | |
| config.setdefault('model', {})['checkpoint_path'] = args.checkpoint_path | |
| if args.output_dir: | |
| config.setdefault('output', {})['output_dir'] = args.output_dir | |
| if args.use_gpu: | |
| config.setdefault('evaluation', {})['use_gpu'] = True | |
| if args.max_test_proteins is not None: | |
| config.setdefault('evaluation', {})['max_test_proteins'] = args.max_test_proteins | |
| # Validate configuration | |
| validate_config(config) | |
| # Convert config to args namespace | |
| benchmark_args = config_to_args(config) | |
| else: | |
| # Use command-line arguments directly | |
| if not args.excel_path: | |
| parser.error("Either --config or --excel_path must be provided") | |
| benchmark_args = argparse.Namespace() | |
| benchmark_args.excel_path = args.excel_path | |
| benchmark_args.checkpoint_path = args.checkpoint_path or 'models/alm-enhanced-training/balanced_alm_finetune.ckpt' | |
| benchmark_args.natural_sequences_path = 'data/ecoli_processed_genes.csv' | |
| benchmark_args.output_dir = args.output_dir or 'benchmark_results' | |
| benchmark_args.use_gpu = args.use_gpu | |
| benchmark_args.max_test_proteins = args.max_test_proteins or 0 | |
| benchmark_args.name_col = None | |
| benchmark_args.seq_col = None | |
| benchmark_args.sheet_name = None | |
| # Validate | |
| if not os.path.exists(benchmark_args.excel_path): | |
| raise ValueError(f"Benchmark Excel file not found: {benchmark_args.excel_path}") | |
| # Print configuration summary | |
| print("\n" + "="*60) | |
| print("Benchmark Configuration Summary") | |
| print("="*60) | |
| print(f"Excel file: {benchmark_args.excel_path}") | |
| print(f"Checkpoint: {benchmark_args.checkpoint_path}") | |
| print(f"Output directory: {benchmark_args.output_dir}") | |
| print(f"Use GPU: {benchmark_args.use_gpu}") | |
| print(f"Max test proteins: {benchmark_args.max_test_proteins if benchmark_args.max_test_proteins > 0 else 'All'}") | |
| print("="*60 + "\n") | |
| # Run benchmark | |
| benchmark_main(benchmark_args) | |
| except Exception as e: | |
| print(f"Error: {e}", file=sys.stderr) | |
| import traceback | |
| traceback.print_exc() | |
| sys.exit(1) | |
| if __name__ == "__main__": | |
| main() | |