Weight&Biases教程-持续更新
简介
Weights & Biases 可以帮助跟踪你的机器学习项目。使用工具记录运行中的超参数和输出指标(Metric),然后对结果进行可视化和比较,并快速与同事分享你的发现。
好处
首先它和tensorboard的功能类似,但是区别在于可以通过真正的网址随时进行访问,同时他人也能看到你的效果,省去了麻烦的步骤,同时还能方便自己随时随地监工自己的网络运行情况,同时它的sweeps能自己调参优化模型
工具
仪表盘:跟踪实验、可视化结果。
报告:保存和分享可复制的成果/结论。
Sweeps:通过调节超参数来优化模型
Artifacts : 数据集和模型版本化,流水线跟踪。
网址
https://wandb.ai/site,注册一个账号,个人是免费的,然后创建一个项目,然后按照官网提示安装pip install wandb
测试demo
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
import wandb
batch_size = 200
learning_rate = 0.01
epochs = 30
wandb.init(
# Set the project where this run will be logged
project=" ",#写自己的
entity=" ",#写自己的
# Track hyperparameters and run metadata
config={
"learning_rate": learning_rate,
"architecture": "MLP",
"dataset": "MNIST",
"epochs": epochs,
})
train_loader = torch.utils.data.DataLoader(
datasets.MNIST('../data', train=True, download=True,
transform=transforms.Compose([
transforms.ToTensor(),
# transforms.Normalize((0.1307,), (0.3081,))
])),
batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(
datasets.MNIST('../data', train=False, transform=transforms.Compose([
transforms.ToTensor(),
# transforms.Normalize((0.1307,), (0.3081,))
])),
batch_size=batch_size, shuffle=True)
class MLP(nn.Module):
def __init__(self):
super(MLP, self).__init__()
self.model = nn.Sequential(
nn.Linear(784, 200),
nn.LeakyReLU(inplace=True),
nn.Linear(200, 200),
nn.LeakyReLU(inplace=True),
nn.Linear(200, 10),
nn.LeakyReLU(inplace=True),
)
def forward(self, x):
x = self.model(x)
return x
device = torch.device('cuda:0')
net = MLP().to(device)
optimizer = optim.SGD(net.parameters(), lr=learning_rate)
criteon = nn.CrossEntropyLoss().to(device)
global_step = 0
for epoch in range(epochs):
net.train()
for batch_idx, (data, target) in enumerate(train_loader):
data = data.view(-1, 28 * 28)
data, target = data.to(device), target.cuda()
logits = net(data)
loss = criteon(logits, target)
optimizer.zero_grad()
loss.backward()
# print(w1.grad.norm(), w2.grad.norm())
optimizer.step()
global_step += 1
if batch_idx % 100 == 0:
print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
epoch, batch_idx * len(data), len(train_loader.dataset),
100. * batch_idx / len(train_loader), loss.item()))
#展示数据
wandb.log({"Train loss": loss.item()})
net.eval()
test_loss = 0
correct = 0
for data, target in test_loader:
data = data.view(-1, 28 * 28)
data, target = data.to(device), target.cuda()
logits = net(data)
test_loss += criteon(logits, target).item()
pred = logits.argmax(dim=1)
correct += pred.eq(target).float().sum().item()
test_loss /= len(test_loader.dataset)
print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
test_loss, correct, len(test_loader.dataset),
100. * correct / len(test_loader.dataset)))
wandb.log({"Test avg loss":test_loss,"Test acc": 100. * correct / len(test_loader.dataset)})
wandb.finish()
下面是介绍一些基本的使用
登录
在pycharm命令行运行wandb login
,输入自己的API key
wandb.init()
默认情况下,wandb.init()会启动一个进程,把指标(Metric)实时同步到云托管应用程序。
- run = wandb.init(reinit=True): 使用这个设置以允许重新初始化运行。
- run.finish(): 在你的运行结束时使用此功能来完成该运行的日志记录
import wandb
run = wandb.init(project="test",
entity="coffee_tea",#告诉网址你的身份
reinit=True)
for y in range(100):
#在网站上可以看到
wandb.log({"metric": y})
run.finish()
指定id和name
id是本地文件中最后的后缀
name是网站中运行对应名字
通过在init中指定即可
import wandb
run = wandb.init(project="test",
entity="coffee_tea",#个人的名称,每个人不同
name="ko12",
id="qvlp96vk",
reinit=True)
for y in range(100):
wandb.log({"metric": y})
#通过run.的方式访问init里面的属性
print("name:{},id:{}".format(run.name,run.id))
run.finish()
离线使用
如果你的机器离线,或者你无法访问互联网,下面讲述如何以离线模式运行wandb并在稍后同步。
设置两个环境变量:
- WANDB_API_KEY: Set this to your account’s API key, on your settings page
- WANDB_MODE: dryrun
import wandb
import os
os.environ["WANDB_API_KEY"]=" "
os.environ["WANDB_MODE"]="dryrun"
run = wandb.init(project="test",
entity="coffee_tea",
name="ko12",
id="qvlp96vk",
reinit=True)
for y in range(100):
wandb.log({"metric": y})
#通过run.的方式访问init里面的属性
print("name:{},id:{}".format(run.name,run.id))
run.finish()
然后就在本地生成
一旦可以访问互联网,运行一条同步命令即可把该文件夹发送到云端。
wandb sync 文件的绝对路径
wandb sync F:\project2022\test\wandb\offline-run-20220303_193233-qvlp96vk
winda.config
在你的脚本中设置wandb.config
对象,以保存你的训练配置:超参数(Hyperparameter)、输入设置(如数据集名称和模型类型),及其他用于实验的独立变量。这对于分析你的实验以及在将来重现你的工作很有用。
你可以在Web界面根据配置值进行分组、比较不同运行的设置以及查看这些配置如何影响输出。要注意,输出指标(Metric)或独立变量(如损失和准确率)应当用wandb.log
保存而不是wandb.config
。
init是给W&B的配置文件,给网站那边识别和配置信息的。
config是配置超参数,为将来的深度学习做准备!
基本使用
wandb.init(config={"epochs": 4, "batch_size": 32})
# or
wandb.config.update({"epochs": 4, "batch_size": 32})
Argparse 配置
wandb.init()
wandb.config.epochs = 4
parser = argparse.ArgumentParser()
parser.add_argument('-b', '--batch-size', type=int, default=8, metavar='N',
help='input batch size for training (default: 8)')
args = parser.parse_args()
wandb.config.update(args) # adds all of the arguments as config variables
使用
import argparse
import wandb
import os
run = wandb.init(project="test",
entity="coffee_tea",
name="args",
id="args",
reinit=True)
parser = argparse.ArgumentParser()
parser.add_argument('-b', '--batch-size', type=int, default=8, metavar='N',
help='input batch size for training (default: 8)')
args = parser.parse_args()
wandb.config.update(args)
#给config提供超参数
print(run.config)
基于yaml文件的配置
你可以创建一个名为config-defaults.yaml 的文件,它会被自动加载到wandb.config
!
# sample config defaults file
epochs:
desc: Number of epochs to train over
value: 100
batch_size:
desc: Size of each mini-batch
value: 32
肯定我们不会用上面的默认名,假如你有一个test.yaml文件,可以通过wandb.init(config=file_path)
方式进行配置
import argparse
import wandb
import os
run = wandb.init(project="test",
entity="coffee_tea",
name="args",
id="args",
config="test.yaml",
reinit=True)
print(run.config)
基于字典配置
和基于文件配置类似
hyperparameter_defaults = dict(
dropout = 0.5,
batch_size = 100,
learning_rate = 0.001,
)
wandb.init(config=hyperparameter_defaults)