Gradio官方学习文档(二)

一、队列

多用户访问Gradio app排队机制,支持的类:gr.Interface, gr.Blocks, and gr.ChatInterface
示例:

#在类后使用queue()函数,设定`default_concurrency_limit` = 5(不声明,默认值为1)
demo = gr.Interface(...).queue(default_concurrency_limit=5)
demo.launch()

二、流式输出(yield)

在Gradio中,类声明streaming=True 和生成器 yield 都是用于处理实时数据流的技术,但它们在工作方式和应用场景上有所不同。

类声明streaming=True

streaming=True目前只支持Audio和Image类

  • 使用 streaming=True 可以将数据流拆分成多个小块,并在每个小块准备好后立即将其发送给Gradio界面。这使得Gradio能够实时更新界面,而无需等待整个数据流完全准备好。
  • 使用 streaming=True 需要使用 yield 生成器来逐个生成数据块。
  • streaming=True 适用于需要实时更新界面的场景,例如实时监控传感器数据或生成实时音频/视频。
    示例:gr.Audio(source='microphone', streaming=True)

生成器 yield

  • 生成器 yield 是一种用于生成序列的函数。它每次调用时都会返回序列中的下一个元素,但不会立即计算整个序列。
  • 生成器 yield 可以与 streaming=True 一起使用,也可以单独使用。
  • 生成器 yield 适用于需要按需生成数据的场景,例如生成大型数据集或进行迭代计算。

区别对比:

特性streaming=True生成器 yield
工作方式将数据流拆分成多个小块,并在每个小块准备好后立即将其发送给Gradio界面。每次调用时都会返回序列中的下一个元素,但不会立即计算整个序列。
应用场景实时更新界面按需生成数据
适用范围Audio和Image类几乎所有

示例:


import gradio as gr
import numpy as np
import time
#Steps步渲染出目标图片,实现流式输出
def fake_diffusion(steps):
    rng = np.random.default_rng()
    for i in range(steps):
        time.sleep(1)
        image = rng.random(size=(600, 600, 3))
        yield image
    image = np.ones((1000,1000,3), np.uint8)
    image[:] = [255, 124, 0]
    yield image


demo = gr.Interface(fake_diffusion,
                    inputs=gr.Slider(1, 10, 3, step=1),#定义拖拉条,默认值为3,拖拉单位为1
                    outputs="image")

demo.launch()

yield流式输出

三、警示通知

报错:

gr.Error('This is an error.')    

通知:

gr.Info('This is some info.')

gr.Warning('This is a warning.')

InfoWarning这两个只有颜色区别
alert

四、主题风格

使用方法

demo = gr.Interface(..., theme=gr.themes.Monochrome())

要进一步拥有样式设计的能力,您可以向Gradio应用程序传递任何CSS(以及自定义JavaScript)。

预览主题切换示例:

import gradio as gr

gr.themes.builder()

themes-mon
themes-soft

其他主题的细节设置请看官访文档:

themes-guild

五、进度条

示例:

import gradio as gr
import time

#在函数定义添加参数gr.Progress()即可,inputs和outputs不需要改变
def slowly_reverse(word, progress=gr.Progress()):
    #初始化
    progress(0, desc="Starting")
    time.sleep(1)
    #定义处理的显示单位长度
    progress(0.05)
    new_string = ""
    for letter in progress.tqdm(word, desc="Reversing"):
        time.sleep(0.25)
        new_string = letter + new_string
    return new_string

demo = gr.Interface(slowly_reverse, gr.Text(), gr.Text())

demo.launch()

Progess
也可以和tqdm进行耦合,如果想使用tqdm,只需要修改为gr.Progress(track_tqdm=True),前提是有tqdm.tqdm在你的函数体内。

六、批处理函数(对多个请求,并行处理加速)

Gradio支持传递批处理函数的功能。批处理函数就是接收输入列表并返回预测列表的函数。
例如,这里是一个批处理函数,它接收两个输入列表(一个单词列表和一个整数列表),并返回修剪后的单词列表作为输出:

import time

def trim_words(words, lens):
    trimmed_words = []
    time.sleep(5)
    for w, l in zip(words, lens):
        trimmed_words.append(w[:int(l)])
    return [trimmed_words]

使用批处理函数的优势在于,如果启用排队,Gradio服务器可以
自动批处理传入的请求并并行处理,可能加快演示速度

以下是相关Gradio代码示例(请注意batch=Truemax_batch_size=16):
gr.Interface类使用方式:

demo = gr.Interface(
    fn=trim_words, 
    inputs=["textbox", "number"], 
    outputs=["output"],
    batch=True, 
    max_batch_size=16 #最大批处理大小
)

demo.launch()

gr.Blocks使用方式(之后会提到gr.Blocks)

import gradio as gr

with gr.Blocks() as demo:
    with gr.Row():
        word = gr.Textbox(label="word")
        leng = gr.Number(label="leng")
        output = gr.Textbox(label="Output")
    with gr.Row():
        run = gr.Button()

    event = run.click(trim_words, [word, leng], output, batch=True, max_batch_size=16)

demo.launch()

在上面的例子中,可以并行处理16个请求(总推理时间为5秒),而不是每个请求单独处理(总推理时间为80秒)。
并行5秒,串行80秒,并行提速。

  • 33
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值