Skip to main content
skill CX Codex

experiment-tracking-swanlab — Claude Code skill: SwanLab run tracking

A skill that shows your agent how to track ML runs in SwanLab: metrics, configs, media logging and a local dashboard.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add Orchestra-Research/AI-Research-SKILLs --skill experiment-tracking-swanlab -a claude-code
npx skills add Orchestra-Research/AI-Research-SKILLs --skill swanlab -a claude-code
Open on GitHub

What experiment-tracking-swanlab does

This skill hands the agent working patterns for SwanLab, an open-source library for tracking ML runs. It covers initialising a run, logging scalars, comparing runs across seeds and checkpoints, and writing images, audio, text, GIFs, point clouds and molecules.

Framework sections cover PyTorch, Transformers, PyTorch Lightning and Fastai. The Transformers path uses report_to="swanlab" inside TrainingArguments. Local and self-hosted setups get their own walkthrough: login with SWANLAB_API_KEY and a host, offline logging through mode="local" with a logdir, viewing logs with swanlab watch -l ./swanlog, and pushing them later with swanlab sync.

Media examples rely on pillow and soundfile, and the local dashboard plus swanlab watch need the swanlab[dashboard] package — skip it and mode="local" will not work. The base install pulls swanlab>=0.7.11; cloud or a self-hosted server also needs swanlab login.

What it helps with

  • log training metrics per epoch and per batch
  • compare runs across seeds and hyperparameters
  • run a local dashboard without a cloud account
  • attach images and audio to loss curves
  • wire tracking into a Transformers Trainer

Example prompts for the agent

  • set up SwanLab tracking for a ResNet run on MNIST
  • log train/loss and val/loss with swanlab
  • switch training to local mode with logs in ./swanlog

How to install experiment-tracking-swanlab

1Skills CLI (Vercel)

npx skills add Orchestra-Research/AI-Research-SKILLs --skill experiment-tracking-swanlab -a claude-code
npx skills add Orchestra-Research/AI-Research-SKILLs --skill swanlab -a claude-code

2Manually: put the files in place

~/.claude/skills/swanlab/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/swanlab/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about experiment-tracking-swanlab

How do I install experiment-tracking-swanlab in Claude?

Run npx skills add Orchestra-Research/AI-Research-SKILLs --skill experiment-tracking-swanlab -a claude-code, then npx skills add Orchestra-Research/AI-Research-SKILLs --skill swanlab -a claude-code. The skill file lands at ~/.claude/skills/swanlab/SKILL.md.

What does experiment-tracking-swanlab do?

It guides the agent through SwanLab experiment tracking: starting a run, writing metrics and configs, logging media, and using a local or self-hosted dashboard.

What do I need for the SwanLab local dashboard?

The swanlab[dashboard]>=0.7.11 package, required for mode="local" and swanlab watch. Media examples also use pillow and soundfile.

Source text

SKILL.md · MIT
---
name: experiment-tracking-swanlab
description: Provides guidance for experiment tracking with SwanLab. Use when you need open-source run tracking, local or self-hosted dashboards, and lightweight media logging for ML workflows.
version: 1.0.0
author: Orchestra Research
license: MIT
tags: [MLOps, SwanLab, Experiment Tracking, Open Source, Visualization, PyTorch, Transformers, PyTorch Lightning, Fastai, Self-Hosted]
dependencies: [swanlab>=0.7.11, pillow>=9.0.0, soundfile>=0.12.0]
---

# SwanLab: Open-Source Experiment Tracking

## When to Use This Skill

Use SwanLab when you need to:
- **Track ML experiments** with metrics, configs, tags, and descriptions
- **Visualize training** with scalar charts and logged media
- **Compare runs** across seeds, checkpoints, and hyperparameters
- **Work locally or self-hosted** instead of depending on managed SaaS
- **Integrate** with PyTorch, Transformers, PyTorch Lightning, or Fastai

**Deployment**: Cloud, local, or self-hosted | **Media**: images, audio, text, GIFs, point clouds, molecules | **Integrations**: PyTorch, Transformers, PyTorch Lightning, Fastai

## Installation

```bash
# Install SwanLab plus the media dependencies used in this skill
pip install "swanlab>=0.7.11" "pillow>=9.0.0" "soundfile>=0.12.0"

# Add local dashboard support for mode="local" and swanlab watch
pip install "swanlab[dashboard]>=0.7.11"

# Optional framework integrations
pip install transformers pytorch-lightning fastai

# Login for cloud or self-hosted usage
swanlab login
```

`pillow` and `soundfile` are the media dependencies used by the Image and Audio examples in this skill. `swanlab[dashboard]` adds the local dashboard dependency required by `mode="local"` and `swanlab watch`.

## Quick Start

### Basic Experiment Tracking

```python
import swanlab

run = swanlab.init(
    project="my-project",
    experiment_name="baseline",
    config={
        "learning_rate": 1e-3,
        "epochs": 10,
        "batch_size": 32,
        "model": "resnet18",
    },
)

for epoch in range(run.config.epochs):
    train_loss = train_epoch()
    val_loss = validate()

    swanlab.log(
        {
            "train/loss": train_loss,
            "val/loss": val_loss,
            "epoch": epoch,
        }
    )

run.finish()
```

### With PyTorch

```python
import torch
import torch.nn as nn
import torch.optim as optim
import swanlab

run = swanlab.init(
    project="pytorch-demo",
    experiment_name="mnist-mlp",
    config={
        "learning_rate": 1e-3,
        "batch_size": 64,
        "epochs": 10,
        "hidden_size": 128,
    },
)

model = nn.Sequential(
    nn.Flatten(),
    nn.Linear(28 * 28, run.config.hidden_size),
    nn.ReLU(),
    nn.Linear(run.config.hidden_size, 10),
)
optimizer = optim.Adam(model.parameters(), lr=run.config.learning_rate)
criterion = nn.CrossEntropyLoss()

for epoch in range(run.config.epochs):
    model.train()
    for batch_idx, (data, target) in enumerate(train_loader):
        optimizer.zero_grad()
        logits = model(data)
        loss = criterion(logits, target)
        loss.backward()
        optimizer.step()

        if batch_idx % 100 == 0:
            swanlab.log(
                {
                    "train/loss": loss.item(),
                    "train/epoch": epoch,
                    "train/batch": batch_idx,
                }
            )

run.finish()
```

## Core Concepts

### 1. Projects and Experiments

**Project**: Collection of related experiments  
**Experiment**: Single execution of a training or evaluation workflow

```python
import swanlab

run = swanlab.init(
    project="image-classification",
    experiment_name="resnet18-seed42",
    description="Baseline run on ImageNet subset",
    tags=["baseline", "resnet18"],
    config={
        "model": "resnet18",
        "seed": 42,
        "batch_size": 64,
        "learning_rate": 3e-4,
    },
)

print(run.id)
print(run.config.learning_rate)
```

### 2. Configuration Tracking

```python
config = {
    "model": "resnet18",
    "seed": 42,
    "batch_size": 64,
    "learning_rate": 3e-4,
    "epochs": 20,
}

run = swanlab.init(project="my-project", config=config)

learning_rate = run.config.learning_rate
batch_size = run.config.batch_size
```

### 3. Metric Logging

```python
# Log scalars
swanlab.log({"loss": 0.42, "accuracy": 0.91})

# Log multiple metrics
swanlab.log(
    {
        "train/loss": train_loss,
        "train/accuracy": train_acc,
        "val/loss": val_loss,
        "val/accuracy": val_acc,
        "lr": current_lr,
        "epoch": epoch,
    }
)

# Log with custom step
swanlab.log({"loss": loss}, step=global_step)
```

### 4. Media and Chart Logging

```python
import numpy as np
import swanlab

# Image
image = np.random.randint(0, 255, (224, 224, 3), dtype=np.uint8)
swanlab.log({"examples/image": swanlab.Image(image, caption="Augmented sample")})

# Audio
wave = np.sin(np.linspace(0, 8 * np.pi, 16000)).astype("float32")
swanlab.log({"examples/audio": swanlab.Audio(wave, sample_rate=16000)})

# Text
swanlab.log({"examples/text": swanlab.Text("Training notes for this run.")})

# GIF video
swanlab.log({"examples/video": swanlab.Video("predictions.gif", caption="Validation rollout")})

# Point cloud
points = np.random.rand(128, 3).astype("float32")
swanlab.log({"examples/point_cloud": swanlab.Object3D(points, caption="Point cloud sample")})

# Molecule
swanlab.log({"examples/molecule": swanlab.Molecule.from_smiles("CCO", caption="Ethanol")})
```

```python
# Custom chart with swanlab.echarts
line = swanlab.echarts.Line()
line.add_xaxis(["epoch-1", "epoch-2", "epoch-3"])
line.add_yaxis("train/loss", [0.92, 0.61, 0.44])
line.set_global_opts(
    title_opts=swanlab.echarts.options.TitleOpts(title="Training Loss")
)

swanlab.log({"charts/loss_curve": line})
```

See [references/visualization.md](references/visualization.md) for more chart and media patterns.

### 5. Local and Self-Hosted Workflows

```python
import os
import swanlab

# Self-hosted or cloud login
swanlab.login(
    api_key=os.environ["SWANLAB_API_KEY"],
    host="http://your-server:5092",
)

# Local-only logging
run = swanlab.init(
    project="offline-demo",
    mode="local",
    logdir="./swanlog",
)

swanlab.log({"loss": 0.35, "epoch": 1})
run.finish()
```

```bash
# View local logs
swanlab watch -l ./swanlog

# Sync local logs later
swanlab sync ./swanlog
```

## Integration Examples

### HuggingFace Transformers

```python
from transformers import Trainer, TrainingArguments

training_args = TrainingArguments(
    output_dir="./results",
    per_device_train_batch_size=8,
    evaluation_strategy="epoch",
    logging_steps=50,
    report_to="swanlab",
    run_name="bert-finetune",
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=eval_dataset,
)

trainer.train()
```

See [references/integrations.md](references/integrations.md) for callback-based setups and additional framework patterns.

### PyTorch Lightning

```python
import pytorch_lightning as pl
from swanlab.integration.pytorch_lightning import SwanLabLogger

swanlab_logger = SwanLabLogger(
    project="lightning-demo",
    experiment_name="mnist-classifier",
    config={"batch_size": 64, "max_epochs": 10},
)

trainer = pl.Trainer(
    logger=swanlab_logger,
    max_epochs=10,
    accelerator="auto",
)

trainer.fit(model, train_loader, val_loader)
```

### Fastai

```python
from fastai.vision.all import accuracy, resnet34, vision_learner
from swanlab.integration.fastai import SwanLabCallback

learn = vision_learner(dls, resnet34, metrics=accuracy)
learn.fit(
    5,
    cbs=[
        SwanLabCallback(
            project="fastai-demo",
            experiment_name="pets-classification",
            config={"arch": "resnet34", "epochs": 5},
        )
    ],
)
```

See [references/integrations.md](references/integrations.md) for fuller framework examples.

## Best Practices

### 1. Use Stable Metric Names

```python
# Good: grouped metric namespaces
swanlab.log({
    "train/loss": train_loss,
    "train/accuracy": train_acc,
    "val/loss": val_loss,
    "val/accuracy": val_acc,
})

# Avoid mixing flat and grouped names for the same metric family
```

### 2. Initialize Early and Capture Config Once

```python
run = swanlab.init(
    project="image-classification",
    experiment_name="resnet18-baseline",
    config={
        "model": "resnet18",
        "learning_rate": 3e-4,
        "batch_size": 64,
        "seed": 42,
    },
)
```

### 3. Save Checkpoints Locally

```python
import torch
import swanlab

checkpoint_path = "checkpoints/best.pth"
torch.save(model.state_dict(), checkpoint_path)

swanlab.log(
    {
        "best/val_accuracy": best_val_accuracy,
        "artifacts/checkpoint_path": swanlab.Text(checkpoint_path),
    }
)
```

### 4. Use Local Mode for Offline-First Workflows

```python
run = swanlab.init(project="offline-demo", mode="local", logdir="./swanlog")
# ... training code ...
run.finish()

# Inspect later with: swanlab watch -l ./swanlog
```

### 5. Keep Advanced Patterns in References

- Use [references/visualization.md](references/visualization.md) for advanced chart and media patterns
- Use [references/integrations.md](references/integrations.md) for callback-based and framework-specific integration details

## Resources

- [Official docs (Chinese)](https://docs.swanlab.cn)
- [Official docs (English)](https://docs.swanlab.cn/en)
- [GitHub repo](https://github.com/SwanHubX/SwanLab)
- [Self-hosted repo](https://github.com/SwanHubX/self-hosted)

## See Also

- [references/integrations.md](references/integrations.md) - Framework-specific examples
- [references/visualization.md](references/visualization.md) - Charts and media logging patterns

© Orchestra Research · MIT · Orchestra-Research/AI-Research-SKILLs

Similar skills

Everything for AI and ML →

From the same set66

lambda-labs-gpu-cloud This skill helps run Lambda Labs GPU instances for ML training and inference. Use it for SSH access, persistent storage, or multi-node clusters. CX Codex +1 939installs presenting-conference-talks Generates Beamer LaTeX and PPTX presentation slides from a compiled research paper with speaker notes. Useful when preparing oral, spotlight, or invited conference talks. CX Codex +1 913installs ml-training-recipes PyTorch training recipes for neural networks, covering training loops, Muon and AdamW optimizer setups, mixed precision, and scaling laws. CX Codex +1 912installs systems-paper-writing Paragraph-level structural blueprint for writing 10–12 page systems papers targeting OSDI, SOSP, ASPLOS, NSDI, and EuroSys. Organizes page budgets and section flows. CX Codex +1 908installs fine-tuning-serving-openpi Workflows for fine-tuning and serving Physical Intelligence OpenPI models (pi0, pi0-fast, pi0.5). Guides setup, norm stats calculation, and policy inference servers. CX Codex +1 861installs fine-tuning-openvla-oft Guides fine-tuning and evaluation of OpenVLA-OFT robot action policies. Use it for LIBERO or ALOHA workflows with continuous action heads. CX Codex +1 861installs evaluating-cosmos-policy A skill for running NVIDIA Cosmos Policy evaluations on LIBERO and RoboCasa simulators and profiling inference latency. CX Codex +1 858installs evolving-ai-agents A skill for A-Evolve: it runs solve-observe-evolve cycles that rewrite an agent's prompts, skills and memory against benchmark scores. CX Codex +1 833installs

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor