找回密码
 会员注册
查看: 40|回复: 0

GradioGradio客户端与轻量版开始使用GradioPython客户端

[复制链接]

2万

主题

0

回帖

6万

积分

超级版主

积分
64454
发表于 2024-9-3 15:18:50 | 显示全部楼层 |阅读模式
GradioPython客户端使得使用任何Gradio应用作为API变得非常容易。例如,考虑这个HuggingFaceSpacehttps://huggingface.co/spaces/abidlabs/whisper,它可以转录从麦克风录制的音频文件。使用 gradio_client 库,我们可以轻松地使用Gradio作为API来编程转录音频文件。这是完成它的全部代码:#从gradio_client包中导入Client和file类fromgradio_clientimportClient,file#创建一个Client对象,指定要使用的模型是“abidlabs/whisper”client=Client("abidlabs/whisper")#使用客户端的predict方法进行预测,输入参数是一个通过file函数封装的音频文件“audio_sample.wav”output=client.predict(audio=file("audio_sample.wav"))#输出预测结果print(output)Gradio客户端适用于任何托管的Gradio应用!尽管客户端主要用于托管在HuggingFaceSpaces上的应用,但您的应用可以托管在任何地方,例如您自己的服务器。先决条件:要使用Gradio客户端,您不需要非常详细地了解 gradio 库。然而,对Gradio的输入和输出组件概念有一般的熟悉是有帮助的。 安装 如果您已经有了最新版本的 gradio ,那么 gradio_client 将作为依赖项包含在内。但请注意,此文档反映了 gradio_client 的最新版本,所以如果您不确定,请升级!轻量级 gradio_client 包可以通过pip(或pip3)安装,并且已测试可与Python3.9或更高版本一起使用:$pipinstall--upgradegradio_client连接到HuggingFaceSpaces上的Gradio应用程序 首先连接实例化一个 Client 对象,并将其连接到运行在HuggingFaceSpaces上的Gradio应用程序。fromgradio_clientimportClientclient=Client("abidlabs/en2fr")#aSpacethattranslatesfromEnglishtoFrenchfromgradio_clientimportClientclient=Client("abidlabs/my-private-space",hf_token="...")#导入os库,用于从环境变量中获取HuggingFaceTokenimportos#从gradio_client包中导入Client和file类fromgradio_clientimportClient,file#从环境变量中读取HuggingFaceTokenHF_TOKEN=os.environ.get("HF_TOKEN")#使用Client类的duplicate方法创建一个客户端实例,传入模型的名称和HuggingFaceToken#hf_token=HF_TOKEN用于验证与HuggingFace平台的交互client=Client.duplicate("abidlabs/whisper",hf_token=HF_TOKEN)#使用客户端的predict方法进行预测。输入参数通过file函数包装的音频文件“audio_sample.wav”#这里没有直接将结果赋值给一个变量,但是预期的行为是函数会返回处理后的文本client.predict(file("audio_sample.wav"))#输出结果应为“Thisisatestofthewhisperspeechrecognitionmodel.”,#说明“audio_sample.wav”文件中的语音内容被成功识别注意:如果原始空间使用了GPU,您的私人空间也会使用,并且您的HuggingFace账户将根据GPU的价格进行计费。为了减少费用,您的空间在1小时无活动后会自动休眠。您也可以使用 hardware 参数来设置硬件 duplicate() 。连接一个通用的Gradio应用 如果您的应用程序在其他地方运行,只需提供完整的URL,包括"http://"或"https://"。这里有一个例子,展示了如何对运行在共享URL上的Gradio应用程序进行预测:fromgradio_clientimportClientclient=Client("https://bec81a83-5b5c-471e.gradio.live")检查API端点 一旦您连接到Gradio应用程序,您可以通过调用 Client.view_api() 方法来查看可用的API。对于Whisper空间,我们看到以下内容:Client.predict()UsageInfo---------------------------NamedAPIendpoints:1-predict(audio,api_name="/predict")->outputParameters:-[Audio]audio:filepath(required)Returns:-[Textbox]output:str我们看到这个空间中有1个API端点,并向我们展示了如何使用API端点进行预测:我们应该调用 .predict() 方法(我们将在下面探讨),提供一个类型为 str 的参数 input_audio ,它是一个 filepathorURL 。最简单的预测方法就是用适当的参数调用 .predict() 函数:fromgradio_clientimportClientclient=Client("abidlabs/en2fr",api_name='/predict')client.predict("Hello")>>Bonjour如果有多个参数,那么你应该将它们作为 .predict() 的单独参数传递,像这样:fromgradio_clientimportClientclient=Client("gradio/calculator")client.predict(4,"add",5)>>9.0建议提供关键字参数而不是位置参数:fromgradio_clientimportClientclient=Client("gradio/calculator")client.predict(num1=4,operation="add",num2=5)>>9.0这允许您利用默认参数。例如,这个空间包括滑块组件的默认值,所以当客户端访问它时,您不需要提供它。fromgradio_clientimportClientclient=Client("abidlabs/image_generator")client.predict(text="anastronautridingacamel")默认值是相应Gradio组件的初始值。如果组件没有初始值,但是预测函数中的相应参数有一个默认值 None ,那么在客户端中该参数也是可选的。当然,如果您想覆盖它,您也可以包括它:fromgradio_clientimportClientclient=Client("abidlabs/image_generator")client.predict(text="anastronautridingacamel",steps=25)为了提供文件或URL作为输入,您应该将文件路径或文件的URL放在 gradio_client.file() 中。这样可以将文件上传到Gradio服务器,并确保文件被正确预处理:fromgradio_clientimportClient,fileclient=Client("abidlabs/whisper")client.predict(audio=file("https://audio-samples.github.io/samples/mp3/blizzard_unconditional/sample-0.mp3"))>>"MythoughtIhavenobodybyabeautyandwillasyoupoured.Mr.Rochesterisserveinthatsodon'tfindsimpus,anddevotedabode,toatmightinar—"运行作业异步地 我们应该注意 .predict() 是一个阻塞操作,因为它等待操作完成后才返回预测结果。在许多情况下,您可能更愿意让作业在后台运行,直到您需要预测结果。您可以通过使用 .submit() 方法创建一个 Job 实例,然后稍后调用作业上的 .result() 来获取结果。例如:fromgradio_clientimportClientclient=Client(space="abidlabs/en2fr")job=client.submit("Hello",api_name="/predict")#Thisisnotblocking#Dosomethingelsejob.result()#Thisisblocking>>Bonjour添加回调 或者,可以添加一个或多个回调,在作业运行完成后执行操作,如下:fromgradio_clientimportClientdefprint_result(x):print("Thetranslatedresultis:{x}")client=Client(space="abidlabs/en2fr")job=client.submit("Hello",api_name="/predict",result_callbacks=[print_result])#Dosomethingelse>>Thetranslatedresultis:Bonjour 状态 Job 对象还允许您通过调用 .status() 方法来获取正在运行的作业的状态。这将返回一个 StatusUpdate 对象,包含以下属性: code (状态代码,一组定义的字符串中的一个,代表状态。参见 utils.Status 类), rank (此作业在队列中的当前位置), queue_size (队列总大小), eta (预计此作业完成的时间), success (一个布尔值,表示作业是否成功完成),以及 time (生成状态的时间)。fromgradio_clientimportClientclient=Client(src="gradio/calculator")job=client.submit(5,"add",4,api_name="/predict")job.status()>>注意: Job 类还有一个 .done() 实例方法,它返回一个布尔值,指示作业是否已完成。 取消工作 Job 类还有一个 .cancel() 实例方法,用于取消已经排队但尚未开始的工作。例如,如果你运行:client=Client("abidlabs/whisper")job1=client.submit(file("audio_sample1.wav"))job2=client.submit(file("audio_sample2.wav"))job1.cancel()#willreturnFalse,assumingthejobhasstartedjob2.cancel()#willreturnTrue,indicatingthatthejobhasbeencanceled如果第一个工作已经开始处理,那么它将不会被取消。如果第二个工作还没有开始,它将被成功取消并从队列中移除。Generator 端点 有些GradioAPI端点不返回单一值,而是返回一系列值。您可以通过运行 job.outputs() 随时获取从这样的生成器端点返回的值序列:fromgradio_clientimportClientclient=Client(src="gradio/count_generator")job=client.submit(3,api_name="/count")whilenotjob.done():time.sleep(0.1)job.outputs()>>['0','1','2']请注意,在生成器端点上运行 job.result() 只会得到该端点返回的第一个值。Job 对象也是可迭代的,这意味着您可以使用它来显示生成器函数从端点返回的结果。以下是使用 Job 作为生成器的等效示例:#从gradio_client包中导入Client类fromgradio_clientimportClient#创建一个Client对象,指定要使用的模型是“gradio/count_generator”client=Client(src="gradio/count_generator")#使用客户端的submit方法提交一个任务。这里的任务是计数到3(不包括3)。#api_name参数指定了要调用的API的名称,这里是/countjob=client.submit(3,api_name="/count")#循环遍历任务的输出foroinjob:#打印每一次迭代的输出值print(o)您也可以取消具有迭代输出的作业,在这种情况下,作业将在当前迭代完成运行后尽快结束。fromgradio_clientimportClientimporttimeclient=Client("abidlabs/test-yield")job=client.submit("abcdef")time.sleep(3)job.cancel()#jobcancelsafter2iterations演示带有会话状态 Gradio演示可以包括会话状态,这为演示在页面会话中保持用户交互信息提供了一种方式。例如,考虑以下演示,它在一个 gr.State 组件中维护用户提交的单词列表。当用户提交一个新单词时,它会被添加到状态中,并显示该单词之前出现的次数:#导入gradio库importgradioasgr#定义一个名为count的函数,用于计算一个单词在列表中的出现次数,并返回次数和更新后的列表defcount(word,list_of_words):#返回单词在列表中的计数以及更新后的列表(在原列表基础上添加了新单词)returnlist_of_words.count(word),list_of_words+[word]#使用gradio的Blocks创建一个交互式应用withgr.Blocks()asdemo:#使用gr.State创建一个空列表,作为词汇的初始列表words=gr.State([])#创建一个文本框用于用户输入单词textbox=gr.Textbox()#创建一个数字显示组件,用于显示计数结果number=gr.Number()#设置文本框组件的提交行为。当文本框内的数据被提交时,会调用count函数。#inputs指定了输入参数,分别是用户输入的单词和当前单词列表;#outputs指定了输出,包括计数结果和更新后的单词列表。textbox.submit(count,inputs=[textbox,words],outputs=[number,words])#启动创建的应用demo.launch()如果您使用Python客户端连接这个Gradio应用程序,您会注意到API信息只显示一个输入和一个输出:Client.predict()UsageInfo---------------------------NamedAPIendpoints:1-predict(word,api_name="/count")->value_31Parameters:-[Textbox]word:str(required)Returns:-[Number]value_31:float那是因为Python客户端会自动为您处理状态——当您发出一系列请求时,一个请求的返回状态会被内部存储,并自动为后续请求提供。如果您想要重置状态,您可以通过调用 Client.reset_session() 来实现。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-27 13:58 , Processed in 0.385603 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表