深度学习炼丹炉可视化·w&b基础入门

一、W&B 是什么?

Weights & Biases(W&B)是AI开发者平台,提供用于训练模型、微调模型以及利用基础模型的工具。

在5分钟内设置 W&B,然后可以放心地在您的机器学习流程中快速迭代,确保您的模型和数据被跟踪和版本化在一个可靠的记录系统中。

W&B Models

是一组轻量级、可互操作的工具,供机器学习实践者用于**训练和微调模型**。

  • Experiments:机器学习实验跟踪
  • Model Registry:集中管理生产模型
  • Launch:扩展和自动化工作负载
  • Sweeps:超参数调整和模型优化

W&B Prompts

用于调试和评估LLMs。

W&B Platform

是一组强大的核心构建模块,用于跟踪和可视化数据和模型,并传达结果。

  • Artifacts:版本化资产并跟踪谱系
  • Tables:可视化和查询表格数据
  • Reports:记录和协作您的发现
  • Weave:查询和创建数据可视化。

二、快速入门

在几分钟内安装 W&B 并开始跟踪您的机器学习实验。

2-1:创建账户并安装 W&B

进入官网,创建账户

⚠️建议第一次注册的用户直接与github账号绑定。

image-20240321204342043

进入创建的虚拟环境

打开终端,任选一个你之前已经创建过的虚拟环境,如果不知道怎么创建虚拟环境的,去看我这篇文章

image-20240321204742666

conda pyt

安装用于与 Weights and Biases API 交互的 CLI 和 Python 库:

pip install wandb

安装成功界面如下。

image-20240321205439960


2-2:登陆wandb

输入下列代码

wandb login

image-20240321205621407

密钥在官网首页即可获取

image-20240321205730249

⚠️:你粘贴密钥的时候并不会有显示,粘贴完毕直接回车即可。


2-3:开始一个运行并跟踪超参数

打开jupyter

终端输入

jupyter notebook

检查一下刚刚w&b是否导入成功

pip list

image-20240321211907054

此时如果你和我一样,没有导入成功,那么需要重新导入一次。

pip install wandb

现在导入成功了。

image-20240321212043765

初始化代码如下

⚠️:现在不要输入,只是告诉你这一个模块负责初始化——指定项目名称、学习率以及迭代次数。

run = wandb.init(
    # Set the project where this run will be logged
    project="my-awesome-project",
    # Track hyperparameters and run metadata
    config={
        "learning_rate": 0.01,
        "epochs": 10,
    },
)

现在打开一个代码运行界面

image-20240321212432586

# train.py
import wandb
import random  # for demo script

wandb.login()

epochs = 10
lr = 0.01

run = wandb.init(
    # Set the project where this run will be logged
    project="my-awesome-project",
    # Track hyperparameters and run metadata
    config={
        "learning_rate": lr,
        "epochs": epochs,
    },
)

offset = random.random() / 5
print(f"lr: {lr}")

# simulating a training run
for epoch in range(2, epochs):
    acc = 1 - 2**-epoch - random.random() / epoch - offset
    loss = 2**-epoch + random.random() / epoch + offset
    print(f"epoch={epoch}, accuracy={acc}, loss={loss}")
    wandb.log({"accuracy": acc, "loss": loss})

# run.log_code()

完成了!访问 https://wandb.ai/home 上的 W&B 应用程序,查看我们使用 W&B 记录的指标(准确率和损失)在每个训练步骤中的改善情况。

image-20240321213037817

上面的图片(点击扩大)显示了我们从上面运行脚本时跟踪的损失和准确率。在“Runs”列中显示了每个创建的运行对象。每个运行名称都是随机生成的。


三、W&B Models

W&B Models 是机器学习实践者的记录系统,旨在帮助他们组织模型、提升生产力和协作能力,并实现规模化的生产级机器学习。

image-20240321214404961

借助 W&B Models,您可以:

  1. 跟踪和可视化所有机器学习实验。
  2. 利用超参数搜索在规模上**优化和微调**模型。
  3. 维护所有模型的集中式中心,实现与开发运维和部署的无缝交接点。
  4. 配置自定义自动化,触发关键的模型CI/CD工作流程。
  5. 打包并运行机器学习工作流,以便无缝访问强大的计算资源。

机器学习实践者依赖 W&B Models 作为他们的机器学习记录系统,用于跟踪和可视化实验,管理模型版本和谱系,并优化超参数。


3-1:跟踪实验

使用几行代码跟踪机器学习实验。然后,您可以在交互式仪表板中查看结果,或使用API 将数据导出到 Python 以进行编程访问。

如果您使用流行的框架如 PyTorch、Keras 或 Scikit,可以利用 W&B 集成。请查看集成指南,获取完整的集成列表以及如何将 W&B 添加到代码中。

如何工作

使用几行代码跟踪机器学习实验:

  1. 创建一个 W&B 运行。
  2. 将超参数字典(例如学习率或模型类型)存储到您的配置中(wandb.config)。
  3. 在训练循环中随时间记录指标(wandb.log()),例如准确率和损失。
  4. 保存运行的输出,如模型权重或预测表。

以下伪代码演示了常见的 W&B 实验跟踪工作流程:

# 1. Start a W&B Run
wandb.init(entity="", project="my-project-name")

# 2. Save mode inputs and hyperparameters
wandb.config.learning_rate = 0.01

# Import model and data
model, dataloader = get_model(), get_data()

# Model training code goes here

# 3. Log metrics over time to visualize performance
wandb.log({"loss": loss})

# 4. Log an artifact to W&B
wandb.log_artifact(model)

3-2:创建一个wandb实验

在脚本开头调用 wandb.init() API 来生成一个后台进程,以将数据同步和记录为 W&B 运行。

以下代码片段演示了如何创建一个名为“cat-classification”的新 W&B 项目。添加了一个注释 “My first experiment”以帮助识别此运行。标签baselinepaper1被包含在内,以提醒我们此运行是一个基准实验,旨在用于未来的论文发表。


初始化

# Import the W&B Python Library
import wandb

# 1. Start a W&B Run
run = wandb.init(
    project="cat-classification",
    notes="My first experiment",
    tags=["baseline", "paper1"],
)

使用 wandb.init() 初始化 W&B 时会返回一个 Run 对象。此外,W&B 会创建一个本地目录,其中保存并异步流式传输到 W&B 服务器的所有日志和文件。

image-20240321230222869


记录超参数

保存一个超参数字典,比如学习率或模型类型。在 config 中捕获的模型设置以后对于组织和查询结果非常有用。

#  2. Capture a dictionary of hyperparameters
wandb.config = {"epochs": 100, "learning_rate": 0.001, "batch_size": 128}

在你的训练循环中记录指标

在每个 for 循环(epoch)期间记录指标,准确率和损失值通过 wandb.log() 计算并记录到 W&B。默认情况下,当你调用 wandb.log 时,它会向 history 对象追加一个新步骤,并更新 summary 对象。

以下代码示例展示了如何使用 wandb.log 记录指标。

⚠️:关于如何设置模型和获取数据的详细信息被省略了,所以下面这段代码你运行不了!!只是告诉你这个流程,后续会有相应的教程介绍如何使用。

# Set up model and data
model, dataloader = get_model(), get_data()

for epoch in range(wandb.config.epochs):
    for batch in dataloader:
        loss, accuracy = model.training_step()
        #  3. Log metrics inside your training loop to visualize
        # model performance
        wandb.log({"accuracy": accuracy, "loss": loss})

记录一个 Artifact 到 W&B

可选择记录一个 W&B Artifact。Artifact 可以方便地对数据集和模型进行版本管理。

wandb.log_artifact(model)

完整的代码记录如下

# Import the W&B Python Library
import wandb

# 1. Start a W&B Run
run = wandb.init(project="cat-classification", notes="", tags=["baseline", "paper1"])

#  2. Capture a dictionary of hyperparameters
wandb.config = {"epochs": 100, "learning_rate": 0.001, "batch_size": 128}

# Set up model and data
model, dataloader = get_model(), get_data()

for epoch in range(wandb.config.epochs):
    for batch in dataloader:
        loss, accuracy = model.training_step()
        #  3. Log metrics inside your training loop to visualize
        # model performance
        wandb.log({"accuracy": accuracy, "loss": loss})

# 4. Log an artifact to W&B
wandb.log_artifact(model)

# Optional: save model at the end
model.to_onnx()
wandb.save("model.onnx")

最佳实践

以下是创建实验时可以考虑的一些建议指南:

  1. 配置信息(Config):跟踪超参数、架构、数据集以及其他任何您想要用来复现模型的信息。这些信息会显示在列中,您可以使用配置列在应用程序中动态地对运行进行分组、排序和筛选。

  2. 项目(Project):项目是一组可以进行比较的实验。每个项目都有一个专用的仪表板页面,您可以轻松地打开和关闭不同组运行以比较不同的模型版本。

  3. 备注(Notes):给自己的一个快速提交消息。备注可以从您的脚本中设置。您可以在稍后在 W&B 应用程序的项目仪表板概述部分编辑备注。

  4. 标签(Tags):标识基准运行和喜欢的运行。您可以使用标签筛选运行。您可以在稍后在 W&B 应用程序的项目仪表板概述部分编辑标签。

以下代码片段演示了如何使用上述最佳实践定义一个 W&B 实验:

import wandb

config = dict(
    learning_rate=0.01, momentum=0.2, architecture="CNN", dataset_id="cats-0192"
)

wandb.init(
    project="detect-cats",
    notes="tweak baseline",
    tags=["baseline", "paper1"],
    config=config,
)

3-3:配置实验

在这里尝试在 Colab Notebook 中配置实验

使用 wandb.config 对象保存您的训练配置,例如:

  1. 超参数
  2. 输入设置,如数据集名称或模型类型
  3. 实验中的任何其他独立变量

wandb.config 属性使得分析您的实验并在将来复现您的工作变得更加容易。您可以在 W&B 应用程序中按配置值分组,比较不同 W&B 运行的设置,并查看不同训练配置如何影响输出。运行的 config 属性是类似字典的对象,可以由许多类似字典的对象构建。


设置实验配置

通常在训练脚本的开头定义配置。然而,机器学习工作流程可能会有所不同,因此您并非必须在训练脚本的开头定义配置。


在初始化时设置配置

在调用 wandb.init() API 时,在脚本开头传递一个字典,以生成一个后台进程来同步和记录数据作为一个 W&B Run。

以下代码片段演示了如何定义一个带有配置值的 Python 字典,以及在初始化 W&B Run 时如何将该字典作为参数传递。

import wandb

# Define a config dictionary object
config = {
    "hidden_layer_sizes": [32, 64],
    "kernel_sizes": [3],
    "activation": "ReLU",
    "pool_sizes": [2],
    "dropout": 0.5,
    "num_classes": 10,
}

# Pass the config dictionary when you initialize W&B
run = wandb.init(project="config_example", config=config)

类似于在 Python 中访问其他字典,您可以访问字典中的值:

# Access values with the key as the index value
hidden_layer_sizes = wandb.config["hidden_layer_sizes"]
kernel_sizes = wandb.config["kernel_sizes"]
activation = wandb.config["activation"]

# Python dictionary get() method
hidden_layer_sizes = wandb.config.get("hidden_layer_sizes")
kernel_sizes = wandb.config.get("kernel_sizes")
activation = wandb.config.get("activation")

使用 argparse 设置配置

您可以使用 argparse 对象设置您的配置。argparse 是 Python 3.2 及以上版本的标准库模块,它使得编写脚本以利用命令行参数的所有灵活性和功能变得容易。

image-20240321232447747

这对于跟踪从命令行启动的脚本的结果非常有用。

以下 Python 脚本演示了如何定义一个解析器对象来定义和设置您的实验配置。为了演示目的,提供了 train_one_epochevaluate_one_epoch 函数来模拟训练循环:

将下面这段代码保存为test.py文件

⚠️:要保存在当前路径下,不然会报错

# test.py
import wandb
import argparse
import numpy as np
import random


# Training and evaluation demo code
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):
    # Start a W&B Run
    run = wandb.init(project="config_example", config=args)

    # Access values from config dictionary and store them
    # into variables for readability
    lr = wandb.config["learning_rate"]
    bs = wandb.config["batch_size"]
    epochs = wandb.config["epochs"]

    # Simulate training and logging values to W&B
    for epoch in np.arange(1, epochs):
        train_acc, train_loss = train_one_epoch(epoch, lr, bs)
        val_acc, val_loss = evaluate_one_epoch(epoch)

        wandb.log(
            {
                "epoch": epoch,
                "train_acc": train_acc,
                "train_loss": train_loss,
                "val_acc": val_acc,
                "val_loss": val_loss,
            }
        )


if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        formatter_class=argparse.ArgumentDefaultsHelpFormatter
    )

    parser.add_argument("-b", "--batch_size", type=int, default=32, help="Batch size")
    parser.add_argument(
        "-e", "--epochs", type=int, default=50, help="Number of training epochs"
    )
    parser.add_argument(
        "-lr", "--learning_rate", type=int, default=0.001, help="Learning rate"
    )

    args = parser.parse_args()
    main(args)

终端运行代码

python test.py

image-20240322010847386

监测结果如下

image-20240322010948083


在整个脚本中设置配置

您可以在整个脚本中向您的配置对象添加更多参数。以下代码片段展示了如何向您的配置对象添加新的键值对:

import wandb

# Define a config dictionary object
config = {
    "hidden_layer_sizes": [32, 64],
    "kernel_sizes": [3],
    "activation": "ReLU",
    "pool_sizes": [2],
    "dropout": 0.5,
    "num_classes": 10,
}

# Pass the config dictionary when you initialize W&B
run = wandb.init(project="config_example", config=config)

# Update config after you initialize W&B
wandb.config["dropout"] = 0.2
wandb.config.epochs = 4
wandb.config["batch_size"] = 32

你可以一次更改多个变量。

wandb.init(config={"epochs": 4, "batch_size": 32})
# later
wandb.config.update({"lr": 0.1, "channels": 16})

在运行完成后设置配置

使用W&B公共API在运行完成后更新您的配置(或者除了完整的运行之外的任何其他内容)。如果您在运行期间忘记记录某个值,这将特别有用。

提供您的实体(entity)、project nameRun ID,以便在运行完成后更新您的配置。可以直接从Run对象本身wandb.run或从W&B应用程序UI中找到这些值:

api = wandb.Api()

# Access attributes directly from the run object
# or from the W&B App
username = wandb.run.entity
project = wandb.run.project
run_id = wandb.run.id

run = api.run(f"{username}/{project}/{run_id}")
run.config["bar"] = 32
run.update()

基于文件的配置

如果您创建一个名为config-defaults.yaml的文件,其中的键值对会自动传递给wandb.config

以下代码片段展示了一个示例config-defaults.yaml YAML文件:

# config-defaults.yaml
# sample config defaults file
epochs:
  desc: Number of epochs to train over
  value: 100
batch_size:
  desc: Size of each mini-batch
  value: 32

您可以通过wandb.initconfig参数覆盖config-defaults.yaml中自动传递的值。为此,请将值传递给wandb.initconfig参数。

您还可以使用命令行参数--configs 加载不同的配置文件。

假设您有一个包含运行的一些元数据的YAML文件,然后在您的Python脚本中有一个超参数字典。您可以将这两者保存在嵌套的config对象中:

hyperparameter_defaults = dict(
    dropout=0.5,
    batch_size=100,
    learning_rate=0.001,
)

config_dictionary = dict(
    yaml=my_yaml_file,
    params=hyperparameter_defaults,
)

wandb.init(config=config_dictionary)

下期更新

后续我会再更新一部分实际案例,感兴趣的同学可以关注一波!!

  • 27
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值