Kaggle | 如何解决提交错误
Code Competition
,测试数据并不可见,我们需要将notebook代码在线提交进行推理,而因为测试集不可以见经常会遇到提交Error,同时报错完整的日志并不返回,只返回错误大类类型,在Debug时有一定程度上的困难。今天我便将之前遇到过的一些报错以及如何排查来做一个简单的总结回顾,使得自己在今后的提交尽量避免出错。1. Notebook Threw Exception
因为比赛所给出的sample_test文件仅包含极少量数据,最后线上用来预测的测试集可能和公开的数据集有差异的情况,这便是导致异常的罪魁祸首。举个曾经遇到过的例子,当我们使用Label Encoder
对类别变量进行编码时,测试集中可能存在未曾出现过的类别,导致异常抛出。我们需要提高代码的健壮性,以应对未知测试集可能带来的异常情况。
2. Notebook Timeout
根据不同比赛的时间限制不同,我们需要在指定的时间内完成推理。为了避免超时错误,我们需要合理估计模型的推理时间,根据测试集的长度使用训练集来模拟推理(可以采用1/5、1/10的测试集数量的训练集以节约GPU时长)。超时错误经常发生在比赛后期多个模型进行融合时,我们应该控制整个推理时长在指定的时间内。除此之外,我们可以对代码进行优化,提升模型推理的速度,例如在Feedback
比赛中,根据@hengck23在讨论区所提到的,我们可以对text的长度进行排序,将长度相仿的数据放入同个batch中,在batch中取最长的token来进行padding的方法以减少不必要的时间消耗(此方法提升推理速度约为6倍)。
3. Notebook Exceeded Allowed Compute
16G
爆掉,二是内存在推理时超出13G
。def memory_used_to_str():
# https://stackoverflow.com/questions/61366458/how-to-find-memory-usage-of-kaggle-notebook
pid = os.getpid()
processs = psutil.Process(pid)
memory_use = processs.memory_info()[0] / 2. ** 30
return 'ram memory gb :' + str(np.round(memory_use, 2))
对于显存超过容量的问题,我们可以使用较小的batch_size
, 并且在加载完前一个模型并且完成推理保存结果后,及时清除显存
,然后加载下一个模型。对于huggingface中预训练模型的加载,我们可以通过使用from_config
而不是from_pretrained
,后者可能会有异常的显存泄露导致OOM(来自@阁老师的discuss)。
4. Submission CSV Not Found
该错误是指比赛所指定的submission.csv文件未能找到。一种情况是我们生成的文件名不符合要求,注意生成的提交文件一定需要命名为submission.csv
而不是其他;另外一种情况是notebook在运行时,遇到错误停止运行,未能生成提交文件。
5. Submission Scoring Error
我们需要按照比赛要求生成对应的提交文件,保证该提交文件的行数以及列数满足要求,保证输出的内容符合规范,以避免提交值无效,造成得分异常。
6. Kaggle Error
——END——