Tensorboard

orchestra-research/ai-research-skills/13-mlops/tensorboard

作者 orchestra-research773a52944ba4MIT13K 个星标收录于 2026年10月8日更新于 2026年10月8日仓库3个月前更新

Visualize training metrics, debug models with histograms, compare experiments, visualize model graphs, and profile performance with TensorBoard - Google's ML visualization toolkit

AI 生成的概览

使用 TensorBoard 记录并可视化机器学习训练指标、模型图、嵌入向量与性能剖析。

功能
该技能提供使用 TensorBoard 跟踪机器学习实验的说明与代码示例。内容涵盖记录标量、图像、直方图、文本、嵌入向量和 PR 曲线,可视化模型图,比较多次运行,调优超参数,以及在 PyTorch 和 TensorFlow/Keras 中进行性能剖析。它会生成可在 TensorBoard 仪表板中查看的日志目录。
适用场景
适用于训练或调试机器学习模型时,需要跟踪损失与准确率随时间的变化、比较不同实验、检查权重与梯度分布,或定位性能瓶颈的场景。适合使用 PyTorch 和 TensorFlow/Keras 并希望以可视化方式跟踪实验的工作流。
运行要求
需要 tensorboard 包,框架相关示例还需要 torch 或 tensorflow。日志写入本地目录,并通过 TensorBoard 网页界面查看,通常位于 localhost:6006。该技能不包含脚本,只有说明文档和参考文档。

TensorBoard: Visualization Toolkit for ML

When to Use This Skill

Use TensorBoard when you need to:

  • Visualize training metrics like loss and accuracy over time
  • Debug models with histograms and distributions
  • Compare experiments across multiple runs
  • Visualize model graphs and architecture
  • Project embeddings to lower dimensions (t-SNE, PCA)
  • Track hyperparameter experiments
  • Profile performance and identify bottlenecks
  • Visualize images and text during training

Users: 20M+ downloads/year | GitHub Stars: 27k+ | License: Apache 2.0

Installation

bash
# Install TensorBoardpip install tensorboard
# PyTorch integrationpip install torch torchvision tensorboard
# TensorFlow integration (TensorBoard included)pip install tensorflow
# Launch TensorBoardtensorboard --logdir=runs# Access at http://localhost:6006

Quick Start

PyTorch

python
from torch.utils.tensorboard import SummaryWriter
# Create writerwriter = SummaryWriter('runs/experiment_1')
# Training loopfor epoch in range(10):    train_loss = train_epoch()    val_acc = validate()
    # Log metrics    writer.add_scalar('Loss/train', train_loss, epoch)    writer.add_scalar('Accuracy/val', val_acc, epoch)
# Close writerwriter.close()
# Launch: tensorboard --logdir=runs

TensorFlow/Keras

python
import tensorflow as tf
# Create callbacktensorboard_callback = tf.keras.callbacks.TensorBoard(    log_dir='logs/fit',    histogram_freq=1)
# Train modelmodel.fit(    x_train, y_train,    epochs=10,    validation_data=(x_val, y_val),    callbacks=[tensorboard_callback])
# Launch: tensorboard --logdir=logs

Core Concepts

1. SummaryWriter (PyTorch)

python
from torch.utils.tensorboard import SummaryWriter
# Default directory: runs/CURRENT_DATETIMEwriter = SummaryWriter()
# Custom directorywriter = SummaryWriter('runs/experiment_1')
# Custom comment (appended to default directory)writer = SummaryWriter(comment='baseline')
# Log datawriter.add_scalar('Loss/train', 0.5, step=0)writer.add_scalar('Loss/train', 0.3, step=1)
# Flush and closewriter.flush()writer.close()

2. Logging Scalars

python
# PyTorchfrom torch.utils.tensorboard import SummaryWriterwriter = SummaryWriter()
for epoch in range(100):    train_loss = train()    val_loss = validate()
    # Log individual metrics    writer.add_scalar('Loss/train', train_loss, epoch)    writer.add_scalar('Loss/val', val_loss, epoch)    writer.add_scalar('Accuracy/train', train_acc, epoch)    writer.add_scalar('Accuracy/val', val_acc, epoch)
    # Learning rate    lr = optimizer.param_groups[0]['lr']    writer.add_scalar('Learning_rate', lr, epoch)
writer.close()
python
# TensorFlowimport tensorflow as tf
train_summary_writer = tf.summary.create_file_writer('logs/train')val_summary_writer = tf.summary.create_file_writer('logs/val')
for epoch in range(100):    with train_summary_writer.as_default():        tf.summary.scalar('loss', train_loss, step=epoch)        tf.summary.scalar('accuracy', train_acc, step=epoch)
    with val_summary_writer.as_default():        tf.summary.scalar('loss', val_loss, step=epoch)        tf.summary.scalar('accuracy', val_acc, step=epoch)

3. Logging Multiple Scalars

python
# PyTorch: Group related metricswriter.add_scalars('Loss', {    'train': train_loss,    'validation': val_loss,    'test': test_loss}, epoch)
writer.add_scalars('Metrics', {    'accuracy': accuracy,    'precision': precision,    'recall': recall,    'f1': f1_score}, epoch)

4. Logging Images

python
# PyTorchimport torchfrom torchvision.utils import make_grid
# Single imagewriter.add_image('Input/sample', img_tensor, epoch)
# Multiple images as gridimg_grid = make_grid(images[:64], nrow=8)writer.add_image('Batch/inputs', img_grid, epoch)
# Predictions visualizationpred_grid = make_grid(predictions[:16], nrow=4)writer.add_image('Predictions', pred_grid, epoch)
python
# TensorFlowimport tensorflow as tf
with file_writer.as_default():    # Encode images as PNG    tf.summary.image('Training samples', images, step=epoch, max_outputs=25)

5. Logging Histograms

python
# PyTorch: Track weight distributionsfor name, param in model.named_parameters():    writer.add_histogram(name, param, epoch)
    # Track gradients    if param.grad is not None:        writer.add_histogram(f'{name}.grad', param.grad, epoch)
# Track activationswriter.add_histogram('Activations/relu1', activations, epoch)
python
# TensorFlowwith file_writer.as_default():    tf.summary.histogram('weights/layer1', layer1.kernel, step=epoch)    tf.summary.histogram('activations/relu1', activations, step=epoch)

6. Logging Model Graph

python
# PyTorchimport torch
model = MyModel()dummy_input = torch.randn(1, 3, 224, 224)
writer.add_graph(model, dummy_input)writer.close()
python
# TensorFlow (automatic with Keras)tensorboard_callback = tf.keras.callbacks.TensorBoard(    log_dir='logs',    write_graph=True)
model.fit(x, y, callbacks=[tensorboard_callback])

Advanced Features

Embedding Projector

Visualize high-dimensional data (embeddings, features) in 2D/3D.

python
import torchfrom torch.utils.tensorboard import SummaryWriter
# Get embeddings (e.g., word embeddings, image features)embeddings = model.get_embeddings(data)  # Shape: (N, embedding_dim)
# Metadata (labels for each point)metadata = ['class_1', 'class_2', 'class_1', ...]
# Images (optional, for image embeddings)label_images = torch.stack([img1, img2, img3, ...])
# Log to TensorBoardwriter.add_embedding(    embeddings,    metadata=metadata,    label_img=label_images,    global_step=epoch)

In TensorBoard:

  • Navigate to "Projector" tab
  • Choose PCA, t-SNE, or UMAP visualization
  • Search, filter, and explore clusters

Hyperparameter Tuning

python
from torch.utils.tensorboard import SummaryWriter
# Try different hyperparametersfor lr in [0.001, 0.01, 0.1]:    for batch_size in [16, 32, 64]:        # Create unique run directory        writer = SummaryWriter(f'runs/lr{lr}_bs{batch_size}')
        # Log hyperparameters        writer.add_hparams(            {'lr': lr, 'batch_size': batch_size},            {'hparam/accuracy': final_acc, 'hparam/loss': final_loss}        )
        # Train and log        for epoch in range(10):            loss = train(lr, batch_size)            writer.add_scalar('Loss/train', loss, epoch)
        writer.close()
# Compare in TensorBoard's "HParams" tab

Text Logging

python
# PyTorch: Log text (e.g., model predictions, summaries)writer.add_text('Predictions', f'Epoch {epoch}: {predictions}', epoch)writer.add_text('Config', str(config), 0)
# Log markdown tablesmarkdown_table = """| Metric | Value ||--------|-------|| Accuracy | 0.95 || F1 Score | 0.93 |"""writer.add_text('Results', markdown_table, epoch)

PR Curves

Precision-Recall curves for classification.

python
from torch.utils.tensorboard import SummaryWriter
# Get predictions and labelspredictions = model(test_data)  # Shape: (N, num_classes)labels = test_labels  # Shape: (N,)
# Log PR curve for each classfor i in range(num_classes):    writer.add_pr_curve(        f'PR_curve/class_{i}',        labels == i,        predictions[:, i],        global_step=epoch    )

Integration Examples

PyTorch Training Loop

python
import torchimport torch.nn as nnfrom torch.utils.tensorboard import SummaryWriter
# Setupwriter = SummaryWriter('runs/resnet_experiment')model = ResNet50()optimizer = torch.optim.Adam(model.parameters(), lr=0.001)criterion = nn.CrossEntropyLoss()
# Log model graphdummy_input = torch.randn(1, 3, 224, 224)writer.add_graph(model, dummy_input)
# Training loopfor epoch in range(50):    model.train()    train_loss = 0.0    train_correct = 0
    for batch_idx, (data, target) in enumerate(train_loader):        optimizer.zero_grad()        output = model(data)        loss = criterion(output, target)        loss.backward()        optimizer.step()
        train_loss += loss.item()        pred = output.argmax(dim=1)        train_correct += pred.eq(target).sum().item()
        # Log batch metrics (every 100 batches)        if batch_idx % 100 == 0:            global_step = epoch * len(train_loader) + batch_idx            writer.add_scalar('Loss/train_batch', loss.item(), global_step)
    # Epoch metrics    train_loss /= len(train_loader)    train_acc = train_correct / len(train_loader.dataset)
    # Validation    model.eval()    val_loss = 0.0    val_correct = 0
    with torch.no_grad():        for data, target in val_loader:            output = model(data)            val_loss += criterion(output, target).item()            pred = output.argmax(dim=1)            val_correct += pred.eq(target).sum().item()
    val_loss /= len(val_loader)    val_acc = val_correct / len(val_loader.dataset)
    # Log epoch metrics    writer.add_scalars('Loss', {'train': train_loss, 'val': val_loss}, epoch)    writer.add_scalars('Accuracy', {'train': train_acc, 'val': val_acc}, epoch)
    # Log learning rate    writer.add_scalar('Learning_rate', optimizer.param_groups[0]['lr'], epoch)
    # Log histograms (every 5 epochs)    if epoch % 5 == 0:        for name, param in model.named_parameters():            writer.add_histogram(name, param, epoch)
    # Log sample predictions    if epoch % 10 == 0:        sample_images = data[:8]        writer.add_image('Sample_inputs', make_grid(sample_images), epoch)
writer.close()

TensorFlow/Keras Training

python
import tensorflow as tf
# Define modelmodel = tf.keras.models.Sequential([    tf.keras.layers.Conv2D(32, 3, activation='relu', input_shape=(28, 28, 1)),    tf.keras.layers.MaxPooling2D(),    tf.keras.layers.Flatten(),    tf.keras.layers.Dense(128, activation='relu'),    tf.keras.layers.Dense(10, activation='softmax')])
model.compile(    optimizer='adam',    loss='sparse_categorical_crossentropy',    metrics=['accuracy'])
# TensorBoard callbacktensorboard_callback = tf.keras.callbacks.TensorBoard(    log_dir='logs/fit',    histogram_freq=1,          # Log histograms every epoch    write_graph=True,          # Visualize model graph    write_images=True,         # Visualize weights as images    update_freq='epoch',       # Log metrics every epoch    profile_batch='500,520',   # Profile batches 500-520    embeddings_freq=1          # Log embeddings every epoch)
# Trainmodel.fit(    x_train, y_train,    epochs=10,    validation_data=(x_val, y_val),    callbacks=[tensorboard_callback])

Comparing Experiments

Multiple Runs

bash
# Run experiments with different configspython train.py --lr 0.001 --logdir runs/exp1python train.py --lr 0.01 --logdir runs/exp2python train.py --lr 0.1 --logdir runs/exp3
# View all runs togethertensorboard --logdir=runs

In TensorBoard:

  • All runs appear in the same dashboard
  • Toggle runs on/off for comparison
  • Use regex to filter run names
  • Overlay charts to compare metrics

Organizing Experiments

python
# Hierarchical organizationruns/├── baseline/│   ├── run_1/│   └── run_2/├── improved/│   ├── run_1/│   └── run_2/└── final/    └── run_1/
# Log with hierarchywriter = SummaryWriter('runs/baseline/run_1')

Best Practices

1. Use Descriptive Run Names

python
# ✅ Good: Descriptive namesfrom datetime import datetimetimestamp = datetime.now().strftime('%Y%m%d_%H%M%S')writer = SummaryWriter(f'runs/resnet50_lr0.001_bs32_{timestamp}')
# ❌ Bad: Auto-generated nameswriter = SummaryWriter()  # Creates runs/Jan01_12-34-56_hostname

2. Group Related Metrics

python
# ✅ Good: Grouped metricswriter.add_scalar('Loss/train', train_loss, step)writer.add_scalar('Loss/val', val_loss, step)writer.add_scalar('Accuracy/train', train_acc, step)writer.add_scalar('Accuracy/val', val_acc, step)
# ❌ Bad: Flat namespacewriter.add_scalar('train_loss', train_loss, step)writer.add_scalar('val_loss', val_loss, step)

3. Log Regularly but Not Too Often

python
# ✅ Good: Log epoch metrics always, batch metrics occasionallyfor epoch in range(100):    for batch_idx, (data, target) in enumerate(train_loader):        loss = train_step(data, target)
        # Log every 100 batches        if batch_idx % 100 == 0:            writer.add_scalar('Loss/batch', loss, global_step)
    # Always log epoch metrics    writer.add_scalar('Loss/epoch', epoch_loss, epoch)
# ❌ Bad: Log every batch (creates huge log files)for batch in train_loader:    writer.add_scalar('Loss', loss, step)  # Too frequent

4. Close Writer When Done

python
# ✅ Good: Use context managerwith SummaryWriter('runs/exp1') as writer:    for epoch in range(10):        writer.add_scalar('Loss', loss, epoch)# Automatically closes
# Or manuallywriter = SummaryWriter('runs/exp1')# ... logging ...writer.close()

5. Use Separate Writers for Train/Val

python
# ✅ Good: Separate log directoriestrain_writer = SummaryWriter('runs/exp1/train')val_writer = SummaryWriter('runs/exp1/val')
train_writer.add_scalar('loss', train_loss, epoch)val_writer.add_scalar('loss', val_loss, epoch)

Performance Profiling

TensorFlow Profiler

python
# Enable profilingtensorboard_callback = tf.keras.callbacks.TensorBoard(    log_dir='logs',    profile_batch='10,20'  # Profile batches 10-20)
model.fit(x, y, callbacks=[tensorboard_callback])
# View in TensorBoard Profile tab# Shows: GPU utilization, kernel stats, memory usage, bottlenecks

PyTorch Profiler

python
import torch.profiler as profiler
with profiler.profile(    activities=[        profiler.ProfilerActivity.CPU,        profiler.ProfilerActivity.CUDA    ],    on_trace_ready=torch.profiler.tensorboard_trace_handler('./runs/profiler'),    record_shapes=True,    with_stack=True) as prof:    for batch in train_loader:        loss = train_step(batch)        prof.step()
# View in TensorBoard Profile tab

Resources

See Also

  • references/visualization.md - Comprehensive visualization guide
  • references/profiling.md - Performance profiling patterns
  • references/integrations.md - Framework-specific integration examples

来源与署名

来源:orchestra-research/ai-research-skills位于13-mlops/tensorboard提交773a529

许可证: MIT

内容归原作者所有。SourceWeft 从公开仓库中收录这些内容。

举报或申请下架