Python解決gensim加載doc2vec或work2vec向量訓練模型文件太慢甚至無法訪問的情況


項目中使用了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> 解決問題的方式,就是解決它一次 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM