通过 Docker 在 Huggingface 上部署您的 FastAPI 应用程序

社区文章 发布于2023年12月11日

引言

在本教程中,我将指导您完成使用 Docker 部署 FastAPI 应用程序,并将您的 API 部署到 Huggingface 的过程。FastAPI 是一个现代、快速的 Web 框架,用于构建基于标准 Python 类型提示的 Python 3.7+ API。Docker 允许我们将应用程序容器化以便于部署,而 Huggingface 提供了一个部署和共享模型及应用程序的平台。

部署平台及我遇到的问题

  1. Vercel

将 API 部署到 Vercel 一直是我的首选,因为它用户界面友好,并且免费套餐提供 1 GB 内存。我所有的项目都进展顺利,除了一个项目。该项目中的 requirements.txt 文件包含的包解压后总大小超过 250 MB 的限制,导致它崩溃。

image/png

  1. Render

尽管我很少使用 Render,但我在一次黑客马拉松中需要提交项目,时间紧迫,迫切需要部署我的 API,所以我查看了这个平台。Render 使用 Python==3.7,而我的应用程序所需的包需要 Python>=3.9。我强制 Render 使用 Python>=3.9,但这还不是全部。在 Render 免费套餐上运行的应用程序只能运行 15 分钟,之后就会进入休眠状态。

由于这些原因,我将我的 API 部署到了 Huggingface,过程非常简单,没有任何问题。

先决条件

  • 对 FastAPI 的基本理解。
  • 一个 Huggingface 账户

步骤

步骤 1:创建一个新的 Docker Space 🐳

image/png

接下来,您可以为您的项目选择任何您喜欢的名称,选择一个许可证,并使用 Docker 作为软件开发工具包(SDK)。有许多可供选择的 Docker 模板。我将从一个空白的 Docker 模板开始。然后点击“创建空间”按钮。

image/png

步骤 2:设置您的 FastAPI 应用程序

现在,一个新的空间已经设置好了,我将创建一个简单的应用程序,它可以使用 ClarifaiLangchain 根据任何提示生成文本。

示例应用程序将包含以下三个文件:

  • requirements.txt ——列出 Python 项目或应用程序的依赖项。
  • TextGen/router.py ——我们将在此 Python 脚本中编写我们的 FastAPI 应用程序。
  • TextGen/ConfigEnv.py ——我们将在此 Python 脚本中处理环境变量。
  • Dockerfile ——设置我们的环境,安装 requirements.txt,然后启动 app.py。

步骤 3:Requirements.txt

在名为 requirements.txt 的文件中列出 Python 包及其版本。

fastapi==0.99.1
uvicorn
requests
pydantic==1.10.12
langchain
clarifai
Pillow

步骤 4:设置 FastAPI 应用程序

如果您是 Clarifai 的新手,让我快速向您介绍这个平台。

Clarifai 是一个 AI 驱动的平台,专注于计算机视觉、自然语言处理、LLM 以及所有最新的流行技术解决方案。只需几个步骤即可构建整个业务解决方案。

以下代码定义了一个 FastAPI Web 应用程序,该应用程序使用 Clarifai 和 Langchain 库根据用户输入生成文本。该应用程序本身是一个简单的单端点 API。/generate 端点接收文本并使用 Langchain 管道生成补全,然后将其作为响应返回。我在此应用程序中使用了 Cohere 的文本生成模型。

from pydantic import BaseModel

from .ConfigEnv import config
from fastapi.middleware.cors import CORSMiddleware

from langchain.llms import Clarifai
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from TextGen import app

class Generate(BaseModel):
    text:str

def generate_text(prompt: str):
    if prompt == "":
        return {"detail": "Please provide a prompt."}
    else:
        prompt = PromptTemplate(template=prompt, input_variables=['Prompt'])
        llm = Clarifai(
            pat = config.CLARIFAI_PAT,
            user_id = config.USER_ID,
            app_id = config.APP_ID, 
            model_id = config.MODEL_ID,
            model_version_id=config.MODEL_VERSION_ID,
        )
        llmchain = LLMChain(
            prompt=prompt,
            llm=llm
        )
        llm_response = llmchain.run({"Prompt": prompt})
        return Generate(text=llm_response)

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

@app.get("/", tags=["Home"])
def api_home():
    return {'detail': 'Welcome to FastAPI TextGen Tutorial!'}

@app.post("/api/generate", summary="Generate text from prompt", tags=["Generate"], response_model=Generate)
def inference(input_prompt: str):
    return generate_text(prompt=input_prompt)

我已链接了 TextGen GitHub 仓库,其中包含完整的代码库。

步骤 5:Dockerfile!

在此步骤中,我们将编写一个 Dockerfile,它将设置 Python 3.9 环境,安装 requirements.txt 中列出的包,并在端口 7860 上启动 FastAPI 应用程序。

我们来了解一下 Dockerfile 的设置。

FROM python:3.10.9

上一行指定我们将使用官方的 Python 3.9 Docker 镜像作为我们容器的基础镜像。此镜像由 Docker Hub 提供,它包含运行 Python 3.9 所需的所有文件。

COPY . .

上一行将我们本地目录中的所有文件(即 .)复制到容器内的根目录(即 .)。因此,. 基本意味着将根目录中的所有文件复制到容器的根目录中。

WORKDIR /

这一行将容器内的工作目录设置为 /,即根目录。我们将在其中复制应用程序代码和依赖项。

RUN pip install --no-cache-dir --upgrade -r /requirements.txt

此行使用 pip 安装 requirements.txt 中列出的包。--no-cache-dir 标志告诉 pip 不要使用任何缓存的包,--upgrade 标志告诉 pip 如果有新版本可用则升级任何已安装的包,-r 标志指定要使用的 requirements 文件。

CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]

此行指定容器启动时要运行的命令。它使用 uvicorn 启动 FastAPI 应用程序并侦听端口 7860。--host 标志指定应用程序应侦听所有可用的网络接口,而 app:app 参数告诉 uvicorn 在我们的代码中的 app 模块中查找 app 对象。

完整的 Dockerfile

# Use the official Python 3.10.9 image
FROM python:3.10.9

# Copy the current directory contents into the container at .
COPY . .

# Set the working directory to /
WORKDIR /

# Install requirements.txt 
RUN pip install --no-cache-dir --upgrade -r /requirements.txt

# Start the FastAPI app on port 7860, the default port expected by Spaces
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]

提交此文件后,您的空间将切换到“正在构建”,您应该会看到容器的构建日志弹出,以便您可以监控其状态。👀

步骤 6:使用应用程序 🚀

如果一切顺利,您的空间在构建完成后应该会切换到运行中。构建完成后,您可以使用已部署的应用程序,如下图所示。点击嵌入此空间

image/png

复制直接 URL 中提供的链接,并将其粘贴到新的浏览器选项卡中。

image/png

您的 FastAPI 应用程序现已部署并正在运行。

image/png

转到 /docs 查看 Swagger UI

image/png

演示 💻

image/png

结论

本文介绍了通过 Docker 在 Huggingface 上部署 FastAPI 应用程序以及使用 Clarifai 和 Langchain 构建一个简单的文本生成应用程序的基础知识。您可以将本指南作为起点,构建更复杂、更令人兴奋的利用机器学习功能的应用程序。

快速链接

愉快地进行提示!

社区

我们仍然需要克隆仓库

这篇文章真的很有帮助!直到我读了这页,我才弄明白如何获取运行中的应用程序的 URL。谢谢!!

这很有帮助,谢谢!

注册登录 发表评论