谷歌免费GPU训练星际2AI好难?你需要份debug指南

Root 发自 凹非寺 量子位 出品 | 公众号 QbitAI

自从去年8月10号暴雪开放了星际争霸II的人工智能API之后,数不清的AI研究者前赴后继地加入了训练星际2 AI的队伍中。

但并非所有人都舍得掏钱购买昂贵的GPU。还好,谷歌近期大发善心提供免费的云GPU,这下有更多的人可以训练星际2AI了。

那用免费的GPU训练AI会遇到哪些坑?

Reddit上有个小哥哥Franklin H.分享了这个排雷的过程,一步步引导大家如何debug。

以下是post全文:

太长不看版:如果你想用GPU硬件搭建一个免费的星际争霸II机器学习的环境,看我在谷歌Colab上的笔记:https://colab.research.google.com/drive/1AzCKV98UaQQz2aJIeGWlExcxBrpgKsIV

最近,我和几个好基友一起搞了个星际争霸II的项目。

我始终持有一个观点,就是搞机器学习研究的人,得有能力快速训练神经网络。这一点相当重要。

把代码分享出去,是相对简单的事。但我认为,对于全球训练星际争霸II AI智能体的研究群体来说,更有价值的是告诉他们,怎样用谷歌免费的GPU,在谷歌Colab跑起来星际争霸II的AI。

我就自己先动手试了一下。

没想到,下载完星际争霸II和安装上必要的数据库之后,遇到这茬:

Return代码是啥玩意儿

看来得先搞清楚Return代码是个啥。

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

进一步挖掘,发现poll()这一块是源自Python的subprocess模块。这说明11是终止星际争霸程序的信号。

信号11是可怕的segfault,绝对算C程序员的噩梦。

为了看问题是不是出在这,我找到了可执行的SC2,然后让它自己运行起来。

Emmm……

开启Debug的地狱模式

一般来说,我会直接打开用得最顺手的Debug工具。但这样,这篇文章就不过是个怎么用GDB的流水账了。

但,这不是在Google Colab上嘛,我们有的只是Jupyter Notebook网页。这就意味着:

  • 没有Debugger;
  • 没有Root权限;
  • 好多工具不能用,比如说Strace。
RIP debug中

当你只能用网页时……

我就试了服务器上不同版本的星际争霸II,包括暴雪提供4.0.2版本,3.17版本,和3.16.1版本。

居然!都不行!生气……

那我只能在本地Linux系统上跑星际争霸II了,毕竟这个环境我熟,有把握可以debug。这样才能验证我的猜想。

第一个可能的原因:没找到必需的数据库

刚开始我猜,星际争霸作为一个游戏,应该是要一些OpenGL里的函数以及库。而这些东西在谷歌Colab里没有。

为了验证这个假说,这次我本地运行了星际争霸II。然后用strace,记录星际争霸II的一切系统调用,所有的库都是从操作系统加载的,这样就能知道缺了什么依赖库。

这里是日志中的一个片段:

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

看结果,发现StarCraft II除了动态地链接到那些标准C/C++库,没做什么别的,这就排除了这个猜测。

还有哪些segfault?

又因为本地跑的没有挂,说明暴雪给的码也没有问题。

谷歌搜怎么debug段错误的时候,想起了Valgrind。我惊讶地发现,他居然就在谷歌Colab工作。

Valgrind给出代码片段如下:

我唯一能看出来的函数是libtcmalloc.so.4.3.0里的MallocExtension::Initialize()。

可能有不知道TCMalloc的盆友,这其实是个谷歌定制化记忆分配器。谷歌Chrome浏览器用的也是这个。

但是……

当我用strace找错的时候,我只记得看到了C和C++标准库的加载。那TCMalloc是从哪里冒出来的?

后来发现,有个办法可以在没有TCMalloc的程序上强行使用TCMalloc。

在Linux上设定LD_PRELOAD环境变量,加载TCMalloc共享库后,就搞定。

很好奇,在谷歌Colab上看会是什么样?

矮马!就这个!

解决方案

可是,设定LD_PRELOAD环境变量无法扩展到其他环境里去。

执行这段:

我已经卸载了TCMalloc。然后,除了一些错误的提示信息,星际争霸II现在可以跑起来了。这会儿总算可以开始训练星际争霸II的AI了。

我写了份针对谷歌Colab的bug文档,这样以后大家遇到类似问题就不用再纠结了。

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

不过,等星际2的AI出来还早。

我们拭目以待。

最后我想感谢一下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

你可能感兴趣

星际争霸界也出了位“带路党”,当年的冠军正帮谷歌AI击败人类

原文发布于微信公众号 - 量子位(QbitAI)

原文发表时间:2018-04-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏生信技能树

peerJ期刊探索

开放获取的期刊--PeerJ由Peter Binfield(曾在PLOS ONE任职)和Jason Hoyt(曾为Mendeley的首席科学家)于2012年6月...

41440
来自专栏域名资讯

好域名来袭:英文ALL.cc大五位结拍

近段时间域名圈不断有好消息曝出,众多品相兼优的域名纷纷结拍,而近日又有几枚不错的域名结拍,下面让我们来详细的介绍介绍

25080
来自专栏牛客网

从0offer到一天谈完薪资,几乎结束秋招,前端面经回馈牛客

个人是双非渣本,没有实习经历,但是自己的项目经验巨多,之前是搞算法的,后来转向前端

27120
来自专栏从零开始理解云计算

从零开始理解云计算 Vol.1:什么是云计算

这个系列其实是写给自己的云计算知识学习笔记——作为一个没有专业背景的小白,从零开始理解云计算的过程。王良明的《云计算通俗讲义》是一本入门的好书,本文根据书中的内...

1.6K20
来自专栏有趣的django

CRM客户关系管理系统(一) 第一章、CRM介绍和开发流程第二章、CRM项目表结构设计

1.1K00
来自专栏平凡文摘

只有程序员才看得懂的漫画

13730
来自专栏玉树芝兰

如何用Python和R对《权力的游戏》故事情节做情绪分析?

想知道一部没看过的影视剧能否符合自己口味,却又怕被剧透?没关系,我们可以用情绪分析来了解故事情节是否足够跌宕起伏。本文一步步教你如何用Python和R轻松愉快完...

24720
来自专栏吉浦迅科技

PGI 2014 编译器即日起提供试用,可支持AMD GPU和APU

为针对高效能运算,并加入全新效能及简易程序功能,并行计算编译器与开发工具 PGI 即日起推出全新 PGI 2014 编译器,新版本针对 NVIDIA 和 AM...

33890
来自专栏编程

工业机器人编程教程-机器人编程运动

1、机器人的运动类型 ? 2、PTP运动 (1)PTP运动简要介绍 PTP运动示意图 ? 同步运动PTP 在一个PTP运动中,参与运动的轴中运动距离组长的被称之...

474100
来自专栏牛客网

新疆学子的腾讯后台开发的面经

4月26日收到了腾讯的offer,终于安心了,很多小伙伴们要我写面经介绍下,其实自己能拿到腾讯的offer 99%是运气~, 这里就介绍下自己的面经跟总结自己的...

47860

扫码关注云+社区

领取腾讯云代金券