文章目錄[隱藏]
MLOps介紹
機器學習(xi) 操作 (MLOps,Machine Learning Operations ) 是“機器學習(xi) ”和“工程”的組合,涵蓋了與(yu) 生產(chan) ML 生命周期管理有關(guan) 的所有內(nei) 容。
ML模型生命周期可大致分為(wei) 三個(ge) 階段:
設計
初始階段從(cong) 調查問題開始,然後篩選可選的模型框架。由於(yu) 機器學習(xi) 需要訓練數據,因此我們(men) 還會(hui) 在這一步中調查我們(men) 擁有哪些數據以及是否需要以其他方式獲取數據。
模型開發
開始設計一些機器學習(xi) 算法來解決(jue) 我們(men) 的問題,然後需要進行部分數據分析,選擇特定的模型架構。最後還需要進行驗證和測試,以確保我們(men) 的模型能夠很好地泛化。
操作
操作是創建一個(ge) 自動管道的地方,它確保每當我們(men) 對代碼庫進行更改時,它們(men) 都會(hui) 自動合並到我們(men) 的模型中,這樣我們(men) 就不會(hui) 減慢生產(chan) 速度。同樣重要的還有對已部署模型的持續監控,以確保它們(men) 的行為(wei) 與(yu) 我們(men) 指定的完全一致。
需要注意的是,這三個(ge) 步驟實際上是一個(ge) 循環,這意味著我們(men) 已經成功部署了一個(ge) 機器學習(xi) 模型,這並不是它的結束。比如需求可能會(hui) 發生變化,模型從(cong) 新進行設計階段。
步驟1:確定部署環境
命令行終端
終端是在您的計算機沒有可以與(yu) 之交互的圖形界麵的時候創建的,是為(wei) 計算機的文本界麵。
終端可以任意位置的機器進行操作,可以發送準確的命令。這裏我們(men) 建議大家學習(xi) 使用Linux的終端:
- 跳轉目錄,運行某個程序
- 將程序允許結果重定向到文件
- 查看文件內容,並修改文件
Conda虛擬環境
Conda 是一個(ge) 環境管理器,可以幫助不同項目的依賴項不會(hui) 相互交叉汙染。但是安裝 conda 是一回事,實際使用它是另一回事。
首先要區分pip 和 conda:
- pip用來安裝 python 包(以 python wheels 和發行版的形式),而 conda 也可以安裝用其他語言編寫的包,因為它是從二進製文件安裝的
- pip 以序列化遞歸方式安裝依賴項,這意味著它可能會導致依賴項問題,而conda 在安裝任何東西之前首先檢查所有依賴項以檢查兼容性。
- pip綁定了特定的python版本,而conda可以同時管理多個python版本
在開發多個(ge) 項目,或者需要切換Python時,強烈建議使用 conda 環境。這裏建議大家學習(xi) 使用conda來管理環境:
- 使用 conda 創建和切換環境
- 使用 pip 在該環境中安裝包
當然pip 和 conda 並不是 Python 僅(jin) 有的兩(liang) 個(ge) 環境管理器。Pipenv 是另一種經常使用的替代方案。
編輯器與IDE
Notebook非常適合開發簡單代碼以及解釋和可視化代碼庫。但器學習(xi) 項目需要處理多個(ge) .py 文件,因此要真正“完成工作”,需要一個(ge) 好的編輯器或IDE。
如果你還沒有安裝編輯器,強烈推薦 Visual studio code。當然在終端環境下,我們(men) 推薦掌握 vim。
Notebooks 允許開發人員輕鬆測試我們(men) 的新想法。但是當實際需要部署模型時,它們(men) 通常會(hui) 導致痛點。在開完完成後,將Notebook轉換為(wei) .py 腳本很簡單:
jupyter nbconvert --to=script my_notebook.ipynb
深度學習(xi) 框架
關(guan) 於(yu) 深度學習(xi) 框架,主要由四個(ge) 主導:
- PaddlePaddle
- Pytorch
- JAX
- Tensorflow
我們(men) 不會(hui) 就哪種框架最好進行更長時間的討論,因為(wei) 它毫無意義(yi) 。Pytorch 和 Tensorflow 存在時間最長,因此此時擁有更大的社區和功能集。但這些框架它們(men) 都非常相似,因為(wei) 它們(men) 都具有針對研究和生產(chan) 的特征。
步驟2:代碼管理
在大型團隊中工作時,將不同的人組織和編寫(xie) 代碼的方式的差異最小化是至關(guan) 重要的。
Git
與(yu) 其他人的適當協作將在同一代碼庫上工作,這就是版本控製存在的原因。需要注意的是Github不是git!,Github是一家提供免費存儲(chu) 庫托管的公司。
在使用git時,我們(men) 推薦掌握:
- fork項目,修改代碼
- 提交代碼,合並代碼
代碼組織
代碼組織可以簡單理解為(wei) 代碼目錄,比如安裝代碼存儲(chu) 在什麽(me) 位置,Notebook存儲(chu) 在什麽(me) 位置。常見的項目文件組織如下:
project │ README.md | notebook | data └───src │ │ utils.py | | ... | ...
代碼組織的標準化確實遵循一些特定的規則,從(cong) 而使一個(ge) 人能夠更快地理解另一個(ge) 人的代碼。代碼組織不僅(jin) 是為(wei) 了使代碼更易於(yu) 您維護,而且還便於(yu) 其他人閱讀和理解。
良好的編程習慣
要了解什麽(me) 是良好的編碼習(xi) 慣,重要的是要了解它不是什麽(me) :
- 確保您的代碼快速運行
- 確保您使用特定的編碼範例
- 確保隻使用很少的依賴項
代碼文檔
大多數程序員對文檔都有一種愛恨交加的關(guan) 係:我們(men) 絕對討厭自己編寫(xie) 文檔,但喜歡別人花時間將它添加到他們(men) 的代碼中。
文檔比代碼更容易維護,但也需要更多的時間。好的文檔比編寫(xie) 文檔節省的時間更多。
在文檔下可以記錄從(cong) 代碼中清晰可見的信息,而不是實際上難以理解的複雜部分。而寫(xie) 太多的文檔對大多數人來說會(hui) 產(chan) 生與(yu) 你想要的相反的效果:有太多的東(dong) 西要讀,所以人們(men) 會(hui) 跳過它。
編程風格
當從(cong) 事個(ge) 人項目時,這種編碼風格的差異並不那麽(me) 重要,但當多個(ge) 人一起從(cong) 事同一項目時,考慮這一點很重要。
Pep8 是 python 的官方風格指南,包含了編寫(xie) Python 時被認為(wei) 是“好的做法”和“壞的做法”。
類型聲明 Typing
除了編寫(xie) 文檔和遵循特定樣式之外,在 Python 中也推薦使用Typing。Typing可以追溯到早期的編程語言,如 c、c++ 等。
Typing可以提高代碼的可讀性,可以直接從(cong) 代碼中讀取輸入參數和返回值的預期類型。
數據版本管理
DVC(數據版本控製)是 git 的擴展,它不僅(jin) 可以獲取版本控製數據,還可以獲取一般的模型和實驗。
DVC將隻跟蹤元文件,然後該元文件將指向存儲(chu) 原始數據的某個(ge) 遠程位置。圖元文件本質上用作數據文件的占位符。
步驟3:Docker與可複現性
項目可重複性的非常重要,可重複性與(yu) 科學方法密切相關(guan) :
觀察 -> 問題 -> 假設 -> 實驗 -> 結論 -> 結果 -> 觀察 -> ...
如果實驗是不可重現的,那麽(me) 我們(men) 就不指望別人能得出和我們(men) 一樣的結論。由於(yu) 機器學習(xi) 實驗與(yu) 在實驗室中進行化學實驗基本相同,因此我們(men) 應該同樣小心確保我們(men) 的環境是可重現的。
創建 MLOps 管道的一個(ge) 重要部分是您能夠重現它。為(wei) 了獲得可重複性,我們(men) 需要確定係統環境,例如:
- 操作係統
- 軟件環境
Docker 通過創建獨立的程序提供可重複性。Docker是係統級可重現的,無論在單台機器上還是在 1000 台機器上都沒有關(guan) 係。
Docker主要有三個(ge) 概念:docker file,Docker image和docker container:
- Docker file:是一個基本的文本文檔,包含用戶可以在命令行上調用以運行應用程序的所有命令。包括安裝依賴項、從在線存儲中提取數據、設置代碼以及要運行的命令。
- Docker image:更準確地說構建一個Docker文件將創建一個Docker鏡像。鏡像是一個輕量級的、獨立的/容器化的、可執行的軟件包,其中包括使應用程序運行所需的一切。
- Docker container:運行創建一個 Docker 容器。這意味著可以多次啟動同一個鏡像,從而創建多個容器。
步驟4:調試與分析代碼
調試
調試非常難教,因為(wei) 其是經驗帶來的技能之一。我們(men) 可能都熟悉在我們(men) 的代碼中到處插入 print(...) 語句,這可以幫助我們(men) 縮小問題發生的範圍。但處理非常大的代碼庫時,print就不是一種很好的調試方式。
要在 python 調試器中調用構建,可以通過調用設置跟蹤:
import pdb pdb.set_trace()
性能優(you) 化
分析代碼是為(wei) 了提高代碼的性能。在優(you) 化代碼之前首先需要明確兩(liang) 個(ge) 問題:
- 我的代碼中每個方法被調用了多少次?
- 每種方法需要多長時間?
第一個(ge) 問題對優(you) 先級優(you) 化很重要。如果兩(liang) 個(ge) 方法 A 和 B 的運行時間大致相同,但 A 的調用次數比 B 多 1000 次,如果我們(men) 想加速代碼,我們(men) 可能應該花時間優(you) 化 A 而不是 B。
通過探查器可以幫助您找到代碼中的瓶頸。cProfile 是 pythons 內(nei) 置的分析器,可以幫助您了解程序中涉及的所有函數和方法的運行時概況。
實驗日誌
實驗記錄或模型監控是了解模型正在發生的事情,它可以幫助調試模型。最基本的日誌記錄是將模型生成的指標寫(xie) 入終端或文件以供以後檢查。
在進行較小的實驗或單獨處理一個(ge) 項目時,這種工作流程可能就足夠了,但是在與(yu) 他人合作進行大規模實驗時,合適的實驗跟蹤器和可視化工具更加重要。
有許多工具可用於(yu) 記錄實驗:
- Tensorboard
- Comet
- MLFlow
- Neptune
- Weights and Bias
Trainer模板
模板描述了任何標準化的文本、副本、文檔、方法或程序,可以在不對原始文件進行重大更改的情況下再次使用。
但這與(yu) 機器學習(xi) 項目有什麽(me) 關(guan) 係?如果你已經在機器學習(xi) 領域嚐試過幾個(ge) 項目,可能會(hui) 看到一個(ge) 模式:每個(ge) 項目通常都包含以下三個(ge) 方麵的代碼:
- 模型實現
- 模型訓練代碼
- 保存模型和日誌代碼
雖然後兩(liang) 者看起來當然很重要,但在大多數情況下,實際的開發或研究往往圍繞著定義(yi) 模型展開。
從(cong) 這個(ge) 意義(yi) 上說,訓練代碼和實用程序都變成了樣板,應該從(cong) 一個(ge) 項目轉移到另一個(ge) 項目。但問題通常是我們(men) 沒有概括我們(men) 的訓練代碼來處理未來項目中可能需要的小調整,因此我們(men) 每次開始一個(ge) 新項目時都會(hui) 一遍又一遍地實施它。
Pytorch 生態係統中最受歡迎的高級(訓練)框架是:
- fast.ai
- Ignite
- skorch
- Catalyst
- Composer
- Pytorch Lightning
它們(men) 都提供許多相同的功能,因此對於(yu) 大多數項目來說,選擇一個(ge) 而不是另一個(ge) 並不重要。
步驟5:持續集成
持續集成是訓練數據或數據處理,更新模型架構,基本所有任何代碼更改都會(hui) 對最終結果產(chan) 生影響。
在討論持續集成時,許多開發人員經常想到的是代碼測試。CI 應該確保無論何時更新代碼庫,它都會(hui) 自動進行測試,這樣如果代碼庫中引入了錯誤,就會(hui) 及早發現。
我們(men) 將要查看的測試類型稱為(wei) 單元測試。單元測試是指編寫(xie) 測試代碼庫的各個(ge) 部分以測試其正確性的測試實踐。Python 提供了幾個(ge) 不同的庫來編寫(xie) 測試,比較常用的是pytest。
步驟6:部署模型
當我們(men) 談論請求時,本質上是在談論客戶端-服務器類型的架構中使用的通信方法。在此架構中客戶端(用戶)將向服務器(我們(men) 的機器學習(xi) 應用程序)發送請求,服務器將給出響應。
HTTP協議
發送請求的常用方式稱為(wei) HTTP。它本質上是對客戶端和服務器之間的中間傳(chuan) 輸方式的一種規範。一個(ge) HTTP 請求基本上由兩(liang) 部分組成:
- 請求 URL:服務器的位置
- 請求方法:執行什麽操作
常見的請求方式有(區分大小寫(xie) ):
- GET:從服務器獲取數據
- POST/PUT:向服務器發送數據
- DELETE:刪除服務器上的數據
本地部署
模型提供服務的第一個(ge) 起點應該始終是在本地部署它。部署到雲(yun) 比本地部署花費的時間要長得多。因此本地應該始終是任何新應用程序的第一步。
編譯是將用一種語言編寫(xie) 的計算機程序翻譯成另一種語言的任務。在大多數情況下,這意味著采用您使用首選編程語言編寫(xie) 的任何內(nei) 容,並將其翻譯成計算機可以執行的機器代碼。Pytorch 自帶編譯器,可以幫你優(you) 化模型。它可以在子模塊 torch.jit 中找到。
評論已經被關(guan) 閉。