expmate


Nameexpmate JSON
Version 0.1.2 PyPI version JSON
download
home_pageNone
SummaryML Research Boilerplate β€” Config & Logging First
upload_time2025-10-27 07:34:44
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseMIT
keywords machine-learning deep-learning experiment-tracking pytorch configuration logging reproducibility research cli
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # ExpMate

**ML Research Boilerplate β€” Config & Logging First**

[![PyPI version](https://img.shields.io/pypi/v/expmate.svg)](https://pypi.org/project/expmate/)
[![Python versions](https://img.shields.io/pypi/pyversions/expmate.svg)](https://pypi.org/project/expmate/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

ExpMate is a lightweight experiment management toolkit designed for ML researchers who want to focus on their experiments, not on boilerplate code. It provides clean, reusable patterns for configuration management, logging, and experiment trackingβ€”everything you need to run reproducible ML experiments.

## 🌟 Key Features

- **πŸ”§ Configuration Management**: YAML-based configs with command-line overrides, type preservation, and nested value support
- **πŸ“Š Experiment Logging**: Structured logging with metrics tracking, best model monitoring, and rank-aware DDP support
- **πŸš€ PyTorch Integration**: Checkpoint management, DDP utilities, and distributed training helpers
- **πŸ“ˆ Experiment Tracking**: Built-in support for WandB and TensorBoard
- **πŸ” CLI Tools**: Compare runs, visualize metrics, and manage hyperparameter sweeps
- **πŸ”„ Git Integration**: Automatic git info tracking for reproducibility
- **⚑ Zero Configuration**: Works out of the box with sensible defaults

## πŸ“¦ Installation

### Basic Installation

Install ExpMate with all core features:

```bash
pip install expmate
```

**What's included:**
- βœ… **Configuration parser** - YAML configs with CLI overrides
- βœ… **Experiment logger** - Structured logging and metrics tracking
- βœ… **CLI tools** - `compare`, `visualize`, `sweep` commands
- βœ… **Visualization** - Plot metrics with matplotlib
- βœ… **Data analysis** - Fast data processing with polars
- βœ… **System monitoring** - Track CPU/memory usage with psutil

### Optional: Experiment Tracking

Add integration with popular tracking platforms:

```bash
# Weights & Biases only
pip install expmate[wandb]

# TensorBoard only
pip install expmate[tensorboard]

# Both tracking platforms
pip install expmate[tracking]
```

### Using with PyTorch

ExpMate works great with PyTorch! **Install PyTorch separately:**

```bash
pip install expmate
pip install torch torchvision  # Install PyTorch your way
```

## πŸš€ Quick Start

### Minimal Example

```python
from expmate import ExperimentLogger, parse_config, set_seed

# Parse config from YAML + command-line overrides
config = parse_config()

# Set random seed for reproducibility
set_seed(config.seed)

# Create experiment logger
logger = ExperimentLogger(run_dir=f"runs/{config.run_id}")
logger.info(f"Starting experiment: {config.run_id}")

# Your training code here...
for epoch in range(config.training.epochs):
    # ... training logic ...

    # Log metrics
    logger.log_metric(step=epoch, split='train', name='loss', value=loss)
    logger.info(f"Epoch {epoch}: loss={loss:.4f}")

logger.info("Training complete!")
```

### Configuration File (YAML)

```yaml
# config.yaml
run_id: "exp_${now:%Y%m%d_%H%M%S}"  # Auto-generate with timestamp
seed: 42

model:
  input_dim: 128
  hidden_dim: 256
  output_dim: 10

training:
  epochs: 10
  lr: 0.001
  batch_size: 32
```

### Running with Overrides

```bash
# Basic run
python train.py config.yaml

# Override parameters
python train.py config.yaml training.lr=0.01 training.epochs=20

# Add new keys
python train.py config.yaml +optimizer.weight_decay=0.0001
python train.py config.yaml +description="Testing new implementation"

# Type hints for ambiguous values
python train.py config.yaml training.lr:float=1e-3
```

## πŸ“š Core Components

### Configuration Parser

ExpMate provides a powerful configuration system with [Hydra](https://github.com/facebookresearch/hydra)-style overrides, automatic type inference, and flexible list handling:

```python
from expmate import parse_config

# Parse config file (first positional argument) with CLI overrides
config = parse_config()

# Access nested config values
print(config.model.hidden_dim)
print(config.training.lr)
print(config.training.gpus)
```

**Command-line usage:**

```bash
# Basic usage - config file is the FIRST argument
python train.py config.yaml

# Override existing values
python train.py config.yaml training.lr=0.01 model.depth=34

# Add new configuration keys
python train.py config.yaml +experiment.debug=true

# Override with lists (JSON format)
python train.py config.yaml training.gpus=[0,1,2,3]

# Override with space-separated lists (auto-detect type)
python train.py config.yaml training.gpus=0 1 2 3

# Override with typed lists
python train.py config.yaml training.ids:int=1 2 3
python train.py config.yaml data.splits:str=train val test

# View current configuration
python train.py config.yaml --show-config

# View configuration schema with types
python train.py config.yaml --config-help
```

**Type preservation:**

ExpMate automatically detects and preserves types:

```bash
# From config.yaml:
#   training:
#     lr: 0.001          # float
#     epochs: 100        # int
#     use_amp: true      # bool
#     gpus: [0, 1]       # list

# Command line overrides preserve types:
python train.py config.yaml training.lr=0.01        # β†’ float
python train.py config.yaml training.epochs=200     # β†’ int
python train.py config.yaml training.use_amp=false  # β†’ bool
python train.py config.yaml training.gpus=0 1 2     # β†’ list[int]
```

### Experiment Logger

Structured logging with colorful console output, timing utilities, and hierarchical stage tracking:

```python
from expmate import ExperimentLogger

logger = ExperimentLogger(
    run_dir='runs/exp1',
    rank=0,  # For distributed training
    log_level='INFO'
)

# Text logging with color-coded console output
logger.info("Training started")  # Green
logger.warning("Learning rate might be too high")  # Yellow
logger.error("NaN detected in loss")  # Red

# Metrics logging
logger.log_metric(step=100, split='train', name='loss', value=0.5)
logger.log_metric(step=100, split='train', name='accuracy', value=0.95)

# Hierarchical stage tracking
with logger.stage('epoch', epoch=5):
    with logger.stage('train'):
        # Training code...
        train_loss = train_epoch()
    with logger.stage('validation'):
        # Validation code...
        val_loss = validate()

# Timing utilities
with logger.timer('data_loading'):
    data = load_data()

# Rate-limited logging (reduce console spam)
for step in range(10000):
    loss = train_step()
    with logger.rate_limit(every=100):
        logger.info(f"Step {step}: loss={loss:.4f}")
```

**Features:**
- 🎨 Automatic colorful console output (disabled in file logs)
- πŸ“Š Best metric tracking
- ⏱️ Simple timing with `timer()`
- πŸ“‚ Hierarchical stage tracking with `stage()`
- πŸ”‡ Rate-limited logging with `rate_limit()`


### PyTorch Checkpoint Manager

Intelligent checkpoint management with automatic cleanup:

```python
from expmate.torch import CheckpointManager

manager = CheckpointManager(
    checkpoint_dir='checkpoints',
    keep_last=3,      # Keep last 3 checkpoints
    keep_best=5,      # Keep top 5 checkpoints
    metric_name='val_loss',
    mode='min'
)

# Save checkpoint
manager.save(
    model=model,
    optimizer=optimizer,
    scheduler=scheduler,
    epoch=epoch,
    metrics={'val_loss': 0.5, 'val_acc': 0.95}
)

# Load checkpoint
checkpoint = manager.load_latest()
model.load_state_dict(checkpoint['model_state_dict'])
optimizer.load_state_dict(checkpoint['optimizer_state_dict'])

# Load best checkpoint
best_checkpoint = manager.load_best()
```

### Distributed Training (DDP) Support

Easy distributed training setup:

```python
from expmate.torch import mp
from expmate import ExperimentLogger

# Setup DDP
rank, local_rank, world_size = mp.setup_ddp()

# Create shared run directory (DDP-safe!)
run_dir = mp.create_shared_run_dir(base_dir="runs", run_id=config.run_id)

# Rank-aware logging
logger = ExperimentLogger(run_dir=run_dir, rank=rank)
if rank == 0:
    logger.info(f"Training on {world_size} GPUs")

# Your DDP training code...
```

Run with torchrun:

```bash
torchrun --nproc_per_node=4 train.py config.yaml
```

## πŸ› οΈ CLI Tools

ExpMate includes powerful command-line tools for experiment management:

### Compare Runs

```bash
# Compare multiple experiments
expmate compare runs/exp1 runs/exp2 runs/exp3

# Compare specific metrics
expmate compare runs/exp* --metrics loss accuracy

# Export to CSV
expmate compare runs/exp* --output results.csv

# Show config differences
expmate compare runs/exp* --show-config
```

### Visualize Metrics

```bash
# Plot training curves
expmate viz runs/exp1 --metrics loss accuracy

# Compare multiple runs
expmate viz runs/exp1 runs/exp2 runs/exp3 --metrics loss

# Specify output file
expmate viz runs/exp1 --output metrics.png

# Different plot styles
expmate viz runs/exp1 --style seaborn
```

### Hyperparameter Sweeps

```bash
# Grid search with Python
expmate sweep "python train.py {config}" \
  --config config.yaml \
  --sweep "training.lr=[0.001,0.01,0.1]" \
          "model.hidden_dim=[128,256,512]"

# With torchrun for distributed training
expmate sweep "torchrun --nproc_per_node=4 train.py {config}" \
  --config config.yaml \
  --sweep "training.lr=[0.001,0.01,0.1]" \
          "model.hidden_dim=[128,256]"

# Dry run to preview commands
expmate sweep "python train.py {config}" \
  --config config.yaml \
  --sweep "training.lr=[0.001,0.01]" \
  --dry-run
```

## πŸ”Œ Experiment Tracking Integration

### Weights & Biases

```python
from expmate.tracking import WandbTracker

tracker = WandbTracker(
    project="my-project",
    name=config.run_id,
    config=config.to_dict()
)

# Log metrics
tracker.log({'train/loss': loss, 'train/acc': acc}, step=epoch)

# Log artifacts
tracker.log_artifact(path='model.pt', name='final_model')
tracker.finish()
```

### TensorBoard

```python
from expmate.tracking import TensorBoardTracker

tracker = TensorBoardTracker(log_dir=f'runs/{config.run_id}/tensorboard')

# Log metrics
tracker.log({'loss': loss, 'accuracy': acc}, step=epoch)

# Log histograms
tracker.log_histogram('weights', model.fc.weight, step=epoch)
```

## πŸ“– Examples

Check out the [`examples/`](examples/) directory for complete examples:

- **[`minimal.py`](examples/minimal.py)**: Quick start guide with basic usage
- **[`train.py`](examples/train.py)**: Complete DDP training example with all features
- **[`train.sh`](examples/train.sh)**: Shell script for running experiments

## 🎯 Design Philosophy

ExpMate is built around three core principles:

1. **Configuration First**: All experiments start with a config file, making them reproducible and easy to modify
2. **Logging First**: Structured logging and metrics tracking from day one
3. **Zero Boilerplate**: Sensible defaults that work out of the box, with customization when needed

## 🀝 Contributing

Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.

## πŸ“„ License

This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.

## πŸ™ Acknowledgments

ExpMate was created to simplify ML research workflows. Special thanks to the open-source community for inspiration and tools.

## πŸ“ž Contact

- **Author**: Kunhee Kim
- **Email**: kunhee.kim@kaist.ac.kr
- **GitHub**: [kunheek/expmate](https://github.com/kunheek/expmate)

## πŸ”— Links

- [PyPI Package](https://pypi.org/project/expmate/)
- [GitHub Repository](https://github.com/kunheek/expmate)
- [Documentation](https://github.com/kunheek/expmate#readme)
- [Issue Tracker](https://github.com/kunheek/expmate/issues)

---

**Made with ❀️ for ML researchers**

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "expmate",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "machine-learning, deep-learning, experiment-tracking, pytorch, configuration, logging, reproducibility, research, cli",
    "author": null,
    "author_email": "Kunhee Kim <kunhee.kim@kaist.ac.kr>",
    "download_url": "https://files.pythonhosted.org/packages/ee/ef/4a486f8932e08c5c212ad261baae88d2873c27dbb541fd37573b991ba396/expmate-0.1.2.tar.gz",
    "platform": null,
    "description": "# ExpMate\n\n**ML Research Boilerplate \u2014 Config & Logging First**\n\n[![PyPI version](https://img.shields.io/pypi/v/expmate.svg)](https://pypi.org/project/expmate/)\n[![Python versions](https://img.shields.io/pypi/pyversions/expmate.svg)](https://pypi.org/project/expmate/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nExpMate is a lightweight experiment management toolkit designed for ML researchers who want to focus on their experiments, not on boilerplate code. It provides clean, reusable patterns for configuration management, logging, and experiment tracking\u2014everything you need to run reproducible ML experiments.\n\n## \ud83c\udf1f Key Features\n\n- **\ud83d\udd27 Configuration Management**: YAML-based configs with command-line overrides, type preservation, and nested value support\n- **\ud83d\udcca Experiment Logging**: Structured logging with metrics tracking, best model monitoring, and rank-aware DDP support\n- **\ud83d\ude80 PyTorch Integration**: Checkpoint management, DDP utilities, and distributed training helpers\n- **\ud83d\udcc8 Experiment Tracking**: Built-in support for WandB and TensorBoard\n- **\ud83d\udd0d CLI Tools**: Compare runs, visualize metrics, and manage hyperparameter sweeps\n- **\ud83d\udd04 Git Integration**: Automatic git info tracking for reproducibility\n- **\u26a1 Zero Configuration**: Works out of the box with sensible defaults\n\n## \ud83d\udce6 Installation\n\n### Basic Installation\n\nInstall ExpMate with all core features:\n\n```bash\npip install expmate\n```\n\n**What's included:**\n- \u2705 **Configuration parser** - YAML configs with CLI overrides\n- \u2705 **Experiment logger** - Structured logging and metrics tracking\n- \u2705 **CLI tools** - `compare`, `visualize`, `sweep` commands\n- \u2705 **Visualization** - Plot metrics with matplotlib\n- \u2705 **Data analysis** - Fast data processing with polars\n- \u2705 **System monitoring** - Track CPU/memory usage with psutil\n\n### Optional: Experiment Tracking\n\nAdd integration with popular tracking platforms:\n\n```bash\n# Weights & Biases only\npip install expmate[wandb]\n\n# TensorBoard only\npip install expmate[tensorboard]\n\n# Both tracking platforms\npip install expmate[tracking]\n```\n\n### Using with PyTorch\n\nExpMate works great with PyTorch! **Install PyTorch separately:**\n\n```bash\npip install expmate\npip install torch torchvision  # Install PyTorch your way\n```\n\n## \ud83d\ude80 Quick Start\n\n### Minimal Example\n\n```python\nfrom expmate import ExperimentLogger, parse_config, set_seed\n\n# Parse config from YAML + command-line overrides\nconfig = parse_config()\n\n# Set random seed for reproducibility\nset_seed(config.seed)\n\n# Create experiment logger\nlogger = ExperimentLogger(run_dir=f\"runs/{config.run_id}\")\nlogger.info(f\"Starting experiment: {config.run_id}\")\n\n# Your training code here...\nfor epoch in range(config.training.epochs):\n    # ... training logic ...\n\n    # Log metrics\n    logger.log_metric(step=epoch, split='train', name='loss', value=loss)\n    logger.info(f\"Epoch {epoch}: loss={loss:.4f}\")\n\nlogger.info(\"Training complete!\")\n```\n\n### Configuration File (YAML)\n\n```yaml\n# config.yaml\nrun_id: \"exp_${now:%Y%m%d_%H%M%S}\"  # Auto-generate with timestamp\nseed: 42\n\nmodel:\n  input_dim: 128\n  hidden_dim: 256\n  output_dim: 10\n\ntraining:\n  epochs: 10\n  lr: 0.001\n  batch_size: 32\n```\n\n### Running with Overrides\n\n```bash\n# Basic run\npython train.py config.yaml\n\n# Override parameters\npython train.py config.yaml training.lr=0.01 training.epochs=20\n\n# Add new keys\npython train.py config.yaml +optimizer.weight_decay=0.0001\npython train.py config.yaml +description=\"Testing new implementation\"\n\n# Type hints for ambiguous values\npython train.py config.yaml training.lr:float=1e-3\n```\n\n## \ud83d\udcda Core Components\n\n### Configuration Parser\n\nExpMate provides a powerful configuration system with [Hydra](https://github.com/facebookresearch/hydra)-style overrides, automatic type inference, and flexible list handling:\n\n```python\nfrom expmate import parse_config\n\n# Parse config file (first positional argument) with CLI overrides\nconfig = parse_config()\n\n# Access nested config values\nprint(config.model.hidden_dim)\nprint(config.training.lr)\nprint(config.training.gpus)\n```\n\n**Command-line usage:**\n\n```bash\n# Basic usage - config file is the FIRST argument\npython train.py config.yaml\n\n# Override existing values\npython train.py config.yaml training.lr=0.01 model.depth=34\n\n# Add new configuration keys\npython train.py config.yaml +experiment.debug=true\n\n# Override with lists (JSON format)\npython train.py config.yaml training.gpus=[0,1,2,3]\n\n# Override with space-separated lists (auto-detect type)\npython train.py config.yaml training.gpus=0 1 2 3\n\n# Override with typed lists\npython train.py config.yaml training.ids:int=1 2 3\npython train.py config.yaml data.splits:str=train val test\n\n# View current configuration\npython train.py config.yaml --show-config\n\n# View configuration schema with types\npython train.py config.yaml --config-help\n```\n\n**Type preservation:**\n\nExpMate automatically detects and preserves types:\n\n```bash\n# From config.yaml:\n#   training:\n#     lr: 0.001          # float\n#     epochs: 100        # int\n#     use_amp: true      # bool\n#     gpus: [0, 1]       # list\n\n# Command line overrides preserve types:\npython train.py config.yaml training.lr=0.01        # \u2192 float\npython train.py config.yaml training.epochs=200     # \u2192 int\npython train.py config.yaml training.use_amp=false  # \u2192 bool\npython train.py config.yaml training.gpus=0 1 2     # \u2192 list[int]\n```\n\n### Experiment Logger\n\nStructured logging with colorful console output, timing utilities, and hierarchical stage tracking:\n\n```python\nfrom expmate import ExperimentLogger\n\nlogger = ExperimentLogger(\n    run_dir='runs/exp1',\n    rank=0,  # For distributed training\n    log_level='INFO'\n)\n\n# Text logging with color-coded console output\nlogger.info(\"Training started\")  # Green\nlogger.warning(\"Learning rate might be too high\")  # Yellow\nlogger.error(\"NaN detected in loss\")  # Red\n\n# Metrics logging\nlogger.log_metric(step=100, split='train', name='loss', value=0.5)\nlogger.log_metric(step=100, split='train', name='accuracy', value=0.95)\n\n# Hierarchical stage tracking\nwith logger.stage('epoch', epoch=5):\n    with logger.stage('train'):\n        # Training code...\n        train_loss = train_epoch()\n    with logger.stage('validation'):\n        # Validation code...\n        val_loss = validate()\n\n# Timing utilities\nwith logger.timer('data_loading'):\n    data = load_data()\n\n# Rate-limited logging (reduce console spam)\nfor step in range(10000):\n    loss = train_step()\n    with logger.rate_limit(every=100):\n        logger.info(f\"Step {step}: loss={loss:.4f}\")\n```\n\n**Features:**\n- \ud83c\udfa8 Automatic colorful console output (disabled in file logs)\n- \ud83d\udcca Best metric tracking\n- \u23f1\ufe0f Simple timing with `timer()`\n- \ud83d\udcc2 Hierarchical stage tracking with `stage()`\n- \ud83d\udd07 Rate-limited logging with `rate_limit()`\n\n\n### PyTorch Checkpoint Manager\n\nIntelligent checkpoint management with automatic cleanup:\n\n```python\nfrom expmate.torch import CheckpointManager\n\nmanager = CheckpointManager(\n    checkpoint_dir='checkpoints',\n    keep_last=3,      # Keep last 3 checkpoints\n    keep_best=5,      # Keep top 5 checkpoints\n    metric_name='val_loss',\n    mode='min'\n)\n\n# Save checkpoint\nmanager.save(\n    model=model,\n    optimizer=optimizer,\n    scheduler=scheduler,\n    epoch=epoch,\n    metrics={'val_loss': 0.5, 'val_acc': 0.95}\n)\n\n# Load checkpoint\ncheckpoint = manager.load_latest()\nmodel.load_state_dict(checkpoint['model_state_dict'])\noptimizer.load_state_dict(checkpoint['optimizer_state_dict'])\n\n# Load best checkpoint\nbest_checkpoint = manager.load_best()\n```\n\n### Distributed Training (DDP) Support\n\nEasy distributed training setup:\n\n```python\nfrom expmate.torch import mp\nfrom expmate import ExperimentLogger\n\n# Setup DDP\nrank, local_rank, world_size = mp.setup_ddp()\n\n# Create shared run directory (DDP-safe!)\nrun_dir = mp.create_shared_run_dir(base_dir=\"runs\", run_id=config.run_id)\n\n# Rank-aware logging\nlogger = ExperimentLogger(run_dir=run_dir, rank=rank)\nif rank == 0:\n    logger.info(f\"Training on {world_size} GPUs\")\n\n# Your DDP training code...\n```\n\nRun with torchrun:\n\n```bash\ntorchrun --nproc_per_node=4 train.py config.yaml\n```\n\n## \ud83d\udee0\ufe0f CLI Tools\n\nExpMate includes powerful command-line tools for experiment management:\n\n### Compare Runs\n\n```bash\n# Compare multiple experiments\nexpmate compare runs/exp1 runs/exp2 runs/exp3\n\n# Compare specific metrics\nexpmate compare runs/exp* --metrics loss accuracy\n\n# Export to CSV\nexpmate compare runs/exp* --output results.csv\n\n# Show config differences\nexpmate compare runs/exp* --show-config\n```\n\n### Visualize Metrics\n\n```bash\n# Plot training curves\nexpmate viz runs/exp1 --metrics loss accuracy\n\n# Compare multiple runs\nexpmate viz runs/exp1 runs/exp2 runs/exp3 --metrics loss\n\n# Specify output file\nexpmate viz runs/exp1 --output metrics.png\n\n# Different plot styles\nexpmate viz runs/exp1 --style seaborn\n```\n\n### Hyperparameter Sweeps\n\n```bash\n# Grid search with Python\nexpmate sweep \"python train.py {config}\" \\\n  --config config.yaml \\\n  --sweep \"training.lr=[0.001,0.01,0.1]\" \\\n          \"model.hidden_dim=[128,256,512]\"\n\n# With torchrun for distributed training\nexpmate sweep \"torchrun --nproc_per_node=4 train.py {config}\" \\\n  --config config.yaml \\\n  --sweep \"training.lr=[0.001,0.01,0.1]\" \\\n          \"model.hidden_dim=[128,256]\"\n\n# Dry run to preview commands\nexpmate sweep \"python train.py {config}\" \\\n  --config config.yaml \\\n  --sweep \"training.lr=[0.001,0.01]\" \\\n  --dry-run\n```\n\n## \ud83d\udd0c Experiment Tracking Integration\n\n### Weights & Biases\n\n```python\nfrom expmate.tracking import WandbTracker\n\ntracker = WandbTracker(\n    project=\"my-project\",\n    name=config.run_id,\n    config=config.to_dict()\n)\n\n# Log metrics\ntracker.log({'train/loss': loss, 'train/acc': acc}, step=epoch)\n\n# Log artifacts\ntracker.log_artifact(path='model.pt', name='final_model')\ntracker.finish()\n```\n\n### TensorBoard\n\n```python\nfrom expmate.tracking import TensorBoardTracker\n\ntracker = TensorBoardTracker(log_dir=f'runs/{config.run_id}/tensorboard')\n\n# Log metrics\ntracker.log({'loss': loss, 'accuracy': acc}, step=epoch)\n\n# Log histograms\ntracker.log_histogram('weights', model.fc.weight, step=epoch)\n```\n\n## \ud83d\udcd6 Examples\n\nCheck out the [`examples/`](examples/) directory for complete examples:\n\n- **[`minimal.py`](examples/minimal.py)**: Quick start guide with basic usage\n- **[`train.py`](examples/train.py)**: Complete DDP training example with all features\n- **[`train.sh`](examples/train.sh)**: Shell script for running experiments\n\n## \ud83c\udfaf Design Philosophy\n\nExpMate is built around three core principles:\n\n1. **Configuration First**: All experiments start with a config file, making them reproducible and easy to modify\n2. **Logging First**: Structured logging and metrics tracking from day one\n3. **Zero Boilerplate**: Sensible defaults that work out of the box, with customization when needed\n\n## \ud83e\udd1d Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.\n\n## \ud83d\udcc4 License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## \ud83d\ude4f Acknowledgments\n\nExpMate was created to simplify ML research workflows. Special thanks to the open-source community for inspiration and tools.\n\n## \ud83d\udcde Contact\n\n- **Author**: Kunhee Kim\n- **Email**: kunhee.kim@kaist.ac.kr\n- **GitHub**: [kunheek/expmate](https://github.com/kunheek/expmate)\n\n## \ud83d\udd17 Links\n\n- [PyPI Package](https://pypi.org/project/expmate/)\n- [GitHub Repository](https://github.com/kunheek/expmate)\n- [Documentation](https://github.com/kunheek/expmate#readme)\n- [Issue Tracker](https://github.com/kunheek/expmate/issues)\n\n---\n\n**Made with \u2764\ufe0f for ML researchers**\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "ML Research Boilerplate \u2014 Config & Logging First",
    "version": "0.1.2",
    "project_urls": {
        "Changelog": "https://github.com/kunheek/expmate/blob/main/CHANGELOG.md",
        "Documentation": "https://github.com/kunheek/expmate#readme",
        "Homepage": "https://github.com/kunheek/expmate",
        "Issues": "https://github.com/kunheek/expmate/issues",
        "Repository": "https://github.com/kunheek/expmate"
    },
    "split_keywords": [
        "machine-learning",
        " deep-learning",
        " experiment-tracking",
        " pytorch",
        " configuration",
        " logging",
        " reproducibility",
        " research",
        " cli"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f17669370f62c2fc813a392ded9f13122a45d2e7df8989dbbd446ddc1d669120",
                "md5": "513c20b9ef1b8a6880072a74d969f003",
                "sha256": "1682224f395c7ec8d3f925b4f9075db8a56bada40f20388afc32d2724d18ac7e"
            },
            "downloads": -1,
            "filename": "expmate-0.1.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "513c20b9ef1b8a6880072a74d969f003",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 43852,
            "upload_time": "2025-10-27T07:34:42",
            "upload_time_iso_8601": "2025-10-27T07:34:42.729651Z",
            "url": "https://files.pythonhosted.org/packages/f1/76/69370f62c2fc813a392ded9f13122a45d2e7df8989dbbd446ddc1d669120/expmate-0.1.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "eeef4a486f8932e08c5c212ad261baae88d2873c27dbb541fd37573b991ba396",
                "md5": "3ef38e9cc7cc0d0d803aef55c96fc22a",
                "sha256": "321cc4d76577dcfdaa53c42bc2844387d7c2e74ca12575414533adb7d51c3fdd"
            },
            "downloads": -1,
            "filename": "expmate-0.1.2.tar.gz",
            "has_sig": false,
            "md5_digest": "3ef38e9cc7cc0d0d803aef55c96fc22a",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 64542,
            "upload_time": "2025-10-27T07:34:44",
            "upload_time_iso_8601": "2025-10-27T07:34:44.305833Z",
            "url": "https://files.pythonhosted.org/packages/ee/ef/4a486f8932e08c5c212ad261baae88d2873c27dbb541fd37573b991ba396/expmate-0.1.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-27 07:34:44",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "kunheek",
    "github_project": "expmate",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "expmate"
}
        
Elapsed time: 1.44334s