Jupyter可能並非理想的Notebook
Jupyter是一款免費、開源的互動式 web 工具,在數據科學家中備受歡迎。但本文作者卻對這一工具存在很多不滿,認為其不是理想的 Notebook。
據報道,Jupyter notebook 是數據科學家首選的實戰工具。本文展示了從 EDA(探索性數據分析)到API 的快節奏,並沒有Jupyter。
Jupyter的主要特點是:
行內代碼執行
簡單的構思結構
對圖片和數據幀的良好展示
與更加質樸的 iPython 命令行相比,這種整體的靈活性讓它成為了一款首選工具。但是,值得記住的是,這不過是一款 REPL(讀取-求值-輸出-循環),你可以在整個歷史記錄中有效地導航。因此,這並不是一款生產工具。
但是,很多機器學習開發者在生產中都經歷過把一個深度學習 notebook 重構成一個實際演算法時深深的痛苦(reddit 和 Stack Overflow 上也有類似的討論)。
保持精益生產的思想,我們應該努力減少浪費。
簡介
在 Sicara,我們為客戶構建基於機器學習的產品。
機器學習:客戶帶來了業務需求,我們必須儘快提供令人滿意的演算法;
我們構建的產品:我們需要以一種生產就緒的思想來開發產品。演算法被部署在雲端,以 API 等多種形式進行服務和更新。
首先,你肯定需要一個版本控制工具,這對 Jupyter 來說是一種痛苦(在 Reddit 和 quora 上也有相關討論)。不僅僅是針對你的代碼,還有你的實驗。你需要有十足的把握能夠重新運行目前得到的所有結果。結果無法復現對於數據科學家來說多麼常見?
此外,使用 notebook 的人往往容易混淆下面三種用途:
開發:定義一些實用的方法和工具;
調試/應用:用真實的數據運行一段代碼,看看會發生什麼;
可視化:以一種整潔、可復現的輸出來呈現結果。
為了減少浪費,應該明確地定義和分離這些步驟,以便可以在改變一個步驟的時候不會改變其他步驟,反之亦然。我得到的結論是:
為了產生高質量的測試代碼,應該使用一流的 IDE
為了調試代碼,應該使用可視調試工具
為了寫報告,我對表達性標記語言更為滿意(如 markdown、reST 及 LaTeX)
幸運的是,一個配置得當的IDE可以完成所有的事情。例如,如果你來自於R社區的話,你肯定會使用RStudio,它允許你進行這些工作:
本機代碼完成、自動修復等等。
直接的可視調試
使用 Rmarkdown/knitr/Sweave 來生成好看的動態報告。
開發出生產就緒的代碼
只要你想做一個實驗,也就是說,寫一個可以在你的數據上有所作為的方法,你就應該思考一下用法、極限案例等等。在一個單獨的文件、文檔和單元測試中來做。這樣可以確保:
使用你的方法可以達到你的目的;
你的代碼可以安全地用在項目中的其他地方。
因為你必須組織你的工具,所以這會讓你思考流程的結構、你所需要的東西、你最可能改變的東西等等。Python和 R 都支持這種快速測試。最好花十分鐘時間寫一下那些需要十小時調試錯誤輸出的極限案例。
為了清楚起見,單元測試絕不能與定義方法的文件存在於同一個文件夾中。但是使用Jupyter 的話,這點就無法避免了。
調試和顯示
在這一步,你有了全新的功能代碼。是時候在實際的數據上試一試了!這是notebook非常方便的所在了,因其存在單元格機制(cell mechanism)。但這顯然是一次工具切換。你為什麼要放棄具有所有快捷鍵和舒適度的IED,去在web瀏覽器上運行代碼呢?你所需要的是將你的代碼直接在 IDE 中行內執行( inline execution)。
像pycharm這樣的工具就有對這個功能的原生支持:使用一個鍵盤快捷鍵就能夠執行選定的代碼或腳本(在控制台中選擇執行或者執行塊)。此外,它的控制台中運行著iPython,還具有很好的變數工具窗口。在科學模式下,你還可以在IDE中顯示和改變圖像、數據/數組。或者你還可以使用像VSCode或者Atom with Hydrogen這些具備這種功能的工具。
彙報和分享
這裡你應該已經在項目路徑下有了測試代碼,並在數據上運行一個純Python文件。
你已經將代碼在你的IDE中內聯地運行了並檢查了結果,非常棒!你的工作基本已經完成了:現在需要向團隊做彙報了,以證明將你的演算法移植到新的版本中的合理性,或者也許你將要寫一篇論文投稿到下一屆的NeurIPS會議上。
你需要解釋你的邏輯,並逐步證明你的結果。當然你不想在另一個文件中重新輸入所有的內容,這太無聊了。
這就是存在用於文學式編程(literate programming)的工具的原因了。像Sphinx這類文檔工具就是以這種思路構建的:將你的代碼和文檔寫進同一個文件中,並從中生成一個可讀版本。
對於你的 Python notebook,我建議你使用 Pweave。這是我發現的目前為止最好用的 knitr 搬運包。也是一個完全支持 Python cell(或者Python和R的混合)的Rmarkdown。
在任何情況下,我發現使用 Pweave 的
從中生成一個清晰的可分享HTML。每一個注釋行都是markdown解釋的,每個cell(或者代碼塊)都可以被顯示或者被隱藏。
例如,用這個notebook運行(注意特殊的注釋標記#"、# 以及# %%)。
生成如下報告:
我推薦在PyCharm中設置一個外部工具來一鍵發布notebook,配置如下(如有必要,請注意添加環境變數的技巧):
Pweave作為外部工具配置
結論
這不是另一篇《為啥Jupyter notebook糟糕極了》(Why Jupyter notebooks suck )的文章。我對這個流行工具並無任何個人偏見,只是希望分享一些我在使用過程中的個人體驗。尤其是身處一個生產驅動的環境中,我已經進入了另一個工作流程。你怎麼看呢?
本文為機器之心編譯,轉載請聯繫本公眾號獲得授權。
------------------------------------------------
※特朗普簽署啟動美國AI計劃,加速與中國、加拿大AI競賽,爭奪全球領導權
※達闥科技,用柔性智能關節 SCA 定義雲端智能柔性機器人起跑線
TAG:機器之心 |