1. 其他教程
  2. 使用 Docker 部署 Gradio

使用 Docker 部署 Gradio 应用

简介

Gradio 是一个功能强大且直观的 Python 库,用于创建展示机器学习模型的 Web 应用。这些 Web 应用可以在本地运行,也可以免费部署到 Hugging Face Spaces。或者,您也可以将它们部署在自己的服务器上的 Docker 容器中。将 Gradio 应用 Docker 化有几个好处:

  • 一致性:Docker 将应用及其环境打包在一起,确保 Gradio 应用无论部署在哪里都以相同的方式运行。
  • 可移植性:容器可以轻松地在不同系统或云环境之间移动。
  • 可扩展性:Docker 与 Kubernetes 等编排系统配合良好,允许您的应用根据需求进行扩展或缩减。

如何将 Gradio 应用 Docker 化

让我们通过一个简单的例子来了解如何使用 Docker 将 Gradio 应用容器化。

步骤 1:创建 Gradio 应用

首先,我们需要一个简单的 Gradio 应用。让我们创建一个名为 app.py 的 Python 文件,其中包含以下内容:

import gradio as gr

def greet(name):
    return f"Hello {name}!"

iface = gr.Interface(fn=greet, inputs="text", outputs="text").launch()

这个应用创建了一个简单的界面,通过名字向用户问好。

步骤 2:创建 Dockerfile

接下来,我们将创建一个 Dockerfile 来指定应用在 Docker 容器中应如何构建和运行。在与应用相同的目录下创建一个名为 Dockerfile 的文件,内容如下:

FROM python:3.10-slim

WORKDIR /usr/src/app
COPY . .
RUN pip install --no-cache-dir gradio
EXPOSE 7860
ENV GRADIO_SERVER_NAME="0.0.0.0"

CMD ["python", "app.py"]

此 Dockerfile 执行以下步骤:

  • 从 Python 3.10 slim 镜像开始。
  • 设置工作目录并将应用复制到容器中。
  • 安装 Gradio(您也应安装所有其他必需的依赖项)。
  • 暴露端口 7860(Gradio 的默认端口)。
  • 设置 GRADIO_SERVER_NAME 环境变量,以确保 Gradio 监听所有网络接口。
  • 指定运行应用的命令。

步骤 3:构建并运行 Docker 容器

有了 Dockerfile,您就可以构建并运行容器了:

docker build -t gradio-app .
docker run -p 7860:7860 gradio-app

现在您应该可以通过 https://:7860 访问您的 Gradio 应用了。

重要注意事项

在 Docker 中运行 Gradio 应用时,需要牢记一些重要事项:

"0.0.0.0" 上运行 Gradio 应用并暴露端口 7860

在 Docker 环境中,将 GRADIO_SERVER_NAME="0.0.0.0" 设置为环境变量(或直接在 Gradio 应用的 launch() 函数中设置)至关重要,它允许来自容器外部的连接。Dockerfile 中的 EXPOSE 7860 指令告诉 Docker 暴露 Gradio 的默认端口,以便外部访问 Gradio 应用。

为多个副本启用会话保持(Stickiness)

当部署带有多个副本的 Gradio 应用时,例如在 AWS ECS 上,必须使用 sessionAffinity: ClientIP 启用会话保持(stickiness)。这可以确保来自同一用户的所有请求都被路由到同一个实例。这非常重要,因为 Gradio 的通信协议需要前端与后端建立多个独立连接才能正确处理事件。(如果您使用 Terraform,您需要在目标组定义中添加一个 stickiness block。)

在代理后部署

如果您在 Nginx 等代理后面部署 Gradio 应用,正确配置代理至关重要。Gradio 提供了一份详细指南,介绍了所需的步骤。这种设置可确保您的应用在生产环境中可访问并表现良好。

gradio