SwanLab最全使用教程:看这篇就够了

前言

机器学习通常涉及在训练期间可视化和度量模型的性能。 有许多工具可用于此任务。 在本文中,我们将重点介绍 SwanLab 开源工具,它可以服务于各种深度学习训练任务(计算机视觉、自然语言处理、音频处理等等),也适配了PyTorch、Transformers、Keras这样的框架。

一、什么是SwanLab?

SwanLab (https://swanlab.cn)是一个用于AI模型训练过程可视化的工具。SwanLab的主要功能包括:

  1. 跟踪模型指标,如损失和准确性等
  2. 同时支持云端和离线使用,支持远程查看训练过程,比如可以在手机上看远程服务器上跑的训练
  3. 记录训练超参数,如batch_size和learning_rate等
  4. 自动记录训练过程中的日志、硬件环境、Python库以及GPU(支持英伟达显卡)、NPU(支持华为昇腾卡)、内存的硬件信息
  5. 支持团队多人协作,很适合打Kaggle等比赛的队伍

0

SwanLab库来自一个中国团队(情感机器),最早的出发点是其开发团队的内部训练需求,后来逐渐开源并且发展成面向公众的产品。SwanLab库在2024年向公众发布。SwanLab刚出现时只有离线版本(对标Tensorboard),后来经过迭代和努力已经有了云端版和各项功能,并且集成了接近30+个深度学习框架,包括PyTorch、HuggingFace Transformers、Keras、XGBoost等等,其中还包括同样是中国团队开发的LLaMA Factory、Modelscope Swift、PaddleYOLO等框架,具有了很全面的功能。

二、如何安装SwanLab?

要安装 SwanLab 可以使用如下命令:

pip install swanlab

要查看是否安装成功,可以打开命令行输入:

swanlab -v

如果打印出了版本号,就说明已经安装成功。

三、登录SwanLab账号(详细)

SwanLab的云端版体验是比较好的(非常推荐),能够支持你在随时随地访问训练过程。

要使用云端版之前需要先注册一下账号:

  1. 在电脑或手机浏览器访问SwanLab官网:https://swanlab.cn

0

  1. 点击右上角的黑色按钮「注册/登录」:

1

  1. 填写手机号后,点击「发送短信验证码」按钮

2

  1. 填写你的信息
  • 用户名称:你的个人昵称,中英文均可
  • 用户ID:你的英文名,可由数字、字母、下划线、中横线组成
  • 邮箱:你的邮箱
  • 机构/院校:你所在的企业、机构或学校
  • 您从哪了解到SwanLab? :(选填项)了解到SwanLab的渠道,比如朋友介绍

3

  1. 复制API Key

完成填写后点击「完成」按钮,会进入到下面的页面。然后点击左边的「设置」:

5

API Key 这个地方,点击复制按钮:

  1. 登录(方式一)

打开命令行,输入下面的命令:

swanlab login

6

在出现的提示里把API Key粘贴进去(粘贴完不显示密码是正常的,这是命令行的特性),然后按回车,完成登录。

7


7. 登录(方式二)

创建一个Python脚本,输入下面的代码:

import swanlabswanlab.login(api_key="把API Key粘贴到这里")

把API Key粘贴到对应的位置,然后运行一下这个脚本,完成登录。

​​

四、快速开始:Hello World代码

SwanLab最核心的功能是深度学习训练过程可视化。要搞清楚怎么用,其实只需要掌握 initlog 这两大法宝的用法。

  • init:负责创建一个实验
  • log:负责将学习率、损失值等指标上传到实验中。log()里传入的是一个字典。

举个简单例子:

import swanlab# 创建1个实验
run = swanlab.init()for i in range(10):# 将指标loss,上传到这个实验中run.log({"loss": i})

这里做了3件事:

  1. 引入swanlab​库
  2. 使用swanlab.init()​创建了1个实验
  3. 将指标loss,循环上传到这个实验中

让我们运行看看效果!点击这个链接:

8

可以看到,这里创建了1个叫swan-1​的实验,实验中有1个loss​折线图,里面记录了这次循环中记录的值。

9

让我们升级一下代码:

import swanlab
import random# 创建SwanLab实验
run = swanlab.init(# 设置将记录此次运行的项目信息project="my-ml-project",experiment_name="hello_world",# 跟踪超参数和运行元数据config={"learning_rate": 0.02,"architecture": "CNN","dataset": "CIFAR-100","epochs": 10}
)# 模拟训练
epochs = 10
offset = random.random() / 5
for epoch in range(2, epochs):acc = 1 - 2 ** -epoch - random.random() / epoch - offsetloss = 2 ** -epoch + random.random() / epoch + offset# 向swanlab上传训练指标run.log({"acc": acc, "loss": loss})

这段代码引入了几个新概念:

  • project参数:SwanLab用项目作为区分单位。实验可以理解为「文件」,项目就是「文件夹」。project参数用于指定这次的实验创建在哪个项目下。
  • experiment_name参数:这个参数用于指定本次实验的名称。实验名称也可以在网页上修改。
  • config参数:这个参数的作用是记录「超参数」,传入是1个字典。

项目、实验、图表、超参数等的关系如下:

10

ok,这里我们运行一下上面的代码,会得到下面的效果!

11

至此,我们就大致盘清楚了swanlab的基本用法,总体上来说还是非常简易好上手的。

五、SwanLab仪表板都有什么东西

SwanLab 仪表板由用于可视化数据的不同组件组成。我们将研究几个常用的组件。

上面的图只是部分可视化功能,全部可视化功能还有很多很多,如下:

1. 可视化图表

折线图

机器学习过程需要跟踪与模型性能相关的不同指标。这对于快速发现问题并确定模型是否过度拟合等非常重要。

使用 SwanLab 的 折线图看板,可以可视化这些指标并更轻松地调试模型:

12

折线图看板是最常用的看板,主要用于将神经网络训练过程中的acc(训练集准确率)val_acc(验证集准确率),loss(损失值),weight(权重)等等变化情况绘制成折线图。

图像图

在处理图像数据时,如果希望查看数据查找问题,或者查看样本以确保数据质量,则可以使用 SwanLab 的 Image API。

13

image

文本图

在进行NLP训练任务时,如果希望查看数据查找问题,或者查看模型的输出内容,则可以使用 SwanLab 的 Text API。

image

16

2. 日志记录

训练过程中,很多有用的信息打印在日志中。SwanLab会在实验的「日志」选项卡中展示自动记录下的完整日志。

17

3. 硬件监控

训练时的GPU显存变化等指标,都会被自动记录在「系统」选项卡下面,能帮你找到一些诡异的爆显存原因,分析训练效率的瓶颈在哪里。硬件监控这一块支持的英伟达和华为昇腾两种训练卡。

image

4. 实验对比

实验表格会把每个实验的超参数、最终指标展示在一个统一的表格中,方便对比不同参数对于实验的影响。

image

图表对比视图能帮直观的分析不同实验的指标差异,应该是机器学习训练时最最常用的功能。

20

​​

六、将 SwanLab 与 PyTorch结合使用

PyTorch 是另一个深受研究人员欢迎的深度学习框架。 使用PyTorch来训练深度学习模型时,用SwanLab来监控非常方便。

下面展示一个使用PyTorch框架进行MNIST手写体识别训练的案例:

import os
import torch
from torch import nn, optim, utils
from torchvision.datasets import MNIST
from torchvision.transforms import ToTensor
import swanlab
from torchvision.models import resnet18# 捕获并可视化前20张图像
def log_images(loader, num_images=16):images_logged = 0logged_images = []for images, labels in loader:# images: batch of images, labels: batch of labelsfor i in range(images.shape[0]):if images_logged < num_images:# 使用swanlab.Image将图像转换为可视化格式logged_images.append(swanlab.Image(images[i], caption=f"Label: {labels[i]}"))images_logged += 1else:breakif images_logged >= num_images:breakswanlab.log({"MNIST-Preview": logged_images})def train(model, device, train_dataloader, optimizer, criterion, epoch, num_epochs):model.train()# 1. 循环调用train_dataloader,每次取出1个batch_size的图像和标签for iter, (inputs, labels) in enumerate(train_dataloader):inputs = inputs.repeat(1, 3, 1, 1)  # 将单通道图像转换为3通道inputs, labels = inputs.to(device), labels.to(device)optimizer.zero_grad()# 2. 传入到resnet18模型中得到预测结果outputs = model(inputs)# 3. 将结果和标签传入损失函数中计算交叉熵损失loss = criterion(outputs, labels)# 4. 根据损失计算反向传播loss.backward()# 5. 优化器执行模型参数更新optimizer.step()print('Epoch [{}/{}], Iteration [{}/{}], Loss: {:.4f}'.format(epoch, num_epochs, iter + 1, len(train_dataloader),loss.item()))# 6. 每20次迭代,用SwanLab记录一下loss的变化if iter % 20 == 0:swanlab.log({"train/loss": loss.item()})def test(model, device, val_dataloader, epoch):model.eval()correct = 0total = 0with torch.no_grad():# 1. 循环调用val_dataloader,每次取出1个batch_size的图像和标签for inputs, labels in val_dataloader:inputs = inputs.repeat(1, 3, 1, 1)  # 将单通道图像转换为3通道inputs, labels = inputs.to(device), labels.to(device)# 2. 传入到resnet18模型中得到预测结果outputs = model(inputs)# 3. 获得预测的数字_, predicted = torch.max(outputs, 1)total += labels.size(0)# 4. 计算与标签一致的预测结果的数量correct += (predicted == labels).sum().item()# 5. 得到最终的测试准确率accuracy = correct / total# 6. 用SwanLab记录一下准确率的变化swanlab.log({"val/accuracy": accuracy}, step=epoch)if __name__ == "__main__":#检测是否支持mpstry:use_mps = torch.backends.mps.is_available()except AttributeError:use_mps = False#检测是否支持cudaif torch.cuda.is_available():device = "cuda"elif use_mps:device = "mps"else:device = "cpu"# 初始化swanlabrun = swanlab.init(project="MNIST-example",experiment_name="resnet18",config={"model": "ResNet18","optim": "Adam","lr": 1e-4,"batch_size": 256,"num_epochs": 10,"device": device,},)# 设置MNIST训练集和验证集dataset = MNIST(os.getcwd(), train=True, download=True, transform=ToTensor())train_dataset, val_dataset = utils.data.random_split(dataset, [55000, 5000])train_dataloader = utils.data.DataLoader(train_dataset, batch_size=run.config.batch_size, shuffle=True)val_dataloader = utils.data.DataLoader(val_dataset, batch_size=8, shuffle=False)# (可选)看一下数据集的前16张图像log_images(train_dataloader, 16)# 初始化模型model = resnet18(pretrained=True)model.fc = nn.Linear(512, 10)  # 修改最后一层以适应10个类别model.to(torch.device(device))# 打印模型print(model)# 定义损失函数和优化器criterion = nn.CrossEntropyLoss()optimizer = optim.Adam(model.parameters(), lr=run.config.lr)# 开始训练和测试循环for epoch in range(1, run.config.num_epochs+1):swanlab.log({"train/epoch": epoch}, step=epoch)train(model, device, train_dataloader, optimizer, criterion, epoch, run.config.num_epochs)if epoch % 2 == 0: test(model, device, val_dataloader, epoch)# 保存模型# 如果不存在checkpoint文件夹,则自动创建一个if not os.path.exists("checkpoint"):os.makedirs("checkpoint")torch.save(model.state_dict(), 'checkpoint/latest_checkpoint.pth')

运行此程序后,转到 SwanLab 并查看训练过程:

21

参考链接

  1. SwanLab官方文档:https://docs.swanlab.cn/

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

维修ABB IRB6700机器人的平衡缸3HAC043477出现异响

当ABB IRB6700机器人的平衡缸3HAC043477出现异响时,可能需要进行内部零件的检查和更换。以下是一些建议的步骤:1、检查IRB6700机械臂平衡缸的密封性:确保平衡缸的密封性良好,没有气体泄漏。如果发现有气体泄漏,可能需要更换密封件。2、检查活塞和缸体的磨损情况:如果活塞…

探索编程知识的宝库:www.readview.site 深度揭秘

在当今这个数字化浪潮汹涌澎湃的时代,编程技能已经如同基石一般,支撑着各行各业的创新与变革。无论是开发炫酷的手机应用、构建智能的物联网系统,还是投身于热门的大数据分析领域,扎实的编程功底都是迈向成功的关键一步。而在众多的学习资源中,www.readview.site 脱颖而出…

探索编程知识的宝库:[www.readview.site](http://www.readview.site) 深度揭秘

在当今这个数字化浪潮汹涌澎湃的时代,编程技能已经如同基石一般,支撑着各行各业的创新与变革。无论是开发炫酷的手机应用、构建智能的物联网系统,还是投身于热门的大数据分析领域,扎实的编程功底都是迈向成功的关键一步。而在众多的学习资源中,www.readview.site 脱颖而出…

Mysql连接报错排查解决记录

Mysql连接报错排查解决记录 背景:系统:uos server-1060e​ 运行环境kvm虚拟机​ mysql版本:5.7.44, for Linux (x86_64)问题现象: 宿主机重启后,kvm虚拟机内的mysql服务无法远程连接了。通过不同的客户端工具连接,报错现象分别如下: dbeaver-ce 工具连接报错: Can no…

CDS标准视图:维修工单工艺数据 I_MAINTORDEROPERATIONDATA

视图名称:维修工单工艺数据 I_MAINTORDEROPERATIONDATA 视图类型:基础 视图代码:点击查看代码 @EndUserText.label: Maintenance Order Operation Data @VDM.viewType: #COMPOSITE @AccessControl.authorizationCheck: #CHECK @AbapCatalog.sqlViewName: IPMORDOPERDATA @Cl…

关于const的使用

1、修饰整型变量const int a 就是声明了一种常量表示该变量的内容不可改变 2、对于修饰指针的const就有说法了 const int *a 和int* const a这是两种不同的用法 第一种: const int *a表示定义了一个指向const变量的指针,但是指针本身不是const类型,也就是说指针本身可以修改…

UOS系统mysql服务安装

UOS系统mysql服务安装 背景 1、安装环境:kvm虚拟机2、运行环境:uos server-1060e3、架构:x864、安装mysql版本:mysql-5.71、安装准备 # Mysql官网 https://downloads.mysql.com/archives/community/ # 下载安装包 wget -i -c http://dev.mysql.com/get/mysql57-community-…

使用Docker搭建npm私有仓库

由于文章格式和图片解析问题,为了更好的阅读体验,读者可前往 阅读原文在公司团队内一般都会拥有私有的工具包或者其他依赖,这些东西又是比较敏感的信息,因此如npm私库的搭建在公司内部必不可少。 私库搭建方式有很多,本篇通过docker+nexus3的进行搭建。 本人使用ARM架构Ce…

认识Token和Cookie

认识Token和Cookie 1、token和cookie有什么区别? ​ 1.1 存储位置及方式:Cookie是浏览器用来存储本地信息的文件,有一定的存储限制,而Token是由服务器按一定算法生成的密令,可以由前端指定存放到localStorage、sessionStorage或cookie中。 ​ 1.2 功能特性:每次浏览器…

开发微信小程序游戏,有没有类似Debug真机图形的方法

1)开发微信小程序游戏,有没有类似Debug真机图形的方法2)Unity中如何实现动态实时的车削效果3)动态创建的Texture,有什么办法可以让他保持ASTC么4)Unity转微信小游戏的日志问题这是第416篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术…

CDS标准视图:维护通知任务数据 I_MaintNotificationTaskData

视图名称:维护通知任务数据 I_MaintNotificationTaskData 视图类型:基础 视图代码:IW67/IW23点击查看代码 @AbapCatalog.sqlViewName: INOTIFTASKDATA @AbapCatalog.compiler.compareFilter: true @AccessControl.authorizationCheck: #CHECK @EndUserText.label: Maintenan…