安装:
pip install wandb
登录(只有在线模型才需要登录)
wanbd login
查看你自己的Wandb api key
在terminal中操作查看你的API key并粘贴回车进行授权(https://wandb.ai/authorize)
是否使用Wandb?
如果你使用wandb有问题,或者暂时不想使用,那么可以通过设置mode为disable来不使用wandb:
wandb.init(project="config_example", mode="disabled")
设置离线模式/在线模式
1、离线模式
有时候会出现错误:wandb Network error (ReadTimeout), entering retry loop.
设置为offline会在无网络(内网)的时候使用,会导致错误
注意:设置offline要在wandb init之前使用,否则不起作用,但是不需要注释wandb init
import os
os.environ["WANDB_API_KEY"] = '+++++++++++++++' # 将引号内的+替换成自己在wandb上的一串值
os.environ["WANDB_MODE"] = "offline" # 离线 (此行代码不用修改)
# 初始化wandb
wandb.init(project="config_example")
然后模型会保存在本地,后面你只需要将你本地的log同步到远程即可:
cd your-wandb-folder
wandb sync offline-run-**************
如果在上传的时候出现错误:run 1168flos was previously created and deleted; try a new run name
则直接在后面加上--id即可:wandb sync offline-run-************** --id XXXX
2、在线模式
代码中初始化wandb
# 初始化wandb
wandb.init(project="config_example")
如果记录参数和日志?
1)记录运行args参数
有很多方式,但是最常用的方式是直接通过一行代码上传args:
# 储存运行参数:将参数值转为dict,然后再储存
wandb.config.update(vars(args))
上传后的参数储存在overview中:
2)记录运行log(loss等) + images
wandb.log()记录这些值
然后image要通过一步wandb.Image(image)转换才可以存储
# 储存运行过程中的图像:随机生成一个图像作为示例
data = np.random.rand(256, 256, 3) * 255
data = data.astype(np.uint8)
image = Image.fromarray(data, 'RGB')
# 储存运行过程中的loss等日志
wandb.log(
{
"epoch": epoch,
"train_acc": train_acc,
"train_loss": train_loss,
"val_acc": val_acc,
"val_loss": val_loss,
'images': wandb.Image(image),
}
)
3)记录某些文本
记录总结性的文本
例如:参数量
wandb.run.summary['Trainable parameters'] = f"{n_params / 1e6}M"
记录带有格式的文本
某些时候可能需要记录model的构造等等,我们需要使用:
wandb.log(
{"Model_architecture": wandb.Table(columns=["Model_architecture"], data=[[str(model_without_ddp)]])}
)
怎么resume?
例如你想从某个project的runs中恢复log,也就是继续log,那么你可以使用resume参数
https://docs.wandb.ai/guides/runs/resuming
project必须你是要resume的project,id是你所对应runs的id
wandb.init(project="config_example", id="ismjl25l", resume="must")
id在overview中的runpath的最后
结果查看:
运行代码后,会出现日志,直接点击本次运行结果的连接即可
完整示例代码执行:
import wandb
import argparse
import numpy as np
import random
from PIL import Image
# 初始化wandb
wandb.init(project="config_example")
def train_one_epoch(epoch, lr, bs):
acc = 0.25 + ((epoch / 30) + (random.random() / 10))
loss = 0.2 + (1 - ((epoch - 1) / 10 + random.random() / 5))
return acc, loss
def evaluate_one_epoch(epoch):
acc = 0.1 + ((epoch / 20) + (random.random() / 10))
loss = 0.25 + (1 - ((epoch - 1) / 10 + random.random() / 6))
return acc, loss
def main(args):
# 储存运行参数:将参数值转为dict,然后再储存
wandb.config.update(vars(args))
for epoch in np.arange(1, args.epochs):
train_acc, train_loss = train_one_epoch(epoch, args.learning_rate, args.batch_size)
val_acc, val_loss = evaluate_one_epoch(epoch)
# 储存运行过程中的图像:随机生成一个图像作为示例
data = np.random.rand(256, 256, 3) * 255
data = data.astype(np.uint8)
image = Image.fromarray(data, 'RGB')
# 储存运行过程中的loss等日志
wandb.log(
{
"epoch": epoch,
"train_acc": train_acc,
"train_loss": train_loss,
"val_acc": val_acc,
"val_loss": val_loss,
'images': wandb.Image(image),
}
)
if __name__ == "__main__":
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument("--batch_size", type=int, default=32, help="Batch size")
parser.add_argument("--epochs", type=int, default=50, help="Number of training epochs")
parser.add_argument("--learning_rate", type=int, default=0.001, help="Learning rate")
args = parser.parse_args()
main(args)