在影視作品中,程式設計師多以技術大神的形象出現。
他們經常在電腦上隨意插一個隨身碟,對著黑色的介面飛速敲下綠色的程式碼,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分鐘黑進五角大樓,他就是伺服器的化身!
這是他自己說的
陽仔看都沒看,就拿起一個隨身碟插入我的主機,讓我安裝這個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的時候可以引一下,明年我們評上獎學金請大家吃飯,謝謝)