文章目錄
- 一、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 loggedproject="basic-intro",# We pass a run name (otherwise it’ll be randomly assigned, like sunshine-lollypop-10)name=f"experiment",# Track hyperparameters and run metadataconfig={"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 - offsetloss = 2 ** -epoch + random.random() / epoch + offset# 🐝 2?? Log metrics from your script to W&Bwandb.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 Tdevice = "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 loaderdef 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 modeldef 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 = 0for 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 totable = 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 ratesfor _ in range(5):# 🐝 initialise a wandb runwandb.init(project="pytorch-intro",config={"epochs": 10,"batch_size": 128,"lr": 1e-3,"dropout": random.uniform(0.01, 0.80),})# Copy your configconfig = wandb.config# Get the datatrain_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 modelmodel = get_model(config.dropout)# Make the loss and optimizerloss_func = nn.CrossEntropyLoss()optimizer = torch.optim.Adam(model.parameters(), lr=config.lr)# Trainingexample_ct = 0step_ct = 0for 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 wandbwandb.log(metrics)step_ct += 1val_loss, accuracy = validate_model(model, valid_dl, loss_func, log_images=(epoch == (config.epochs - 1)))# 🐝 Log train and validation metrics to wandbval_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 metricwandb.summary['test_accuracy'] = 0.8# 🐝 Close your wandb runwandb.finish()