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您的 Gradio 应用现在应该可以在 http://localhost:7860 访问。
在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的粘性。这确保了来自同一用户的所有请求都被路由到同一实例。这一点很重要,因为Gradio的通信协议需要从前端到后端的多个独立连接,以便事件能够被正确处理。(如果您使用Terraform,您需要在目标组定义中添加一个stickiness block。)
如果您在代理(如Nginx)后面部署Gradio应用程序,正确配置代理至关重要。Gradio提供了一个指南,详细介绍了必要的步骤。此设置确保您的应用程序在生产环境中可访问且性能良好。