不要將資料科學筆記本放進生產環境
我們遇過許多客戶有興趣將資料科學家開發的運算筆記本,直接放入生產應用程式的程式碼庫中。資料科學概念確實需要從筆記本轉移到生產環境,但嘗試將筆記本部署為程式碼成品會破壞許多良好的軟體實務。可以預見的是,這會導致一些已觀察到的痛點。這種行為是更深層問題的徵兆:資料科學家與軟體開發人員之間缺乏協作。
2020 年 11 月 18 日
首先,讓我們說明什麼是運算筆記本。筆記本起源於 Wolfram Mathematica 語言,這個概念現在在資料科學社群中相當流行,特別是 Python 和 R 使用者。基本上,它是整合了部分視覺化和文件說明的指令碼組合。您可以看到已執行的程式碼和結果,無論是純文字、格式良好的表格或圖形。文件說明可以解釋正在發生的事情,使其對教學很有用。筆記本基本上是一個更好的互動式殼層,可以在其中儲存指令碼並輕鬆地重新執行變更。圖形或輸出就在一個視窗中,而不是儲存在檔案中的其他地方或彈出在其他視窗中。互動式工作階段可以儲存在一個檔案中並分享,以便任何其他人(在特定條件下)都可以執行它並得到相同的結果。
筆記本基本上擅長兩件事。它們為執行互動式探索性工作的資料科學家提供了一個不錯的互動式殼層。它們也適合用於示範。它們不是執行資料科學的關鍵工具,許多資料科學家根本不使用它們。
筆記本與試算表有許多共同的特點,優缺點也類似。首先,談談優點。它們讓沒有太多程式設計技能的人也能執行有用的量化工作。筆記本基本上是指令碼,而指令碼編寫是一般程式設計的第一步。例如,Excel 也允許指令碼編寫,例如使用公式。而且,人們也可以透過拖放操作執行許多有用的工作。這兩種工具都將儲存(程式碼和資料)、視覺化和商業邏輯考量結合在一個應用程式中。
讓一個工具成為各種考量的「一站式服務」既有優點也有缺點。優點是簡單的事情可以簡單處理。為什麼我要使用資料庫、Java 應用程式和 Javascript 前端,只為了執行一些簡單的運算,計算我新創公司雇用 12 名員工的薪資?這就是試算表的強項。但這並不表示試算表應該用來處理大型國際銀行的薪資。而它們沒有用於此用途,是有充分理由的。那些情況更為複雜。變數更多。它們有稽核需求。資料可能很大,等等。
團隊人員可以成功建置大型應用程式來解決複雜問題,但前提是他們能控制複雜性。而我們有很少的工具可以做到這一點。最重要的就是將其分解成許多較小、耦合度較低的子問題。這就是為什麼在簡報領域資料分層模式中,我們會將使用者介面、領域邏輯和儲存分開。我們可以專注於運算如何執行,而不會被其顯示方式或資料存取方式分心。
將筆記本放入生產流程中,實際上就是將所有實驗程式碼放入生產程式碼庫中。其中許多程式碼與生產行為無關,因此會讓未來修改程式碼的人感到困惑。筆記本也是一個功能齊全的殼層,將其包含在生產系統中很危險。安全操作需要可重製性和可稽核性,而且通常會避免在生產環境中進行手動修改。即使是善意的人也可能犯錯並造成意外傷害。
我們需要放入生產環境的是最終的領域邏輯和(有時是)視覺化。在多數情況下,這並不困難,因為大多數筆記本並不複雜。它們只鼓勵線性指令碼編寫,通常很小且容易提取並放入完整的程式碼庫中。如果它更複雜,我們怎麼知道它能運作?這些指令碼對於幾行程式碼來說很好,但對於幾十行程式碼來說就不行了。你通常會想要將其分解成較小、模組化且可測試的區塊,這樣你才能確定它實際上能運作,而且也許以後可以重複使用程式碼,而不用重複編寫。
因此我們認為,讓筆記本直接在生產環境中執行通常並非有幫助或安全的做法。將其納入結構化的程式碼庫中也不困難。那麼,為什麼有人會討論如何將筆記本生產化呢?問題的本質在於,資料科學家和軟體開發人員之間的溝通並不總是順暢,也無法理解對方需要做什麼。許多資料科學家並未真正理解專業軟體開發人員的考量,例如自動化、可重複和可稽核的建置,或徹底測試的需求和流程,以及良好設計在使程式碼庫可支援和靈活方面的重要性。反過來,許多軟體開發人員也並未真正理解資料科學家在做什麼。
雖然兩種人通常可以在不了解對方具體工作內容的情況下順利合作,但這通常並非其中一種情況。當資料科學家和開發人員可以分享知識,並進一步了解對方需要做什麼以及他們為何以這種方式做事時,將會帶來巨大的好處。換句話說,資料科學家應努力學習軟體開發,並完全融入負責交付生產軟體的交付團隊中。他們不必在這方面達到滿載,但應充分了解基礎知識,並持續學習與其在團隊中的工作最相關的領域。
他們會發現,使用許多軟體開發技術實際上會讓他們作為資料科學家的生產力更高。他們會發現,當他們適當地建構程式碼時,他們可以處理更複雜的任務,並花更少的時間進行除錯。開發人員會發現,當他們花時間進一步了解實際發生的事情時,他們可以更好地利用資料科學模型和方法。雙方都不需要在另一個領域中具備完全的技能,但他們至少應具備其基礎知識。
筆記本是互動式資料探勘的有用工具,這是資料科學家在專案早期階段或探索新技術時的主要活動。但一旦確定方法後,重點需要轉移到圍繞此方法建立結構化的程式碼庫,同時保留一些實驗能力。關鍵是將實驗能力建置到管道本身中。一個範例是包含機器學習模型註冊,允許使用者在執行時間或建置時間修改參數,並將結果(例如效能指標)儲存在資料儲存中。這具有實驗總是可重複的優點,因為它們使用版本化程式碼執行,並且其結果會保留下來以供比較,並作為進度的可證明標記。這可確保任何效果差異都可以證明來自預期的原因,這是任何良好實驗的標誌。畢竟,目標是瞭解對生產軟體的哪些變更將創造更多業務價值。實驗環境與實際實作之間的差距越小,我們就越能確信變更確實創造了價值。另一個關鍵概念是建置資料科學管道,以便它們可以在多個環境中執行,例如,在生產伺服器、建置伺服器和您的筆記型電腦等本機環境中。這使得更多實驗可能性得以實現,而不會中斷生產中發生的任何事情。
總之,我們認為有關如何將資料科學筆記本製成產品的討論錯失了重點。目標應該是讓資料科學家及其整個傳遞團隊齊聚一堂,並建置提供所需業務功能的軟體,同時仍保留實驗和改進的能力。這需要在初始探索階段後退出筆記本式開發,而不是使其成為需要持續整合支援的持續工作模式。這種工作方式不僅讓資料科學家能夠持續改進工作軟體,還讓他們參與向其業務利害關係人傳遞工作軟體和實際價值的責任。
重大修訂
2020 年 11 月 18 日:發布