當前位置:係統粉 >   IT資訊 >   微軟資訊 >  機器學習Debug就找他!曾在微軟實習,初用穀歌GPU訓練星際爭霸AI

機器學習Debug就找他!曾在微軟實習,初用穀歌GPU訓練星際爭霸AI

時間:2018-04-18 來源:互聯網 瀏覽量:

Root 發自 凹非寺

量子位 出品 | 公眾號 QbitAI

自從去年8月10號暴雪開放了星際爭霸II的人工智能API之後,數不清的AI研究者前赴後繼地加入了訓練星際2 AI的隊伍中。

但並非所有人都舍得掏錢購買昂貴的GPU。還好,穀歌近期大發善心提供免費的雲GPU,這下有更多的人可以訓練星際2AI了。

那用免費的GPU訓練AI會遇到哪些坑?

Reddit上有個小哥哥Franklin H.分享了這個排雷的過程,一步步引導大家如何debug。

機器學習Debug就找他!曾在微軟實習,初用穀歌GPU訓練星際爭霸AI(1)

以下是post全文:

太長不看版:如果你想用GPU硬件搭建一個免費的星際爭霸II機器學習的環境,看我在穀歌Colab上的筆記:https://colab.research.google.com/drive/1AzCKV98UaQQz2aJIeGWlExcxBrpgKsIV

最近,我和幾個好基友一起搞了個星際爭霸II的項目。

我始終持有一個觀點,就是搞機器學習研究的人,得有能力快速訓練神經網絡。這一點相當重要。

把代碼分享出去,是相對簡單的事。但我認為,對於全球訓練星際爭霸II AI智能體的研究群體來說,更有價值的是告訴他們,怎樣用穀歌免費的GPU,在穀歌Colab跑起來星際爭霸II的AI。

我就自己先動手試了一下。

沒想到,下載完星際爭霸II和安裝上必要的數據庫之後,遇到這茬:

機器學習Debug就找他!曾在微軟實習,初用穀歌GPU訓練星際爭霸AI(2)

Return代碼是啥玩意兒

看來得先搞清楚Return代碼是個啥。

我翻出PySC2 source看了下,找到了設置Return代碼的部分。

機器學習Debug就找他!曾在微軟實習,初用穀歌GPU訓練星際爭霸AI(3)

進一步挖掘,發現poll()這一塊是源自Python的subprocess模塊。這說明11是終止星際爭霸程序的信號。

信號11是可怕的segfault,絕對算C程序員的噩夢。

為了看問題是不是出在這,我找到了可執行的SC2,然後讓它自己運行起來。

機器學習Debug就找他!曾在微軟實習,初用穀歌GPU訓練星際爭霸AI(4)

Emmm……

開啟Debug的地獄模式

一般來說,我會直接打開用得最順手的Debug工具。但這樣,這篇文章就不過是個怎麼用GDB的流水賬了。

但,這不是在Google Colab上嘛,我們有的隻是Jupyter Notebook網頁。這就意味著:

沒有Debugger;

沒有Root權限;

好多工具不能用,比如說Strace。

機器學習Debug就找他!曾在微軟實習,初用穀歌GPU訓練星際爭霸AI(5)

RIP debug中

當你隻能用網頁時……

我就試了服務器上不同版本的星際爭霸II,包括暴雪提供4.0.2版本,3.17版本,和3.16.1版本。

居然!都不行!生氣……

那我隻能在本地Linux係統上跑星際爭霸II了,畢竟這個環境我熟,有把握可以debug。這樣才能驗證我的猜想。

第一個可能的原因:沒找到必需的數據庫

剛開始我猜,星際爭霸作為一個遊戲,應該是要一些OpenGL裏的函數以及庫。而這些東西在穀歌Colab裏沒有。

為了驗證這個假說,這次我本地運行了星際爭霸II。然後用strace,記錄星際爭霸II的一切係統調用,所有的庫都是從操作係統加載的,這樣就能知道缺了什麼依賴庫。

這裏是日誌中的一個片段:

機器學習Debug就找他!曾在微軟實習,初用穀歌GPU訓練星際爭霸AI(6)

完整的日誌見:https://docs.python.org/3/library/subprocess.html#subprocess.Popen.returncode

看結果,發現StarCraft II除了動態地鏈接到那些標準C/C++庫,沒做什麼別的,這就排除了這個猜測。

還有哪些segfault?

又因為本地跑的沒有掛,說明暴雪給的碼也沒有問題。

穀歌搜怎麼debug段錯誤的時候,想起了Valgrind。我驚訝地發現,他居然就在穀歌Colab工作。

Valgrind給出代碼片段如下:

機器學習Debug就找他!曾在微軟實習,初用穀歌GPU訓練星際爭霸AI(7)

我唯一能看出來的函數是libtcmalloc.so.4.3.0裏的MallocExtension::Initialize()。

可能有不知道TCMalloc的盆友,這其實是個穀歌定製化記憶分配器。穀歌Chrome瀏覽器用的也是這個。

但是……

當我用strace找錯的時候,我隻記得看到了C和C++標準庫的加載。那TCMalloc是從哪裏冒出來的?

後來發現,有個辦法可以在沒有TCMalloc的程序上強行使用TCMalloc。

在Linux上設定LD_PRELOAD環境變量,加載TCMalloc共享庫後,就搞定。

很好奇,在穀歌Colab上看會是什麼樣?

機器學習Debug就找他!曾在微軟實習,初用穀歌GPU訓練星際爭霸AI(8)

矮馬!就這個!

解決方案

可是,設定LD_PRELOAD環境變量無法擴展到其他環境裏去。

執行這段:

機器學習Debug就找他!曾在微軟實習,初用穀歌GPU訓練星際爭霸AI(9)

我已經卸載了TCMalloc。然後,除了一些錯誤的提示信息,星際爭霸II現在可以跑起來了。這會兒總算可以開始訓練星際爭霸II的AI了。

我寫了份針對穀歌Colab的bug文檔,這樣以後大家遇到類似問題就不用再糾結了。

bug文檔:https://docs.python.org/3/library/subprocess.html#subprocess.Popen.returncode

不過,等星際2的AI出來還早。

機器學習Debug就找他!曾在微軟實習,初用穀歌GPU訓練星際爭霸AI(10)

我們拭目以待。

最後我想感謝一下Paul和William,StarAI,是他們告訴我PySC2,以及帶的我入坑機器學習。

如果大家遇到高難度的bug,有debug的需求可以找我,我可以提供相應的服務。這是我LinkedIn的介紹,https://www.linkedin.com/in/franklin-h-804b85a0/

最後,附小哥哥post鏈接:

https://medium.com/@n0mad/how-i-trained-starcraft-2-ais-using-googles-free-gpus-44bc635b0418

— 完 —

誠摯招聘

量子位正在招募編輯/記者,工作地點在北京中關村。期待有才氣、有熱情的同學加入我們!相關細節,請在量子位公眾號(QbitAI)對話界麵,回複“招聘”兩個字。

量子位 QbitAI · 頭條號簽約作者

վ'ᴗ' ի 追蹤AI技術和產品新動態

我要分享:

最新熱門遊戲

版權信息

Copyright @ 2011 係統粉 版權聲明 最新發布內容 網站導航