使用 FastAPI 和 Docker 的语言翻译 A​​PI — 第 1 部分

使用 FastAPI 和 Docker 的语言翻译 A​​PI — 第 1 部分

fast!!!!!!

您好,在本文中,我们将深入探讨如何使用 快速API (我真的很喜欢这个框架 ) .不仅如此,我们还将成为 码头化 我们的 api,你猜对了, 码头工人! .文章的标题说明了一切。本文分为两部分;第一部分将专注于设置我们的环境和代码的某些部分,第 2 部分将从第 1 部分停止的地方继续。不要浪费太多时间,让我们直接进入它,因为有很多事情要做!

模型

我们将要使用的模型是 t5-碱基 语言模型来自 拥抱脸 .该型号是 T5 系列中的几个型号之一。对于此模型,共有 4 种语言:英语、德语、罗马尼亚语和法语。所以基本上这些将是我们感兴趣的语言。

套餐

如果这个项目要运行,我们将需要几个或很多包,谁知道呢,让我们找出来。首先,转到您希望项目所在的任何位置并创建一个新文件夹。随意命名该文件夹,但在我的情况下,我将命名它 t5_base。 创建文件夹并正确命名后,在您使用的任何 IDE 中打开它 (我推荐 vs 代码,因为那是我自己会使用的 )。 打开 vs code 后,继续创建一个新的虚拟环境,因为我们不希望包相互冲突,而且这样做是一种很好的做法。如果您不知道如何创建虚拟环境,请查看这篇讨论的文章 在python中设置虚拟环境 .

创建并激活虚拟环境后,让我们继续使用 pip 安装我们的包。确保您的终端将新创建的文件夹作为当前目录。现在在您的终端中运行以下代码

pip install fastapi[all] 变压器语句 torch torchvision torchaudio

这些是我们需要的包; 快速API 用于设置我们的 api,其余的基本上是用于从 huggingface 获取和运行我们的模型。精彩的!成功安装所有软件包后,让我们继续下一步。

文件夹结构

我们的项目将有四个主要文件夹,旁边是 主文件 我们将从中运行我们的 api 的文件。在文件夹旁边创建四个新文件夹 主文件 文件即: api、核心、方案和静态。 您的文件夹应如下所示;

Image depicting the folder we just created

fig 1. project folders

现在让我们简要了解一下这些文件夹的用途

  • 接口: 这个文件夹将保存我们的 api 端点。这个项目中只有一个端点,但假设您希望扩展它,那么您可以在这里拥有所有不同的端点。
  • 核: 这个文件夹包含我们 api 的配置。不要担心我的意思 配置, 我们将在本文后面看一下。
  • 方案: 在这个文件夹中,我们将使用我们的枚举来定义我们的 源语言目的地语言 .
  • 静止的: 静态文件夹将简单地保存我们的静态文件,在本例中是我们的标记器和模型。

好的,现在已经不碍事了,让我们开始一些实际的编码。

代码!!!!!

好吧,让我们从我们的开始 文件夹。在里面 文件夹创建两个新文件,即: init.py配置文件。init.py 文件将是空的,因为这将帮助我们调用我们的文件夹,就好像它是一个包一样。在我们的 配置文件 文件但是我们将包括一些东西。

我们在这里基本上做的是导入 基本设置 从 pydantic 创建一个可以在整个应用程序中使用的设置类。我们的类继承自 基本设置 因为它帮助我们创建了一个明确定义、类型提示的应用程序配置类,这正是我们想要的。在我们的设置类中,我们有一些非常不言自明的东西,比如我们所有端点都将拥有的 api 的标题、版本和前缀,我们正在初始化我们的设置类,以便我们可以调用 设置 代替 设置 在我们代码的其他部分。

接下来让我们设置我们的枚举。在里面 计划 文件夹创建一个 init.py翻译.py 文件。我们将再次离开 init.py 文件为空,仅填充 翻译.py 文件。你知道吗,只知道每当我们创建一个 init.py 它将是空的。现在在我们的 翻译.py 文件我们将有一些东西。

这里我们导入 枚举枚举。 这有助于我们为我们的 资源目的地 语言。如您所见 源枚举目的地枚举 具有保存值并且属于类型 细绳 因为我们将在相同的语言之间进行翻译。当我们设置端点并运行我们的服务器时,这将为我们提供类似的东西。

fig 2

您可以看到我们指定的各种值。

继续。在我们的 api 文件夹创建一个 init.py 文件和一个名为 v1 .内 v1 文件夹创建一个 init.py翻译.py 文件。这次我们的 翻译.py 会有更多的代码行,但别担心,我们会通过分解所有内容来放慢速度。

在这里,我们有一些进口。 泡菜 从我们还没有的静态文件中加载我们的标记器, API路由器 初始化我们的路线, 地位 发送适当的状态码消息, T5ForConditionalGeneration 得到我们的预训练模型和我们之前创建的枚举。这里没有什么好玩的。

接下来,在事件启动时,即当我们的服务器运行时,我们调用下面的帮助函数 on_event 打回来。这个函数所做的基本上就是加载我们的模型和分词器。请注意,我们的 模型分词器 变量是全局的,因为在外部声明的任何变量 on_event 回调不能在其中使用。我们只是让变量在可能需要它的代码的其他部分中可访问。

现在对于我们的 post 请求,我们声明我们的 translate 函数。这将源枚举和目标枚举以及用户的输入文本作为查询。然后,我们的标记器将采用用户选择的源语言和目标语言并输入文本并对其进行标记。然后我们将这个标记化的值传递给 产生 我们模型的方法。从代码中的注释可以看出,这将为我们的标记化数据生成向量,下面的行将将该向量解码为单词,然后我们将其作为翻译文本传递给我们的返回调用。

看到那还不错。现在我们需要做的就是获取我们的模型、标记器并测试我们的端点。让我们这样做吧!

现在回到我们的 主文件 我们之前创建文件夹时创建的文件。在那个文件中,我们将有更多的东西,比如我们的 翻译.py 我们刚刚完成的文件,所以我们将采用相同的方法来分解它。

在这里,我们导入一些我们需要的东西。接下来我们初始化一个新的 FastAPI 应用程序并从我们的 设置 班级。在这之后,我们有几行简单地获取应用程序的根目录并获取其中的静态文件夹。如果我们不打算这样做,我们真的不需要这个 码头化 我们的应用程序,但因为我们要这样做,所以我们需要它。最后我们安装我们的 静止的 文件夹,因为我们需要 fastapi 才能知道我们的静态文件在哪里。

安装后,我们定义了一个辅助函数来安装我们的模型和标记器,并将它们保存到我们的 静止的 目录/文件夹。在事件启动时,我们检查模型是否存在。如果它确实存在并且我们已经在我们的静态文件夹中拥有它,那么我们什么也不做,我们称之为 获取模型 安装和保存它们的功能(模型和标记器)。然后我们将主页重定向到我们的文档页面(因为这是我们将测试端点的地方)。接下来,我们包括我们的翻译路线,以便能够访问我们的翻译端点。

这就是我们运行应用程序所需的所有代码。让我们通过在激活的终端中调用以下命令来实际运行它

uvicorn main:app --reload

你可能想知道在哪里 乌维康 来自。不要害怕,因为我会让你放松。它来自安装 快速API [全部]。 还记得我们之前做过吗?它安装了 fastapi 附带的所有内容,包括 uvicorn。伟大的!

现在我们的应用程序应该可以工作并且看起来像这样

fig 3

现在让我们试试我们的翻译端点。假设我想将“我爱我的家人”翻译成法语

fig 4

我们选择我们的语言并提供我们的文本。

fig 4

瞧! (我希望我拼错了)我们有我们的翻译文本。我真的很爱我的家人❤

我们开始了,一个简单的语言翻译 api。这将我们带到第 1 部分的结尾。在第 2 部分中,我们将看看如何 码头化 我们的 api 应用程序。在那之前,同志,保持安全!

链接到 github 存储库: 点击/点击我

笔记: github 上的代码使用诗歌进行项目管理,但我排除了这一点,以使我们所有人尽可能简单,因为使用诗歌对应用程序进行 docker 化非常痛苦

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/27278/11071110

posted @ 2022-09-11 10:11  哈哈哈来了啊啊啊  阅读(70)  评论(0编辑  收藏  举报