Wandb(Weights Biases) 深度学习轻量级可视化工具(Sweeps Artifacts)
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_1
、finetune_v2
、finetune_with_attention
等。
*cls*
:匹配包含cls
的任意字符或字符串,例如fine-tune-with-cls
、model_cls_dropout
、myclsmodel
等。
*train*epoch5*
:匹配包含train
和epoch5
的任意字符或字符串,例如model_train_loss_epoch5
、traindata_epoch5_stats
、trainv2-epoch5
等。使用通配符
*
时需要注意以下几点:
通配符
*
只能用于字符串类型的筛选条件,例如name
、tags
等,不能用于数值类型的metric或hyperparameter。如果在通配符
*
前面或后面加上其他文本或符号,通配符只会匹配特定的字符或字符串,例如*cls
只会匹配以cls
结尾的字符或字符串,而不是匹配包含cls
的任意字符或字符串。通配符
*
可以多次使用,例如*finetune*cls*
会匹配包含finetune
和cls
的任意字符或字符串,无论它们在名称中的位置如何。wandb界面搜索 正则表达式
在实验名称搜索界面就要用MySQL正则表达式了,就不能用通配符了
以下是一些使用MySQL正则表达式的示例:
^exp_.*
:匹配名称以exp_
开头的实验,其中^
表示以指定的文本开头,.*
表示匹配零个或多个任意字符。
.*_v[12]$
:匹配名称以_v1
或_v2
结尾的实验,其中.*
表示匹配零个或多个任意字符,$
表示以指定的文本结尾。
.*(cnn|resnet).*
:匹配名称中包含cnn
或resnet
的实验,其中|
表示逻辑或关系,括号用于分组。
^(?!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)相关推荐
- wandb(wb)(weights and biases): 深度学习轻量级可视化工具入门教程
参考文章:wandb: 深度学习轻量级可视化工具入门教程 这wandb有点蛋疼啊,说登录https://wandb.ai/authorize?signup=true获取API KEY,但貌似要梯子才能 ...
- wandb: 深度学习轻量级可视化工具入门教程
本文,就来给大家介绍一款新型的机器学习可视化工具,能够让人工智能研发过程变得更加简单明了. wandb: 深度学习轻量级可视化工具入门教程 引言 wandb 验证数据可视化 自然语言处理 重要工具 极 ...
- PyTorch深度学习训练可视化工具tensorboardX
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 之前笔者提到了PyTorch的专属可视化工具visdom,参看Py ...
- 【深度学习】PyTorch深度学习训练可视化工具visdom
PyTorch Author:louwill Machine Learning Lab 在进行深度学习实验时,能够可视化地对训练过程和结果进行展示是非常有必要的.除了Torch版本的TensorBoa ...
- 深度学习3D可视化工具——Zetane Engine
神经网络在工作的时候,里面到底是什么样? 为了能透视这个"AI黑箱"中的过程,加拿大蒙特利尔一家公司开发一个3D可视化工具Zetane Engine.只需要上传一个模型,Zetan ...
- YOLOv5的Tricks | 【Trick11】在线模型训练可视化工具wandb(Weights Biases)
如有错误,恳请指出. 与其说是yolov5的训练技巧,这篇博客更多的记录如何使用wandb这个在线模型训练可视化工具,感受到了yolov5作者对其的充分喜爱. 所以下面内容更多的记录下如何最简单的使用 ...
- 深度学习半自动标注_时下流行的深度学习数据标注工具
时下流行的深度学习数据标注工具 迷若烟雨 2018-09-04 16:36:00 15820 收藏 33 分类专栏: 深度学习 版权 本文将标注工具适用的最佳运行环境分成了三类. 跨平台 https: ...
- 深度学习数据集标注工具、图像语料数据库等资源
NLP+VS︱深度学习数据集标注工具.图像语料数据库.实验室搜索ing... 2017年02月07日 12:12:01 阅读数:27032 ~~因为不太会使用opencv.matlab工具,所以在找一 ...
- 深度学习图像标注工具汇总
深度学习图像标注工具汇总 原文地址: https://blog.csdn.net/chaipp0607/article/details/79036312 对于监督学习算法而言,数据决定了任务的上限,而 ...
最新文章
- Netflix CEO哈斯廷斯:内容为王 公司潜力依然巨大
- DeepFake 入门了解
- 排序算法(还需补充)
- Acdream Path 动态规划
- Windows Vista Ultimate 版测试结果汇整
- 出块过程(2)nodeos 服务器接收消息
- 使用gitkraken来push的流程
- 多线程—synchronized及同步器
- node.js知识点总结
- 百度HTTPS认证显示“您的站点有链接未通过https检验”的解决办法
- UWP平台Taglib编译(1)
- [转] oracle 数据库 SQL plus 连接方法
- 仍然提供32位Linux发行版,Ubuntu 20.04彻底淘汰32位映像,只提供64位映像下载
- Hadoop简单安装配置
- 【寒江雪】Go实现代理模式
- 智能家居时代到来?智能家居是有必要的吗?
- Visual studio之C#的一些常见问题
- python的contour怎么画虚线_Python+Matplotlib画contour图
- 广东高科技产业商会会长王理宗:回眸经典故事 重燃青春岁月
- java都市男人心痒痒_男人听了会“心痒痒”的四个称呼,低情商的女人从来没叫过...
热门文章
- 段码液晶屏笔段电压范围_可以用段码液晶屏的驱动方式驱动数码管屏吗?
- 百胜图Barsetto手动奶泡机测评意想不到的丝滑奶泡
- 基础物理-电磁学-(一)电场
- 华为mate9测试软件,【华为Mate9评测】3个月使用不卡顿!EMUI 5.0系统再测_华为 Mate 9(MHA-AL00/4GB RAM/全网通) _手机评测-中关村在线...
- 【小白学java】java的面向对象设计:封装+继承+抽象类+接口(day06)
- 2019年猪年颁奖典礼、公司年会、跨年晚会、科技会议、年终答谢会之幕布背景展板PSD模板-第二部分...
- linux tcptraceroute tcpping安装使用
- java实现远程开关机
- 【CSS】CSS的置灰方法
- jmeter功能介绍(三)