前言
我們在開發機器學習模型 (Python) 時,常會遇到需要把模型發布成API或Web App來供其它客戶端或用戶調用 (俗稱Model-as-a-Service)。
今天介紹兩種我常用的方法,可在幾分鍾內快速實現從本地到Azure的模型部署。
方法1 利用Azure App Services 的內建Kudu Server,把本地git repository發布到Azure
方法2 使用Azure DevOps建立CI/CD pipeline,簡單實現敏捷部署 (Agile deployment)
兩種方法同樣適用於任何常見的Python App發布 (例如Flask,Django)
准備工作
為方便介紹部署方法,我寫個簡單的Python App放在GitHub上:
1. 在本地創建一個空的folder (例如:"deploy-pyhton-on-azure")
2. 執行 git clone https://github.com/jixjia/python-app-azure.git
3. 創建一個Azure App Services用來部署我們的Python App
[注意] 微軟Azure需要用Linux版App Services來部署Python運行環境,部署執行過程會自動創建一個Linux container。
(a) 如圖在Azure上新建一個Web App資源
(b) 選擇Linux作為OS,Runtime設為Python 3.X, 用Code方式發布 (非Container方式)
(c) 選擇免費的F1 Plan來部署我們的App。該Plan只適合用來Dev/Test,不推薦Production環境
至此前期准備工作完成!
部署方法1 - 利用Kudu Server
微軟Azure有內建的App部署服務叫Kudu。這個方法最為簡潔,只需git push到Kudu的Git URL即可完成部署,特別適合小型項目或單人開發使用。
1. 在新建的Web App里找到 Deployment Center
(1) 依次選擇 Local Git > App Service Build Service
(2) 得到一個部署專用的Git URL (如圖示),復制它!
2. 把得到的Git URL 加入本地 git remote repository列表
(1) 執行 git remote add azure {粘貼得到的Git URL}
(2) 用git remote -v 查看repository列表,確認Kudu Git URL被成功加入進去
3. 最后用 git push 將本地Python App推送到Kudu
此時Kudu后在后台會自動執行以下工作:
(1) 打包你的Python App
(2) 創建Python 3.X 虛擬環境
(3) 安裝dependency (即 pip install requirements.txt)
(4) 部署到Azure上!
成功部署后,打開瀏覽器訪問 http://{你的web app名}.azurewebsites.net,可以看到我們的Python App已成功發布到Azure上!
該App會獲取訪問者IP地址,解析並顯示地理信息 (如圖所示)
部署方法2 - 利用Azure DevOps建立自動CI/CD pipeline
盡管使用方法1 (Kudu) 只要3步就能很容易發布我們的Python App, 但我個人建議利用敏捷開發工具 (如 Azure DevOps, Jenkins) 來實現 CI/CD自動化部署。
1. 在dev.azure.com (Azure DevOps) 上新建一個Project
2. 授權該Project訪問Azure的資源,以自動化部署我們的Python App
(1) 新建一個 Service Connection
(2) 選擇允許訪問的Azure訂閱 (Subscription) 及資源組 (Resource Group)
3. 創建並配置CI/CD Pipeline
(1) 選擇Pipelines > 創建一個新的Pipeline
(2) 依次選 GitHub (YAML) > 你的GitHub Repository > Python to Linux Web App
(3) 此時系統會自動生成Python的部署模板 (稱為 "azure-pipelines.yml")。這里需要在模板上做兩個小更改,如下圖示:
A> 在中間script部分,"antenv"虛擬環境名稱后加上$(pythonVersion)變量
python -m venv antenv$(pythonVersion)
source antenv$(pythonVersion)/bin/activate
B> 在模板最后加上 appType: webAppLinux
(4) 編輯完成后,選擇 "Save and Run"。此時點擊 Pipeline Run 可以看到CI/CD pipeline在安裝和部署我們的Python App。
每當有新的Pull Request進來后,該pipeline就會自動執行部署任務而無需人為操作,從而實現敏捷開發和敏捷部署。
成功執行Pipeline后,依舊可在 http://{你的web app名}.azurewebsites.net里看到我們的Python App。
由於兩次部署間沒做任何改變,所以顯示內容除了時間和隨機的Host Name外都是一樣的:
總結
今天分享了兩種簡潔的方法用來快速實現Python App從本地到雲的部署。
無論是把機器學習模型發布成Web service API,或者提供一個有用戶界面的交互型Web App,我們都可以利用以上兩種方法來快速實現App的發布。
最后,如果需要debug或調試部署的App,可用下面的URL:http://{你的web app名}.scm.azurewebsites.net
來SSH到hosting server進行調試,或查看實時Log Stream做debug:
Jixin Jia