Gradio 是一个功能强大且直观的 Python 库,用于创建展示机器学习模型的 Web 应用。这些 Web 应用可以在本地运行,也可以免费部署到 Hugging Face Spaces。或者,您也可以将它们部署在自己的服务器上的 Docker 容器中。将 Gradio 应用 Docker 化有几个好处:
让我们通过一个简单的例子来了解如何使用 Docker 将 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()这个应用创建了一个简单的界面,通过名字向用户问好。
接下来,我们将创建一个 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 执行以下步骤:
GRADIO_SERVER_NAME 环境变量,以确保 Gradio 监听所有网络接口。有了 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 应用。
当部署带有多个副本的 Gradio 应用时,例如在 AWS ECS 上,必须使用 sessionAffinity: ClientIP 启用会话保持(stickiness)。这可以确保来自同一用户的所有请求都被路由到同一个实例。这非常重要,因为 Gradio 的通信协议需要前端与后端建立多个独立连接才能正确处理事件。(如果您使用 Terraform,您需要在目标组定义中添加一个 stickiness block。)
如果您在 Nginx 等代理后面部署 Gradio 应用,正确配置代理至关重要。Gradio 提供了一份详细指南,介绍了所需的步骤。这种设置可确保您的应用在生产环境中可访问并表现良好。