如何创建带有Word2Vec和Flask的深度学习REST API

・6 分钟阅读

在生产中使用复杂的机器学习模型时,很难保持传统的开发方法。因此,我们通常使用有更强大硬件的云机器来训练和运行机器学习模型,这是一个很好的做法,因为我们抽象复杂的计算,而变成根据需要发出AJAX请求。在本教程中,我们将通过从头开始构建REST API,为Word2Vec的预训练深度学习模型建立服务。

前提条件

  • An Ubuntu 16.04服务器实例,有至少4GB内存,
  • sudo用户

什么是词嵌入?

词嵌入是自然语言处理和深度学习的最新发展,由于快速进步,已经彻底改变了这两个领域。词嵌入本质上是向量,每个向量对应于单个词,使得向量可以表示词。这可以通过某些现象来证明,例如 king - queen = boy - girl , 词向量用于构建从推荐引擎到实际理解英语的聊天机器人的所有内容。

词嵌入不是随机生成的;它们是通过训练神经网络产生的,最近一个强大的词嵌入实现来自Google,名为Word2Vec,它通过预测出现在语言中其他词旁边的词来训练。例如,对于词"cat",神经网络会预测"kitten""feline" ,这种出现在彼此附近的词的现象允许我们将它们放置在向量空间中。

然而,实际上我们倾向于使用其他大型公司(比如谷歌)的预先训练模型,以便快速原型化和简化部署过程,在本教程中,我们会下载和使用Word2Vec词嵌入预训练模型,我们可以在工作目录中运行以下命令来执行这个操作。


wget http://magnitude.plasticity.ai/word2vec/GoogleNews-vectors-negative300.magnitude

安装Flask和Magnitude包

我们下载的词嵌入模型是.magnitude格式的,这种格式允许我们使用SQL高效地查询模型,因此这是生产服务器的最佳嵌入格式,由于我们需要能够读取.magnitude格式,所以,我们将安装pymagnitude包,我们还将安装flask以便稍后服务于模型所做的深度学习预测。


pip3 install pymagnitude flask

我们还将使用以下命令将它添加到依赖,这将创建名为requirements.txt的文件,并且保存python库,以便以后可以安装它们。


pip3 freeze > requirements.txt

查询Word2Vec模型

首先,我们将创建一个文件来处理打开和查询词嵌入。

 
touch model.py

 

接下来,我们将向model.py添加以下行以导入Magnitude 。


from pymagnitude import Magnitude
vectors = Magnitude('GoogleNews-vectors-negative300.magnitude')

我们可以使用query方法来处理pymagnitude包和深度学习模型,为词提供一个参数。


cat_vector = vectors.query('cat')
print(cat_vector)

对于API的核心,我们会定义一个函数来返回两个词之间意义的差异,这是推荐引擎等大多数深度学习解决方案的支柱。显示有相似词的内容。

我们可以使用similaritymost_similar 函数来处理这个函数。


print(vectors.similarity("cat","dog"))
print(vectors.most_similar("cat", topn=100))

我们按照如下方式实现相似计算器,此方法将在下一节中由Flask API调用,请注意此函数返回一个介于0和1之间的实值。


def similarity(word1, word2):
 return vectors.similarity(word1, word2)

创建REST API

我们将在名为service.py的文件中创建我们的服务器,导入flaskrequest处理服务器功能,我们从前面编写的模块导入similarity引擎。


from flask import Flask, request
from model import similarity

app = Flask(__name__)

@app.route("/", methods=['GET'])
def welcome():
 return"Welcome to our Machine Learning REST API!"

@app.route("/similarity", methods=['GET'])
def similarity_route():
 word1 = request.args.get("word1")
 word2 = request.args.get("word2")
 return str(similarity(word1, word2))

if __name__ =="__main__":
 app.run(port=8000, debug=True)

我们的服务非常简单,但是可以通过使用@app.route decorator创建更多路由来轻松扩展。

调用API调用

运行以下命令,激活虚拟环境,安装包,并运行相关的python文件,从而运行我们的Flask服务器。


source venv/bin/activate
pip3 install -r requirements.txt
python3 service.py

我们的服务器使用localhost:8000,我们可以查询数据库 localhost:8000/similarity?word1=cat&word2=dog 并在我们的浏览器或其他AJAX客户端中查看响应。

Zuoxiaojuan profile image