Weights And Biases

W&B: логирование ML-экспериментов, свипы, реестр моделей, дашборды.

Метаданные навыка

ИсточникВстроенный (установлен по умолчанию)
Путьskills/mlops/evaluation/weights-and-biases
Версия1.0.0
АвторOrchestra Research
ЛицензияMIT
Зависимостиwandb
Платформыlinux, macos, windows
ТегиMLOps, Weights And Biases, WandB, Experiment Tracking, Hyperparameter Tuning, Model Registry, Collaboration, Real-Time Visualization, PyTorch, TensorFlow, HuggingFace

Справочник: полный SKILL.md

инфо

Ниже приведено полное определение навыка, которое Hermes Agent загружает при его активации. Именно этот текст агент получает в качестве инструкций, когда навык включён.

Weights & Biases: трекинг ML-экспериментов и MLOps

Когда использовать этот навык

Weights & Biases (W&B) пригодится, когда нужно:

  • Отслеживать ML-эксперименты с автоматическим логированием метрик
  • Визуализировать обучение в реальном времени через дашборды
  • Сравнивать запуски по гиперпараметрам и конфигурациям
  • Оптимизировать гиперпараметры через автоматизированные свипы
  • Вести реестр моделей с версионированием и трассировкой
  • Работать над ML-проектами командой в общих воркспейсах
  • Трекать артефакты (датасеты, модели, код) с сохранением lineage

Пользователи: 200 000+ ML-специалистов | GitHub Stars: 10.5k+ | Интеграции: 100+

Установка

# Установить W&B
pip install wandb

# Войти в аккаунт (создаёт API-ключ)
wandb login

# Или задать API-ключ через переменную окружения
export WANDB_API_KEY=your_api_key_here

Быстрый старт

Базовый трекинг эксперимента

import wandb

# Инициализировать запуск
run = wandb.init(
    project="my-project",
    config={
        "learning_rate": 0.001,
        "epochs": 10,
        "batch_size": 32,
        "architecture": "ResNet50"
    }
)

# Цикл обучения
for epoch in range(run.config.epochs):
    # Ваш код обучения
    train_loss = train_epoch()
    val_loss = validate()

    # Логировать метрики
    wandb.log({
        "epoch": epoch,
        "train/loss": train_loss,
        "val/loss": val_loss,
        "train/accuracy": train_acc,
        "val/accuracy": val_acc
    })

# Завершить запуск
wandb.finish()

С PyTorch

import torch
import wandb

# Инициализация
wandb.init(project="pytorch-demo", config={
    "lr": 0.001,
    "epochs": 10
})

# Получить конфигурацию
config = wandb.config

# Цикл обучения
for epoch in range(config.epochs):
    for batch_idx, (data, target) in enumerate(train_loader):
        # Прямой проход
        output = model(data)
        loss = criterion(output, target)

        # Обратный проход
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        # Логировать каждые 100 батчей
        if batch_idx % 100 == 0:
            wandb.log({
                "loss": loss.item(),
                "epoch": epoch,
                "batch": batch_idx
            })

# Сохранить модель
torch.save(model.state_dict(), "model.pth")
wandb.save("model.pth")  # Загрузить в W&B

wandb.finish()

Основные концепции

1. Проекты и запуски

Project — коллекция связанных экспериментов.
Run — один запуск тренировочного скрипта.

# Создать или открыть проект
run = wandb.init(
    project="image-classification",
    name="resnet50-experiment-1",  # Опциональное имя запуска
    tags=["baseline", "resnet"],    # Организация по тегам
    notes="First baseline run"      # Заметки
)

# У каждого запуска есть уникальный ID
print(f"Run ID: {run.id}")
print(f"Run URL: {run.url}")

2. Трекинг конфигурации

Гиперпараметры отслеживаются автоматически:

config = {
    # Архитектура модели
    "model": "ResNet50",
    "pretrained": True,

    # Параметры обучения
    "learning_rate": 0.001,
    "batch_size": 32,
    "epochs": 50,
    "optimizer": "Adam",

    # Параметры данных
    "dataset": "ImageNet",
    "augmentation": "standard"
}

wandb.init(project="my-project", config=config)

# Обращение к конфигурации во время обучения
lr = wandb.config.learning_rate
batch_size = wandb.config.batch_size

3. Логирование метрик

# Логировать скаляры
wandb.log({"loss": 0.5, "accuracy": 0.92})

# Логировать несколько метрик сразу
wandb.log({
    "train/loss": train_loss,
    "train/accuracy": train_acc,
    "val/loss": val_loss,
    "val/accuracy": val_acc,
    "learning_rate": current_lr,
    "epoch": epoch
})

# Логировать с кастомной осью X
wandb.log({"loss": loss}, step=global_step)

# Логировать медиа (изображения, аудио, видео)
wandb.log({"examples": [wandb.Image(img) for img in images]})

# Логировать гистограммы
wandb.log({"gradients": wandb.Histogram(gradients)})

# Логировать таблицы
table = wandb.Table(columns=["id", "prediction", "ground_truth"])
wandb.log({"predictions": table})

4. Сохранение контрольных точек

import torch
import wandb

# Сохранить чекпоинт модели
checkpoint = {
    'epoch': epoch,
    'model_state_dict': model.state_dict(),
    'optimizer_state_dict': optimizer.state_dict(),
    'loss': loss,
}

torch.save(checkpoint, 'checkpoint.pth')

# Загрузить в W&B
wandb.save('checkpoint.pth')

# Или использовать артефакты (рекомендуется)
artifact = wandb.Artifact('model', type='model')
artifact.add_file('checkpoint.pth')
wandb.log_artifact(artifact)

Свипы гиперпараметров

Автоматический поиск оптимальных гиперпараметров.

Задать конфигурацию свипа

sweep_config = {
    'method': 'bayes',  # или 'grid', 'random'
    'metric': {
        'name': 'val/accuracy',
        'goal': 'maximize'
    },
    'parameters': {
        'learning_rate': {
            'distribution': 'log_uniform',
            'min': 1e-5,
            'max': 1e-1
        },
        'batch_size': {
            'values': [16, 32, 64, 128]
        },
        'optimizer': {
            'values': ['adam', 'sgd', 'rmsprop']
        },
        'dropout': {
            'distribution': 'uniform',
            'min': 0.1,
            'max': 0.5
        }
    }
}

# Инициализировать свип
sweep_id = wandb.sweep(sweep_config, project="my-project")

Определить функцию обучения

def train():
    # Инициализировать запуск
    run = wandb.init()

    # Получить параметры свипа
    lr = wandb.config.learning_rate
    batch_size = wandb.config.batch_size
    optimizer_name = wandb.config.optimizer

    # Собрать модель с параметрами свипа
    model = build_model(wandb.config)
    optimizer = get_optimizer(optimizer_name, lr)

    # Цикл обучения
    for epoch in range(NUM_EPOCHS):
        train_loss = train_epoch(model, optimizer, batch_size)
        val_acc = validate(model)

        # Логировать метрики
        wandb.log({
            "train/loss": train_loss,
            "val/accuracy": val_acc
        })

# Запустить свип
wandb.agent(sweep_id, function=train, count=50)  # 50 попыток

Стратегии свипа

# Grid search — перебор всех комбинаций
sweep_config = {
    'method': 'grid',
    'parameters': {
        'lr': {'values': [0.001, 0.01, 0.1]},
        'batch_size': {'values': [16, 32, 64]}
    }
}

# Случайный поиск
sweep_config = {
    'method': 'random',
    'parameters': {
        'lr': {'distribution': 'uniform', 'min': 0.0001, 'max': 0.1},
        'dropout': {'distribution': 'uniform', 'min': 0.1, 'max': 0.5}
    }
}

# Байесовская оптимизация (рекомендуется)
sweep_config = {
    'method': 'bayes',
    'metric': {'name': 'val/loss', 'goal': 'minimize'},
    'parameters': {
        'lr': {'distribution': 'log_uniform', 'min': 1e-5, 'max': 1e-1}
    }
}

Артефакты

Трекинг датасетов, моделей и файлов с сохранением lineage.

Логировать артефакты

# Создать артефакт
artifact = wandb.Artifact(
    name='training-dataset',
    type='dataset',
    description='ImageNet training split',
    metadata={'size': '1.2M images', 'split': 'train'}
)

# Добавить файлы
artifact.add_file('data/train.csv')
artifact.add_dir('data/images/')

# Залогировать артефакт
wandb.log_artifact(artifact)

Использовать артефакты

# Скачать и использовать артефакт
run = wandb.init(project="my-project")

# Загрузить артефакт
artifact = run.use_artifact('training-dataset:latest')
artifact_dir = artifact.download()

# Работать с данными
data = load_data(f"{artifact_dir}/train.csv")

Реестр моделей

# Залогировать модель как артефакт
model_artifact = wandb.Artifact(
    name='resnet50-model',
    type='model',
    metadata={'architecture': 'ResNet50', 'accuracy': 0.95}
)

model_artifact.add_file('model.pth')
wandb.log_artifact(model_artifact, aliases=['best', 'production'])

# Связать с реестром моделей
run.link_artifact(model_artifact, 'model-registry/production-models')

Примеры интеграций

HuggingFace Transformers

from transformers import Trainer, TrainingArguments
import wandb

# Инициализировать W&B
wandb.init(project="hf-transformers")

# Параметры обучения с W&B
training_args = TrainingArguments(
    output_dir="./results",
    report_to="wandb",  # Включить логирование в W&B
    run_name="bert-finetuning",
    logging_steps=100,
    save_steps=500
)

# Trainer автоматически логирует в W&B
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=eval_dataset
)

trainer.train()

PyTorch Lightning

from pytorch_lightning import Trainer
from pytorch_lightning.loggers import WandbLogger
import wandb

# Создать W&B логгер
wandb_logger = WandbLogger(
    project="lightning-demo",
    log_model=True  # Логировать чекпоинты модели
)

# Использовать с Trainer
trainer = Trainer(
    logger=wandb_logger,
    max_epochs=10
)

trainer.fit(model, datamodule=dm)

Keras/TensorFlow

import wandb
from wandb.keras import WandbCallback

# Инициализация
wandb.init(project="keras-demo")

# Добавить callback
model.fit(
    x_train, y_train,
    validation_data=(x_val, y_val),
    epochs=10,
    callbacks=[WandbCallback()]  # Автоматически логирует метрики
)

Визуализация и анализ

Кастомные графики

# Логировать пользовательские визуализации
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot(x, y)
wandb.log({"custom_plot": wandb.Image(fig)})

# Логировать матрицу ошибок
wandb.log({"conf_mat": wandb.plot.confusion_matrix(
    probs=None,
    y_true=ground_truth,
    preds=predictions,
    class_names=class_names
)})

Отчёты

Создавайте отчёты в интерфейсе W&B и делитесь ими:

  • Объединяйте запуски, графики и текст
  • Поддержка Markdown
  • Встраиваемые визуализации
  • Командная работа

Лучшие практики

1. Организация через теги и группы

wandb.init(
    project="my-project",
    tags=["baseline", "resnet50", "imagenet"],
    group="resnet-experiments",  # Группировать связанные запуски
    job_type="train"             # Тип задачи
)

2. Логировать всё важное

# Логировать системные метрики
wandb.log({
    "gpu/util": gpu_utilization,
    "gpu/memory": gpu_memory_used,
    "cpu/util": cpu_utilization
})

# Логировать версию кода
wandb.log({"git_commit": git_commit_hash})

# Логировать разбивку данных
wandb.log({
    "data/train_size": len(train_dataset),
    "data/val_size": len(val_dataset)
})

3. Описательные имена запусков

# ✅ Good: Descriptive run names
wandb.init(
    project="nlp-classification",
    name="bert-base-lr0.001-bs32-epoch10"
)

# ❌ Bad: Generic names
wandb.init(project="nlp", name="run1")

4. Сохранять важные артефакты

# Сохранить финальную модель
artifact = wandb.Artifact('final-model', type='model')
artifact.add_file('model.pth')
wandb.log_artifact(artifact)

# Сохранить предсказания для анализа
predictions_table = wandb.Table(
    columns=["id", "input", "prediction", "ground_truth"],
    data=predictions_data
)
wandb.log({"predictions": predictions_table})

5. Офлайн-режим при нестабильном соединении

import os

# Включить офлайн-режим
os.environ["WANDB_MODE"] = "offline"

wandb.init(project="my-project")
# ... ваш код ...

# Синхронизировать позже
# wandb sync <run_directory>

Командная работа

Публикация запусков

# Запуски автоматически доступны по URL
run = wandb.init(project="team-project")
print(f"Share this URL: {run.url}")

Командные проекты

  • Заведите командный аккаунт на wandb.ai
  • Добавьте участников команды
  • Настройте видимость проекта (private/public)
  • Используйте артефакты и реестр моделей на уровне команды

Тарифы

  • Free: неограниченные публичные проекты, 100 ГБ хранилища
  • Academic: бесплатно для студентов и исследователей
  • Teams: $50/место/месяц, приватные проекты, безлимитное хранилище
  • Enterprise: индивидуальное ценообразование, on-prem варианты

Ресурсы

См. также

  • references/sweeps.md — подробное руководство по оптимизации гиперпараметров
  • references/artifacts.md — паттерны версионирования данных и моделей
  • references/integrations.md — примеры интеграции с фреймворками
ESC