循环运行Neptune.ai时后续轮次准确率不记录且无报错问题排查
我编写了一个for循环用于测试不同批量大小,每次循环都会创建并关闭一个Neptune run。首次运行一切正常,但后续循环中,准确率数据无法记录到Neptune平台,且Python未抛出任何错误。请问可能的问题是什么?
for i in range(len(percentage)): run = neptune.init( project="xxx", api_token="xxx", ) epochs = 600 batch_perc = percentage[i] lr = 0.001 sb = 64 #round((43249*batch_perc)*0.00185) params = { 'lr': lr, 'bs': sb, 'epochs': epochs, 'batch %': batch_perc } run['parameters'] = params torch.manual_seed(12345) td = 43249 * batch_perc vd = 0.1*(43249 - td) + td train_dataset = dataset[:round(td)] val_dataset = dataset[round(td):round(vd)] test_dataset = dataset[round(vd):] print(f'Number of training graphs: {len(train_dataset)}') run['train'] = len(train_dataset) print(f'Number of validation graphs: {len(val_dataset)}') run['val'] = len(val_dataset) print(f'Number of test graphs: {len(test_dataset)}') run['test'] = len(test_dataset) train_loader = DataLoader(train_dataset, batch_size=sb, shuffle=True) val_loader = DataLoader(val_dataset, batch_size=sb, shuffle=True) test_loader = DataLoader(test_dataset, batch_size=1, shuffle=False) model = GCN(hidden_channels=64).to(device) optimizer = torch.optim.Adam(model.parameters(), lr=lr) criterion = torch.nn.CrossEntropyLoss() for epoch in range(1, epochs): train() train_acc = test(train_loader) run['training/batch/acc'].log(train_acc) val_acc = test(val_loader) run['training/batch/val'].log(val_acc)
未显式停止Neptune Run:每次循环创建run后,没有调用
run.stop()结束当前会话。Neptune的日志上传是异步的,若不主动停止,后台进程可能持续占用资源,导致后续run的数据流被阻塞,数据无法正常上传。
解决:在每个循环的末尾添加run.stop(),确保当前run的所有数据都被提交并释放资源。异步上传的时序冲突:如果循环迭代速度快于前一个run的异步上传速度,新创建的run可能和旧run的上传进程产生冲突,导致数据丢失或无法记录。
解决:除了调用run.stop(),可在停止后添加短暂延迟(如import time; time.sleep(1)),确保数据完全上传;或者初始化run时设置mode="sync"启用同步上传模式(会降低运行效率,适合调试)。训练数据或指标计算的静默异常:后续循环中,
train_acc或val_acc可能未生成有效数值(比如为NaN、None,或test()函数逻辑在特定批量下返回异常值),但函数未抛出错误,导致log()没有实际数据可上传。
解决:在日志记录前添加打印语句,输出train_acc和val_acc的具体值,验证数据有效性;检查train()和test()函数的逻辑,确保在不同批量大小下能正常计算准确率。重复初始化导致的内部状态混乱:多次调用
neptune.init()可能引发内部配置状态混乱,比如API token或项目信息的重复加载导致隐性错误,影响后续run的数据上传。
解决:将neptune.init()的固定参数(如project、api_token)提取到循环外,或者在每次初始化前检查并关闭残留的run实例,确保会话状态干净。
内容的提问来源于stack exchange,提问作者Tony Sirico

