当前位置: 首页 > 科技观察

95%的PyTorch库都会被bug捕获!特斯拉AI总监也未能幸免

时间:2023-03-13 21:35:00 科技观察

本文经AI新媒体量子比特(公众号ID:QbitAI)授权转载,转载请联系出处。什么样的bug能让Pytorch库95%招人,连特斯拉AI主管都深感困扰?还别说,这虫子虽然小,但也够“狡猾”了。这是最近在Reddit上热议的话题。是一位网友在使用通常的Pytorch+Numpy组合时发现的。最重要的是,如果代码有效,它甚至会影响模型的准确性!另外,网友们热议的另一点竟然是:但这算不算bug?这到底是怎么回事?事件起因是有网友发现在PyTorch中使用NumPy生成随机数时,由于数据预处理的限制,会出现多个进程并行加载数据,但最终每个进程返回的随机数都是相同的。他还举了例子来证实他的说法。这是一个示例数据集,它返回三个元素的随机向量。这里使用的批量大小分别为2,工作进程为4。然后神奇的事情发生了:每个进程返回相同的随机数。这个结果真的会让人有点摸不着头脑,就像一道数学题问小明走一段距离需要多长时间,你却算出了一个负数。发现问题后,这位网友还在GitHub上下载了10万多个PyTorch库,用同样的方法生成随机数。结果更令人震惊:超过95%的图书馆都遭遇了这个问题!其中有PyTorch的官方教程和OpenAI的代码。就连特斯拉AI的负责人Karpathy也承认自己被“坑”了!但有一件事要说,解决这个bug并不难:你只需要在每个epoch重新设置种子,或者使用python内置的随机数生成器来避免这个问题。这是一个错误吗?如果这个问题已经可以解决,为什么还会引起这么大的讨论?因为网友们的关注点上升到了“哲学”层面:这是bug吗?Reddit上有人认为:这不是错误。这个问题虽然很常见,但不是bug,而是调试时不可忽视的一点。正是这个观点激起了波澜,很多人认为他忽略了问题的症结所在。这不是生成伪随机数的问题,也不是numpy的问题。问题的核心是PyTorch中DataLoader的实现有一个包含随机转换的数据加载管道,这意味着每个worker都会选择“相同”的转换。现在NN中的许多数据加载管道都使用某种类型的随机转换来进行数据扩充,因此没有重新初始化可能是默认设置。另一位网友也表示,这个bug其实只有在默认程序下运行才会出现,应该给更多的用户指出来。而超过95%的Pytorch库都因此而困扰,绝非危言耸听。有人分享了他之前的惨痛经历:我意识到当我跑很多进程创建一个数据集时,我发现有一半的数据是重复的,花了很长时间才找出问题所在。问题。另一位用户补充说,如果超过95%的用户在使用时出错,那么代码就是错误的。顺便说一句,这提供了Karpathy定律的另一个例子:“神经网络想要工作”,即使你搞砸了一些非常基本的代码。你踩过PyTorch的坑吗?上述错误并非偶然。随着越来越多的人使用PyTorch,发现的错误也越来越多。星湖上还有PyTorch的陷阱总结,已经看高达49w了。其中,从vectors、functions到model.train(),无论是真正的bug还是bug,每个人的血泪史真的是不一样。那么,你能分享一下你对PyTorch的血泪吗?