項目中使用了gensim計算帖子向量和相似度,model文件已經訓練好,但是在運行的過程中發現,模型加載十分緩慢,需要大約1-2分鍾,我們不能讓用戶等那么長時間,於是得想辦法
想法,是否可以將其打包為api的方式,資源只需加載一次模型,然后利用即可,消耗小,速度快
查找各方資料比較中意的有2個方案Django和Flask,2者都是python的web服務框架,區別 Django 是一個重量級的框架,Flask是一個輕量型的框架;
這里我們嘗試利用Flask解決該問題
首先安裝需要的依賴
pip install Flask
然后寫了一段測試代碼
from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" if __name__ == "__main__": app.run()
運行代碼
python hello.py
Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead. Running on http://localhost:5000/
這里有一個警告,flask需要使用 WSGI 啟動,這里測試代碼可以先不管,我這邊是編寫完之后解決的這個問題
利用WSGI啟動(這塊可以最后操作)
pip install Gevent
from gevent.pywsgi import WSGIServer http_server = WSGIServer(('', 5000), app) http_server.serve_forever()
下面是我編寫的完整代碼
# coding=utf-8 import re, json, time, sys, os import gensim curPath = os.path.abspath(os.path.dirname(__file__)) rootPath = os.path.split(curPath)[0] sys.path.append(rootPath) from setting.default import * from flask import Flask, request, jsonify from gensim.models.doc2vec import Doc2Vec, TaggedDocument from gevent.pywsgi import WSGIServer app = Flask(__name__) app.config['JSON_AS_ASCII'] = False @app.route("/") def index(): return 'hello word!' @app.route("/get_content_similar", methods=['GET']) def get_content_similar(): # 請求參數接收 words = request.args.get("words") # 分割為數組 seg_list = words.split(',') # 預測向量 vector = model_dm.infer_vector(seg_list, steps=5, epochs=70) # 提取數據 sims = model_dm.docvecs.most_similar([vector], topn=100) post_id_dict = [] for i in sims: post_id_dict.append([i[0], i[1]]) return jsonify(post_id_dict) def main(): # 初始化模型 global model_dm model_dm = Doc2Vec.load(WORDS_PATH + 'doc2vec_0619last_300_3_15_paddle', mmap='r') print('--------------初始化模型完成--------------') # 開發模式啟動服務 # app.run(host='0.0.0.0') # WSGI啟動服務 http_server = WSGIServer(('', 5000), app) http_server.serve_forever() if __name__ == "__main__": main()
在啟動的時候加載model文件,到內存中,定義了2個路由,1個請求參數,然后處理結果返回為json,目前請求參數為逗號隔開的分詞,如果需要在服務中分詞,可自行修改
親測使用訪問
http://localhost:5000/get_content_similar?words=水族,龍魚
速度提升至200ms左右,效果顯著
參考資料
https://dormousehole.readthedocs.io/en/latest/deploying/wsgi-standalone.html#gevent
https://zhuanlan.zhihu.com/p/94124468
https://blog.csdn.net/goddavide/article/details/103712131
作者:舊舊的 <393210556@qq.com> 解決問題的方式,就是解決它一次