Отслеживайте и оптимизируйте эксперименты с машинным обучением с помощью Weights & Biases

Используйте Weights & Biases (W&B) для отслеживания экспериментов с машинным обучением: автоматический учёт метрик, интерактивные дашборды, перебор гиперпараметров, отслежение связей артефактов и версионированный реестр моделей.

Hermes OpenClaw Продвинутый Скопировали: 0
1 ресурс

Что понадобится

  • Требуется пакет wandb; работает на Linux, macOS и Windows.

Как применить

Обратитесь к W&B, когда вам нужно отслеживать эксперименты с машинным обучением, визуализировать процесс обучения в реальном времени, сравнивать запуски по гиперпараметрам и конфигурациям, оптимизировать гиперпараметры с помощью автоматизированного перебора, управлять версионированным реестром моделей с отслеживанием связей, совместно работать в командных пространствах или отслеживать артефакты — такие как наборы данных, модели и код. Гиперпараметры можно отслеживать автоматически.

Бесплатный уровень включает неограниченные публичные проекты и 100 ГБ хранилища.

Академический уровень бесплатен для студентов и исследователей.

Уровень Teams стоит 50 долларов за место в месяц и включает приватные проекты и неограниченное хранилище.

Уровень Enterprise имеет индивидуальное ценообразование и возможность развертывания локально.

Установите W&B через pip, затем войдите в систему, чтобы создать ключ API, или задайте ключ программно через переменную окружения WANDB_API_KEY.

# Install W&B
pip install wandb

# Login (creates API key)
wandb login

# Or set API key programmatically
export WANDB_API_KEY=your_api_key_here

Инициализируйте запуск с помощью wandb.init, указав имя проекта и словарь конфигурации с параметрами, такими как скорость обучения, количество эпох, размер пакета и архитектура. Внутри цикла обучения записывайте метрики, такие как потери и точность при обучении и валидации, с помощью wandb.log, а затем вызовите wandb.finish после завершения запуска.

import wandb

# Initialize a run
run = wandb.init(
    project="my-project",
    config={
        "learning_rate": 0.001,
        "epochs": 10,
        "batch_size": 32,
        "architecture": "ResNet50"
    }
)

# Training loop
for epoch in range(run.config.epochs):
    # Your training code
    train_loss = train_epoch()
    val_loss = validate()

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

# Finish the run
wandb.finish()

В цикле обучения PyTorch инициализируйте W&B с указанием проекта и конфигурации, считывайте гиперпараметры из wandb.config и записывайте потери каждые 100 пакетов. После обучения сохраните модель с помощью torch.save и загрузите её через wandb.save перед завершением запуска.

import torch
import wandb

# Initialize
wandb.init(project="pytorch-demo", config={
    "lr": 0.001,
    "epochs": 10
})

# Access config
config = wandb.config

# Training loop
for epoch in range(config.epochs):
    for batch_idx, (data, target) in enumerate(train_loader):
        # Forward pass
        output = model(data)
        loss = criterion(output, target)

        # Backward pass
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        # Log every 100 batches
        if batch_idx % 100 == 0:
            wandb.log({
                "loss": loss.item(),
                "epoch": epoch,
                "batch": batch_idx
            })

# Save model
torch.save(model.state_dict(), "model.pth")
wandb.save("model.pth")  # Upload to W&B

wandb.finish()

Создайте или повторно используйте проект через wandb.init, при желании задав имя запуска, теги и примечания; каждый запуск получает уникальный идентификатор и URL, которые можно вывести на экран.

# Create/use project
run = wandb.init(
    project="image-classification",
    name="resnet50-experiment-1",  # Optional run name
    tags=["baseline", "resnet"],    # Organize with tags
    notes="First baseline run"      # Add notes
)

# Each run has unique ID
print(f"Run ID: {run.id}")
print(f"Run URL: {run.url}")

  1. Отслеживайте свои гиперпараметры, чтобы они сохранялись вместе с запуском.
config = {
    # Model architecture
    "model": "ResNet50",
    "pretrained": True,

    # Training params
    "learning_rate": 0.001,
    "batch_size": 32,
    "epochs": 50,
    "optimizer": "Adam",

    # Data params
    "dataset": "ImageNet",
    "augmentation": "standard"
}

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

# Access config during training
lr = wandb.config.learning_rate
batch_size = wandb.config.batch_size

Записывайте скаляры, несколько метрик одновременно и метрики с пользовательской осью X с помощью параметра step. Также можно записывать медиафайлы — изображения, аудио и видео, гистограммы градиентов, а также таблицы с колонками типа id, предсказание и эталонное значение.

# Log scalars
wandb.log({"loss": 0.5, "accuracy": 0.92})

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

# Log with custom x-axis
wandb.log({"loss": loss}, step=global_step)

# Log media (images, audio, video)
wandb.log({"examples": [wandb.Image(img) for img in images]})

# Log histograms
wandb.log({"gradients": wandb.Histogram(gradients)})

# Log tables
table = wandb.Table(columns=["id", "prediction", "ground_truth"])
wandb.log({"predictions": table})

Чтобы сохранить точку восстановления модели, сохраните чекпоинт Torch и загрузите его через wandb.save, или лучше создайте объект wandb.Artifact типа 'model', добавьте файл чекпоинта и запишите его с помощью wandb.log_artifact.

import torch
import wandb

# Save model checkpoint
checkpoint = {
    'epoch': epoch,
    'model_state_dict': model.state_dict(),
    'optimizer_state_dict': optimizer.state_dict(),
    'loss': loss,
}

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

# Upload to W&B
wandb.save('checkpoint.pth')

# Or use Artifacts (recommended)
artifact = wandb.Artifact('model', type='model')
artifact.add_file('checkpoint.pth')
wandb.log_artifact(artifact)

Определите конфигурацию перебора, указав метод поиска (bayes, grid или random), метрику и цель оптимизации, а также диапазоны параметров или списки значений. Инициализируйте перебор с помощью wandb.sweep, передав конфигурацию и проект, чтобы получить идентификатор перебора.

sweep_config = {
    'method': 'bayes',  # or 'grid', 'random'
    'metric': {
        'name': 'val/accuracy',
        'goal': 'maximize'
    },
    'parameters': {
        'learning_rate': {
            'distribution': 'log_uniform_values',
            '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
        }
    }
}

# Initialize sweep
sweep_id = wandb.sweep(sweep_config, project="my-project")

Напишите функцию обучения, которая вызывает wandb.init, считывает параметры перебора из wandb.config, соответствующим образом создаёт модель и оптимизатор, а также записывает метрики каждую эпоху. Запустите перебор с помощью wandb.agent, передав идентификатор перебора, саму функцию и количество попыток.

def train():
    # Initialize run
    run = wandb.init()

    # Access sweep parameters
    lr = wandb.config.learning_rate
    batch_size = wandb.config.batch_size
    optimizer_name = wandb.config.optimizer

    # Build model with sweep config
    model = build_model(wandb.config)
    optimizer = get_optimizer(optimizer_name, lr)

    # Training loop
    for epoch in range(NUM_EPOCHS):
        train_loss = train_epoch(model, optimizer, batch_size)
        val_acc = validate(model)

        # Log metrics
        wandb.log({
            "train/loss": train_loss,
            "val/accuracy": val_acc
        })

# Run sweep
wandb.agent(sweep_id, function=train, count=50)  # Run 50 trials

Выберите стратегию перебора: полный перебор по явно указанным значениям, случайный поиск с распределениями по диапазонам или оптимизацию методом Байеса, которую рекомендует источник, с целью минимизации метрики, например потерь при валидации.

# Grid search - exhaustive
sweep_config = {
    'method': 'grid',
    'parameters': {
        'lr': {'values': [0.001, 0.01, 0.1]},
        'batch_size': {'values': [16, 32, 64]}
    }
}

# Random search
sweep_config = {
    'method': 'random',
    'parameters': {
        'lr': {'distribution': 'uniform', 'min': 0.0001, 'max': 0.1},
        'dropout': {'distribution': 'uniform', 'min': 0.1, 'max': 0.5}
    }
}

# Bayesian optimization (recommended)
sweep_config = {
    'method': 'bayes',
    'metric': {'name': 'val/loss', 'goal': 'minimize'},
    'parameters': {
        'lr': {'distribution': 'log_uniform_values', 'min': 1e-5, 'max': 1e-1}
    }
}

Записывайте артефакты, создавая объект wandb.Artifact с именем, типом, таким как 'dataset', описанием и метаданными, добавляя в него файлы или целые каталоги, а затем вызывая wandb.log_artifact.

# Create artifact
artifact = wandb.Artifact(
    name='training-dataset',
    type='dataset',
    description='ImageNet training split',
    metadata={'size': '1.2M images', 'split': 'train'}
)

# Add files
artifact.add_file('data/train.csv')
artifact.add_dir('data/images/')

# Log artifact
wandb.log_artifact(artifact)

Чтобы использовать записанный артефакт, инициализируйте запуск, извлеките его с помощью run.use_artifact, указав ссылку на версию, например 'training-dataset:latest', скачайте его и загрузите данные из возвращённого каталога.

# Download and use artifact
run = wandb.init(project="my-project")

# Download artifact
artifact = run.use_artifact('training-dataset:latest')
artifact_dir = artifact.download()

# Use the data
data = load_data(f"{artifact_dir}/train.csv")

Для реестра моделей зарегистрируйте модель как wandb.Artifact с метаданными, такими как архитектура и точность, добавьте файл модели, зарегистрируйте его с псевдонимами вроде 'best' и 'production', а затем свяжите его с путем в реестре, например 'model-registry/production-models', с помощью функции run.link_artifact.

# Log model as artifact
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'])

# Link to model registry
run.link_artifact(model_artifact, 'model-registry/production-models')

С использованием библиотеки HuggingFace Transformers инициализируйте W&B и установите параметр report_to='wandb' в объекте TrainingArguments, при желании укажите имя запуска, шаги логирования и сохранения, чтобы Trainer автоматически вел логирование в W&B во время обучения.

from transformers import Trainer, TrainingArguments
import wandb

# Initialize W&B
wandb.init(project="hf-transformers")

# Training arguments with W&B
training_args = TrainingArguments(
    output_dir="./results",
    report_to="wandb",  # Enable W&B logging
    run_name="bert-finetuning",
    logging_steps=100,
    save_steps=500
)

# Trainer automatically logs to W&B
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=eval_dataset
)

trainer.train()

В PyTorch Lightning создайте объект WandbLogger с указанием вашего проекта и параметром log_model=True для логирования точек сохранения модели, затем передайте его в качестве логгера для Trainer и продолжайте обучение как обычно.

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

# Create W&B logger
wandb_logger = WandbLogger(
    project="lightning-demo",
    log_model=True  # Log model checkpoints
)

# Use with Trainer
trainer = Trainer(
    logger=wandb_logger,
    max_epochs=10
)

trainer.fit(model, datamodule=dm)

В Keras/TensorFlow инициализируйте W&B и добавьте специальные коллбэки из модуля wandb.integration.keras: WandbMetricsLogger для автоматического логирования метрик и WandbModelCheckpoint для сохранения точек сохранения модели в метод model.fit. Обратите внимание, что монолитный класс WandbCallback был удален, поэтому используйте эти коллбэки вместо него.

import wandb
from wandb.integration.keras import WandbMetricsLogger, WandbModelCheckpoint

# Initialize
wandb.init(project="keras-demo")

# Add callbacks (the monolithic WandbCallback was removed;
# use the dedicated callbacks from wandb.integration.keras instead)
model.fit(
    x_train, y_train,
    validation_data=(x_val, y_val),
    epochs=10,
    callbacks=[
        WandbMetricsLogger(),                        # Auto-logs metrics
        WandbModelCheckpoint("models/model-{epoch}")  # Saves checkpoints
    ]
)

Логируйте пользовательские визуализации, такие как график matplotlib, обернутый в wandb.Image, или матрицу ошибок, созданную через wandb.plot.confusion_matrix с данными о правильных ответах, предсказаниях и названиях классов.

# Log custom visualizations
import matplotlib.pyplot as plt

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

# Log confusion matrix
wandb.log({"conf_mat": wandb.plot.confusion_matrix(
    probs=None,
    y_true=ground_truth,
    preds=predictions,
    class_names=class_names
)})

Создавайте общедоступные отчеты в интерфейсе W&B, которые объединяют запуски, диаграммы и текст, поддерживают формат Markdown, позволяют встраивать визуализации и способствуют командной работе.

Организуйте запуски, передавая теги, группу для связанных запусков и тип задачи, например 'train', в функцию wandb.init.

wandb.init(
    project="my-project",
    tags=["baseline", "resnet50", "imagenet"],
    group="resnet-experiments",  # Group related runs
    job_type="train"             # Type of job
)

Логируйте всё важное: системные метрики, такие как загрузка GPU, память GPU и загрузка CPU; версию кода по хэшу коммита Git; размеры выборок данных для обучения и валидации.

# Log system metrics
wandb.log({
    "gpu/util": gpu_utilization,
    "gpu/memory": gpu_memory_used,
    "cpu/util": cpu_utilization
})

# Log code version
wandb.log({"git_commit": git_commit_hash})

# Log data splits
wandb.log({
    "data/train_size": len(train_dataset),
    "data/val_size": len(val_dataset)
})

Используйте описательные имена запусков, отражающие параметры конфигурации, например 'bert-base-lr0.001-bs32-epoch10', вместо общих названий вроде 'run1'.

# ✅ 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")

Сохраняйте важные результаты в виде артефактов: зарегистрируйте итоговую модель как wandb.Artifact и сохраните таблицу предсказаний с колонками id, input, prediction и ground_truth для последующего анализа.

# Save final model
artifact = wandb.Artifact('final-model', type='model')
artifact.add_file('model.pth')
wandb.log_artifact(artifact)

# Save predictions for analysis
predictions_table = wandb.Table(
    columns=["id", "input", "prediction", "ground_truth"],
    data=predictions_data
)
wandb.log({"predictions": predictions_table})

При нестабильном соединении включите режим офлайн, установив переменную окружения WANDB_MODE в значение 'offline' перед вызовом wandb.init, а затем позже синхронизируйте каталог запуска с помощью команды wandb sync.

import os

# Enable offline mode
os.environ["WANDB_MODE"] = "offline"

wandb.init(project="my-project")
# ... your code ...

# Sync later
# wandb sync <run_directory>

Запуски автоматически становятся доступными для общего доступа по своему URL, который можно получить из объекта запуска.

# Runs are automatically shareable via URL
run = wandb.init(project="team-project")
print(f"Share this URL: {run.url}")

Чтобы работать в команде, создайте учетную запись на сайте wandb.ai и добавьте туда членов команды.

Добавьте членов команды в свой аккаунт.

Установите видимость проекта как приватную или публичную.

Используйте артефакты и реестр моделей на уровне команды.

Источник: nousresearch/hermes-agent и участники проекта. Лицензия: MIT.

Copyright (c) 2025 Nous Research

Перевод и редакционная адаптация: ClawCases.

>Ресурсы

>Похожие юзкейсы

Разработка

Арбитр разрешения конфликтов слияния агентов

Разрешает конфликт слияния Git между ветками двух агентов в качестве беспристрастной третьей стороны: нейтральный арбитр, который принимает обе версии изменений и указанные намерения, после чего формирует итоговый результат слияния, не перезаписывая ни одну из сторон.

Hermes Средний
Автоматизация Разработка

Автономное управление проектами с помощью подагентов

Координация проектов автономно: главный агент делегирует работу подагентам-менеджерам проектов, которые отслеживают задачи в общем файле STATE.yaml, обновляют его по мере выполнения, параллельно берутся за неблокируемые задачи и сохраняют всё состояние задач в файлах с контролем версий.

OpenClaw Средний
Творчество

Простой английский: переписывание текста по стандарту ASD-STE100 Simplified Technical English

Переписать технический текст в соответствии со стандартом ASD-STE100 Упрощенный технический английский — контролируемым языком, используемым в документации по техническому обслуживанию аэрокосмической и оборонной техники. Режим проверки позволяет аудитировать существующий текст на соответствие стандарту STE и выявлять каждое нарушение с предложением корректного варианта переписывания.

Hermes Средний

>Ещё на этом уровне: Продвинутый