手把手教程:Linux服務(wù)器-flask部署深度學(xué)習(xí)模型

Linux服務(wù)器-flask部署深度學(xué)習(xí)模型

1.首先本地構(gòu)建DL模型

根據(jù)自己的實際業(yè)務(wù)場景構(gòu)建ML羹奉、DL模型,訓(xùn)練模型约计,并保存自己需要的模型诀拭,這里就不用過多贅述了。

2.本地跑通mac-將題目分類模型轉(zhuǎn)換為Web應(yīng)用程序

在原本的項目文件夾中新增如下幾個文件:

app.py

templates/

? ? ? ? home.html

? ? ? ? result.html

static/

? ? ? ? style.css

如圖:


目錄

子目錄templates是Flask在Web瀏覽器中查找靜態(tài)HTML文件的目錄煤蚌。

2.1 app.py代碼

from flask import Flask,render_template,url_for,request

from lstm_clf import get_title_text_label

app = Flask(__name__)

@app.route('/')

def home():

? ? return render_template('home.html')

@app.route('/predict',methods=['POST'])

def predict():

? ? if request.method == 'POST':

? ? ? ? message = request.form['message']

? ? ? ? y_label = get_title_text_label(message)

? ? return render_template('result.html',prediction = y_label)

if __name__ == '__main__':

? ? app.run(host='0.0.0.0', port=5018,debug=True)

app.py文件包含將由Python解釋器執(zhí)行以運行Flask Web應(yīng)用程序的主代碼

1耕挨、我們將應(yīng)用程序作為單個模塊運行细卧,因此我們使用參數(shù)初始化了一個新的Flask實例,__name__是為了讓Flask知道它可以在templates所在的同一目錄中找到HTML模板文件夾()筒占。

2贪庙、接下來,我們使用route decorator(@app.route('/'))來指定可以觸發(fā)home?函數(shù)執(zhí)行的URL?翰苫。我們的home?函數(shù)只是呈現(xiàn)home.htmlHTML文件止邮,該文件位于templates文件夾中。

3革骨、在predict函數(shù)內(nèi)部农尖,封裝了一個get_title_text_label(text)函數(shù)析恋,這個函數(shù)是對之前保存模型的封裝及使用良哲,通過訪問用戶輸入信息,傳入get_title_text_label(message)函數(shù)助隧,就會對輸入的數(shù)學(xué)題目文本進(jìn)行分類筑凫,返回預(yù)測的分類標(biāo)簽。

4并村、我們使用該POST方法將表單數(shù)據(jù)傳輸?shù)椒?wù)器巍实。最后,通過debug=True在app.run方法中設(shè)置參數(shù)哩牍,進(jìn)一步激活Flask的調(diào)試器棚潦。

5、最后膝昆,使用run函數(shù)執(zhí)行在服務(wù)器上的腳本文件丸边,我們需要確保使用if語句?__name__ == '__main__'。

2.2 home.html

以下是home.html將呈現(xiàn)文本表單的文件的內(nèi)容荚孵,用戶可以在其中輸入數(shù)學(xué)題目文本:

<!DOCTYPE html>

<html>

<head>

? ? <title>Home</title>

? ? <!--<link rel="stylesheet" type="text/css" href="../static/styles.css">-->

? ? <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/styles.css') }}">

</head>

<body>

? ? <header>

? ? ? ? <div class="container">

? ? ? ? <div id="brandname">

? ? ? ? ? ? <h2 style="color:black;text-align:center;">Mathematical Problem Classifier</h2>

? ? ? ? </div>

? ? </div>

? ? </header>

? ? <div class="ml-container" >

? ? ? ? <form action="{{ url_for('predict')}}" method="POST">

? ? ? ? <p style="color:blue;font-size:20px;text-align:center;">Enter Your Mathematical Problem Here</p>

? ? ? ? <div style="display: flex;justify-content:center;flex-direction: column">

? ? ? ? ? ? <textarea name="message" rows="10" cols="100" style="align-self: center;color:black;font-size:14px;text-align:left;" placeholder="e.g. '{'main': '直線\\{\\begin{matrix}x=-2+t\\\\ y=1-t\\end{matrix}(t為參數(shù))被圓(x-3)^{2}+(y+1)^{2}=25所截得的弦長為(? )', 'options': [], 'subquestions': []}'" ></textarea>

? ? ? ? <br/>

? ? ? ? <input type="submit" class="btn-info" value="predict" style="margin: 0 auto;font-size:18px;text-align:center;">

? ? </div>

? ? </form>

? ? </div>

</body>

</html>

2.3 style.css

在home.html的head部分妹窖,我們將加載styles.css文件,CSS文件是用于確定HTML文檔的外觀和風(fēng)格的收叶。styles.css必須保存在一個名為的子目錄中static骄呼,這是Flask查找靜態(tài)文件(如CSS)的默認(rèn)目錄。

body{

? ? font:15px/1.5 Arial, Helvetica,sans-serif;

? ? padding: auto;

? ? background-color:#f4f3f3;

}

.container{

? ? width:100%;

? ? margin: 0 auto;

? ? overflow: hidden;

}

header{

? ? background:#03A9F4;

? ? border-bottom:#448AFF 3px solid;

? ? height:120px;

? ? width:100%;

? ? padding-top:30px;

}

.main-header{

? ? ? ? ? ? text-align:center;

? ? ? ? ? ? background-color: blue;

? ? ? ? ? ? height:100px;

? ? ? ? ? ? width:100%;

? ? ? ? ? ? margin:0 auto;

? ? ? ? }

#brandname{

? ? float:left;

? ? font-size: 100px;

? ? color: #fff;

? ? /*margin: 10px;*/

}

header h2{

? ? text-align:center;

? ? color:#fff;

}

.btn-info {background-color: #2196F3;

? ? height:40px;

? ? width:100px;} /* Blue */

.btn-info:hover {background: #0b7dda;}

.resultss{

? ? border-radius: 15px 50px;

? ? background: #345fe4;

? ? padding: 20px;

? ? width: 200px;

? ? height: 150px;

}

2.4 result.html

我們創(chuàng)建一個result.html文件判没,該文件將通過函數(shù)render_template('result.html', prediction=my_prediction)返回呈現(xiàn)predict蜓萄,我們在app.py腳本中定義該文件以顯示用戶通過文本字段提交的文本。result.html文件包含以下內(nèi)容:

<!DOCTYPE html>

<html>

<head>

? ? <title></title>

? ? <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/styles.css') }}">

</head>

<body>

? ? <header>

? ? ? ? <div class="container">

? ? ? ? <div id="brandname">

? ? ? ? ? ? <h2 style="color:black;text-align:center;">Mathematical Problem Classifier</h2>

? ? ? ? </div>

? ? </div>

? ? </header>

? ? <p style="color:blue;font-size:20px;text-align:center;"><b>math tag:</b></p>

? ? <div class="results">

? ? <h2 style="color:blue;text-align:center;">{{prediction}}</h2>

? ? </div>

</body>

</html>

從result.htm文件我們可以看到一些代碼使用通常在HTML文件中找不到的語法例如{{prediction}}澄峰,這是jinja語法嫉沽,它用于訪問從HTML文件中請求返回的預(yù)測。

2.5 本地運行app.py

完成上述所有操作后摊阀,可以直接在pycharm中運行app.py文件耻蛇,也可以在mac 終端中切換至項目目錄踪蹬,然后

python app.py

結(jié)果顯示:

pycharm app.py 運行結(jié)果

點擊網(wǎng)址進(jìn)入,顯示以下頁面:


predict之后頁面顯示:


到這里就已經(jīng)本地跑通flask部署web應(yīng)用了臣咖。

2.6 其他

深入了解其原理跃捣,可參見以下文章:

https://www.cnblogs.com/sebastiane-root/p/9365248.html

https://segmentfault.com/a/1190000018807684

3.最后實現(xiàn)linux服務(wù)器部署

Linux常用命令:https://www.cnblogs.com/gaojun/p/3359355.html

3.1首先下載secureCRT 登陸服務(wù)器

詳細(xì)Mac下安裝SecureCRT并激活教程鏈接:

https://blog.csdn.net/gengxiaoming7/article/details/79433940

安裝激活之后登陸

3.2打包項目文件zip,上傳至服務(wù)器并解壓

把自己項目文件打包成zip文件

在服務(wù)器上新建自己的文件夾:mkdir filename

zip文件包上傳至自己的文件夾夺蛇,? secureCRT可以使用 rz 和 sz 命令完成文件的上傳和下載疚漆,rz上傳時,自動跳出文件目錄進(jìn)行選擇刁赦,選擇相應(yīng)文件進(jìn)行選擇即可娶聘。對于需要變更默認(rèn)上傳以及下載文件目錄的,可以進(jìn)行設(shè)置

中文版目錄設(shè)置:??點開 secureCRT 的菜單項中的【選項】 --> 會話選項 --> 打開會話選項對話框 -->點擊分類中的的終端 --> X/Y/Zmodem

英文版目錄設(shè)置:?Options --> session options --> terminal --> X/Y/Zmodem

對上傳的zip包解壓:

解壓zip文件到當(dāng)前目錄 unzip filename.zip

3.3使用nohup啟動flask服務(wù)

上面已經(jīng)完成了項目文件的上傳甚脉,接下來啟動flask服務(wù):

在并發(fā)量不大丸升,僅是開發(fā)環(huán)境試用時,可以試用nohup啟動服務(wù)牺氨,nohup命令詳解鏈接:https://www.cnblogs.com/zq-inlook/p/3577003.html狡耻,下面簡單介紹:

nohup保證部署的服務(wù)在退出SSH客戶端后程序能一直執(zhí)行

nohup /usr/local/python3.6/bin/python3? app.py &

2.執(zhí)行nohup命令的時候,經(jīng)常會出現(xiàn)下面這種沒有寫入權(quán)限的錯誤猴凹。

nohup: ignoring input and appending output to `nohup.out'

解決方案:https://www.cnblogs.com/quchunhui/p/5582371.html

在使用nohup命令的時候夷狰,經(jīng)常由于輸出nohup.out的路徑?jīng)]有寫入權(quán)限,而無法使用nohup郊霎。

這是可以使用Linux重定向的方法沼头,將nohup.out重定向至一個有寫入權(quán)限的路徑,或者直接扔到/dev/null中书劝。

nohup ./program >/dev/null 2>/dev/null &

或者

nohup ./program >/dev/null 2>&1 &

本次使用的是:

nohup /usr/local/python3.6/bin/python3? app.py >/dev/null 2>&1 &

3. 到此為止进倍,就已經(jīng)完成服務(wù)器的flask服務(wù)部署了

訪問網(wǎng)址就可以體驗數(shù)學(xué)題目分類標(biāo)簽預(yù)測服務(wù)了:

IP地址:服務(wù)器的對外地址

端口號:5018是自己程序中設(shè)置的,未被占用的端口號

3.4其他1--關(guān)于端口號被占用的解決方案


端口號被占用

如果端口號被占用本次使用的是:

查看進(jìn)程

ps -ef | grep python3

殺掉進(jìn)程

kill -9 XXXX

詳細(xì)鏈接:https://blog.csdn.net/weixin_42109679/article/details/80578778

關(guān)于LINUX中如何查看某個端口是否被占用:https://blog.csdn.net/yyf960126/article/details/80908823

這樣就可以在app.py中設(shè)置不被占用的端口號

#查看該端口號是否被占用

netstat ?-anp ?|grep ? 端口號

#該命令是查看當(dāng)前所有已經(jīng)使用的端口情況

netstat ? -nultp

3.5 其他2--關(guān)于Python2與Python3出現(xiàn)沖突的問題

如果使用pip install jieba,在服務(wù)器上會默認(rèn)安裝至Python2庄撮,但是我們平時使用的是Python3背捌,所以使用如下命令執(zhí)行:

/usr/local/python3.6/bin/pip install --user jieba

為什么使用--user,也是為了解決?Permission denied這個問題洞斯,防止pip安裝報錯

對于Python執(zhí)行程序時毡庆,也是使用:

/usr/local/python3.6/bin/python3 XX.py

3.6 其他3--對并發(fā),進(jìn)程烙如,線程有要求時么抗,可以使用uwsgi 啟動flask 服務(wù)方式

添加 app.ini文件

代碼如下:

[uwsgi]

master = true

http=0.0.0.0:5018

chdir =項目文件夾地址

wsgi-file=app.py

callable=app

processes=4

threads=2

buffer-size = 65536

socket-timeout = 240

uid = work

gid = work

protocol = uwsgi

詳細(xì)解釋,參考鏈接:https://www.runoob.com/python3/python-uwsgi.html

https://blog.csdn.net/u013421629/article/details/84103873

相關(guān)參數(shù)解釋:

master = true

#啟動主進(jìn)程亚铁,來管理其他進(jìn)程蝇刀,其它的uwsgi進(jìn)程都是這個master進(jìn)程的子進(jìn)程,如果kill這個master進(jìn)程徘溢,相當(dāng)于重啟所有的uwsgi進(jìn)程吞琐。

chdir = /web/www/mysite

#在app加載前切換到當(dāng)前目錄捆探, 指定運行目錄

socket = /test/myapp.sock

#指定socket文件,也可以指定為127.0.0.1:9000站粟,這樣就會監(jiān)聽到網(wǎng)絡(luò)套接字

processes = 2 #啟動2個工作進(jìn)程黍图,生成指定數(shù)目的worker/進(jìn)程

buffer-size = 32768

#設(shè)置用于uwsgi包解析的內(nèi)部緩存區(qū)大小為64k。默認(rèn)是4k奴烙。

服務(wù)器中啟動方式

/usr/local/python3.6/bin/uwsgi app.ini

停止:

-- 停止 uwsgi

pkill -f -9 uwsgi

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末助被,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子切诀,更是在濱河造成了極大的恐慌揩环,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幅虑,死亡現(xiàn)場離奇詭異丰滑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)翘单,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門吨枉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蹦渣,“玉大人哄芜,你說我怎么就攤上這事〖砦ǎ” “怎么了认臊?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長锄奢。 經(jīng)常有香客問我失晴,道長,這世上最難降的妖魔是什么拘央? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任涂屁,我火速辦了婚禮,結(jié)果婚禮上灰伟,老公的妹妹穿的比我還像新娘拆又。我一直安慰自己,他們只是感情好栏账,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布帖族。 她就那樣靜靜地躺著,像睡著了一般挡爵。 火紅的嫁衣襯著肌膚如雪竖般。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天茶鹃,我揣著相機(jī)與錄音涣雕,去河邊找鬼艰亮。 笑死,一個胖子當(dāng)著我的面吹牛挣郭,可吹牛的內(nèi)容都是我干的垃杖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼丈屹,長吁一口氣:“原來是場噩夢啊……” “哼调俘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起旺垒,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤彩库,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后先蒋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骇钦,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年竞漾,在試婚紗的時候發(fā)現(xiàn)自己被綠了眯搭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡业岁,死狀恐怖鳞仙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情笔时,我是刑警寧澤棍好,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站允耿,受9級特大地震影響借笙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜较锡,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一业稼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蚂蕴,春花似錦低散、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至君编,卻和暖如春跨嘉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吃嘿。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工祠乃, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留梦重,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓亮瓷,卻偏偏與公主長得像琴拧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子嘱支,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容