機器學習專案是如何開發和部署的?
阿新 • • 發佈:2020-05-29
>本文以一個小專案帶你弄清ML的專案流程
這周做作業查資料時,無意中看到一個GitHub專案[ML-web-app](https://github.com/imadelh/ML-web-app),它以PyTorch訓練MNIST文字識別模型為例,介紹了從`模型訓練`到`部署上線`的整個流程。是非常好的學習專案!下圖是效果圖:
![](https://img2020.cnblogs.com/blog/743096/202005/743096-20200528231501301-1898526904.gif)
筆者瀏覽了專案的程式碼,以學習為目的,簡單解讀下這個專案。
## 模型訓練
模型訓練是相對獨立的部分,可以由演算法工程師來做。總結起來就是呼叫PyTorch介面,建立一個神經網路,然後利用MNIST資料進行訓練,**最後把訓練好的模型檔案儲存起來,後面部署的時候要用到**。
## 服務部署
該專案使用Flask框架部署服務,**為了方便閱讀,筆者對程式碼進行了精簡**。
下面的程式碼中,通過載入預訓練好的模型資料,得到模型例項,可以進行預測:
```python
# initialize flask application
app = Flask(__name__)
# Read model to keep it ready all the time
model = MyModel('./ml_model/trained_weights.pth', 'cpu')
```
核心預測API路由,路徑是`/predict`。
```python
@app.route('/predict', methods=['GET','POST'])
def predict():
results = {"prediction" :"Empty", "probability" :{}}
input_img = BytesIO(base64.urlsafe_b64decode(request.form['img']))
res = model.predict(input_img)
return json.dumps(results)
```
## 請求過程
預設主頁是通過模板渲染的,在index.js中定義了兩個核心函式:
1. `onRecognition`函式通過Ajax向`/predict` API路由傳送POST請求,請求中封裝了要識別的圖片,然後獲取模型預測結果。
```javascript
// post data to server for recognition
function onRecognition() {
$.ajax({
url: './predict',
type:'POST',
data : {img : cvsIn.toDataURL("image/png").replace('data:image/png;base64,','') },
}).done(function(data) {
showResult(JSON.parse(data))
})
}
```
2. `showResult`函式把結果渲染出來。
```javascript
function showResult(resultJson){
// show predict digit
divOut.textContent = resultJson.prediction;
// show probability
document.getElementById("probStr").innerHTML =
"Probability : " + resultJson.probability.toFixed(2) + "%";
}
```
## 總結
這個專案麻雀雖小,五臟俱全。可以幫助非演算法類程式設計師一窺ML從建模到上線部署整個流程,透過火爆的趨勢看清本質。
>文章持續更新,可以微信搜尋「 **機器學習與系統** 」閱讀最新內容,回覆**資料**、**內推**、**考研**獲取我為你準備