Experiment Tracking¶
Molfun integrates with popular experiment tracking platforms through a
unified BaseTracker interface. Multiple trackers can be composed to log
to several platforms simultaneously.
Quick Start¶
from molfun import MolfunStructureModel
model = MolfunStructureModel.from_pretrained("openfold_v2")
# Pass tracker name to fit()
model.fit(train_dataset=ds, strategy="lora", tracker="wandb", epochs=10)
# Or instantiate a tracker directly
from molfun.tracking import WandbTracker
tracker = WandbTracker(project="molfun-experiments", name="lora-r8")
model.fit(train_dataset=ds, strategy="lora", tracker=tracker, epochs=10)
# Compose multiple trackers
from molfun.tracking import CompositeTracker, WandbTracker, ConsoleTracker
tracker = CompositeTracker([
WandbTracker(project="molfun"),
ConsoleTracker(),
])
BaseTracker¶
BaseTracker ¶
Bases: ABC
Interface for experiment tracking.
Lifecycle
tracker.start_run("my-experiment", tags=["lora", "pairformer"]) tracker.log_config({"lr": 1e-4, "block": "pairformer"}) for epoch in range(epochs): tracker.log_metrics({"train_loss": 0.5, "val_loss": 0.3}, step=epoch) tracker.log_artifact("checkpoints/best.pt") tracker.log_text("Training complete. Best val: 0.28", tag="summary") tracker.end_run(status="completed")
start_run
abstractmethod
¶
start_run(name: str | None = None, tags: list[str] | None = None, config: dict | None = None) -> None
Start a new tracked run/experiment.
log_metrics
abstractmethod
¶
Log scalar metrics (loss, accuracy, etc.).
log_config
abstractmethod
¶
Log hyperparameters / experiment configuration.
log_artifact
abstractmethod
¶
Log a file artifact (checkpoint, plot, etc.).
log_text
abstractmethod
¶
Log free-form text (agent reasoning, summaries, etc.).
Abstract base class for all experiment trackers. Implement this to add support for a new tracking platform.
Required Methods¶
| Method | Description |
|---|---|
start_run(**kwargs) |
Initialize a tracking run |
log_metrics(metrics, step) |
Log a dict of scalar metrics |
log_config(config) |
Log experiment configuration/hyperparameters |
log_artifact(path, name) |
Log a file artifact (model checkpoint, etc.) |
log_text(text, name) |
Log a text blob (predictions, summaries) |
end_run() |
Finalize and close the run |
from molfun.tracking.base import BaseTracker
class MyTracker(BaseTracker):
def start_run(self, **kwargs):
...
def log_metrics(self, metrics: dict, step: int | None = None):
...
def log_config(self, config: dict):
...
def log_artifact(self, path: str, name: str | None = None):
...
def log_text(self, text: str, name: str | None = None):
...
def end_run(self):
...
WandbTracker¶
WandbTracker ¶
Bases: BaseTracker
Log experiments to Weights & Biases.
Usage::
tracker = WandbTracker(project="molfun-search", entity="my-team")
tracker.start_run("baseline-pairformer", tags=["lora"])
tracker.log_metrics({"val_loss": 0.3}, step=1)
tracker.end_run()
Weights & Biases experiment tracker.
from molfun.tracking import WandbTracker
tracker = WandbTracker(
project="molfun-structure",
name="lora-rank8-run1",
entity="my-team",
tags=["lora", "openfold"],
)
tracker.start_run()
tracker.log_config({"rank": 8, "lr": 1e-4})
tracker.log_metrics({"loss": 0.42, "rmsd": 1.5}, step=100)
tracker.log_artifact("./checkpoint.pt", name="best_model")
tracker.end_run()
| Parameter | Type | Default | Description |
|---|---|---|---|
project |
str |
"molfun" |
W&B project name |
name |
str \| None |
None |
Run name |
entity |
str \| None |
None |
W&B team/entity |
tags |
list[str] |
[] |
Run tags |
CometTracker¶
CometTracker ¶
Bases: BaseTracker
Log experiments to Comet ML.
Usage::
tracker = CometTracker(
project_name="molfun-search",
api_key="your-key", # or set COMET_API_KEY env var
)
tracker.start_run("baseline-pairformer", tags=["lora"])
tracker.log_metrics({"val_loss": 0.3}, step=1)
tracker.end_run()
Comet ML experiment tracker.
from molfun.tracking import CometTracker
tracker = CometTracker(
project_name="molfun-experiments",
api_key="...",
)
| Parameter | Type | Default | Description |
|---|---|---|---|
project_name |
str |
required | Comet project name |
api_key |
str \| None |
None |
API key (reads COMET_API_KEY env var if None) |
workspace |
str \| None |
None |
Comet workspace |
MLflowTracker¶
MLflowTracker ¶
Bases: BaseTracker
Log experiments to MLflow.
Usage::
tracker = MLflowTracker(
experiment_name="molfun-search",
tracking_uri="http://localhost:5000", # or local ./mlruns
)
tracker.start_run("baseline-pairformer", tags=["lora"])
tracker.log_metrics({"val_loss": 0.3}, step=1)
tracker.end_run()
MLflow experiment tracker.
from molfun.tracking import MLflowTracker
tracker = MLflowTracker(
experiment_name="molfun-structure",
tracking_uri="http://localhost:5000",
)
| Parameter | Type | Default | Description |
|---|---|---|---|
experiment_name |
str |
"molfun" |
MLflow experiment name |
tracking_uri |
str \| None |
None |
MLflow tracking server URI |
LangfuseTracker¶
LangfuseTracker ¶
Bases: BaseTracker
Log experiments and agent traces to Langfuse.
Works with Langfuse Cloud or self-hosted instances. API keys can be passed directly or via environment variables LANGFUSE_PUBLIC_KEY, LANGFUSE_SECRET_KEY, LANGFUSE_HOST.
Langfuse tracker for monitoring AI/ML pipelines.
from molfun.tracking import LangfuseTracker
tracker = LangfuseTracker(
public_key="...",
secret_key="...",
)
| Parameter | Type | Default | Description |
|---|---|---|---|
public_key |
str \| None |
None |
Langfuse public key (or LANGFUSE_PUBLIC_KEY env var) |
secret_key |
str \| None |
None |
Langfuse secret key (or LANGFUSE_SECRET_KEY env var) |
host |
str |
"https://cloud.langfuse.com" |
Langfuse host URL |
HuggingFaceTracker¶
HuggingFaceTracker ¶
Bases: BaseTracker
Track experiments by pushing to Hugging Face Hub.
Metrics and config are accumulated during the run and written
to the repo on end_run() (or when log_artifact() is called).
Usage::
from molfun.tracking import HuggingFaceTracker
tracker = HuggingFaceTracker(repo_id="user/my-model")
tracker.start_run(name="lora-pairformer", config={...})
tracker.log_metrics({"val_loss": 0.28}, step=10)
tracker.log_artifact("runs/checkpoint/")
tracker.end_run()
Combine with other trackers::
from molfun.tracking import CompositeTracker, WandbTracker
tracker = CompositeTracker([
WandbTracker(project="molfun"),
HuggingFaceTracker(repo_id="user/my-model"),
])
__init__ ¶
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
repo_id
|
str
|
HF Hub repo (e.g. "username/model-name"). |
required |
token
|
str | None
|
HF API token (or set HF_TOKEN env var). |
None
|
private
|
bool
|
Whether the repo should be private. |
False
|
repo_type
|
str
|
"model" or "dataset". |
'model'
|
log_artifact ¶
Upload a file or directory to the HF Hub repo.
end_run ¶
Push accumulated metadata (config, metrics) to the repo.
upload_model_card ¶
Push a README.md (model card) to the repo.
download_repo ¶
Download the full repo to a local directory.
HuggingFace Hub tracker that logs metrics and model cards.
from molfun.tracking import HuggingFaceTracker
tracker = HuggingFaceTracker(repo_id="myorg/molfun-model")
| Parameter | Type | Default | Description |
|---|---|---|---|
repo_id |
str |
required | HuggingFace Hub repository ID |
token |
str \| None |
None |
HF API token |
ConsoleTracker¶
ConsoleTracker ¶
Bases: BaseTracker
Logs everything to stdout.
Usage::
tracker = ConsoleTracker(prefix="[molfun]")
tracker.start_run("baseline-pairformer")
tracker.log_metrics({"train_loss": 0.5}, step=1)
Simple tracker that prints metrics to the console. Useful for debugging and local development.
| Parameter | Type | Default | Description |
|---|---|---|---|
print_every |
int |
1 |
Print metrics every N steps |
CompositeTracker¶
CompositeTracker ¶
Bases: BaseTracker
Fans out every call to multiple trackers.
If one tracker fails, the others still receive the call. Errors are logged but not raised to avoid interrupting training.
Compose multiple trackers to log to several platforms simultaneously.
from molfun.tracking import CompositeTracker, WandbTracker, ConsoleTracker, MLflowTracker
tracker = CompositeTracker([
WandbTracker(project="molfun"),
MLflowTracker(experiment_name="molfun"),
ConsoleTracker(),
])
# All calls are forwarded to every child tracker
tracker.start_run()
tracker.log_metrics({"loss": 0.42}, step=1)
tracker.end_run()
| Parameter | Type | Description |
|---|---|---|
trackers |
list[BaseTracker] |
List of tracker instances to compose |