如何在运行完成之前从 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
不起作用。
您可以使用
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"]}')
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 解耦的好方法!