wandb安装与使用 —— 用于跟踪、可视化和协作机器学习实验的工具

文章目录

  • 一、wandb简介
  • 二、wandb注册与登陆(网页) —— 若登录,则支持在线功能
  • 三、wandb安装与登陆(命令行) —— 若不登录,则只保留离线功能
  • 四、函数详解
    • 4.1、wandb.init() —— 初始化一个新的 wandb 实验,并开始记录实验的信息和结果。
    • 4.2、wandb.config.update() —— 更新实验的配置参数
    • 4.3、wandb.log() —— 记录实验指标和日志信息。
    • 4.4、wandb.finish() —— 结束实验记录。
  • 五、项目实战
    • 5.1、入门教程
      • 5.1.1、在Pycharm中可视化结果
      • 5.1.2、在仪表盘中可视化结果(网页)
    • 5.2、简单的 Pytorch 神经网络


wandb指南(视频教程 - 入门必看):https://docs.wandb.ai/guides
wandb教程(示例代码):W&B Tutorials
wandb教程(示例代码 - Jupyter):Intro_to_Weights_&_Biases.ipynb

一、wandb简介

wandb(Weights&Biases, W&B)用于跟踪、可视化和协作机器学习实验的工具,支持在线和离线。它提供了一个简单的 Python API,可以轻松地将实验数据发送到云端,并通过 Web 应用程序进行访问和可视化。

  • 实验跟踪和记录:自动跟踪机器学习实验,包括超参数、指标、模型架构等,并将这些信息保存在云端,以便后续查看和比较。
  • 结果可视化:提供丰富的可视化功能,包括曲线图、散点图、直方图等,以帮助用户更好地理解实验结果和模型性能。
  • 模型检查点和版本控制:可以保存模型检查点,并生成唯一的版本号,以便回溯和比较不同的实验结果。
  • 协作和共享:可以邀请团队成员参与实验、查看结果,并进行讨论和反馈。还可以将实验和结果与其他人共享,使其可以在不同的环境中重现和使用您的工作。
  • 集成多种框架:支持与各种机器学习框架(如 TensorFlow、PyTorch、Keras 等)和机器学习工具(如 scikit-learn)集成,并提供了方便的 API,方便进行实验管理和结果跟踪。

备注:若登陆(在线版本)则在个人主页的Profile - Projects中保存实验记录,且每运行一次都将新增一条可视化数据,而不是只保留最近一次的运行结果。
备注:若不登陆(离线版本);
备注:无论是否登录,都将在当前路径下自动新建一个wandb文件夹,且每运行一次都将新增一个保存实验记录的文件夹。

二、wandb注册与登陆(网页) —— 若登录,则支持在线功能

若需要wandb在线功能,则执行以下步骤。

  • 账号注册(SING UP):https://wandb.ai/site
  • 注册并登陆账号后,将获取一个与账号绑定的的身份码(API key)。
  • 在 Python 项目中,可以绑定指定的项目名称用于保存实验数据。若项目不存在,则自动创建。
    • 新建项目:(在跳转界面的左上角)create a new project,该项目可以选择私有(Private)、公开(Public)、开放(Open)。

在这里插入图片描述

三、wandb安装与登陆(命令行) —— 若不登录,则只保留离线功能

  • wandb安装:pip install wandb。安装成功之后,将在当前虚拟环境下(py39)显示安装包如下:

在这里插入图片描述

若需要wandb在线功能,则执行以下步骤。

  • wandb登录:wandb login
1)若显示如下,则输入命令行:wandb login --relogin。用于更换账号
"""
wandb: Currently logged in as: anony-moose-837920374001732497. Use `wandb login --relogin` to force relogin
"""2)若显示如下,则点击第二个链接获取API key(在个人主页的User settings中也可以获取),复制后并在命令行中粘贴(此时命令行没有显示),无需理会直接回车。
"""
wandb: Logging into wandb.ai. (Learn how to deploy a W&B server locally: https://wandb.me/wandb-server)
wandb: You can find your API key in your browser here: https://wandb.ai/authorize
wandb: Paste an API key from your profile and hit enter, or press ctrl+c to quit: 
"""3)若显示如下,登录成功(在C:\Users\Administrator\.netrc路径下可以查看或添加API key)。
"""
wandb: Appending key for api.wandb.ai to your netrc file: C:\Users\Administrator\.netrc
"""4)若显示如下,是由于API key失效或丢失,需重新登录。
"""
wandb: W&B API key is configured. Use `wandb login --relogin` to force relogin
wandb: ERROR Error while calling W&B API: user is not logged in (<Response [401]>)
wandb: ERROR The API key you provided is either invalid or missing.  If the `WANDB_API_KEY` environment variable is set, make sure it is correct. Otherwise, to resolve this issue, you may try running the 'wandb login --relogin' command. If you are using a local server, make sure that you're using the correct hostname. If you're not sure, you can try logging in again using the 'wandb login --relogin --host [hostname]' command.(Error 401: Unauthorized)
"""

在这里插入图片描述

四、函数详解

wandb - Python Library(函数详解 + 参数详解) —— https://docs.wandb.ai/ref/python/
最常用的函数/对象:wandb.init + wandb.config.update() + wandb.log + wandb.finish()。

wandb.init()			:初始化一个新的 wandb 实验,并开始记录实验的信息和结果。
wandb.config.update()	:更新实验的配置参数。
wandb.log()				:记录实验指标和日志信息。
wandb.finish()			:结束实验记录。

wandb.save()			:保存实验结果和模型文件。
wandb.restore	 		:从 wandb 云存储中恢复实验记录的模型参数或文件。

wandb.watch()			:监视模型的梯度和参数。
wandb.Api()				:访问 wandb 云服务的 API。
wandb.Table()			:创建一个表格对象,用于显示数据。
wandb.plot()			:创建并显示图表。
wandb.Image()			:创建并显示图像。
wandb.Video()			:创建并显示视频。
wandb.Audio()			:创建并播放音频。

4.1、wandb.init() —— 初始化一个新的 wandb 实验,并开始记录实验的信息和结果。

"""#########################################################################
函数功能:用于初始化一个新的 wandb 实验,并开始记录实验的信息和结果。
函数说明:wandb.init(project=None, entity=None, group=None, job_type=None, config=None,
                   tags=None, resume=False, dir=None, name=None, notes=None, id=None,
                   magic=None, anonymous=None, allow_val_change=False, reinit=False, settings=None,)
参数说明:
        project:实验所属的项目名称。
        entity:实验所属的实体(例如,团队或用户)。
        group:实验的分组名称。
        job_type:实验的类型(例如,训练、评估等)。
        config:实验的配置参数,可以是一个字典或 Namespace 对象。
        tags:实验的标签,可以是一个字符串列表。
        resume:如果为 True,则尝试恢复先前的实验。默认为 False。
        dir:存储实验数据和日志的目录路径。
        name:实验的名称。
        notes:实验的说明或注释。
        id:实验的唯一标识符。
        magic:用于指定特殊功能的魔法命令。
        anonymous:如果为 True,则匿名上传实验结果。默认为 False。
        allow_val_change:如果为 True,则允许修改已存在的配置参数。默认为 False。
        reinit:如果为 True,则重新初始化实验,忽略先前的配置。默认为 False。
        settings:一个字典,用于设置实验的其他参数。
返回参数:
        一个 wandb.Run 对象,代表当前的实验运行。
#########################################################################"""

4.2、wandb.config.update() —— 更新实验的配置参数

"""#########################################################################
函数功能:用于更新当前实验的配置参数。 ———— 配置参数是在 wandb.init() 函数中指定的,并且可以在实验的整个运行过程中进行更新。
函数说明:wandb.config.update(new_config=None, allow_val_change=None, **kwargs)
参数说明:
        new_config:一个字典或 Namespace 对象,包含要更新的配置参数。
        allow_val_change:如果为 True,则允许修改已存在的配置参数。默认为 False。
        **kwargs:关键字参数,用于更新配置参数。
#########################################################################"""

4.3、wandb.log() —— 记录实验指标和日志信息。

"""#########################################################################
函数功能:用于记录实验中的指标、损失、评估结果、日志信息等,并将它们保存到 Weights & Biases(wandb)平台上,以便后续分析和可视化。
函数说明:wandb.log(data, step=None, commit=True, sync=True)
参数说明:
        data:要记录的数据,可以是一个字典、列表、数字、字符串等。通常用于记录指标、损失等信息。
        step:可选参数,表示记录的步骤或轮数。如果不提供,则默认为当前步骤或轮数。
        commit:可选参数,表示是否立即提交记录。默认为 True,表示立即提交。
        sync:可选参数,表示是否同步记录到云端。默认为 True,表示同步记录。
#########################################################################"""

4.4、wandb.finish() —— 结束实验记录。

"""#########################################################################
函数功能:用于结束当前的实验记录,并将记录的数据保存到 wandb平台上。
函数说明:wandb.finish(exit_code: Optional[int] = None, quiet: Optional[bool] = None)
参数说明:
        exit_code	设置为 0 以外的值将运行标记为失败
        quiet	    设置为 true 以最小化日志输出
#########################################################################"""

五、项目实战

wandb教程(示例代码):W&B Tutorials
wandb教程(示例代码 - Jupyter):Intro_to_Weights_&_Biases.ipynb

5.1、入门教程

5.1.1、在Pycharm中可视化结果

在这里插入图片描述

import wandb
import random

# 🐝 1️⃣ Start a new run to track this script
wandb.init(
    # Set the project where this run will be logged
    project="basic-intro",
    # We pass a run name (otherwise it’ll be randomly assigned, like sunshine-lollypop-10)
    name=f"experiment",
    # Track hyperparameters and run metadata
    config={
        "learning_rate": 0.02,
        "architecture": "CNN",
        "dataset": "CIFAR-100",
        "epochs": 10,
    })

# This simple block simulates a training loop logging metrics
epochs = 10
offset = random.random() / 5
for epoch in range(2, epochs):
    acc = 1 - 2 ** -epoch - random.random() / epoch - offset
    loss = 2 ** -epoch + random.random() / epoch + offset

    # 🐝 2️⃣ Log metrics from your script to W&B
    wandb.log({"acc": acc, "loss": loss})

# Mark the run as finished
wandb.finish()

5.1.2、在仪表盘中可视化结果(网页)

仪表盘(Dashboard):是 wandb 提供的一个可视化界面,用户可以在网页浏览器中访问,并通过它查看、分析和管理实验结果。在仪表盘上,用户可以看到实验的指标、损失曲线、模型参数、日志信息等,并可以进行比较、筛选、筛选和导出等操作。

  • 备注:若登陆(在线版本)则在个人主页的Profile - Projects中保存实验记录,且每运行一次都将新增一条可视化数据,而不是只保留最近一次的运行结果。
  • 备注:若不登陆(离线版本);
  • 备注:无论是否登录,都将在当前路径下自动新建一个wandb文件夹,且每运行一次都将新增一个保存实验记录的文件夹。

运行三次后的显示结果如下:
在这里插入图片描述

5.2、简单的 Pytorch 神经网络

wandb教程(示例代码):W&B Tutorials
wandb教程(示例代码 - Jupyter):Intro_to_Weights_&_Biases.ipynb

在这里插入图片描述

import wandb
import math
import random
import torch, torchvision
import torch.nn as nn
import torchvision.transforms as T

device = "cuda:0" if torch.cuda.is_available() else "cpu"

def get_dataloader(is_train, batch_size, slice=5):
    "Get a training dataloader"
    full_dataset = torchvision.datasets.MNIST(root=".", train=is_train, transform=T.ToTensor(), download=True)
    sub_dataset = torch.utils.data.Subset(full_dataset, indices=range(0, len(full_dataset), slice))
    loader = torch.utils.data.DataLoader(dataset=sub_dataset,
                                         batch_size=batch_size,
                                         shuffle=True if is_train else False,
                                         pin_memory=True, num_workers=2)
    return loader

def get_model(dropout):
    "A simple model"
    model = nn.Sequential(nn.Flatten(),
                         nn.Linear(28*28, 256),
                         nn.BatchNorm1d(256),
                         nn.ReLU(),
                         nn.Dropout(dropout),
                         nn.Linear(256,10)).to(device)
    return model

def validate_model(model, valid_dl, loss_func, log_images=False, batch_idx=0):
    "Compute performance of the model on the validation dataset and log a wandb.Table"
    model.eval()
    val_loss = 0.
    with torch.inference_mode():
        correct = 0
        for i, (images, labels) in enumerate(valid_dl):
            images, labels = images.to(device), labels.to(device)

            # Forward pass ➡
            outputs = model(images)
            val_loss += loss_func(outputs, labels)*labels.size(0)

            # Compute accuracy and accumulate
            _, predicted = torch.max(outputs.data, 1)
            correct += (predicted == labels).sum().item()

            # Log one batch of images to the dashboard, always same batch_idx.
            if i==batch_idx and log_images:
                log_image_table(images, predicted, labels, outputs.softmax(dim=1))
    return val_loss / len(valid_dl.dataset), correct / len(valid_dl.dataset)

def log_image_table(images, predicted, labels, probs):
    "Log a wandb.Table with (img, pred, target, scores)"
    # 🐝 Create a wandb Table to log images, labels and predictions to
    table = wandb.Table(columns=["image", "pred", "target"]+[f"score_{i}" for i in range(10)])
    for img, pred, targ, prob in zip(images.to("cpu"), predicted.to("cpu"), labels.to("cpu"), probs.to("cpu")):
        table.add_data(wandb.Image(img[0].numpy()*255), pred, targ, *prob.numpy())
    wandb.log({"predictions_table":table}, commit=False)


if __name__ == "__main__":
    # Launch 5 experiments, trying different dropout rates
    for _ in range(5):
        # 🐝 initialise a wandb run
        wandb.init(
            project="pytorch-intro",
            config={
                "epochs": 10,
                "batch_size": 128,
                "lr": 1e-3,
                "dropout": random.uniform(0.01, 0.80),
            })

        # Copy your config
        config = wandb.config

        # Get the data
        train_dl = get_dataloader(is_train=True, batch_size=config.batch_size)
        valid_dl = get_dataloader(is_train=False, batch_size=2 * config.batch_size)
        n_steps_per_epoch = math.ceil(len(train_dl.dataset) / config.batch_size)

        # A simple MLP model
        model = get_model(config.dropout)

        # Make the loss and optimizer
        loss_func = nn.CrossEntropyLoss()
        optimizer = torch.optim.Adam(model.parameters(), lr=config.lr)

        # Training
        example_ct = 0
        step_ct = 0
        for epoch in range(config.epochs):
            model.train()
            for step, (images, labels) in enumerate(train_dl):
                images, labels = images.to(device), labels.to(device)

                outputs = model(images)
                train_loss = loss_func(outputs, labels)
                optimizer.zero_grad()
                train_loss.backward()
                optimizer.step()

                example_ct += len(images)
                metrics = {"train/train_loss": train_loss,
                           "train/epoch": (step + 1 + (n_steps_per_epoch * epoch)) / n_steps_per_epoch,
                           "train/example_ct": example_ct}

                if step + 1 < n_steps_per_epoch:
                    # 🐝 Log train metrics to wandb
                    wandb.log(metrics)

                step_ct += 1

            val_loss, accuracy = validate_model(model, valid_dl, loss_func, log_images=(epoch == (config.epochs - 1)))

            # 🐝 Log train and validation metrics to wandb
            val_metrics = {"val/val_loss": val_loss,
                           "val/val_accuracy": accuracy}
            wandb.log({**metrics, **val_metrics})

            print(f"Train Loss: {train_loss:.3f}, Valid Loss: {val_loss:3f}, Accuracy: {accuracy:.2f}")

        # If you had a test set, this is how you could log it as a Summary metric
        wandb.summary['test_accuracy'] = 0.8

        # 🐝 Close your wandb run
        wandb.finish()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/673049.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vivado的两种下载安装方式:Webpack下载与安装、本地文件安装详细步骤讲解

目录 1.前言2. Vivado Webpack下载、安装3.本地文件下载安装 微信公众号获取更多FPGA相关源码&#xff1a; 1.前言 本人自本科大二开始接触FPGA相关知识&#xff0c;现已将近六年&#xff0c;由于一直在上学&#xff0c;也不是一直在搞FPGA&#xff0c;但是也完成过一些项目…

【线性表】顺序存储和链式存储的实现

文章目录 顺序存储链式存储单向链表循环链表 线性表的定义 (1)概念定义&#xff1a;用数据元素的有限序列表示叫做线性表&#xff1b;线性表中数据元素的类型可以为简单类型&#xff0c;也可以为复杂类型。许多实际应用问题所涉的基本操作有很大相似性&#xff0c;不应为每个具…

Day02 设计首页导航条

设计首页导航条 导航条的样式&#xff0c;主要是从Material DesignThemes UI 拷贝过来修改的,项目用了这个UI组件库。就看项目需要什么&#xff0c;就去源码拷过来使用。 直接下载源码&#xff0c;编译运行就可以看到Demo 了 下载后且正常编译成功了&#xff0c;是能正常跑起来…

如何使用Python绘制出好看的小提琴图、箱形图、散点图、山脊图和柱状图

如何使用Python绘制出好看的小提琴图、箱形图、散点图、山脊图和柱状图 废话不多说&#xff0c;今天给大家分享一个&#xff0c;使用python绘制小提琴图、箱形图、散点图、山脊图和柱状图等等 图中的数据是随机生成的&#xff0c;图例&#xff0c;图注以及坐标题目各种信息&a…

javascript之对象属性配置

属性标志&#xff1a; 介绍&#xff1a; 对象属性&#xff0c;除 value 外&#xff0c;还有三个特殊的特性&#xff0c;也就是所谓的“标志”&#xff1a; 属性truefalsewritable值可以被修改只可读的enumerable被在循环中列出不会被列出configurable此属性可以被删除/修改 不可…

从头开始构建GPT标记器

从头开始构建GPT标记器 对于GPT Tokenizer&#xff0c;论文《Language Models are Unsupervised Multitask Learners》中介绍了一种字节级编码作为LLM的标记化机制&#xff1a; The vocabulary is expanded to 50,257. We also increase the context size from 512 to 1024 to…

python3.8环境下安装pyqt5

1.实验目的 测试python可视化工具包pyqt5,为后期做系统前端页面做铺垫 2.实验环境 1.软件 anaconda2.5 pycharm2024.1.1 pyqt5 2.硬件 GPU 4070TI Intel I7 1400K 3. 安装步骤 (base) C:\Users\PC>conda -V conda 23.7.4(base) C:\Users\PC>conda create qttest p…

基于卷积-小波神经网络的SAR图像海冰变化检测方法(MATLAB R2018A)

海冰是冰冻圈的重要组成部分&#xff0c;海冰的变化信息对航行安全和自然资源开采等非常重要&#xff0c;许多船舶没有加固防冰设备&#xff0c;因此&#xff0c;必须避开所有的冰区。尤其当冰压很高时&#xff0c;即使破冰船也很难在冰层中前行。为了安全航行&#xff0c;获取…

ctfshow-web入门-爆破(web21-web24)

目录 1、web21 2、web22 3、web23 4、web24 1、web21 爆破什么的&#xff0c;都是基操 需要认证才能访问 随便输一个用户名和密码抓包看看&#xff1a; 多出来一个认证的头 Authorization: Basic YWRtaW46MTIzNDU2 base64 解码看看&#xff1a; 就是我们刚才输入的用于测…

JVM之【运行时数据区2——堆】

三、堆&#xff08;Heap&#xff09; 1、什么是堆 在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;堆&#xff08;Heap&#xff09;是用于动态分配内存的区域。在Java程序运行时&#xff0c;所有对象和数组都是在堆中分配内存的。堆是Java内存模型的重要组成部分&…

云计算-云基础设施的配置 (Provisioning Cloud Infrastructure)

AWS CloudFormation (AWS CloudFormation) 它是一项服务&#xff0c;允许我们自动建模和配置所需的AWS资源。可以使用模板来实现这一目的。这个模板基本上是用JSON或YAML格式编写的。AWS CloudFormation会根据模板描述的内容来实施资源的配置和管理。我们可以成组配置和管理一组…

MySQL—函数—日期函数(基础)

一、引言 接下来讨论和学习关于函数的第三个方面——日期函数。 常见的MySQL当中的日期函数。 注意&#xff1a; 1、CURDATE()&#xff1a;cur&#xff1a;current 当前的&#xff0c;返回的是当前日期。 2、CURTIME()&#xff1a;当前时间。 3、NOW&#xff1a;当前的日期和…

一、实现一个简单的 Google Chrome 扩展程序

目录 &#x1f9ed; 效果展示 # 图示效果 a. 拓展程序列表图示效果&#xff1a; b. 当前选项卡页面右键效果&#xff1a; c. 拓展程序消息提示效果&#xff1a; &#x1f4c7; 项目目录结构 # 说明 # 结构 # 文件一览 ✍ 核心代码 # manifest.json # background.j…

Unity中帧动画素材的切割设置

有几个问题&#xff0c;美术在给我们帧动画的时候&#xff0c;一般都是给一个比较大的图&#xff0c;然后进行切割成多个sprite&#xff0c;导入到animation中 一般来说&#xff0c;进行那个autoSlide&#xff0c;自动切割就可以了 这个自动切割的图片会沿着有像素的最小包围…

内网-2(代理)

一、代理概述 1、代理服务器(proxy server)&#xff1a;代理网络用户去取得网络信息&#xff0c;介于浏览器与web服务器之间的一条服务器。 注&#xff1a;为了方便&#xff0c;以下用B来代表浏览器的主机&#xff0c;S来代表服务器的主机。 2、正向代理和反向代理 正向代…

车载诊断内容汇总(培训+视频)

车载诊断内容汇总 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的人和事&#xff0c…

虚拟现实环境下的远程教育和智能评估系统(二)

本周进行开发工具&#xff0c;技术框架选择与学习&#xff1b;基本了解了以下技术框架的部署应用&#xff1b; 一、Springboot&#xff1a;最常用的后端框架之一&#xff0c;通过提供默认配置和自动配置&#xff0c;消除许多手动配置和样板代码&#xff0c;从而加速基于Spring…

CentOS7单用户模式,救援模式操作记录

CentOS7单用户模式&#xff0c;救援模式操作记录 1. 单用户模式 单用户模式进入不需要密码&#xff0c;无网络连接&#xff0c;拥有root权限&#xff0c;禁止远程登陆。一般用于用于系统维护&#xff0c;例如忘记root密码后可以通过进入单用户模式进行重置。 开机启动&#…

JVM运行时数据区 - 程序计数器

运行时数据区 Java虚拟机在执行Java程序的过程中&#xff0c;会把它管理的内存划分成若干个不同的区域&#xff0c;这些区域有各自的用途、创建及销毁时间&#xff0c;有些区域随着虚拟机的启动一直存在&#xff0c;有些区域则随着用户线程的启动和结束而建立和销毁&#xff0…

Unity DOTS技术(二)ECS

文章目录 一.ECS简介二.基本操作实例三.实体查看组件四.位置实体修改五.旋转实体六.了解原有属性七.禁止自动创建八.动态实例化 一.ECS简介 ECS全称 (Entity Component System).即(E:实体 C:组件 S:系统). 实际上即是数据方法分离.数据放在组件里,具体实现放在系统里.组件挂载…