95%PyTorch庫都會中招的bug!特斯拉AI總監都沒能倖免

明敏 發自 凹非寺

量子位 報道 | 公眾號 QbitAI

到底是怎樣的一個bug,能讓95%的Pytorch庫中招,就連特斯拉AI總監深受困擾?

還別說,這個bug雖小,但有夠“狡猾”的。

這就是最近Reddit上熱議的一個話題,是一位網友在使用再平常不過的Pytorch+Numpy組合時發現。

最主要的是,在程式碼能夠跑通的情況下,它甚至還會影響模型的準確率!

95%PyTorch庫都會中招的bug!特斯拉AI總監都沒能倖免

除此之外,網友熱議的另外一個點,竟然是:

而是它到底算不算一個bug?

95%PyTorch庫都會中招的bug!特斯拉AI總監都沒能倖免

這究竟是怎麼一回事?

事情的起因是一位網友發現,在PyTorch中用NumPy來生成隨機數時,受到資料預處理的限制,會多程序並行載入資料,但最後每個程序返回的隨機數卻是相同的。

他還舉出例子證實了自己的說法。

如下是一個示例資料集,它會返回三個元素的隨機向量。這裡採用的批次大小分別為2,工作程序為4個。

95%PyTorch庫都會中招的bug!特斯拉AI總監都沒能倖免

然後神奇的事情發生了:每個程序返回的隨機數都是一樣的。

95%PyTorch庫都會中招的bug!特斯拉AI總監都沒能倖免

這個結果會著實讓人有點一頭霧水,就好像數學應用題求小明走一段路程需要花費多少時間,而你卻算出來了負數。

發現了問題後,這位網友還在GitHub上下載了超過10萬個PyTorch庫,用同樣的方法產生隨機數。

結果更加令人震驚:居然有超過95%的庫都受到這個問題的困擾!

這其中不乏PyTorch的官方教程和OpenAI的程式碼,連特斯拉AI總監Karpathy也承認自己“被坑過”!

但有一說一,這個bug想要解決也不難:只需要在每個epoch都重新設定seed,或者用python內建的隨機數生成器就可以避免這個問題。

到底是不是bug?

如果這個問題已經可以解決,為什麼還會引起如此大的討論呢?

因為網友們的重點已經上升到了“哲學”層面:

這到底是不是一個bug?

在Reddit上有人認為:這不是一個bug。

雖然這個問題非常常見,但它並不算是一個bug,而是一個在除錯時不可以忽略的點。

95%PyTorch庫都會中招的bug!特斯拉AI總監都沒能倖免

就是這個觀點,激起了千層浪花,許多人都認為他忽略了問題的關鍵所在。

這不是產生偽隨機數的問題,也不是numpy的問題,問題的核心是在於PyTorch中的DataLoader的實現

95%PyTorch庫都會中招的bug!特斯拉AI總監都沒能倖免

對於包含隨機轉換的資料載入pipeline,這意味著每個worker都將選擇“相同”的轉換。

而現在NN中的許多資料載入pipeline,都使用某種型別的隨機轉換來進行資料增強,所以不重新初始化可能是一個預設。

另一位網友也表示這個bug其實是在預設程式下執行才出現的,應該向更多使用者指出來。

95%PyTorch庫都會中招的bug!特斯拉AI總監都沒能倖免

並且95%以上的Pytorch庫受此困擾,也絕不是危言聳聽。

有人就分享出了自己此前的慘痛經歷:

我認識到這一點是之前跑了許多程序來建立資料集時,然而發現其中一半的資料是重複的,之後花了很長的時間才發現哪裡出了問題。

95%PyTorch庫都會中招的bug!特斯拉AI總監都沒能倖免

也有使用者補充說,如果 95% 以上的使用者使用時出現錯誤,那麼程式碼就是錯的。

95%PyTorch庫都會中招的bug!特斯拉AI總監都沒能倖免

順便一提,這提供了Karpathy定律的另一個例子:即使你搞砸了一些非常基本程式碼,“neural nets want to work”。

你有踩過PyTorch的坑嗎?

如上的bug並不是偶然,隨著用PyTorch的人越來越多,被發現的bug也就越來越多,某乎上還有PyTorch的坑之總結,被瀏覽量高達49w。

95%PyTorch庫都會中招的bug!特斯拉AI總監都沒能倖免

其中從向量、函式到model。train(),無論是真bug還是自己出了bug,大家的血淚史還真的是各有千秋。

所以,關於PyTorch你可以分享的經驗血淚史嗎?

歡迎評論區留言討論~

— 完 —