如何使用Word2Vec和Flask创建深度学习REST API

注:本教程在Vultr VPS上测试通过,如需部署请前往Vultr.com

在生产中使用复杂的机器学习模型时,传统的开发方法难以维护。在笔记本电脑或本地计算机上进行开发可能会很慢,无法为深度学习工程师训练机器学习模型。因此,我们通常会使用具有更强大硬件的云机器来训练和运行我们的机器学习模型。这是一个好习惯,因为我们抽象了复杂的计算,而是根据需要发出AJAX请求。在本教程中,我们将通过从头开始构建REST API,使预训练的深度学习模型Word2Vec可用于其他服务。

先决条件

具有至少4GB RAM的Ubuntu 16.04服务器实例。为了进行测试和开发,您可以选择具有4GB RAM的实例
了解如何使用Linux操作系统创建/导航/编辑文件夹和文件
一种 sudo 用户

什么是词嵌入?

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

单词嵌入不是随机的;它们是通过训练神经网络生成的。最近一种功能强大的词嵌入实现来自Google,名为Word2Vec,它通过预测语言中与其他词相邻的词来进行训练。例如,对于这个词 "cat",神经网络会预测单词 "kitten""feline"。彼此靠近出现的单词直觉使我们可以将它们放置在向量空间中。

但是,实际上,我们倾向于使用其他大型公司(例如Google)的经过预先训练的模型,以便快速制作原型并简化部署过程。在本教程中,我们将下载并使用Google的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 导入幅度。

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

我们可以玩 pymagnitude 软件包和深度学习模型,方法是使用 query 方法,为一个单词提供参数。

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("https://www.vultr.com/", 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 装饰。

进行API调用

我们可以通过运行以下命令来运行Flask服务器,以激活我们的虚拟环境,安装我们的软件包并运行其关联的Python文件。

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

我们的服务器将在 localhost:8000。我们可以在以下位置查询我们的数据库 localhost:8000/similarity?word1=cat&word2=dog 并在我们的浏览器中或通过另一个AJAX客户端查看响应。

注:本教程在Vultr VPS上测试通过,如需部署请前往Vultr.com