痛點(diǎn)
我組織過(guò)幾次線下編程工作坊,帶著同學(xué)們用Python處理數(shù)據(jù)科學(xué)問(wèn)題。
其中最讓人頭疼的,就是運(yùn)行環(huán)境的安裝。
實(shí)事求是地講,參加工作坊之前,我已經(jīng)做了認(rèn)真準(zhǔn)備。
例如集成環(huán)境,選用了對(duì)用戶很友好的Anaconda。
代碼在我的Macbook電腦上跑,沒(méi)有問(wèn)題。還拿到學(xué)生的Windows 7上跑,也沒(méi)有問(wèn)題。這才上傳到了Github。
在發(fā)布的教程文章里,我也已經(jīng)把安裝軟件包的說(shuō)明寫(xiě)得非常詳細(xì)。
還針對(duì) Anaconda 這一 Python 運(yùn)行環(huán)境的安裝和運(yùn)行,專門錄制了視頻。
但是,工作坊現(xiàn)場(chǎng)遇見(jiàn)的問(wèn)題,依然五花八門。
有的是操作系統(tǒng)。例如你可能用Windows 10。實(shí)話實(shí)說(shuō),我確實(shí)沒(méi)用過(guò)。拿著Surface端詳,連安裝后的Anaconda文件夾都找不到在哪兒。
有的是編碼。不同操作系統(tǒng),有的默認(rèn)中文編碼是UTF-8,有的是GBK。同樣一段中文文本,我這里顯示一切正常,你那里就是亂碼。
有的是套件路徑。來(lái)參加工作坊前,你可能看過(guò)我一些教程,并安裝了 Python 2.7 版本 Anaconda。來(lái)到現(xiàn)場(chǎng),一看需要 Python 3.6 版本,你就又安裝了一份新的。結(jié)果執(zhí)行起來(lái),你根本分不清運(yùn)行的 Python, pip 命令來(lái)自哪一個(gè)套件,更搞不清楚軟件包究竟安裝到哪里去了。再加上虛擬環(huán)境配置,你就要抓狂了。
還有的,甚至是網(wǎng)絡(luò)擁塞問(wèn)題。因?yàn)橛袝r(shí)需要現(xiàn)場(chǎng)安裝調(diào)用體積龐大的軟件包,幾十臺(tái)電腦“預(yù)備——齊”一起爭(zhēng)搶有限的Wifi帶寬,后果可想而知。
痛定思痛,我決定改變一下現(xiàn)狀。
目前的教程只提供基礎(chǔ)源代碼。對(duì)于許多新手同學(xué)來(lái)說(shuō),是不夠的。
許多同學(xué),就倒在了安裝依賴軟件包的路上,繼而干脆放棄了。
變通的辦法有許多。例如干脆錄制代碼執(zhí)行視頻給你看。
但是正如我在《MOOC教學(xué),什么最重要?》一文中說(shuō)過(guò)的,學(xué)習(xí)過(guò)程里,反饋?zhàn)钪匾?/p>
你需要能運(yùn)行代碼,并且第一時(shí)間獲得結(jié)果反饋。
在此基礎(chǔ)上,你還得能修改代碼,對(duì)比前后執(zhí)行結(jié)果的差別。
我得給你提供一個(gè)直接可以運(yùn)行的環(huán)境。
零安裝,自然也就沒(méi)了上述煩惱。
這個(gè)事兒可能嗎?
我研究了一下,沒(méi)問(wèn)題。
只要你的設(shè)備上有個(gè)現(xiàn)代化瀏覽器(包括但不限于Google Chrome, Firefox, Safari和Microsoft Edge等)就行。
IE 8.0?
那個(gè)不行,趕緊升級(jí)吧!
讀到這里,你應(yīng)該想明白了。因?yàn)橹惶魹g覽器,不挑操作系統(tǒng),所以別說(shuō)你用Windows 10,你就是用iPad,都能運(yùn)行代碼。
嘗試
請(qǐng)你打開(kāi)瀏覽器,輸入這個(gè)鏈接(http://t.cn/R35fElv)。
看看會(huì)發(fā)生什么?
我這里用iPad給你演示。
一開(kāi)始會(huì)有個(gè)啟動(dòng)界面出來(lái)。請(qǐng)你稍等10幾秒鐘。
然后,你就能看到熟悉的Python代碼運(yùn)行界面了。
這個(gè)界面來(lái)自 Jupyter Lab。
你可以將它理解為 Jupyter Notebook 的增強(qiáng)版,它具備以下特征:
代碼單元直接鼠標(biāo)拖動(dòng);
一個(gè)瀏覽器標(biāo)簽,可打開(kāi)多個(gè)Notebook,而且分別使用不同的Kernel;
提供實(shí)時(shí)渲染的Markdown編輯器;
完整的文件瀏覽器;
CSV數(shù)據(jù)文件快速瀏覽
……
圖中左側(cè)分欄,是工作目錄下的全部文件。
右側(cè)打開(kāi)的,是咱們要使用的ipynb文件。
為了證明這不是逗你玩兒,請(qǐng)你點(diǎn)擊右側(cè)代碼上方工具欄的運(yùn)行按鈕。
點(diǎn)擊一下,就會(huì)運(yùn)行出當(dāng)前所在代碼單元的結(jié)果。
不斷點(diǎn)擊下來(lái),你可以看見(jiàn),結(jié)果都被正常渲染。
連圖像也能正常顯示。
甚至連下面這種需要一定運(yùn)算量的可視化結(jié)果,都沒(méi)問(wèn)題。
為了證明這不是變魔術(shù),你可以在新的單元格,寫(xiě)一行輸出語(yǔ)句。
就讓Python輸出你的名字吧。
假如你叫 Chuck,就這樣寫(xiě):
print(“Hello, Chuck!”)
把它替換成你自己的姓名,看看輸出結(jié)果是否正確?
其實(shí),又何止是iPad而已?
你如果足夠勇(sang) 于(xin) 嘗(bing) 試(kuang),手機(jī)其實(shí)也是可以的。
就像這樣。
流程
下面我給你講講,這種效果是怎么做出來(lái)的。
我們需要用到一款工具,叫做 mybinder 。它可以幫助我們,把 github 上的某個(gè)代碼倉(cāng)庫(kù)(repo),快速轉(zhuǎn)換成為一個(gè)可運(yùn)行的環(huán)境。
注意 mybinder 為我們提供了云設(shè)施,也就是計(jì)算資源和存儲(chǔ)資源。因此即便許許多多的用戶同時(shí)在線使用同一份代碼轉(zhuǎn)換出來(lái)的環(huán)境,也不會(huì)互相沖突。
我們先來(lái)看看,怎么準(zhǔn)備一個(gè)可供 mybinder 順利轉(zhuǎn)換的代碼倉(cāng)庫(kù)。
我為你提供的樣例在這里(http://t.cn/R35MEqk):
順便說(shuō)一句,這個(gè)樣例來(lái)自于我的數(shù)據(jù)科學(xué)系列教程之《如何用Python處理自然語(yǔ)言?(Spacy與Word Embedding)》。感興趣的同學(xué)可以點(diǎn)擊鏈接,查看原文。
在該 GitHub 頁(yè)面展示的文件列表中,你需要注意以下3個(gè)文件:
demo.ipynb
environment.yml
postBuild
其中demo.ipynb就是你在上一節(jié)看到的包含源代碼的Jupyter Notebook文件。你需要首先在本地安裝相關(guān)軟件包,并且運(yùn)行測(cè)試通過(guò)。
如果在你本地運(yùn)行都有錯(cuò)誤,放到云上去,想必也難以正常運(yùn)行。
environment.yml文件非常重要,它來(lái)告訴 mybinder ,需要如何為你的代碼運(yùn)行準(zhǔn)備環(huán)境。
我們打開(kāi)看看該文件的內(nèi)容:
dependencies: - python=3 - pip: - spacy - ipykernel - scipy - numpy - scikit-learn - matplotlib - pandas - thinc
這個(gè)文件首先告訴 mybinder ,你的 Python 版本。我們采用的是 3.6 版。所以只需要指定 python=3 即可。mybinder 會(huì)自動(dòng)為你下載安裝最新的。
然后這個(gè)文件說(shuō)明需要使用 pip 工具安裝哪些軟件包。我們需要把所有依賴的安裝包都羅列出來(lái)。
這就是之前,我總在教程里給你說(shuō)明的那些準(zhǔn)備步驟。
但是這還沒(méi)有完,因?yàn)?mybinder 只是為你安裝好了一些軟件依賴。
這里還有兩個(gè)步驟需要處理:
為了分析語(yǔ)義,我們需要調(diào)用預(yù)訓(xùn)練的Word2vec模型,這需要 mybinder 為我們提前下載好。
Jupyter Notebook 打開(kāi)后,應(yīng)當(dāng)使用的 kernel 名稱為 wangshuyi ,這個(gè) kernel 目前還沒(méi)有在 Jupyter 里面注冊(cè)。我們需要 mybinder 代勞。
為了完成上述兩個(gè)步驟,你就需要準(zhǔn)備最后一個(gè)postBuild文件。
它的內(nèi)容如下:
python -m spacy download en python -m spacy download en_core_web_lg python -m ipykernel install --user --name=wangshuyi
跟它的名字一樣。它是在 mybinder 依據(jù) environment.yml 安裝了依賴組建后,依次執(zhí)行的命令。如果你的代碼需要其他的命令提供環(huán)境支持,也可以放在這里。
至此,你的準(zhǔn)備工作就算結(jié)束了。
魔法表演正式開(kāi)始。
請(qǐng)打開(kāi) mybinder 的網(wǎng)址(https://mybinder.org/)。
在 “GitHub repo or URL” 一欄,填寫(xiě)我們的 github 代碼倉(cāng)庫(kù)鏈接,即:
https://github.com/wshuyi/demo-spacy-text-processing
我們希望一進(jìn)入界面,就自動(dòng)打開(kāi) demo.ipynb ,因此需要在“Path to a notebook file (optional)”一欄填寫(xiě)demo.ipynb 。
這時(shí),你會(huì)發(fā)現(xiàn)“Copy the URL below and share your Binder with others:”一欄中,出現(xiàn)了你的代碼運(yùn)行環(huán)境網(wǎng)址。
https://mybinder.org/v2/gh/wshuyi/demo-spacy-text-processing/master?filepath=demo.ipynb
點(diǎn)擊右側(cè)的“復(fù)制”按鈕保存到你的記事本里面。將來(lái)找到你轉(zhuǎn)換好的運(yùn)行環(huán)境,就全靠它了。
妥善保存地址后,點(diǎn)擊“Launch”按鈕。
根據(jù)你的依賴安裝包數(shù)量等因素,你需要等待的時(shí)間長(zhǎng)短不一。但是只有第一次構(gòu)建的時(shí)候,需要花一些時(shí)間。
以后每一次調(diào)用執(zhí)行,就都會(huì)非??炝?。
構(gòu)建完畢后, mybinder 會(huì)自動(dòng)為我們開(kāi)啟對(duì)應(yīng)的運(yùn)行環(huán)境。
很有成就感吧!
測(cè)試一下,能夠正常運(yùn)行代碼,就證明我們成功了。
但是你會(huì)發(fā)現(xiàn),不對(duì)??!
老師你剛才用 iPad 展示的,不是高級(jí)版的 Jupyter Lab 嗎?怎么又變成了 Jupyter Notebook 了?
我也想要高級(jí)版!
別著急。
看看你目前的鏈接地址:
https://mybinder.org/v2/gh/wshuyi/demo-spacy-text-processing/master?filepath=demo.ipynb
你只需要做個(gè)小小的調(diào)整,將其中的:
?filepath=
替換為:
?urlpath=lab/tree/
替換后的鏈接為:
https://mybinder.org/v2/gh/wshuyi/demo-spacy-text-processing/master?urlpath=lab/tree/demo.ipynb
把它輸入到瀏覽器,看看出來(lái)的結(jié)果:
這下沒(méi)問(wèn)題了吧?
原理
你是不是覺(jué)得,mybinder 很黑科技?
其實(shí),也不算。
它只是把已有的幾項(xiàng)技術(shù),鏈接了起來(lái)。
這大概也算是“積木式創(chuàng)新”的一個(gè)實(shí)例吧。
我們看看 mybinder 的說(shuō)明:
可以看到,其中最為關(guān)鍵的技術(shù),是用了 docker 。
Docker 是個(gè)什么東西呢?
簡(jiǎn)單來(lái)說(shuō),Docker 就是為了不同平臺(tái)上,都能夠順利執(zhí)行同一份代碼的保障工具。
你有些猶疑,這說(shuō)的不是 Java 嗎?
沒(méi)錯(cuò),Java 的宣傳口號(hào),就是一次編碼,各處運(yùn)行。
它利用虛擬機(jī),來(lái)保障這種能力。
但是,如果你經(jīng)常使用 Java 開(kāi)發(fā)出來(lái)的工具,就應(yīng)該了解痛點(diǎn)有哪些了。
至少,你應(yīng)該對(duì) Java 程序的運(yùn)行速度,有一些體會(huì)。
上圖中,左側(cè)是虛擬機(jī),右側(cè)是Docker。
Docker 不但效率上要強(qiáng)過(guò) Java 虛擬機(jī),而且它支持的編程語(yǔ)言也不僅僅是一種。
至于其他好處,咱們就不展開(kāi)了。否則聽(tīng)起來(lái)像廣告。
其實(shí),把 github 代碼倉(cāng)庫(kù)轉(zhuǎn)換為 docker 鏡像(image)的工作,也不是 mybinder 自己來(lái)做的。
它調(diào)用的,是另外的一個(gè)工具,叫做 repo2docker(https://github.com/jupyter/repo2docker) 。
而你的瀏覽器能夠執(zhí)行 Python 代碼,是因?yàn)?Jupyter Notebook (或者Lab)本來(lái)就是建立在“瀏覽器/服務(wù)器”(Browser / Server, B/S)結(jié)構(gòu)上。
如果你已經(jīng)在本地計(jì)算機(jī)安裝過(guò) Anaconda ,那不妨看看本地執(zhí)行這個(gè)語(yǔ)句:
jupyter lab
會(huì)出現(xiàn)什么?
對(duì),它開(kāi)啟了一個(gè)服務(wù)器,然后打開(kāi)你的瀏覽器,跟這個(gè)服務(wù)器通訊。
Jupyter 的這種設(shè)計(jì),本身就讓它的擴(kuò)展極為方便。
無(wú)論 Jupyter 服務(wù)器是運(yùn)行在你的本地筆記本上,還是擺在另一個(gè)大洲的機(jī)房,對(duì)你執(zhí)行 Python 代碼來(lái)說(shuō),都是沒(méi)有本質(zhì)區(qū)別的。
另外,如果你以為 mybinder 只能讓你在瀏覽器上跑 Python 代碼,那就太小瞧它了。
-
iPad
+關(guān)注
關(guān)注
1文章
1375瀏覽量
81218 -
python
+關(guān)注
關(guān)注
56文章
4797瀏覽量
84688
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論