教程 | 如何利用Google Colab免費訓練StarCraft II

2021-02-15 機器之心

選自Medium

作者:Franklin He

機器之心編譯

參與:Nurhachu Null、路

本文介紹了如何在 Google Colab(Google 提供免費 GPU 的機器學習環境)上運行 StarCraft II 機器學習項目,包括過程中遇到的問題和作者提出的解決方案。

如果你想開始使用 FREE StarCraft II 機器學習環境,請先完善 GPU 硬體,您可以看一下我的 Google Colab notebook:https://colab.research.google.com/drive/1AzCKV98UaQQz2aJIeGWlExcxBrpgKsIV

最近,我和幾位朋友開始了 StarCraft II 的機器學習項目。我覺得快速訓練神經網絡的能力對於研究者的成功是很重要的。為了向全球的 StarCraft II 研究者提供一個可復現、高效,且容易分享代碼的環境,我想看看我們能否讓 StrCraft II 在 Google Colab(Google 提供免費 GPU 的機器學習環境)上運行起來。

然而,在下載了 StarCraft II,並安裝完必需的庫之後,你會面臨以下問題:

I0331 08:30:17.832181 139972195997568 sc_process.py:148] Connection attempt 0 (running: None)
****** omitted reconnection attempts ******
I0331 08:32:17.048350 139972195997568 sc_process.py:148] Connection attempt 119 (running: -11)
I0331 08:32:18.050124 139972195997568 sc_process.py:180] Shutdown gracefully.
I0331 08:32:18.050344 139972195997568 sc_process.py:166] Shutdown with return code: -11
Failed to create the socket.
I0331 08:32:18.056085 139972195997568 sc2_env.py:327] Environment Close

構建額外的 Pylons 也無法修復這個問題。

理解返回代碼

我所做的第一件事就是弄清楚返回代碼的含義。

讀了 PySC2 的源碼(https://github.com/deepmind/pysc2/blob/39f84b01d662eb58b3d95791f59208c210afd4e7/pysc2/lib/sc_process.py)之後,我找到了設置返回代碼的代碼段:

@property
def running(self):
return self._proc.poll() if self._proc else False

poll() 來自 Python 的 subprocess 模塊,深入挖掘後發現 11 就是導致 StarCraft 中斷的信號。

信號 11 就是臭名昭著的段錯誤,這個信號給 C 語言編程者帶來了無窮無盡的噩夢。

為了確認,我發現 SC2 是可執行的,而且是自行執行的。

> !~/StarCraftII/Versions/Base59877/SC2_x64
Segmentation Fault (Core Dumped)

在 hard 模式下調試

正常情況下,我會啟動最喜歡的調試工具,那本文就變成了如何使用 GDB 的過程。

不過,我們是使用 Google Colab 來處理的,我們唯一擁有的就是一個 Jupyter Notebook 網頁。這意味著:

1. 沒有調試器

2. 沒有 root 特權

3. 工具有限,比如沒有 strace

RIP 調試

當你只有一個網頁的時候……

第一步就是在伺服器上嘗試不同版本的 StarCraft II,暴雪公司提供了 StarCraft II 的 4.0.2、3.17 和 3.16.1 三個版本。不幸的是,沒有一個能夠成功。

然後我決定在本地 Linux 機器上運行 StarCraft II,這個環境我可以控制並在其中進行調試。它還允許我測試我的假設。

第一個猜想:沒有找到需要的庫

我最初的猜測是,StarCraft II 作為一個遊戲,可能需要某些 OpenGL 函數和庫,而這些並不包含在我所用的 Google Colab 環境中。

為了驗證這個猜想,我在本地機器上運行 StarCraft II,這次是有 strace 工具的,這使得我可以跟蹤系統讓 StarCraft II 做了什麼。由於所有的庫都通過作業系統加載了,這樣一來,我就能夠跟蹤任何一個缺失的依賴項,或者查看是否有什麼奇怪的事情發生。

完整的 trace 日誌參見:https://gist.github.com/FrozenXZeus/53a85f58856cb346b90313110ce89bcc,下面展示了一小段:

execve("./SC2_x64", ["./SC2_x64"], 0x7fffc19e08b0 /* 49 vars */) = 0
brk(NULL)                               = 0x95bd000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
.                      
openat(AT_FDCWD, "/lib64/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
.                      
openat(AT_FDCWD, "/lib64/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
.                  
openat(AT_FDCWD, "/lib64/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = 3
.            
openat(AT_FDCWD, "/lib64/libm.so.6", O_RDONLY|O_CLOEXEC) = 3
...                      
openat(AT_FDCWD, "/lib64/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = 3
.
openat(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
..

看一下這個結果,除了動態連結 C/C++ 庫之外,StarCraft II 沒有做任何事情,這否定了我的假設。

那為什麼會出現段錯誤呢?

因為同樣的程序在我的本地機器上運行的時候沒有崩潰,這也否定了暴雪的代碼有問題的假設。

快速搜索如何調試段錯誤使我想起了 Valgrind(http://valgrind.org/),令我驚訝的是,該工具竟然可以在 Google Colab 上使用。

Valgrind 的一段輸出如下:

==354== Process terminating with default action of signal 11 (SIGSEGV): dumping core
==354==  Access not within mapped region at address 0x8
==354==    at 0x6B3DF0: ??? (in /content/StarCraftII/Versions/Base56787/SC2_x64)
==354==    by 0x65FF97: ??? (in /content/StarCraftII/Versions/Base56787/SC2_x64)
==354==    by 0x89CD5C6: MallocExtension::Initialize() (in /usr/lib/x86_64-linux-gnu/libtcmalloc.so.4.3.0)
==354==    by 0x89B7D29: ??? (in /usr/lib/x86_64-linux-gnu/libtcmalloc.so.4.3.0)
==354==    by 0x7B79AD9: call_init.part.0 (dl-init.c:72)
==354==    by 0x7B79BEA: call_init (dl-init.c:30)
==354==    by 0x7B79BEA: _dl_init (dl-init.c:120)
==354==    by 0x7B69ED9: ??? (in /lib/x86_64-linux-gnu/ld-2.26.so)
==354==  If you believe this happened as a result of a stack
==354==  overflow in your program's main thread (unlikely but
==354==  possible), you can try to increase the size of the
==354==  main thread stack using the --main-stacksize= flag.
==354==  The main thread stack size used in this run was 8388608.
==354==
==354== HEAP SUMMARY:
==354==     in use at exit: 0 bytes in 0 blocks
==354==   total heap usage: 4 allocs, 4 frees, 72,710 bytes allocated
==354==
==354== All heap blocks were freed -- no leaks are possible
==354==
==354== For counts of detected and suppressed errors, rerun with: -v
==354== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
Segmentation fault (core dumped)

那麼,唯一一個可以識別的函數就是 libtcmalloc.so.4.3.0 中的 MallocExtension::Initialize()。

對於不了解 TCMalloc 的人而言,它是谷歌的定製化內存分配器,用在 Google Chrome 等產品中。

等等.

回到我追蹤 StarCraft II 的時候,我記得只看到 C/C++庫被加載了。這似乎不正確,TCMalloc 是從哪裡來的呢?

結果證明,有一種方式能夠讓 TCMalloc 在沒有使用 TCMalloc 編譯的程序上強制執行。通過在 Linux 上設置 LD_PRELOAD 環境變量,你可以加載 TCMalloc 共享庫到程序中,強制讓程序使用 TCMalloc。

它在 Google Colab 上會是什麼樣子呢.

解決方案

不幸的是,設置 LD_PRELOAD 環境變量並不能傳播到環境的其他部分中。

通過執行以下命令:

!apt-get uninstall libtcmalloc*

我成功地卸載了 TCMalloc,然後儘管還有錯誤信息,但是 StarCraft II 已經開始運行了,StarCraft II 機器學習項目的大門也隨之開啟了。

我已經在 Google Colab 上提出了這個 bug(https://github.com/googlecolab/colabtools/issues/106),因此我們以後不必為此大費周折了。

基於 STARCRARFT II 進行的機器學習項目。

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

本文為機器之心編譯,轉載請聯繫本公眾號獲得授權

✄---

加入機器之心(全職記者/實習生):hr@jiqizhixin.com

投稿或尋求報導:editor@jiqizhixin.com

廣告&商務合作:bd@jiqizhixin.com

相關焦點

  • 20種小技巧,玩轉Google Colab
    擴展程序下載地址:https://chrome.google.com/webstore/detail/open-in-colab/iogfkhleblhcpcekbiedikdehleodpjo安裝後,單擊 GitHub notebook 的 colab 圖標直接將其打開。
  • 20種小技巧,玩轉Google Colab
    擴展程序下載地址:https://chrome.google.com/webstore/detail/open-in-colab/iogfkhleblhcpcekbiedikdehleodpjo安裝後,單擊 GitHub notebook 的 colab 圖標直接將其打開
  • 薅資本主義羊毛,用Google免費GPU
    地址在這裡,Google還貼心地寫了中文版簡介:https://colab.research.google.com/notebook即便如此,據說還有人不會用?號稱喜歡訓練深度神經網絡的作者fuat,就詳詳細細的寫了一份Google Colab免費GPU試用指南~準備工作在Google Drive上創建文件夾Colab用的數據都存儲在Google Drive雲端硬碟上,所以
  • Colab操作指南
    今天我就跟大家講講怎麼用這個colab(不要問我為啥知道,問就是血淚史)。Colab他還有一個名字叫福音,不,我瞎掰扯的。但是他的確是廣大貧苦學子的福音。好了,鑑於我們真的是一個正經的技術貼,下面開始我們的正題。 Colab是由google研發的,它免費提供CPU、GPU甚至TPU資源。
  • 如何用 Google Colab 練 Python?
    一、不知道如何安裝和設置運行環境;二、遇到問題會慌亂,不知如何有效尋找解決方法;三、對於團隊作業,不知該如何有效協作;四、不懂得如何進行版本控制,代碼越改越亂。這些問題,也構成了學生的痛點。如果不能有效加以解決,學生會把每周寶貴的學習時間,浪費到許多瑣碎的無用功上。
  • 如何利用TensorFlow.js部署簡單的AI版「你畫我猜」圖像識別應用
    這個卷積神經網絡將在 Quick Draw 數據集(https://github.com/googlecreativelab/quickdraw-dataset)上接受訓練。該數據集包含 345 個類別的大約 5 千萬張手繪圖像。
  • 【TensorFlow超級指南】你能想到的TF教程和資源都在這裡了
    本文涵蓋與TensorFlow相關的教程、書籍、工具、求職等的大量信息。盡數資源,應有盡有。因為它會涉及幾個高級概念,例如:什麼是神經元;不同類型的激活函數以及為何要使用Relu;如何通過dropout提高模型的精確度;如何評估模型以及如何調參。
  • 如何用 GPT2 和 BERT 建立一個可信的 reddit 自動回復機器人?
    這項工作還參考了以下內容:https://colab.research.google.com/drive/1VLG8e7YSEwypxU-noRNhsv5dW4NfTGce;https://colab.research.google.com/github/google-research/bert/blob/master/predicting_movie_reviews_with_bert_on_tf_hub.ipynb
  • quartus ii使用教程_quartus ii安裝教程
    打開APP quartus ii使用教程_quartus ii安裝教程 網絡整理 發表於 2020-12-18 15:25:42
  • 教程 | 如何快速訓練免費的文本生成神經網絡
    選自minimaxir作者:Max Woolf機器之心編譯參與:Geek AI、路本文介紹了如何免費使用因此,在理論上,一個經過了充分訓練的網絡可以重現它的輸入源語料,但是由於經過適當訓練的神經網絡也不是十全十美的,因此輸出文本可能會變成一個很奇怪但是效果也很好的「恐怖谷」(和人的行為很相似但不完全相同)。許多文本生成神經網絡的網上教程只是簡單複製了一個現有的 char-rnn 實現同時對輸入數據集進行了更改。
  • 谷歌開源Neural Tangents:簡單快速訓練無限寬度神經網絡
    深度網絡的架構、訓練和性能之間有何關係?如何提取出深度學習模型中的顯著特徵? 我們何以在近些年裡取得了如此的進步?一大關鍵理論見解是:增加 DNN 的寬度能使 DNN 的行為更有規律可循,也就人更容易理解它們。近來的許多研究已經表明,寬度可無限擴增的 DNN 可以收斂成另一類更為簡單的名為「高斯過程(Gaussian processes)」的模型。
  • 教程 | 一招教你使用 tf.keras 和 eager execution 解決複雜問題
    自動下載訓練數據。2. 預處理訓練數據,並創建 tf.data 數據集以便在輸入管道中使用。3. 使用 tf.keras 模型子類化 API 定義模型。4. 使用 eager execution 訓練模型。5. 演示如何使用訓練好的模型。
  • 如何用 Python 腳本批量下載 Google 圖像?
    問題《如何用Python和深度神經網絡識別圖像?》一文中,我給你展示了如何用深度學習,教電腦區分機器人瓦力和哆啦a夢。很快就有用戶在後臺留言,問:老師,我想自己訓練一個圖片分類器,到哪裡去批量下載帶標註的訓練圖像呢?說說我寫教程的時候,是如何找圖片的吧。最大的圖片庫,當然就是 Google 了。
  • 如何免費雲端運行Python深度學習框架?
    首先,它免費。因此可以把軟硬體的綜合使用成本降到最低;其次,它靈活。從系統內核到各種應用,你都可以隨心所欲定製。不像Windows或者macOS,管你用不用西班牙語和文本語音朗讀功能,統統默認一股腦給你裝上;第三,它結實。Linux雖然免費,但是從創生出來就是以UNIX作為參考對象,完全可以勝任運行在一年都不關機一回的大型伺服器上。
  • google nexus 7 google play海淘購買教程!
    最近google發布了一款新的平板電腦:google nexus 7, 很多海淘的朋友不知道如何海淘購買google nexus 7,今天為大家帶來在google play 購買google nexus 7的方法圖文教程,希望對大家有幫助!
  • 如何使用SimilarWeb分析網站數據(最新版免費教程)
    谷歌大叔團隊之前已經給大家分享過兩款專業的網站分析工具《Ahrefs使用教程》《Semrush使用教程》, 很多粉絲都喜歡這兩款功能強大、數據準確的軟體。但是由於價格過高,而且不是專業去做SEO,使用的機會比較少,所以大家問我們有沒有免費的網站數據分析軟體可以推薦,所以就有了今天的SimilarWeb使用教程,我們將會使用它的免費功能,教大家準確的來分析網站數據。 課程分為以下部分: 什麼是SimilarWeb?都有哪些功能?
  • Pokemon Go如何註冊google帳號 Google帳號註冊教程
    不少玩家對最近大熱的Pokemon Go感興趣,但是登陸遊戲需要谷歌帳號,也有不少玩家卡在這一步,下面一起來看看如何註冊谷歌帳號。1、VPN必須!註冊google郵箱,google需要VPN翻牆訪問,這也是卡住很多人的一步。