某節大瓜,GPU集群投毒!

前些日子,宇宙廠爆出了個驚天大瓜。

自回歸團隊某實習生,被公司直接送進號子,喜提銀手鐲一副。原因是實習生對商業化整個GPU集群裡惡意注入病毒。最終導致,8000 多張 H100 的 GPU 集群,一個多月的訓練結果,全是錯的…

這事情在朋友圈已經停不下來了,內容實在太炸裂了!具體什麼程度?技術總監親自給副總裁彙報的程度!!

網傳,事情的起因大致是,leader 把調度給了 dit 生圖團隊,冷落了自回歸團隊。實習生作為北大畢業的高材生,可能心生怨氣,於是選擇了惡意報復。最後直接給公司整了波大的,當然,也把自己的前程斷送了。

據傳,此人的「投毒」操作主要是利用了 Huggingface 的load ckpt函數漏洞。

load ckpt是用於加載模型的保存狀態的函數。具體的問題,是TFPreTrainedModel()類的load_repo_checkpoint()函數在反序列化未受信任的數據時使用了pickle.load(),而 pickle 模塊在反序列化時會執行數據中的任意代碼。

攻擊者可以通過構造一個惡意的序列化數據(如惡意的checkpoint文件),利用這個存在漏洞的函數的反序列化機制來執行任意代碼。這直接導致,任何使用這個函數的人,在正常的訓練或推理過程中只要加載了這個checkpoint,攻擊者的惡意代碼都會直接執行。

因此,存在的攻擊方式包括修改或注入惡意代碼,使得在模型加載時執行攻擊者指定的操作,如篡改模型權重、修改訓練參數或截取模型數據;以及通過操作文件路徑,訪問或修改其他用戶的模型文件。

而此人使用的大概是第一種方法,注入代碼,動態修改別人的optimer,修改參數梯度的方向,以及在各種地方隨機sleep一小段時間。眾所周知,深度學習中的訓練過程依賴於梯度下降來更新模型參數,從而不斷優化損失。修改梯度方向意味著攻擊者對模型的反向傳播過程中計算出的梯度進行了篡改,導致模型更新時,一直朝錯誤的方向優化。而sleep操作通常不太可能引發程序崩潰或報錯,但會明顯降低模型訓練的速度。

這兩個操作只能用驚為天人來形容了。一方面,瘋狂的sleep導致訓練集群的利用率只有50%,另一方面,連參數梯度的方向都被更改了,別人訓出來的模型,可全都是錯的啊!他還加了個條件,只有256卡以上的任務才會觸發這個條件,不斬無名之輩!

除此之外,他還修改了一個公用的 HuggingFace 的ckpts目錄,只要別人用這裏的pretrain模型,就會直接gf(go fail),相當於直接掛了。不過也有網民說到,他可能修改了自己的pretrained model,而這個model parameters是用ckpt文件保存的,其他人在訓練的時候會load他的模型參數(也就是注入惡意代碼的ckpt文件),所以會導致訓練一直出問題也不容易發現。

最狠的是,這哥們直接潛伏在debug群裡,只要同事們查到什麼,他就改什麼,實現最極致的攻防。最後是查了一個多月,恢復了一些被刪除的文件,才查到代碼注入。

經過粗略計算,只是單純的集群成本,造成的損失就是八位數級別的。

不過後續,當事人又進行了闢謠:

這件事,確有發生,但到底是誰做的,就不得而知了,大概率也等不到官方通告。

那麼,對於這個事件,你怎麼看?