在CMU的第一年

留了个假学

May 15, 2021 -
回忆录
-

一年前的我一定想不到此时此刻在新加坡的酒店HDB里面写下这个东西,而且说是CMU的学生但是到现在连学校都没见过

从毕业之后说起。感觉这一年其实没什么好讲的,全是流水账。

天授后续

后续发展超出了我原先的想象

首先是 duburcqa 提交了一系列pr来重构底层的batch,然后在他的要求下,所有commit全部走pr并且有至少1~2个reviewer approval才能merge。这也是我第一次正式体验到了软件工程的开发模式(感觉大二那个课是个假的),虽然开发效率低了点但毕竟是tradeoff,如果想保证代码质量的话确实必须得这样

然后差不多67月的时候,游凯超说他想入门RL,就拿天授源代码来学习(在此之前只看Sutton的书但是一头雾水,每个公式虽然都看得懂但合起来就是不知道这玩意怎么work的),然后后面从batch改起(中间我们三个人还扯皮了一阵batch的标准,看来标准委员会的日常工作确实是扯皮),后面改了个async venv,还有一个multiagent dqn玩tic-tac-toe的(不过我其实个人不是很喜欢这个改动……有点破坏完整性)。

但是不接受也是不行的,毕竟开源社区发展就指望着有好心人能交pr,毕竟这不是一个商业项目,我也是用其他闲暇时间来维护的。如果不接受的话项目的不可持续风险就会变大,所以就得每个pr都跟进,在必要的时候做出妥协(至少我是这样)。

之后还有一些atari dqn的事情来回折腾了快一个月(谁叫我之前没调过呢……原来wrapper这么重要),然后就被cmu的课程给折腾的……停滞了(原因后面会说),中途就调了一个SAC mujoco能达到全网最高的Ant 6300+分

寒假的时候陈华玉开始参与进来,一起重构了下底层的buffer和collector,之后他搭了个全网性能最好的mujoco benchmark。我承认我一个参都没调,都是他调的,我不想调参了

其实本来想在4月的时候搞个PR来总结一下这一年都发生了啥,标题都想好了,“从0.2.1到0.4.2,天授在这一年中发生了什么”,然后一直咕。一个是实际上github如果一搜pytorch reinforcement learning的话tianshou就会排在至少前三,二是star也快饱和了(目前最多的是3.5k,天授3k),三是我确实懒

唉,就这样吧

tianshou star

天授的star增长情况,截图的时候是3050个star

CMU-MCDS

去年这时候应该是准备上第一节课了。问了下学长,MCDS历年暑假都是要先上课的,但是正式项目开始是8月

暑假要上课

暑假的两门都是网课,11637必修,15513是可选的。由于疫情原因,在秋季的时候退还了scs开的暑期课的学费(只有513是,才6分)(早知道选个10601在暑假,三门一起来,完全来得及 – 因为两门课差不多一周三四天肯定能搞完,除非实在摸鱼)

我没上过一节这两门的网课,637是我没找到他有上课的视频,513是说grad student可以不用上课那就不上了

11-637 Foundations of Computational Data Science

傻逼课,没啥值得上的

我上的时候是5次作业(听说20fall就变成6次了),每次是给jupyter notebook然后填空,和CS231n有点类似,内容还是以nlp为主numpy操作为主;每周有小测,理论上需要读他给的材料再做,但是实际上不读和读了再做没啥差别,还不如直接先把全文复制到记事本,小测的时候直接ctrl+F,反正都是开卷

最后一次期末考有些意思,给了两天时间,固定数据集的情况下随便弄一个model能达到一定准确率,然后部署在azure上面。废啥话呢,import torch完事,鬼才用那种tfidf的传统方法(为杨老师默哀一分钟)

15-513 Introduction to Computer Systems

真烦

课挺好的,主要是作业好,毕竟打磨了这么久。写最长最久的还是malloclab,不过现在好像也记不太清了,其实也没什么难的。

每周都有布置书面作业,写完是同学打分,取三个人的平均值作为分数。额但是像我这种人我看到有个错就直接挑出来扣掉了(似乎又加剧内卷……)不过这门课结束之后我就再也没这样过了(毕竟写啥都是先来个great! – 文化差异hhh)

期中期末zoom考试,不得不说这门课的考试是后面上过的课的在线考试中做的最好的,考试网站也是自己做,没用gradescope(这个真的太拉垮了,连邮件通知都没,浏览器检测也没有)。刷一下往年题就行,剩下的也强求不来。

20fall

选这些课都是杨老师帮我选的(虽然他现在已经放弃入学去直接工作了呜呜呜)

选课的时候是按照3个学期毕业来选的,也就是每学期4门。很多人说选5门要死了,确实是这样

10-601 Introduction to Machine Learning

傻逼课,如果不是必修和一堆课的pre-request早就不上了

这就是给没学过ML和python的人开的,piazza开始的时候还一堆人问比如“我为啥按照handout里面输入了 $ python decisionStump.py之后说 command not found: $ 而不是成功执行” 令人十分无语

整个学期学下来没啥收获,因为讲的东西最难也只到HMM那种难度,作业也很水差不多刚出来花个两三小时就做完了。考试的话有三次,都挺简单的,刷分必备课

为啥不上701:感觉没啥必要,以摸鱼划水为纲。701据说还得自己找个project来组队做,然后给分还不行,虽然黄大大的意思是说这个课教的内容在面试的时候很管用

05-839 Interactive Data Science

傻逼课,傻逼课,傻逼课 <– 这个我不划线

我后面被这个课气死了

前面都还好,做一些娱乐性质的作业(hw1),然后讲了些比如啥啥啥设计会影响到啥啥啥用户体验之类的,每周需要在piazza的帖子里面发表对required reading paper的看法和见解(以至于到后面大家都在敷衍说I think this paper is awesome/great/inspires me a lot然后乱编几句话),hw2是用tableau来可视化,hw3是用streamlit+vegalite可视化,final也是,这俩都是自由选题,唯一区别是hw3是2人,final是2~4(通常3~4)并且还有peer review(也是在piazza里面评论,当然,大家都明白各位都不容易于是全部都是I think this project is great/awesome/really interesting! 然后随便抓一点肉眼可见的细节使劲夸)

hw3:https://github.com/CMU-IDS-2020/a3-create-a-new-team

final:https://github.com/CMU-IDS-2020/fp-zhihu

讲课的话十分容易听走神,到后面都是开着zoom然后睡觉去了

然后气人的就来了,老师以为我们final的那个模型就是在划水然后扣了整整15分,硬是把A+扣成了B,十分迷惑,一怒之下退了这个github group。但是看平均大家都被扣了10分之后心里还算有点平衡。

11-631 Data Science Seminar

还是傻逼课

这课就写paper review,要说完全没用吧也不对,但也就一点用,能在之后如果被临时抓去当跨领域的审稿人的时候不至于写出来狗屁不通的东西。

不过大家都在敷衍

具体而言,前半学期有个presentation需要组队做,系统来决定组队;然后有10+10篇paper,每周两篇,需要对每篇写这几件事情:三句话讲这paper都干了啥、三个优点、三个缺点、三个想向作者提出的问题。paper以nlp和system为主。像我这种当时不懂parameter server和knowledge graph的都得硬对着这类paper来写:看不出来优点,编优点;没有缺点,编缺点;没有问题,想办法看错原文内容然后编问题。就很扯淡

期末是给5篇paper然后选一篇写literature review,我选了CSKG(common sense knowledge graph)因为有高天宇可以问,但是实际上还是看video tutorial session比较好,找到对的资料之后直接听写就行(x

15-746 Storage Systems

这课真牛逼

杨老师在暑假的时候帮我选的这个课,我当时问他为啥选,他说都来cmu了不体会一下,“system就这点精华了”。以下是某次我在做p13怀疑人生的时候的对话:

我:话说你当时为啥选了ss这课。。
杨老师:因为时间合适?
我:艹
杨老师:而且我觉得很重要
杨老师:而且这个课老师很牛逼
杨老师:也很实用
我:而且这个课老师很牛逼
   ------
   ?

课很值得听,比起上面那一堆垃圾课来说好太多了,从存储设备讲到文件系统,每个都讲的比较深。

作业就俩,一个myFTL是模拟ssd的Wear Leveling,写些policy之类的,ckpt1和2就纯模拟,ckpt3的writeup会误导人,实际上只有guideline最下面一句话“we encourage exploring different options such as page-level mapping”管用,但通篇扯了一堆block-level mapping,害得我废了整整5天(废是废掉的废,不是费,后面推倒重写page-level mapping花了不到一天就过了,好像一共三小时包括写report)然后就出现了上面这段对话

另一个是cloudFS,用fuse写个文件系统,把大部分文件系统的syscall都给接管掉。设计确实比较复杂,我选了我所认为的最省事的那种,但也写了两千行(我DS可能四个project加起来代码行数也没2045这么多)不过写完真是爽,满打满算一共花了一周多的时间(9天,每个ckpt3天这样)

此外还发现p23有评测bug,实际上可以弄到3.81的分数,然后就私聊助教说你们这handout不严谨有漏洞,他们说下学期改。最后交了个18.66的上去(reference solution是13.9,我记得19以内都算满分好像)

除了project之外,每周需要在gradescope上面做小测:说是要读paper但是我一篇都没读,也做得好好的,这个和ACC一样。然后考试实在不会考,我觉得我的答案没问题,和标准答案差不多,argue一下就是不给分,没办法了。

21spring

本来入学的时候是想打算选个analytics track混过去毕业,但是ss这门课让我改变了这个看法,还是system比较有意思,于是就换了track重新规划选课:一门capstone,两门system,一门elective。

为什么不选cc

还是那句话:以摸鱼划水为纲

一方面是ACC只在春季学期开,另一方面根据学长们的口气是ACC比CC水(好像确实是这样)而且可以直接替代CC

10-605 Machine Learning with Large Datasets

本来当时是打算选Search Engine但是看他们的上课时间过于阴间(凌晨4点)以及可能还有课堂小测于是赶紧换了一门。

这门课主要教的是spark的各种姿势(比如rdd、spark的ml和sql之类的),会用到databricks community edition(不得不说databricks的用户体验是用心做了的,用起来非常好),7次作业有一半以上在跟spark打交道。剩下的用tf2写,pytorch党表示不服

但是

7次作业每次都分为writing和coding,writing在前半学期都是各种证明题,每次都得花个一天来做,最后做到弃疗去问miskcoo;后半学期还好一些,就各种贴coding的结果和结论就行。来一张图:

piazza favorite post

看起来不止我一个人觉得这作业设置有问题

考试两次,期中考做太慢没做完,期末做完了也没考太高。anyways

15-640 Distributed Systems (spring)

本来觉得挺实用的但是上完之后感觉啥都没学,ss和acc可以cover大部分这个课的内容,而且project没啥意思

首先DS在fall和spring是完全不同的两个老师在上,听说fall更注重实用性,spring的Satya是AFS奠基人,上课讲的很慢以及注重很细节的点,然而对于我这种看全是字的ppt会犯困的人来说上到后面就不想听课了……Elaine后半学期讲的区块链都比他有意思

前半学期在讲rpc和cache consistency,讲了好多不同种类的模型;后面讲consistency的各种模型和区块链共识。当然本来像这种课应该得提供一些spark的实战的但是 没 有 就是没有,感觉是个假的课(不过确实都AFS了,这课重心是偏重于distributed FS的而不是distributed computation)

project分四次:

  1. c++写rpc,实现一些file system call以及tcp的通信,大概三个checkpoint一共一天就整完了
  2. java写caching model,记得是check-on-use,就是和AFS一样。我的难点在于我上一次写java已经是三年前的事情了(大二小学期和写编原的时候),花了些时间在复习java的各种基础知识;还有一个是需要处理各种exception和c++对齐,那个我只管了他测啥我就写啥。一共两天多
  3. java写autoscaling,给不同的test然后要用尽可能少的资源来满足尽可能多的访问,有点像ACC的p1不过这玩意简直就是个弟弟。随便搭一个benchmark然后overfit过去就能过了
  4. java写2pc,大模拟,我到后面连client的故障恢复都没写,因为我把发给client的请求搞成了idempotent的了,就好写很多(讲真这些handout里面讲的方法太中规中矩了,照着来没啥意思而且写的时间还长)

列个结果:

# Score (不含doc和code style) Lines of code
1 满了 616
2 满了 444
3 17 / 44.2 / 35.6 264
4 满了 285

p3是因为有bonus然后我把bonus拿满了

平时还有4次problem set,期中期末也是problem set,都是给一周时间做。第一次做这玩意的时候不懂事,直接没检查就交了上去,结果吃了个七十几,后面就注意了很多。

15-719 Advanced Cloud Computing

Greg/George确实nb!

ACC和SS都是同一个老师上的,不过ACC多了个Majd。总的来说风格一致,每周小测要求看paper我还是一篇都没看,上课讲的东西都是之前没接触过的。

project有三个:

  1. aws autoscaling,第一个是terraform直接上,第二个是写个aws lambda来schedule instance,第三个是直接用aws lambda来处理autoscaling(不要instance那种的faas)。最难的是第一个,之前没接触过这玩意然后看文档看半天。不过……为啥他用于测试和提交的二进制文件打包如此煞笔,直接cat能看到python源代码,简直了

  2. spark,第一第二个ckpt都是同一个benchmark要跑,是处理数据的,测试内容一样不过第二个是需要跑得快一点。第三个ckpt是用spark手写一个SGD来处理feature size巨大无比的情况,需要特殊的cache方式比如全放disk上面。由于在605那边写过几次spark,这个作业在我当时做的时候变得挺简单的。贴一个结果:

    Project2 Runtime (mins) Runtime (mins) Runtime (mins) Runtime (mins)
    1 A 0.00 B 8.00    
    2 A 0.00 B 19.00 C 68.00 D 39.00
    3 KDD2010 13.00 KDD2012 21.00 Criteo 16.00  

    值得一提的是最后个checkpoint这三个点我跑的都是全班第一,而且是在ddl前7天交的。为啥这个project三个checkpoint都没有bonus point呢……真不科学

  3. kubernetes,用go写,第一个是用自带的api写scheduling policy,第二个是kube-batch的拓展api写scheduling policy,第三个是用kube-batch自己写policy达到给定的指标。诀窍在于可以自己用python写个k8s scheduling的模拟器方便debug,没写之前300秒跑一次,写完之后1秒300次;以及同样的,cat 测试的二进制有惊喜

考试也是和ss一个类型,overfit下往年题,这回考的比ss要好很多。

11-634 MCDS Capstone Planning Seminar

槽点多多

这课是要每个人选一个project,他会给差不多10多个但是大部分都是nlp以及一些不切实际的project比如AI导盲狗,当然也可以自己选project(只要找好导师能带你)。作为RL选手肯定选那个唯一的RL project叫Roborace,leader是个二年级的MCDS叫Jimmy。

进来之后一共有五个人,俩搞CV俩搞RL还有个我反复横跳(RL/system)最后Jimmy说是把我塞到system实际上我一直在搞RL的东西,他爱搞自己搞去。

去年的Roborace只是接通了组委会给的simulator可以train,但是SAC直接train的效果不太好。哦对顺便一提,前两周我还帮他们写了个前端在 https://www.andrew.cmu.edu/user/jiayiwen/Roborace/ (本来在 https://www.cmu-roborace.com/ 的但是这个网址在我写这段话的时候好像域名过期了,垃圾wix)(不过hugo真好用)

然后骚操作来了,我觉得已有的基于stable-baselines3的代码就是坨屎于是用tianshou重新写了一遍,顺便找了好几个bug出来,还改了改VAE变成只处理道路相关的区域。结果发现一跑,原来需要10h才能有成功一次的现在只要不到一小时就行。

于是吹了半天这个,顺便把之前代码diss一通,估计Jimmy挺不爽的((( – 不过后面做了下ablation study发现是VAE这么操作能显著降低sample complexity

然后就是一周优化一点,从最开始110s慢慢优化到80s,然后是73s,后面到了67s下不去了。每周做一点然后汇报一下结果,就调调参跑好几个晚上,跑的我笔记本插着电都会弄到没电。

Roborace env的特性是一次step需要花很长时间,于是只能在有限的timestamp内来做实验。不过后面jimmy自己搞了个distributed training能一小时1M(单机是三小时100K)结果跑出来的agent能58s,于是教训就是一定要train到底并且distributed training at scale十分重要

说一下队友:CV那边不是很懂,不过最后做实验发现不管用怎么fancy的算法来把路面和非路面部分分割掉,upper bound都和我那个cropped VAE的性能类似,所以大概率CV team只是自娱自乐罢了;RL除了我以外,一个是黄若欣,另一个是印度小姐姐,ruoxin还好至少每周能跟着跑实验,印度小姐姐整个学期下来连实验都没跑,ppt总共做的页数都还没我多,meeting的时候讲话总时长估计也没我长,不过同在一个team给分都是一样的。anyways

业余时间

摸鱼划水

哦删错了好像确实是摸鱼划水。实际上大部分时间还是在做作业,然后差不多7天有两天这样能干别的比如刷youtube啊(大部分时间)、写tianshou、tuixue之类的

piazza、gradescope、autolab的正确用法

piazza我后面发现如果是cmu organization下面的话,是可以注册任意cmu的课程的(如果老师或者助教不把你赶出来的话,我被赶过一次)。所以可以把下学期想上的课先在piazza上面注册一下,把资料啥的下载好就有备无患了

如何在gradescope/autolab上面快速debug(比如限制提交次数那种):如有需要请私聊,天机不可泄露

一些想选的课

寒假的时候去Stellic专门看了一天都有啥课,列一下:

首先是system的:

  • 15-618 parallel挺实用

  • 15-645 db挺实用,顺便一睹Andy风貌(不过听说Andy去搞他那个公司去了,不教这个课了)

  • 15-605 os,如果实在没事了可以选这个,但是还是得找到靠谱队友

Analytics的感觉没什么课好选的,HCI就更不用说了。感觉选system的课还是得去ece那边选

Security:

  • 14-741 Introduction to Information Security

  • 18-730 Introduction to Computer Security(fall only)

  • 18-732 Secure Software Systems(spring only)

  • 14-761 Applied Information Assurance

作为日常热衷于嘿嘿嘿的选手不选点这类课感觉生活失去了乐趣。

Others:

  • 15-666 Computer Game Programming(fall only)不过估计不选了

  • 17-766 Software Engineering for Startups(spring only)

暑假实习

实习是MCDS要求的,每个人必须在第一年暑假实习,但是实习种类繁多,包括暑假当11637的TA也可以算。某次问Eric到底什么样的工作才能算实习,他说只要和Data Science相关的即可,“但是很多人暑假去大厂写前端去了,我本意不是这样的”

找实习的过程在这个知乎回答里面,不具体说了,来个小插曲:众所周知实习的简历只要写一页,和申请不同,并且不要花里胡哨的。于是把原来申请用的那个花里胡哨的cv给压了压变成一页的。接着叫黄大大和几个学长check了下,不放心还拿去 EECSResume 逛了圈(反正免费),结果收到了这玩意,让我不知道说啥好:

eecsresume

最后在三月的时候fb offer被取消掉,然后正好林敏找了过来说SEA这里刚建了个ai lab缺人你要不要试试而且搞的就是RL,我想了想,国内当时还没开,可以边实习边等签证,于是就签了

过了几周我第一次想跳车:不是跳这个实习而是跳CMU,想想美帝这么乱而且签证遥遥无期,能远程毕业就远程毕业得了反正就是拿文凭镀金的。于是upgrade了offer可以延长到秋天的那种

又过了几周我第二次想跳车:这回国内签证开了然后CMU说必须得线下上至少一个学期才能拿学位,于是好不容易签的offer可能又得改回去

美帝这群人过于PUA – 这周放弃幻想准备战斗,下周放弃战斗准备幻想,反复横跳


不过

贴一个stanford mscs大佬的看法:https://www.1point3acres.com/bbs/thread-687592-1-1.html

1p3a

所以身为学生眼光可能十分局限,实际上在学校内部接触的东西和工业界真正需要的东西是有显著gap的。又有多少AI应用能够落地呢?四小龙的颓势已经不可避免了

以及还有一点是在现在这个社会环境来看,idea远远比系统如何实现重要,找到对的问题和需求能事半功倍,哪怕代码写得再拉垮也没关系(虽然这么做的话后面得返工…)。但很可惜的是,这个只能靠自己摸索,没人能教。

tuixue.online/visa后续

为啥要把这个放这里:因为11-12月的时候cyh重写了下后端的代码(巧的是cyh是10月去柬埔寨然后靠tuixue约到了11月唯一的位置,然后自愿想维护下看看有没啥东西可以做的),接着12-1月把前端用React重写了一下,我顺便学了学这玩意,还包括Redux、antd之类的东西。其实主要都是cyh在写,后端我只负责review代码,前端我也写了一部分比如ui design之类的

实际上ui design是个大学问,要做到清楚、简洁明了的同时能清晰地向用户传递信息。这里讲个故事。

QQ群通知事实上一直有,但是如何把这个信息嵌入到前端网站里面是个问题。手机版最开始的设计是在24h图表上面有三个不同的icon,图表、邮件和QQ,点击不同的icon就会切换到不同的功能tab里面。

tuixue

这个问题在于很多人看的时候会忽略过去导致不知道有这个功能存在。于是改了之后变成

tuixue

这个问题在于电脑版显示是正常的,但是手机版如图所示把后面的信息给挤占掉了。于是再改

tuixue

现在就是这样。

还有个问题是老是有人不知道入群密码。最开始的界面长这样:

tuixue

我觉得大概是用户注意力集中在下面11-14群群号那里,上面怎么写他并不care。于是

tuixue

但是这么做的问题是上面还是不被care因为list过长,试了试一周内qq里面找我问入群方式的人还大有人在。于是被搞烦了,重要的事情重复一下:

tuixue

果然后面问这个问题的人少了很多。


4.28的时候说下周开签证,然后tuixue当天被冲爆了好几次,一天13万次api请求,出口带宽被打爆了(虽然只有600KB/s这么大)。临时做了下前后端cache但是还是会爆,于是5.4那天买了个双核8GB内存的服务器,一千不到。实际上光是被打爆那天的打赏已经够cover住这台服务器的成本了23333

至于为啥没在国内签而是跑去新加坡签:我脑子被炮打了 5月第一周final,第二周空闲但是感觉签证一周下不来,第二周周末机票去新加坡。算了算有三个月的时间,一般签证加上check的话两个月能下得来;以及横竖都是check。

其他

去年8月学校说可以返校保研,商量了下还是去见见世面,并且research没啥意思

然后把知乎戒了但是一直逛b站和youtube……youtube主要是两件事情:

一件是 deepmind 的纪录片 https://youtu.be/WXuK6gekU1Y 拍得好好,我八月份看的,看得我当时热泪盈眶。

第二件是dream manhunt,第一次看的时候把我看傻了都,然后就把他所有视频刷了个遍

所以就在重新思考RL的意义。如果从信仰的角度来看的话是一回事(比如alphago确实是一个伟大的项目,然后如果有人能用RL来达到dream这种级别的水平并且还是在multi-agent adversarial RL的setting下那就离AGI又更近了一步),但是如果从吃饭的角度来看的话又是另一回事了……(比如商业化追求观赏性、帮助快速设计之类的)


11月的时候因为实习的问题焦虑了一阵子,并且在12-1月的时候达到了巅峰。正好那阵子没什么事情能干,即使有事情(比如PR需要review之类的)也不想干,就想在床上躺一天啥都不想做,或者是白白发呆、刷视频、kill time。后面总结了下,还是吃太饱了,如果一直有(必须要做的)事情做的话就不会这样(感觉离干电池又近了一步……十分危险)

记得我在大二上学期回忆录里面写过这样一段话:

某天躺在床上的时候回忆起来,不禁开始思考自己两年后、五年后、十年后到底会成为怎样的人,会在哪里,从事什么行业。人生是一个马尔科夫过程吗?

说实话在现在这种情况下,我也并不知道自己三个月之后到底在哪里,是在新加坡的某个其他HDB和别人合租,白天当社畜夜里上网课呢,还是在美帝那边和一堆同学面基;是接着在SAIL工作呢,还是找个其他大厂先积累到原始资本。

不过即使我列了一堆的可选项去分析实际上也没啥用,每次都是一些意料之外的选项突然就冒了出来,或者结果是我根本没考虑到的。所以身为学生的最后一年,还是先搞好知识和人脉储备比较好,剩下的事情……也没办法:(

Read More