使用FastAPI和Deta开发和部署机器学习API的简单方法。
图片由作者提供|元素由vectorjuice提供
指南
在这个项目中,我们将学习如何为你的机器学习模型建立一个应用编程接口(API),然后用简单的代码部署它。我花了一个小时来学习FastAPI,花了五分钟来学习如何将其部署到Deta服务器。我们还将使用Python在本地服务器和远程服务器上测试我们的API 要求.让我们稍微深入了解一下我们项目中要使用的技术。
图片由作者提供
spaCy
spaCy与著名的NLTK Python库相比,对应用和部署更加友好,后者用于实验和评估。spaCy带有预建的统计神经网络NLP模型,具有强大的功能,易于在你的项目中使用和实现。我们将使用相当简单和小型的预建英语模型来从我们的文本中提取实体。
FastAPI
FastAPI是一个快速的网络框架,用于用python构建API,它具有更快的查询时间,简单和最小化的代码,让你在几分钟内设计出你的第一个APIFastAPI。在我们的项目中,我们将学习FastAPI是如何工作的,以及如何使用我们预先建立的模型从英文文本中获得实体。
德塔
我们将使用Deta Micros服务来开发我们的API,并在没有docker或YAML文件的情况下部署我们的项目。Deta平台具有易于部署的CLI,高可扩展性,安全的API认证密钥,改变子域的选项,以及网络流量的记录。这些功能在Deta上的使用是完全免费的。在我们的项目中,我们将使用Deta CLI来部署我们的Fast API,只需要几行脚本。
代码
当我在学习FastAPI的时候,我无意中看到了促使我写这篇文章的YouTube视频。Sebastián Ramírez解释了Fast API是如何工作的,以及它是如何成为目前最快的python网络框架。我们将编写两个Python文件。一个包含机器学习模型,另一个文件包含你的API代码。
要求
在我们开始之前,我们需要创建一个新的目录,其中有一个 _requirements.txt_文件。你可以在下面找到我们要使用的所有必要的库👇
fastapi
你可以一个一个地安装它们,或者使用 🔻。
$ pip install -r requirements.txt
我们将在这个项目中使用一个预训练的NLP模型,所以我们需要从GitHub仓库下载它github.com/explosion/s…,或者直接运行需求文件,它会自动下载并安装它。
机器学习模型
我们将使用预先训练好的SpacyNLP模型来从文本中提取实体。如果你使用的是Jupyter笔记本,请尝试使用_%writefile_在你的目录中创建python文件。
首先,我们加载NLP模型,然后从CBS新闻文章中提取实体。只需几行代码,你就能运行你的第一个机器学习模型。你也可以用同样的方法加载经过训练的模型。
API文件
这是你的主文件,其中包含。
- read_main:使用GET ,从资源中请求数据,在我们的例子中,它将显示一个消息,说欢迎。
- 类文章。使用_pydantic_ BaseModel 来定义对象和变量,这些对象和变量将被用于你的API(helpmanual.io)。在我们的案例中,我们将内容定义为字符串,将评论定义为字符串的列表。
- analyze_article。它接受一个带有评论的文本列表,并使用ml文件中的_NLP_ 对象显示实体。
我知道这很让人困惑,所以让我们把它分成更小的部分来好好理解它。
分解
我们已经创建了一个FastAPI的对象,然后用它作为你的函数的装饰器,使用 _@app.get("/")_.
- @app是你的FastAPI对象的装饰器
- .get或.post是用于返回数据或处理输入的HTTP方法
- **("/")**是网络服务器上的位置。在我们的例子中是主页面。如果你想添加另一个目录,你可以使用("/<new_section>/")。
我们已经创建了read_main函数来显示主页面上的信息,就是这么简单。
现在我们将创建一个 文章类,它继承了BaseModel的功能和变量。这个函数可以帮助我们创建我们将在方法中使用的参数类型。 发布方法中使用的参数类型。在我们的案例中,我们将内容创建为一个字符串变量,将注释创建为字符串列表。
在最后一部分,我们要创建_一个_POST方法("/article/")。这意味着我们将创建一个新的部分,它将接受参数作为输入,并在处理后返回结果。
- 文章类作为论据。使 用List of Article创建文章参数,这将允许我们添加多个文本条目。
- 从文章中提取数据。创 建循环,从文章的列表中提取数据,然后从评论的列表中提取。它还将评论添加到一个数组中。
- 将文本加载到NLP模型中: 将内容加载到 nlp预训练的模型。
- 提取实体: 将实体从 nlp对象中提取实体,然后将其添加到 ents数组。这将把结果堆积起来。
- **显示。**该函数将返回一个实体和注释的列表。
测试
Fast API建立在Uvicorn上,所以服务器也运行在Uvicorn上。在Jupyter笔记本中,你可以用👇来运行这个应用程序,或者在终端中只需输入 uvicorn然后输入主文件,然后输入FastAPI对象,即 应用程序在我们的例子中是这样的。
我们的服务器正在顺利运行,所以让我们用 request.get 方法来访问它。API正在工作,在主页上向我们显示 "欢迎 "信息。
现在让我们尝试在一个列表中添加单个文本和评论作为字典。我们将使用 POST请求方法和 /article/来访问我们的NLP模型函数。将你的输出转换成 .json() 以使其易于提取数据。
我们有我们的字典键。['ents', 'comments'] 。
让我们看看我们的整个输出是什么样子的。它看起来像我们有 ents有标签和实体的列表。同样的,还有 评论钥匙
现在让我们提取单个实体及其文本,以检查我们输出的灵活性。在我们的例子中,我们要从输出中提取第二个实体。
结果显示是完美的。
部署
到你的终端,或者你可以在你的Jupyter笔记本单元中做同样的步骤,但在任何脚本前添加"!"。首先,你需要访问你的目录,使用 cd其中你的 main.py 和 ml.py文件的位置。
cd ~”/FastAPI-ML-Project”
Deta需要的三个主要文件是 ml.py, main.py, 和 requirments.txt.
图片由作者提供|项目目录
如果你使用的是Windows,在PowerShell中使用下面的命令来下载和安装Deta CLI
iwr
对于Linux来说
curl -fsSL
然后使用deta登录,它将带你到浏览器并要求你输入_用户名_和_密码_。如果你已经登录了,它将需要几秒钟来验证。
deta login
Deta Authentication |deta
这两个词在你的终端是神奇的,它将在2分钟内上传文件并部署你的应用程序。
deta new
你的应用程序被上传到一个端点链接上。在我们的例子中,93t2gn.deta.dev/
Successfully created a new micro
{
“name”: “FastAPI-ML-Project”,
“runtime”: “python3.7”,
“endpoint”: “https://93t2gn.deta.dev/",
“visor”: “enabled”,
“http_auth”: “disable”
}
Adding dependencies…
Collecting fastapi
…
Successfully installed ……
如果你看到错误,请检查日志,使用 deta logs,做一些修改,然后用 deta deploy来更新这些改动。
正如你所看到的,我们的应用程序已经部署并在Deta服务器上运行。
项目摘要|deta
你可以去Deta提供的链接,自己检查一下。
图片由作者提供
测试网络API
最后,让我们在Deta平台上测试我们的远程API作为一个微服务。这一次,我们不再添加本地IP,而是添加Deta终端链接。由于我们没有启用API认证,所以我们可以不使用头文件来运行。当认证功能启用时,Deta也提供免费的API密钥。这意味着只有你或拥有API密钥的人可以访问Web服务器。要了解更多关于认证和子域的信息,我建议你阅读文档。
我们将添加相同的参数和相同的代码,以获得相同的结果,然后就可以看到它的神奇效果。你的API是在线的,可以通过使用链接_轻松_访问。
结论
在学习了FastAPI之后,我一直在考虑下一步该怎么做,所以有一天我在浏览网页的时候偶然发现了Deta,这引起了我的注意。我花了几分钟时间安装了Deta CLI并在远程服务器上部署了我的API。我对他们的子域和免费API密钥功能印象深刻。我很快就理解了这项服务是如何工作的,以及我将如何在我未来的项目中使用它。
我们在学习了一些机器学习模型后都会问这个问题。
我知道如何训练我的模型并获得预测结果,但下一步是什么?我如何与他人分享我的模型?这样他们就可以看到我所建立的东西,并在他们的项目中使用这些功能。
这就是Heroku、Google、Azure等云平台的用武之地,但这些平台相当复杂,你需要学习Docker文件的代码,这有时会让人感到沮丧。Deta用它简单的两个字的脚本解决了你所有的问题,它将在几秒钟内部署和运行你的应用程序。
你也可以查看我在这个项目上的GitHub repo。 kingabzpro/FastAPI-ML-项目.
不要忘了给你的👏
部署你的第一个机器学习API》最初发表在Medium上的Towards Data Science,在那里人们通过强调和回应这个故事来继续对话。