究竟是什么样的bug,让95%的PyTorch库受到影响,甚至连特斯拉AI总监都感到困惑?
这个bug虽然微小,却相当“狡猾”。
近期在ReddIT上引发热议的一位网友,在使用常见的PyTorch和NumPy组合时,发现了这一问题。
最令人担忧的是,即使代码正常运行,它依然会对模型的准确率造成影响!

除此之外,网友们讨论的另一个焦点是:
这个问题究竟算不算bug?

这其中又有什么深意呢?
事情的起因是一位用户发现,当在PyTorch中使用NumPy生成随机数时,由于数据预处理的限制,尽管多进程并行加载数据,最终每个进程返回的随机数却是相同的。
他还提供了例证来支持自己的观点。
以下是一个示例数据集,它会生成三个元素的随机向量,批量大小设为2,工作进程数为4。

接下来发生的事情令人惊讶:每个进程返回的随机数完全相同。

这个结果让人感到困惑,仿佛在解数学应用题时,明明应得正数,结果却算出了负数。
在察觉到这个问题后,这位网友在GitHub上下载了超过10万个PyTorch库,使用相同的方法生成随机数。
结果让人更加震惊:竟然有超过95%的库都受到了这个问题的影响!
其中包括PyTorch的官方教程和OpenAI的代码,连特斯拉AI总监KaRpathy也坦言自己曾遭遇过类似困扰!
不过,解决这个bug并不复杂:只需在每个epoch重新设置seed,或者使用Python自带的随机数生成器,就能避免这个问题。
那么,这究竟算不算bug呢?
虽然这个问题有解决方案,但为什么还引发如此广泛的讨论呢?
因为讨论的焦点已经上升到“哲学”层面:
这是否真的算作一个bug?
在ReddIT上,有人认为这不算是bug。
尽管这个问题相当普遍,但并不应被视为bug,而是调试时必须关注的一个方面。

这一观点引发了激烈的讨论,许多人认为他忽略了问题的核心。
这不仅仅是生成伪随机数的问题,也不是NumPy的问题,关键在于PyTorch中Dataloader的实现。

对于包含随机转换的数据加载流程,这意味着每个worker都将选择“相同”的转换。
而如今,许多神经网络中的数据加载流程都采用了某种形式的随机转换进行数据增强,所以不重新初始化可能是个设计缺陷。
另一位网友指出,这个bug实际上是在特定预设下才会出现,因此应该提醒更多用户。

而且,95%以上的PyTorch库受到影响并非虚言。
有人分享了自己的经历:我意识到这一点是在创建数据集时,发现一半的数据是重复的,花费了很长时间才找到问题所在。

还有用户补充说,如果95%以上的用户在使用时出现错误,那么代码本身就是有问题的。

顺便提及,这也再次印证了KaRpathy定律:即便是处理一些非常基础的代码,“神经网络总是想要正常工作”。
你是否也曾踩过PyTorch的坑?
上述bug并非偶然,随着越来越多的人使用PyTorch,发现的问题也在不断增多。某平台上关于PyTorch的坑之总结,浏览量竟高达49万。

从向量、函数到Model.train(),无论是真bug还是自我产生的bug,大家的经历各有不同,血泪史令人唏嘘。
那么,你是否愿意分享自己在PyTorch中的经验和教训呢?
