wandb是Weights & Biases的缩写,是类似TensorBoard, visdom的一款可视化工具

是属于Python的,不是Pytorch的

wandb是最大的特点是能自动上传云端,让你即使在外面或者旅行途中也能随时随地查看模型崩没崩。甚至觉得某个模型跑的不好了在手机上就可以停掉它。

但是wandb必须要联网,没网的本地电脑是没法跑的

首先要注册账号

wandb能够很好解决tensorboard的痛点

我们使用tensorboard的痛点是,如果想要在一张图里比较多个模型的曲线,要将不同模型都copy到同一个目录下才行

如果想要记录一些超参配置的话,可能要起很长的名字才行

wandb能够很好解决这些痛点

Weights & Biases - Documentation (wandb.ai)

Quickstart (快速上手) - Documentation (wandb.ai)

wandb的重要的工具:

  • Dashboard:跟踪实验,可视化结果;
  • Reports:分享,保存结果;
  • Sweeps:超参调优;
  • Artifacts:数据集和模型的版本控制。
pip install wandb

然后

wandb login

在代码里

parser.add_argument("--wandb_id", type=str)
if not args.wandb_id:  #如果没有输入就重新生成args.wandb_id = wandb.util.generate_id()
wandb.init(project = "DAB_DETR",config = args,name = 'debug',id = args.wandb_id,#resume = True,)

wandb.log

log不需要记录step,会自动一直递增

wandb.log({'accuracy': train_acc})
wandb.log({'loss': train_loss})

但是这样会引起一个问题,一旦batchsize改变,训的step数是不同的,就不好一块比了

训练的时候主要是看趋势,还可以

但是在测试的时候,要把epoch也记录上,这样的话,查看的时候x轴转换成epoch就可以比较了

wandb.log({'AP': stats['coco_eval_bbox'][0],'AP50': stats['coco_eval_bbox'][1],'epoch': epoch,})

记录图片

例如我们在程序运行过程中,想把图片也记录下来,来看例如数据增强等操作正不正常

grid_image = torchvision.utils.make_grid(inputs, normalize=False)
Img = wandb.Image(grid_image, caption="epoch:{}".format(epoch))  # attention!!!
wandb.log({"train_img": Img})

就和正常一个,也是一个iter记录一次

图片还可以下载

可以拖动step来看对应的图片

wandb特征图记录

采用register_forward_pre_hook(hook: Callable[..., None])函数实现,括号中的参数是一个函数名,暂且称之为hook_func,函数内容需要自行实现。其参数module, input, output固定,分别代表模块名称、一个tensor组成的tuple输入和tensor输出。关于该函数详细解释可参考博文。
由于hook_func参数固定,故定义get_image_name_for_hook函数为不同特征图命名,并定义全局变量COUNT表示特征图在网络结构中的顺序。具体实现如下。

COUNT = 0  # global_para for featuremap naming
IMAGE_FOLDER = './save_image'
INSTANCE_FOLDER = Nonedef hook_func(module, input, output):image_name = get_image_name_for_hook(module)data = output.clone().detach().permute(1, 0, 2, 3)# torchvision.utils.save_image(data, image_name, pad_value=0.5)from PIL import Imagefrom torchvision.utils import make_gridgrid = make_grid(data, nrow=8, padding=2, pad_value=0.5, normalize=False, range=None, scale_each=False)ndarr = grid.mul_(255).add_(0.5).clamp_(0, 255).permute(1, 2, 0).to('cpu', torch.uint8).numpy()im = Image.fromarray(ndarr)# wandb save from jpg/png filewandb.log({f"{image_name}": wandb.Image(im)})# save locally# im.save(image_path)def get_image_name_for_hook(module):os.makedirs(INSTANCE_FOLDER, exist_ok=True)base_name = str(module).split('(')[0]image_name = '.'  # '.' is surely exist, to make first loop condition Trueglobal COUNTwhile os.path.exists(image_name):COUNT += 1image_name = '%d_%s' % (COUNT, base_name)return image_nameif __name__ == '__main__':# clear output folderif os.path.exists(IMAGE_FOLDER):shutil.rmtree(IMAGE_FOLDER)# TODO: wandb & model initializationmodel.eval()# layers to logmodules_for_plot = (torch.nn.LeakyReLU, torch.nn.BatchNorm2d, torch.nn.Conv2d)for name, module in model.named_modules():if isinstance(module, modules_for_plot):module.register_forward_hook(hook_func)index = 1for idx, batch in enumerate(val_loader):# global COUNTCOUNT = 1INSTANCE_FOLDER = os.path.join(IMAGE_FOLDER, f'{index}_pic')# forwardimages_val = Variable(torch.from_numpy(batch[0]).type(torch.FloatTensor)).cuda()outputs = model(images_val)

wandb.watch

可以记录模型parameters和gradient

要在定义好model之后,开始训练之前加

wandb.watch(net, log='all', log_freq=1)

默认log_freq是1000

但是记录的时候会不显示

把模型点进去之后才能看到

当模型的performance/loss开始趋平,不再提升的时候,梯度值也应该shrink到0.

如果梯度值在减小,而performance/loss并不是我们所期望的那样,那么很可能是被困在了一个局部最优值点了。此时,提升lr或者relax regularization约束都有可能help

在wandb中导入tensorboard数据

将实验过程中产生的tensorboard文件直接上传到wandb

wandb.init(project = 'test',name = 'grad',sync_tensorboard=True,
)
wandb.tensorboard.patch(root_logdir="<logging_directory>")

wandb.finish()

在最后加这个

# do this after training
wandb.finish()

(貌似不加也没什么问题)

wandb.resume

要resume的时候,把wandb.init的id换成之前那个实验的id

然后wandb.init()的resume设成True即可

这样的话有一个小问题,wandb会继续之前中断的step开始写入,例如latest epoch是epoch_10,但是这个终端的地方有可能是epoch_11已经训了一半了,我们load epoch_10是从epoch_11从头开始训,而wandb却会从epoch_11训到一半的step开始继续记录,所以这个epoch_11的曲线会更长,后面的也就会有错位了,像

wandb.save

保存某些文件到wandb

# Save a model file from the current directory
wandb.save('model.h5')# Save all files that currently exist containing the substring "ckpt"
wandb.save('../logs/*ckpt*')# Save any files starting with "checkpoint" as they're written to
wandb.save(os.path.join(wandb.run.dir, "checkpoint*"))

wandb.restore

恢复保存在wandb中的文件

# restore the model file "model.h5" from a specific run by user "lavanyashukla"
# in project "save_and_restore" from run "10pr4joa"
best_model = wandb.restore('model.h5', run_path="lavanyashukla/save_and_restore/10pr4joa")# use the "name" attribute of the returned object if your framework expects a filename, e.g. as in Keras
model.load_weights(best_model.name)

wandb.run.dir

wandb保存文件的本地路径

如/mntnfs/med_data/xian/pra/wandb/run-20230311_143653-2j6cureh/files

在wandb界面 filter

可以使用通配符*

wandb界面中filter选项中,通配符*可以用于匹配一个或多个任意字符。通配符*常常用于在字符串中查找或者过滤特定的文本。

以下是一些使用通配符*的示例:

  • finetune*:匹配以finetune开头的任意字符或字符串,例如finetune_1finetune_v2finetune_with_attention等。

  • *cls*:匹配包含cls的任意字符或字符串,例如fine-tune-with-clsmodel_cls_dropoutmyclsmodel等。

  • *train*epoch5*:匹配包含trainepoch5的任意字符或字符串,例如model_train_loss_epoch5traindata_epoch5_statstrainv2-epoch5等。

使用通配符*时需要注意以下几点:

  • 通配符*只能用于字符串类型的筛选条件,例如nametags等,不能用于数值类型的metric或hyperparameter。

  • 如果在通配符*前面或后面加上其他文本或符号,通配符只会匹配特定的字符或字符串,例如*cls只会匹配以cls结尾的字符或字符串,而不是匹配包含cls的任意字符或字符串。

  • 通配符*可以多次使用,例如*finetune*cls*会匹配包含finetunecls的任意字符或字符串,无论它们在名称中的位置如何。

wandb界面搜索 正则表达式

在实验名称搜索界面就要用MySQL正则表达式了,就不能用通配符了

以下是一些使用MySQL正则表达式的示例:

  • ^exp_.*:匹配名称以exp_开头的实验,其中^表示以指定的文本开头,.*表示匹配零个或多个任意字符。

  • .*_v[12]$:匹配名称以_v1_v2结尾的实验,其中.*表示匹配零个或多个任意字符,$表示以指定的文本结尾。

  • .*(cnn|resnet).*:匹配名称中包含cnnresnet的实验,其中|表示逻辑或关系,括号用于分组。

  • ^(?!exp_).*:匹配名称不以exp_开头的实验,其中?!表示否定预测,即匹配不包含指定文本的实验名称。

  • ^[^_]+_[^_]+_[^_]+$:匹配名称包含三个以下划线分隔的任意文本的实验,其中^$分别表示匹配字符串的开头和结尾,[^_]表示匹配任意非下划线字符,+表示匹配一个或多个匹配项

导出report

可以选择某些图然后导出report

可以通过链接/邮件或者转成pdf给别人分享

设置提醒

将一个run移到另一个project中

Sweeps

可以超参搜索

Artifacts

可以自己搭建pipline实现保存储存数据集和模型以及评估结果的流程。

artifact译为"工件", 指软件开发中产出的最终成果

可以通过wandb.log_artifact来保存任务的关联的重要成果,例如dataset,code和model,并进行版本管理

wandb使用教程(一):基础用法 - 知乎 (zhihu.com)

wandb使用教程(二):基于Launchpad实现分布式超参搜索 - 知乎 (zhihu.com)

wandb使用教程(三):数据与模型管理 - 知乎 (zhihu.com)

wandb: 深度学习轻量级可视化工具入门教程_紫芝的博客-CSDN博客_wandb使用

Wandb:模型训练最强辅助 - 知乎

sweep超参搜索

要把整个训练的代码写成一个train函数,并且在这个train函数内部wandb.init()

搜索方法有

  • grid search(网格搜索): 穷举法,在所有的参数组合中,通过循环便利,尝试每一种可能性,选取评价指标最好的参数输出
  • random search(随即搜索):在预先设定的定义域内随机选取超参数组合
  • bayes search(贝叶斯搜索):区别于grid search和bayes search相对独立的参数搜索方式,bayes search希望通过上一次的效果来决定下一次的参数选择,以提高搜索效率
import torch
import torchvision
from torchvision import transforms
from matplotlib import pyplot as plt
from torch import nn
from torch.nn import functional as F
from torch import optim
import os
import wandb
import mathdef one_hot(label, depth=10):out = torch.zeros(label.size(0), depth)idx = torch.LongTensor(label).view(-1, 1)out.scatter_(dim=1, index=idx, value=1)return outclass Net(nn.Module):def __init__(self):super(Net, self).__init__()#三层全连接层#wx+bself.fc1 = nn.Linear(28*28, 256)self.fc2 = nn.Linear(256,64)self.fc3 = nn.Linear(64,10)def forward(self, x):# x: [b, 1, 28, 28]x = F.relu(self.fc1(x)) #F.relu和torch.relu,用哪个都行x = F.relu(self.fc2(x))x = self.fc3(x)return xcnt = -1
def train():global cntcnt += 1wandb.init(project = "test",# config = args,name = f'debug_hypersearch_{cnt}',# id = args.wandb_id,#resume = True,)print(wandb.config)print(wandb.config.batch_size)batch_size = wandb.config.batch_sizetransform = transforms.Compose([torchvision.transforms.ToTensor(),torchvision.transforms.Normalize((0.1307,), (0.3081,))])trainset = torchvision.datasets.MNIST(root='dataset/',train=True,  #如果为True,从 training.pt 创建数据,否则从 test.pt 创建数据。download=True, #如果为true,则从 Internet 下载数据集并将其放在根目录中。 如果已下载数据集,则不会再次下载。transform=transform)train_loader = torch.utils.data.DataLoader(dataset=trainset,batch_size=batch_size,shuffle=True  #在加载的时候将图片随机打散)testset = torchvision.datasets.MNIST(root='dataset/',train=False,download=True,transform=transform)test_loader = torch.utils.data.DataLoader(dataset=testset,batch_size=batch_size,shuffle=True)net = Net()  #创建网络对象# [w1, b1, w2, b2, w3, b3]optimizer = optim.SGD(net.parameters(), lr=1e-2, momentum=0.9)lr = wandb.config.learning_ratetrain_loss = []for epoch in range(3):#train_loader长度118for idx, data in enumerate(train_loader): #当然这里你也可以写next(iter(train_loader))if idx > 50:breakinputs, labels = datainputs = inputs.view(inputs.size(0), 28*28)#现在inputs是[512, 28*28]outputs = net(inputs)#outputs是[512,10]labels_onehot = one_hot(labels)# 就是将y转成onehot# y是512个label值,是一个512*1的tensor数组# y_onehot是512个10维的,即512*10的tensor数组# 例如y的label是2,那么对应的y_onehot就是0,1,2,第三个位置为1,其余位置为0这样loss = F.mse_loss(outputs, labels_onehot) #用torch.nn.MSELoss()也行optimizer.zero_grad()loss.backward()optimizer.step()train_loss.append(loss.item())wandb.log({'loss': loss.item(),'lr': lr,'epoch': epoch})if idx % 10 == 0:print(epoch, idx, loss.item())torch.save(net.state_dict(), 'params.pkl')print('model has been save into params.pkl.')if __name__ == '__main__':#第一步:定义sweeps 配置,也就是超参数搜索的方法和范围# 超参数搜索方法,可以选择:grid random bayessweep_config = {'method': 'random'}# 参数范围parameters_dict = {'learning_rate': {# a flat distribution between 0 and 0.1'distribution': 'uniform','min': 0,'max': 0.1},'batch_size': {# integers between 32 and 256# with evenly-distributed logarithms 'distribution': 'q_log_uniform','q': 1,'min': math.log(32),'max': math.log(256),}}sweep_config['parameters'] = parameters_dict# from pprint import pprint# pprint(sweep_config)#第二步:初始化sweep#一旦定义好超参数调优策略和搜索范围,需要一个sweep controller管理调优过程sweep_id = wandb.sweep(sweep_config, project="test")wandb.agent(sweep_id, train, count=5)

画图

基于wandb sweeps的pytorch超参数调优实验 - 知乎 (zhihu.com)

Wandb(Weights Biases) 深度学习轻量级可视化工具(Sweeps Artifacts)相关推荐

  1. wandb(wb)(weights and biases): 深度学习轻量级可视化工具入门教程

    参考文章:wandb: 深度学习轻量级可视化工具入门教程 这wandb有点蛋疼啊,说登录https://wandb.ai/authorize?signup=true获取API KEY,但貌似要梯子才能 ...

  2. wandb: 深度学习轻量级可视化工具入门教程

    本文,就来给大家介绍一款新型的机器学习可视化工具,能够让人工智能研发过程变得更加简单明了. wandb: 深度学习轻量级可视化工具入门教程 引言 wandb 验证数据可视化 自然语言处理 重要工具 极 ...

  3. PyTorch深度学习训练可视化工具tensorboardX

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 之前笔者提到了PyTorch的专属可视化工具visdom,参看Py ...

  4. 【深度学习】PyTorch深度学习训练可视化工具visdom

    PyTorch Author:louwill Machine Learning Lab 在进行深度学习实验时,能够可视化地对训练过程和结果进行展示是非常有必要的.除了Torch版本的TensorBoa ...

  5. 深度学习3D可视化工具——Zetane Engine

    神经网络在工作的时候,里面到底是什么样? 为了能透视这个"AI黑箱"中的过程,加拿大蒙特利尔一家公司开发一个3D可视化工具Zetane Engine.只需要上传一个模型,Zetan ...

  6. YOLOv5的Tricks | 【Trick11】在线模型训练可视化工具wandb(Weights Biases)

    如有错误,恳请指出. 与其说是yolov5的训练技巧,这篇博客更多的记录如何使用wandb这个在线模型训练可视化工具,感受到了yolov5作者对其的充分喜爱. 所以下面内容更多的记录下如何最简单的使用 ...

  7. 深度学习半自动标注_时下流行的深度学习数据标注工具

    时下流行的深度学习数据标注工具 迷若烟雨 2018-09-04 16:36:00 15820 收藏 33 分类专栏: 深度学习 版权 本文将标注工具适用的最佳运行环境分成了三类. 跨平台 https: ...

  8. 深度学习数据集标注工具、图像语料数据库等资源

    NLP+VS︱深度学习数据集标注工具.图像语料数据库.实验室搜索ing... 2017年02月07日 12:12:01 阅读数:27032 ~~因为不太会使用opencv.matlab工具,所以在找一 ...

  9. 深度学习图像标注工具汇总

    深度学习图像标注工具汇总 原文地址: https://blog.csdn.net/chaipp0607/article/details/79036312 对于监督学习算法而言,数据决定了任务的上限,而 ...

最新文章

  1. Netflix CEO哈斯廷斯:内容为王 公司潜力依然巨大
  2. DeepFake 入门了解
  3. 排序算法(还需补充)
  4. Acdream Path 动态规划
  5. Windows Vista Ultimate 版测试结果汇整
  6. 出块过程(2)nodeos 服务器接收消息
  7. 使用gitkraken来push的流程
  8. 多线程—synchronized及同步器
  9. node.js知识点总结
  10. 百度HTTPS认证显示“您的站点有链接未通过https检验”的解决办法
  11. UWP平台Taglib编译(1)
  12. [转] oracle 数据库 SQL plus 连接方法
  13. 仍然提供32位Linux发行版,Ubuntu 20.04彻底淘汰32位映像,只提供64位映像下载
  14. Hadoop简单安装配置
  15. 【寒江雪】Go实现代理模式
  16. 智能家居时代到来?智能家居是有必要的吗?
  17. Visual studio之C#的一些常见问题
  18. python的contour怎么画虚线_Python+Matplotlib画contour图
  19. 广东高科技产业商会会长王理宗:回眸经典故事 重燃青春岁月
  20. java都市男人心痒痒_男人听了会“心痒痒”的四个称呼,低情商的女人从来没叫过...

热门文章

  1. 段码液晶屏笔段电压范围_可以用段码液晶屏的驱动方式驱动数码管屏吗?
  2. 百胜图Barsetto手动奶泡机测评意想不到的丝滑奶泡
  3. 基础物理-电磁学-(一)电场
  4. 华为mate9测试软件,【华为Mate9评测】3个月使用不卡顿!EMUI 5.0系统再测_华为 Mate 9(MHA-AL00/4GB RAM/全网通) _手机评测-中关村在线...
  5. 【小白学java】java的面向对象设计:封装+继承+抽象类+接口(day06)
  6. 2019年猪年颁奖典礼、公司年会、跨年晚会、科技会议、年终答谢会之幕布背景展板PSD模板-第二部分...
  7. linux tcptraceroute tcpping安装使用
  8. java实现远程开关机
  9. 【CSS】CSS的置灰方法
  10. jmeter功能介绍(三)