在影視作品中,程序員多以技術大神的形象出現。
他們經常在電腦上随意插一個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的時候可以引一下,明年我們評上獎學金請大家吃飯,謝謝)
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!