解决使用 gradio 创建的 webui 服务部署在 Kubernetes 环境中出现无监听日志的问题

问题现象

使用 gradio 创建的 webui 服务部署在 Kubernetes 环境中会出现 Pod 容器中无监听日志、 有时可能还会出现从一开始就卡住导致无法对外提供 http 服务的问题。

示例代码:

import gradio as gr

def greet(name):
    return "Hello " + name + "!"

demo = gr.Interface(fn=greet, inputs="textbox", outputs="textbox")

if __name__ == "__main__":
    demo.launch()

原因

没有输出监听日志的原因是:gradio 的代码中是通过 print() 来输出监听日志的,默认 print() 的输出使用了 buffer。 在 Kubernetes 这类容器环境内,会出现 print() 的输出无法快速显示的问题。

解决办法

可以通过下面几个方法中的任一方法解决该问题。

设置环境变量

可以通过设置环境变量 PYTHONUNBUFFERED 的值为非空字符串的方式解决该问题:

  • 可以在 Dockerfile 中设置该环境变量:

    ENV PYTHONUNBUFFERED=true
    
  • 也可以在 Pod 的定义中设置该环境变量:

    env:
     - name: PYTHONUNBUFFERED
       value: 'true'
    

设置 Python 执行参数

可以在通过 python 执行服务代码时,增加 -u 参数达到同样的效果。

python -u app.py

配置 Pod 定义使用标准输入

也可以通过配置 Pod 中的容器定义,让容器使用标准输入来解决该问题。

示例 Pod Yaml:

containers:
 - image: xxx
   tty: true
   stdin: true

Comments