对网站内嵌gradio应用的输入输出做审核实现详解

目录
  • 前言
  • 1 | 方案
    • 1.1 | 基于 nginx 流量劫持和转发
    • 1.2 | 基于 gradio sdk 的二次开发
    • 1.3 | 比较
  • 2 | 实施
    • 2.1 | 创建ingress,来劫持发往 /run/predict 的请求
    • 2.2 | 审核服务的接收和处理
  • 3 | 效果展示

前言

在AI领域,来快速实现一个idea:前后端开发+部署+展现,如果走传统的前后端分离开发+服务器docker部署等方式,会很重且入门成本很高。

所以,行业内诞生出来了 gradio :基于python的前端+后端+部署一体的开发框架。基于 gradio,可以很迅速的开发一个应用,部署到线上,通过浏览器访问。

多迅速?

# pip install gradio
import gradio as gr
def call_function(text):
    return 'Hello '+text
gr.Interface(fn=call_function, inputs="text", outputs="text").launch()

很多搞AI算法的同学,工程能力偏弱,但gradio的出现,解决了:科研探索的成果--无法--方便快捷的展现 的痛点。 国内外,也出现了一些基于gradio应用的平台性网站,比如:国外的 huggingface,国内的 modelscope 等等。

然而,这种用户生成式 (UGC)的平台逻辑,最终绕不开一个点:审核。如何有效控制 UGC 的输入和输出,防止平台成为不法、有害信息的集散地,是国内做类似平台必须面对和解决的一个问题。

所以,本文从技术角度来探讨:如何对网站内嵌gradio应用的输入输出做审核?

1 | 方案

目前,在大方向上可以探索的方案有两个:

  • 基于 nginx 流量劫持和转发
  • 基于 gradio sdk 的二次开发

1.1 | 基于 nginx 流量劫持和转发

该方案是在流量入口处做一个监听过滤。

基本思路是:根据 gradio 请求 path,做一个路由转发,将特定的包含输入输出的 api 请求劫持然后转发到审核服务里,审核服务会做如下几件事:

  • 对请求的用户输入做审核;
  • 通过后,将请求转发给 gradio 应用;
  • 接收 gradio 应用的返回,做审核;
  • 审核通过后,返回给前端用户侧

在1-4任何一步,出现异常,则直接终止请求。

1.2 | 基于 gradio sdk 的二次开发

gradio 本身是一个开源的框架,允许开发者进行二次开发。所以可以在 SDK 层面进行改造,来满足对输入输出的审核需求。

1.3 | 比较

优点 缺点
基于 nginx 流量劫持和转发 1. 适用面广泛:支持gradio,steamlit等一系列类似第三方框架; 2. 改造成本低,无需了解gradio等框架的代码,只需要修改nginx配置+处理好转发的请求审核逻辑即可 1. 针对特定应用可能不能很好的满足所有的输入输出的场景;
基于 gradio sdk 的二次开发 1. 可以很好的覆盖gradio的输入输出场景,能保证“应审尽审”,不留隐患;2. 交互逻辑可以制定,用户体验会更好; 1. 改造成本高,需要熟悉 gradio 框架; 2. 限制用户的gradio版本,只允许使用基于二开的gradio版本;3. 适用面窄:如果是streamlit,还需要针对streamlit框架进行二次开发
  • 从比较来看,方案一的优势明显大于方案二;
  • 从长远来看,对gradio/streamlit框架的改造,是一个必须要经历的过程。

所以,这不是一个 二选一 的抉择,而是相互补充的上下游方案的融合。 在本篇中,会针对方案一做一个具体的实操记录。

2 | 实施

环境说明:

  • 基于k8s做服务编排;
  • 以deployment+service+ingress方式部署 gradio 应用 (gradio-app)
  • ingress使用的是nginx-ingress
  • 假设需要劫持的请求路径是: /run/predict
  • 审核服务(audit-service)和 gradio 应用在一个集群,相互间通过 svc 域名访问

2.1 | 创建ingress,来劫持发往 /run/predict 的请求

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /api/v1/audit/gradio?id=$1
    nginx.ingress.kubernetes.io/use-regex: "true"
  name: gradio-monitor-ingress
  namespace: here_is_a_namespace
spec:
  ingressClassName: nginx
  rules:
  - host: abc.com
    http:
      paths:
      - backend:
          service:
            name: audit-service
            port:
              number: 80
        path: /(regex_script_to_match_gradio_app_service)/run/predict
        pathType: Prefix

说明:

  • 如果 spec.rules[0].http.paths[0].path 通过正则来匹配,则需要在 metadata.annotations 添加 nginx.ingress.kubernetes.io/use-regex: "true"
  • nginx.ingress.kubernetes.io/rewrite-target: /api/v1/audit/gradio?id=$1 表示将来自 abc.com/(regex_script_to_match_gradio_app_service)/run/predict 的请求转发给 audit-service:80/api/v1/audit/gradio?id=regex_script_to_match_gradio_app_service

2.2 | 审核服务的接收和处理

伪代码如下:

@PostMapping("/gradio")
public void predict(HttpServletRequest request, HttpServletResponse response, @RequestBody Map<String, Object> reqMap, @RequestParam("id") String id) throws IOException {
    log.info("get gradio predict request with params={}", reqMap);
    // request audit process
    boolean pass = false;
    pass = doAuditProcess(reqMap)
    if (!pass) {
       response.getWriter().write("audit failed");
       return
    }
    // redirect request to gradio-app
    Object ret = doRedirectRequest(id)
    // response audir process
    pass = doAuditProcess(ret)
    if (!pass) {
       response.getWriter().write("audit failed");
       return
    }
    response.getWriter().write(ret.toString());
}

3 | 效果展示

审核通过场景

审核不通过场景

以上就是对网站内嵌gradio应用的输入输出做审核实现详解的详细内容,更多关于网站内嵌gradio应用审核的资料请关注我们其它相关文章!

(0)

相关推荐

  • 通过gradio和摄像头获取照片和视频实现过程

    目录 1.环境设置 1.1gradio安装 2.ffmpeg安装 2.简单小程序 2.1 引入gradio 2.2 定义方法 2.3 定义接口 2.4 运行 3.执行情况 3.1 终端日志输出 3.2 截图 3.3 保存 1.环境设置 1.1gradio安装 需要安装 gradio,安装办法就是 pip install gradio 2.ffmpeg安装 再次需要加入到path路径. 下载地址: https://www.jb51.net/softjc/760881.html ffmpeg.exe

  • Gradio机器学习模型快速部署工具quickstart

    目录 引言 1.图像示例 2.块:更多的灵活性和控制 3.更复杂的 Blocks 引言 书接上回 Gradio机器学习模型快速部署工具[quickstart]翻译,讲到多输入输出,其实很简单,就是把多个组件包装到列表,inputs和outputs对应的就是2个列表,输入输出列表,仅此而已. 1.图像示例 Gradio 支持多种类型的组件,例如Image, DataFrame, Video, 或Label. 让我们尝试一个图像到图像的功能来感受一下这些! import numpy as np im

  • Gradio机器学习模型快速部署工具quickstart前篇

    目录 Gradio 是做什么的? Hello, World 类Interface 组件属性 多个输入和输出组件 Gradio 是做什么的? 先决条件:Gradio 需要 Python 3.7 或更高版本,仅此而已! gradio.app/quickstart/… 与他人分享您的机器学习模型.API 或数据科学工作流程的最佳方式_之一是创建一个交互式应用程序,让您的用户或同事可以在他们的浏览器中试用该演示. Gradio 允许您**构建演示并共享它们,所有这些都在 Python 中.**通常只需几

  • Gradio机器学习模型快速部署工具应用分享

    目录 1.嵌入 IFrame 2.API页面 3.验证 4.直接访问网络请求 5.在另一个 FastAPI 应用程序中安装[![图片转存失败,建议将图片保存下来直接上传 6.安全和文件访问 1.嵌入 IFrame (/assets/img/anchor.svg)]()](https://gradio.app/sharing-your-app/#embedding-with-iframes) 要改为嵌入 IFrame(例如,如果您无法将 javascript 添加到您的网站),请添加此元素: <i

  • 对python内置map和six.moves.map的区别详解

    python内置map返回的是列表,而six.moves.map返回的是iter. >>> map(lambda a: a*2, [1, 2, 3]) [2, 4, 6] >>> m = six.moves.map(lambda a: a*2, [1, 2, 3]) >>> type(m) <type 'itertools.imap'> >>> next(m) 2 >>> next(m) 4 >&g

  • C++类与对象深入之引用与内联函数与auto关键字及for循环详解

    目录 一:引用 1.1:概念 1.2:引用特性 1.3:常引用 1.4:使用场景 1.5:引用和指针的区别 二:内联函数 2.1:概念 2.2:特性 2.3:面试题 三:auto关键字 3.1:auto简介 3.2:auto使用细则 3.3:auto不能推导的场景 四:基于范围的for循环 4.1:范围for循环的语法 4.2:范围for循环的使用条件 一:引用 1.1:概念 引用不是定义一个新的变量,而是给已经存在的变量取一个别名.注意:编译器不会给引用变量开辟内存空间,他和他的引用变量共用同

  • apache实现部署多个网站(一个ip部署多域名)的方法详解

    前言 在日常的网站发布中很多情况下都无法做到一个IP对应一个站点,在IP4的情况下IP的资源是相对有限的.然而作为最流行的Apache自然也考虑到这种情况,下面来一起看看详细的介绍吧. 配置方法 首先apache的版本是2.4.7,然后系统是Ubuntu 14.04.1 LTS.(因为好像配置文件和目录有差异) 首先进到apache2目录下, 我们要探讨的主要是sites-available和sites-enabled根据字面意思,前一个是网站可用的,后一个是网站可用的,然后我们还知道了,sit

  • 玩客云内置EMMC存储刷入Armbian系统(图文详解)

    目录 设备准备:玩客云 玩客云配置: 系统:Armbian 准备工具 刷机软件及系统准备 刷机 步骤一:连接设备 步骤二:导入镜像 步骤三:烧入安卓底包 步骤四:U盘写入 Armbian 步骤五:U盘写入系统 重启并连接设备 把系统写入EMMC 第三步1:拆机 最近因 Nas 负荷太大,搞了一个玩客云作为微型主机分担了部分压力.要让玩客云成为一台微型主机,需要给它安装一个Armbian系统. 设备准备:玩客云 玩客云是一款前些年很火的矿机,曾经在官网售卖¥599,现在已经沦落到¥45包邮的田地了

  • 利用Distinct()内置方法对List集合的去重问题详解

    前言 说到对集合去重处理,第一时间想到的肯定是Linq的Distinct扩展方式,对于一般的值类型集合去重,很好处理,直接list.Distinct()即可.但是如果想要对一个引用类型的集合去重(属性值都相同就认为重复),就会发现,直接Distinct()是不行的 先来看看泛型链表 List<T> 的定义: public class List<T> : IList<T>, ICollection<T>, IList, ICollection, IReadOn

  • C++通过内嵌解释器调用Python及间接调用Python三方库

    目录 1.移植Python解释器 2.VS配置(VS2017为例,此教程与VS版本无关) 3.C++调用程序样例 4.被调Python程序样例 本文章目的是脱离安装Python环境的前提下,由C++程序调用Python程序及Python相关三方库 1.移植Python解释器 Python环境的目录结构 路径详解 需要用的如下图 1.红色部分是生成路径下解释器运行时依赖 将红色部分拷贝到C++编译主ExE路径下即可 2.蓝色部分是VS配置编译时依赖 路径或文件名 作用 DLLs Python内部运

  • C语言ASM汇编内嵌语法详解

    3 GCC Inline ASM GCC 支持在C/C++代码中嵌入汇编代码,这些汇编代码被称作GCC Inline ASM--GCC内联汇编.这是一个非常有用的功能,有利于我们将一些C/C++语法无法表达的指令直接潜入C/C++代码中,另外也允许我们直接写 C/C++代码中使用汇编编写简洁高效的代码. 1.基本内联汇编 GCC中基本的内联汇编非常易懂,我们先来看两个简单的例子: __asm__("movl %esp,%eax"); // 看起来很熟悉吧! 或者是 __asm__(&q

  • jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码

    iframe和弹窗这些词对于js高手来说都是耳熟能详的东西,作为一个新人来说,还在学习阶段的我就在工作中遇到这么一个奇葩的需求,要在引入的iframe页面里做一个全屏化的功能. 粗略一看,这还不容易,模拟下F11的功能键什么的,于是网上一搜还真有一大堆关于全屏化的案例,遂借来用之. 然后高高兴兴的拿一个没有iframe引入的页面做了个测试页面查看全屏化功能效果,代码如下(fullScreenPage.html): <!DOCTYPE html> <html xmlns="htt

  • java发送内嵌图片邮件

    整体效果: 发送端:网易邮箱:接收端:qq邮箱. 1.web前端 2.在网易邮箱"已发送"中可以看见通过java代码发送的邮件 3.同样在qq邮箱中也可以看到这样的效果 实现过程: 1.web前端(bootstrap布局) <form action="mailAction!sendMail" method="post" name="mailForm" id="mailFormId"> <u

  • 使用微信内嵌H5网页解决JS倒计时失效问题

    项目要求:将H5商城页面嵌套到公司微信公众号里 项目本身的开发跟移动端网页并无太多差异,只是这昨天遇到一个问题,说是棘手,到也简单. 用户下单后,在选择支付方式页面,有个倒计时的逻辑(从下单时开始计算,24小时后未支付,会有ws自动取消这个订单),js代码如下: <script type="text/javascript"><br> var timespan = '20160113'; //后台程序生成24小时时间差值,这里随便写写 var timer; fun

随机推荐