Gradio app 基于 Kubernetes 部署实战
0 - 前言
在人工智能领域的小伙伴,应该听说过 Gradio 吧,在进入本文主题之前,先来了解下 gradio 是什么,官网的介绍是:
Gradio is the fastest way to demo your machine learning model with a friendly web interface so that anyone can use it, anywhere!
简而言之,Gradio App 就是给 AI 算法工程师训练的模型赋予分享给大众的能力。
从技术侧拆分,由三个部分组成:
前端页面 + 后端接口 + AI算法模型推理
Gradio 做了一件事情,就是将这三个部分封装到一个 python 接口里,用户通过实现其封装的接口,将自己训练的算法模型以 web 服务的形式展现给大众使用。
1 - 一个简单的 gradio 程序
下面这个demo程序来自于 gradio 官网:Gradio
# app.py import gradio as gr def sketch_recognition(img): # Implement sketch recognition model here... # Return labels and confidences as dictionary iface = gr.Interface(fn=sketch_recognition, inputs="sketchpad", outputs="label").launch(server_name="0.0.0.0", server_port=7000)复制代码
可以看到 gr.Interface().lanuch() 就是将前端页面,后端服务以及 AI 算法模型三者结合到一个接口里,极大的降低了算法模型落地的难度,使得 AI 算法工程师在不具备工程能力的情况下,也能拿快速部署前后端并提供服务。
2 - 通过Kubernetes部署
Gradio app 可以直接在物理机上通过 python 运行,不过为了更易于移植以及工程化管理,我们需要把gradio app 打包成 docker 镜像,然后交由 kubernetes 进行管理。
首先是 打包成 docker 镜像:
Dockerfile
ARG PYTORCH="1.6.0" ARG CUDA="10.1" ARG CUDNN="7" FROM pytorch/pytorch:$ {PYTORCH} -cuda$ {CUDA} -cudnn$ {CUDNN} -devel MAINTAINER arkMon ENV TORCH_CUDA_ARCH_LIST="6.0 6.1 7.0+PTX" ENV TORCH_NVCC_FLAGS="-Xfatbin -compress-all" ENV CMAKE_PREFIX_PATH="(dirname(which conda))/../" ENV TZ=Asia/Shanghai ENV DEBIAN_FRONTEND=noninteractive RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ >/etc/timezone RUN apt-get update && apt-get install -y git && apt-get install -y libgl1-mesa-glx && apt-get -y install libglib2.0-dev RUN pip install cmake && pip install dlib && pip install wget RUN pip install gradio RUN export PYTHONUNBUFFERED=1 # 一定要加,不加可能出现启动失败的问题,原因见我另一篇文章: https://juejin.cn/post/7052286381724270600 ADD src ./src # 假设 app.py 等需要的文件在 src 目录下 WORKDIR src ENTRYPOINT [ "python", "app.py" ]复制代码
打包
docker build . -t gradio-demo:v0.0.1复制代码
接着,配置 kubernetes yaml 文件: gradio-demo.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: gradio-demo namespace: openmmlab labels: k8s-app: inference-engine spec: selector: matchLabels: name: gradio-demo replicas: 1 template: metadata: labels: name: gradio-demo spec: restartPolicy: Always nodeSelector: workfor: inference hostNetwork: true terminationGracePeriodSeconds: 30 containers: - name: gradio-demo image: gradio-demo:v0.0.1 env: - name: PYTHONUNBUFFERED value: "1" resources: limits: memory: 20000Mi requests: memory: 2000Mi --- apiVersion: v1 kind: Service metadata: name: gradio-demo namespace: openmmlab spec: type: ClusterIP selector: name: gradio-demo ports: - port: 7600 targetPort: 7600 protocol: TCP --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/rewrite-target: /$2 nginx.ingress.kubernetes.io/configuration-snippet: | rewrite ^(/gradio-demo)$ $1/ redirect; # 一定要加这一句重定向,否则无法通过subpath的方式访问 name: gradio-demo namespace: openmmlab spec: rules: - host: app.xxx.com http: paths: - backend: service: name: gradio-demo port: number: 7600 pathType: Prefix path: /gradio-demo(/|$)(.*)复制代码
启动
kubectl apply -f gradio-demo.yaml复制代码
最后,启动成功后,通过域名 app.xxx.com/gradio-demo 直接访问即可。
~~~~~~~~~~~~ 广告时间 ~~~~~~~~~~~~
下面是我们团队算法同学利用 gradio 写的 MMGEN-Facestylor,换头像神器,
欢迎使用: app.openmmlab.com/facestylor/
算法已开源,欢迎star:github.com/open-mmlab/…
以上。
作者:arkMon
链接:https://juejin.cn/post/7057808344945262623