在运行时访问记录的值

问题描述 投票:0回答:2

如何在运行完成之前从 wandb 检索记录的值?

import os
import wandb
wandb.init(project='someproject')


def loss_a():
    # do_stuff and log:
    wandb.log({"loss_a": 1.0})
    
def loss_b():
    # do_stuff and log:
    wandb.log({"loss_b": 2.0})

for epoch in range(2):
    loss_a()
    loss_b()
    
    # somehow retrieve loss_a and loss_b and print them here:
    print(f'loss_a={??}, loss_b={??}')

运行完成后我可以用

wandb.Api
找到它以获得
run.history
。但似乎在运行完成之前,访问
run.history
不起作用。

machine-learning wandb
2个回答
3
投票

您可以使用

wandb.run.summary
在运行完成之前从 wandb 检索记录的值。它是一个字典,保存为特定键名称记录的最后一个值。看看这个链接

您也可以查看这个colab笔记本来亲自尝试一下。

import os
import wandb
wandb.init(project='someproject')


def loss_a():
    # do_stuff and log:
    wandb.log({"loss_a": 1.0})
    
def loss_b():
    # do_stuff and log:
    wandb.log({"loss_b": 2.0})

for epoch in range(2):
    loss_a()
    loss_b()
    
    # somehow retrieve loss_a and loss_b and print them here:
    print(f'loss_a={wandb.run.summary["loss_a"]}, loss_b={wandb.run.summary["loss_b"]}')

0
投票

查看源代码,

run.history
只会暂时将数据保存在
history._data
中。正如您在此特定行上看到的,包含日志的字典在调用回调后立即被清除(我猜测这对应于通过http将数据发送到服务器)。

作为解决方法,您可以返回

loss_a
loss_b
的损失并同时记录它们。这实际上具有在同一时间步记录两种损失的好处:

def loss_a():
   # do_stuff and log:
   return 1.0
    
def loss_b():
   # do_stuff and log:
   return 2.0

for epoch in range(2):
   a = loss_a()
   b = loss_b()
    
   print(f'loss_a={a}, loss_b={b}')
   wandb.log({"loss_a": a, "loss_b": b})

这也是将代码与 wandb 解耦的好方法!

© www.soinside.com 2019 - 2024. All rights reserved.