在影视作品中,程序员多以技术大神的形象出现。
他们经常在电脑上随意插一个U盘,对着黑色的界面飞速敲下绿色的代码,10秒钟后合上电脑,冲主角邪魅一笑表示“我已经黑进五角大楼了。”
邪魅一笑.gif
别急着崇拜。当我入了这一行后,发现根本不是这么回事!
事实上,如果我键盘敲得噼里啪啦响,那绝对是在微信上跟妹子聊天。如果敲一会就停半天,抱着一杯茶,表情拧巴,那才是在编程。
对我们菜鸡来说,编程debug的时间真的比coding的时间长多了
但最近我发现,在一群程序员里,集体相拥debug反而成了一件快乐的事。
debug的意义绝不仅仅是让一段代码跑通,它更是一种技巧的攀比,一种精进的机会,甚至是一种感情的升华!今天,我就来复盘我的一个下午,让大家感受一下我每天的时间都在折腾些啥。
毕导篇
众所周知,我们调包侠有一种常用的科研思路:在前人论文代码的基础上一通魔改,性能提升了2个点,nice可以发文章了
调包侠的学术循环
最近我看到一篇不错的文献,而且作者很贴心地公布了代码。我最喜欢的就是这种有开源精神的作者了!我当场下载他的代码一个run!深度学习就像呼吸一样自然!
咦,怎么第一行就Error啊……仔细一看,的确是我的问题。
众所周知,深度学习有两个主要的库,一个是google家的Tensorflow,一个是Facebook家的Pytorch(不会有caffe党和theano党喷我吧不会吧不会吧)。我用的是更加轻松易学的Pytorch,但这篇文献的代码是用Tensorflow写的,在我的环境里无法运行。
这解决方法很简单啊:只要给我的服务器上安装Tensorflow就行了(你也可以选择import torch as tf)。我用华丽的手法打下一行pip install tensorflow,然后当场重启jupyter内核一个run!深度学习就像呼吸一样自然!
结果是这样的……
怎么还是Error?当然,我对此早有预料。写代码就像人生,有些人出生就会coding,有些人生来就是warning。—— 毕·猛子
这次系统提示说我没有安装tensorflow.contrib这个包。这我就傻了,不应该是装tensorflow的时候自动一起装的么……
我当场一通咕狗,咕到Stackoverflow上有人问过一模一样的问题。Stackoverflow是一个技术问答网站。编程就这点好,不管遇到多蠢的问题,在Stackoverflow上一定有人已经问过并且有大神已经解决了。
大神的回答
破案了,我刚装的Tensorflow是最新版2.7,但这篇文献的代码是用Tensorflow1.0系列写的。
类似于你打算烤串,买了个无敌全自动核聚变烧烤机,但你手上的鸡翅只支持用柴火烤。那你只能卖了核聚变烧烤机,重新买柴火。
所以现在解决方案就很简单了啊:卸载Tensorflow2.7,重新安装1.0系列版本就行了,比如1.15。
这我最擅长了,深度学习写代码我虽然菜,但它的安装与卸载对我就像呼吸一样自然!我当场给图灵老祖烧了点纸求保佑,然后一个pip uninstall tensorflow再一手pip install tensorflow==1.15!
然后当然是Error啊……这次的Error说的是,找不到Tensorflow1.15这个版本……怎么会这样的呢
我咕狗了一通又破案了:Tensorflow1.0版本在Python3.6以上版本无法运行。而我,作为一个喜欢更新一切的先锋青年,用的是python3.8。
类似于你现在买来了柴火打算开始烤鸡翅,结果发现这个柴火不支持打火机引燃,只能用钻木取火。
这时候不可能为了这破事卸载python3.8去装3.6。其实解决方案也很简单:只要用Anaconda创建一个python3.6虚拟环境,在这个虚拟环境里装上Tensorflow1.0就行。类似于你在旁边新建了一个钻木取火机,然后烤翅。
我给Guido van Rossum的照片磕了三个响头,然后反手一个
conda create -n tf1 python=3.6
conda env list
conda activate tf1
pip install tensorflow==1.15
深度学习创建虚拟环境就像呼吸一样自然!
但创建了之后我也不知道为什么,Tensorflow还是安装失败。
时光飞逝,不知不觉半小时过去了,我的呼吸早已不像当初那般自然。我忍不住举手了:“冬冬,请过来一下!”
冬冬篇
冬冬是我组的博五大师兄,比我小三岁,码力深不可测。他日常1个人就可以负责一整个化工厂的横向项目,他训练神经网络时会口算验证GPU的反向传播对不对,他失眠的时候会用Mapreduce并行化数羊!
通常,你可以从一名程序员桌子上的书来判断他的水平。这是冬冬的桌子,虽然大部分书好像没拆封,但还是一看就知道他很厉害。
他听了我的需求,表示这不是像呼吸一样自然!然后反手就是一个
conda create -n tf1 python=3.6
conda env list
conda activate tf1
pip install tensorflow==1.15
然后Tensorflow1.15就安装成功了!
我说你这几行代码跟我刚才有任何区别吗???
冬冬说,手不一样
可恶哇,给他装到了!
但总之折腾这么久,终于搞定了,我的脸上露出了胜利的微笑!调包侠,变身!
怎么还Error!系统提示我没有安装ipykernel,没有这玩意Jupyter就无法运行代码。
此时我已经心存喜乐,见招拆招,只要安装上ipykernel应该就临门一脚,彻底搞定了!我当场两行
conda install -n tf1 ipykernel --update-deps --force-reinstall
pip install ipykernel
ipykernel显示成功装上了,但系统依然继续提示需要安装ipykernel……
我将正在表演真男人从不回头.jpg的冬冬抓了回来。他说这ipykernel不是有手就能装?然后冬冬用刚才的金手指打下了和我一样的代码
conda install -n tf1 ipykernel --update-deps --force-reinstall
pip install ipykernel
这回系统一视同仁,没有鸟他。冬冬表示,不知道,搞不定。可能他手刚刚抠了鼻屎吧。
正当我陷入迷茫之时,一旁的向帅突然举手了!他淡淡地说了一句:“我想试试。”
向帅篇
向帅是我们组研二的师弟,比我小7岁,很帅,单身,码力震古烁今,只要单手就可以写出一个化工厂的故障诊断软件。导师扔给他n个任务,他可以在O(1/n)的时间复杂度内完成!
而且你不管什么时候打开Steam,他都在线,他《刺客信条》全系列白金!虽然这两点好像和他编程厉害没啥关系,但一个连刺客信条都能白金的人,显然不是什么正常人。
我邀请向帅坐在我的座位上,我跪在旁边安静地看着。向帅打开了一个我看不太明白的界面,双手在键盘上飞快地敲linux命令,不过仔细看的话好像大部分时候是敲错了在往回删。
大概20分钟后,他长叹了一口气。
我凑上去看了一眼,挺厉害的,不仅刚才装ipykernel的问题没解决,现在连刚建的虚拟环境都进不去了。
向帅的声音有些颤抖,表示Everything is under control。他又埋头敲下更多的命令,cd ls rm满天乱飞。在我们这个暖气很差的办公室里,他的额头上竟然流下了汗水。
我说,我能不解决这个问题了吗?我不想调这个包了,你给我把一切恢复到你来之前的样子就行。
他说,有些事情是回不去的,而且码农精神就是要不服输,我们应当征服linux而不是被linux征服,不是吗?
听到这里,一直沉默的阳仔突然说话了:“linux?谁在说linux?”
阳仔篇
其实大家在上文中已经见过阳仔了
阳仔今年博四,比我小4岁,码力炉火纯青,基本是Linus先生中国分Li。他的人生0 error 0 warning,我丝毫不怀疑他真的可以10分钟黑进五角大楼,他就是服务器的化身!
这是他自己说的
阳仔看都没看,就拿起一个U盘插入我的主机,让我安装这个
ms-toolsai.jupyter-2021.8.2041215044。
我说你刚不是在睡觉么,你知道发生了什么事吗?他说你这个问题我太懂了,睡着觉都能给你解决。
这一切熟练得仿佛他就是为了解决这个问题而生的。
此时我桌边的人已经越来越多,大家甚至组成了一个人大校徽。
这个bug已经超越了bug本身,变成了一个武侠擂台,小小的ipykernel成了一屋人码力的试金石。看来阳仔才是最终的擂主啊。
过了一会,阳仔问我,那个有点不好意思,你刚才是什么问题来着?我说虚拟环境装不上ipykernel。阳仔说哦原来不是我想的那个问题啊,那我撤了。
已经4点了,而我的电脑还是一团浆糊。旁边的黄宝已经在下班吃饭倒计时1小时报时了。
大家围着我的工位一片欢声笑语,吃着零食,聊起了F1、网球和冰冰最近水的视频,相约哪天一定要去温州现场看一次温网。仿佛没人记得,他们围着我工位的初心是为了debug的。
这时向帅若有所思地说:“我想再试试。”他梅开二度,又坐在了我的工位上。
我已经不报什么希望了,开始在边上带领大家做起了拉伸运动。突然,向帅猛敲了一下我2000块的键盘,怒吼一声“搞定了!”
我定睛一看,Jupyter的代码单元格左下角,出现了一个小小的绿勾。那是一个神圣的绿勾,一个胜利的绿勾!我的键盘上还残留着向帅手指的清香!
此时向帅已经以真男人从不回头.jpg的姿势回到了自己的工位,整个办公室爆发出了雷鸣般的掌声。
向帅说,不知道为啥今天conda默认安装的ipykernel不是最新版的。所以在conda install ipykernel后面加一行conda upgrade ipykernel就好了……这bug真的很诡异,很难发现……
5点整,黄宝进行了下班吃饭准点报时。折腾了一下午,大家都筋疲力尽(主要是聊天和笑累了)。我们开心地复盘了今天的全过程,可惜无人能分享,只好讲给呋喃听。
呋喃说ipykernel在12月1号从6.5.1版Release了6.6.0版,你们的bug可能来自于这。
最后给大家两点经验:
1、代码跑不出来,先检查各种版本问题!
2、人啊,还是要有好兄弟!
参考文献
1、Zheng, Shaodong, and Jinsong Zhao. "A Self-Adaptive Temporal-Spatial Self-Training Algorithm for Semi-Supervised Fault Diagnosis of Industrial Processes." IEEE Transactions on Industrial Informatics (2021).
2、Wu, Deyang, and Jinsong Zhao. "Process topology convolutional network model for chemical process fault diagnosis." Process Safety and Environmental Protection 150 (2021): 93-109.
3、Xiang, Shuaiyu, Yiming Bai, and Jinsong Zhao. "Medium-term Prediction of Key Chemical Process Parameter Trend with Small Data." Chemical Engineering Science (2021): 117361.
(本文并没有参考这些文献,但这是冬冬、阳仔、向帅最近发的,文笔清晰,配图优美,希望大家写paper的时候可以引一下,明年我们评上奖学金请大家吃饭,谢谢)