赞
踩
本系列文章主要介绍WEB界面工具Gradio。Gradio是Hugging Face发布的一个简易的webui开发框架,它基于FastAPI和svelte,便于部署人工智能模型,是当前热门的非常易于开发和展示机器大语言模型及扩散模型的UI框架。本系列文章不仅从概念上介绍Gradio的详细技术架构、历史、应用场景、与其他框架Gradio/NiceGui/StreamLit/Dash/PyWebIO的区别,还进行了大量实践讲解。实践部分先讲解了多种不同的安装、运行和部署方式,然后实践了基础类的Interfaces、Blocks和Custom Components,最后对详解Gradio的多种高级特性,比如Gradio-Lite、Gradio Client和Tabular Data Science And Plots等。
本系列文章目录如下:
本章讲解访问API的Gradio Client的三种使用方式:python、javascript和curl。受字数限制,所以分三篇博客发布。本篇讲解curl方式。
程序部署完成后,如何将Gradio App作为API访问使用呢,这就用到Gradio Client。本章讲解Gradio Client的三种使用方式:python、javascript和curl,以下分别讲解。
当我们试图从Python或Javascript以外的环境查询Gradio应用程序,cURL就派上用场了。cURL是多数操作系统上预安装的命令行工具,它可以将任意Gradio程序作为API使用。本节将详细讲述curl的用法,包括curl的安装、获取Gradio程序的curl方式URL的两种途径:通过API使用和定位源码关键字、POST/GET示例及awk/red整合命令等。
在多数操作系统中已预安装curl,只需要用以下命令查验版本即可:
$ curl --version
curl 7.81.0 (x86_64-pc-linux-gnu) libcurl/7.81.0 OpenSSL/3.0.2 zlib/1.2.11 brotli/1.0.9 zstd/1.4.8 libidn2/2.3.2 libpsl/0.21.0 (+libidn2/2.3.2) libssh/0.9.6/openssl/zlib nghttp2/1.43.0 librtmp/2.3 OpenLDAP/2.5.17
Release-Date: 2022-01-05
Protocols: dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS brotli GSS-API HSTS HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB PSL SPNEGO SSL TLS-SRP UnixSockets zstd
当版本需要更新或确认需要安装时,可参考curl官网安装教程:https://curl.se/download.html。
为了查询相应的Gradio程序,需要获得其完整URL。Gradio的URL有两种形式:对于托管在Gradio官网的应用程序,其形式通常为:https://bec81a83-5b5c-471e.gradio.live;而托管在Hugging Face Spaces中的Gradio程序,则需使用Gradio嵌入式的URL,而不是Space网页的URL,如下所示:
❌ Space URL: https://huggingface.co/spaces/abidlabs/en2fr
✅ Gradio app URL: https://abidlabs-en2fr.hf.space/
而Gradio嵌入式URL的获取也有两种途径,以2024年5月发布的OpenGPT-4o为例,其Hugging Face地址为:https://huggingface.co/spaces/KingNish/OpenGPT-4o。
{"embedSrc":"https://kingnish-opengpt-4o.hf.space","src":"https://kingnish-opengpt-4o.hf.space"}
本小节先通过一个简单例子演示POST/GET两类curl请求的使用方法,然后加入HF_TOKEN和帐密授权。在下一小节详细讲解POST/GET的细节。
获取到Gradio程序的URL后,我们就可以使用curl进行预测。还是以英转法翻译程序为例,先执行第一个POST请求,Gradio程序会返回一个EVENT_ID并将其打印到控制台,然后在第二个GET请求中使用EVENT_ID获取结果,如下所示:
$ curl -X POST https://abidlabs-en2fr.hf.space/call/predict -H "Content-Type: application/json" -d '{
"data": ["Hello, my friend."]
}'
>> {"event_id":"5e847ae0816844acaa7b0ecc956aec4d"}
$ curl -N https://abidlabs-en2fr.hf.space/call/predict/5e847ae0816844acaa7b0ecc956aec4d
>> event: complete
>> data: ["Bonjour, mon ami."]
我们也可以使用awk和read将这些命令组合成一个命令,awk解析第一个POST命令的结果,并使用read将解析的$4写入EVENT_ID,然后将其传入第二个GET命令,整个命令如下所示:
$ curl -X POST https://abidlabs-en2fr.hf.space/call/predict -H "Content-Type: application/json" -d '{
"data": ["Hello, my friend."]
}' \
| awk -F'"' '{ print $4}' \
| read EVENT_ID; curl -N https://abidlabs-en2fr.hf.space/call/predict/$EVENT_ID
当查询私有Spaces,需要用到Hugging Face (HF) token,这时需在两个curl调用中都包含一个额外的标头,其命令如下:
-H "Authorization: Bearer $HF_TOKEN"
完整命令如下:
$ curl -X POST https://private-space.hf.space/call/predict -H "Content-Type: application/json" -H "Authorization: Bearer $HF_TOKEN" -d '{
"data": ["Hello, my friend."]
}'
$ curl -N https://abidlabs-en2fr.hf.space/call/predict/$EVENT_ID -H "Authorization: Bearer $HF_TOKEN"
当Gradio应用程序启用了身份验证时,我们在进行任何查询之前,需要使用cURL发出额外的POST请求以进行身份验证。完整步骤如下:
首先,使用有效用户名和密码的POST请求进行登录:
curl -X POST $URL/login \
-d "username=$USERNAME&password=$PASSWORD" \
-c cookies.txt
如果凭据正确,我们将收到响应{“success”:true},Cookie将保存在cookies.txt中。
接下来,在发出原始POST请求时,需要将cookies.txt添加到命令中,如下所示:
$ curl -X POST $URL/call/$API_NAME -b cookies.txt -H "Content-Type: application/json" -d '{
"data": $PAYLOAD
}'
最后,使用GET获取结果,同样需要cookies.txt提供Cookie,如下:
curl -N $URL/call/$API_NAME/$EVENT_ID -b cookies.txt
在获取Gradio程序的URL和连接方法后,接下来我们详细介绍curl的两个请求POST和GET,以实现更复杂的参数和命令。
两个curl请求中的第一个是POST请求,它将输入的有效载荷提交给Gradio应用程序,以便Gradio应用程序进行后续处理。
POST请求的语法如下:
$ curl -X POST $URL/call/$API_NAME -H "Content-Type: application/json" -d '{
"data": $PAYLOAD
}'
各字段解释如下:
当我们成功发出此POST请求时,将获得一个事件id,该id以下面格式打印到终端:{"event_id": $EVENT_ID}
,在后续的curl请求GET中需要此EVENT_ID来获取预测结果。
以下是一些如何发出POST请求的示例:
$ curl -X POST https://abidlabs-en2fr.hf.space/call/predict -H "Content-Type: application/json" -d '{
"data": ["Hello, my friend."]
}'
curl -X POST https://gradio-hello-world-3.hf.space/call/predict -H "Content-Type: application/json" -d '{
"data": ["Hello", true, 5]
}'
{"path": $URL}
,示例如下:$ curl -X POST https://gradio-image-mod.hf.space/call/predict -H "Content-Type: application/json" -d '{
"data": [{"path": "https://raw.githubusercontent.com/gradio-app/gradio/main/test/test_files/bus.png"}]
}'
# These two requests will share a session
curl -X POST https://gradio-chatinterface-random-response.hf.space/call/chat -H "Content-Type: application/json" -d '{
"data": ["Are you sentient?"],
"session_hash": "randomsequence1234"
}'
curl -X POST https://gradio-chatinterface-random-response.hf.space/call/chat -H "Content-Type: application/json" -d '{
"data": ["Really?"],
"session_hash": "randomsequence1234"
}'
# This request will be treated as a new session
curl -X POST https://gradio-chatinterface-random-response.hf.space/call/chat -H "Content-Type: application/json" -d '{
"data": ["Are you sentient?"],
"session_hash": "newsequence5678"
}'
一旦我们收到与预测相对应的EVENT_ID,就可以stream流式传输结果。Gradio应用程序将这些结果存储在最近最少使用缓存(least-recently-used cache)中,缓存默认可以存储2000个跨用户和端点的结果。
要流式传输预测结果,需使用以下语法发出GET请求:
$ curl -N $URL/call/$API_NAME/$EVENT_ID
字段解释请参考POST。这条会产生以下格式的响应流:event: ... data: [...]
,其中event有以下几种分类:
响应流中data的格式与输入的有效载荷相同,是包含输出结果的有效JSON数据列表,每个输出组件代表一个结果元素。
以下是一些示例,说明如果请求成功应该得到什么结果:
$ curl -N https://abidlabs-en2fr.hf.space/call/predict/5e847ae0816844acaa7b0ecc956aec4d
event: complete
data: ["Bonjour, mon ami."]
event: complete
data: ["Good morning Hello. It is 5 degrees today", -15.0]
event: generating
data: ["Hello, w"]
event: generating
data: ["Hello, wo"]
...
event: complete
data: ["Hello, world!"]
{
"orig_name": "example.jpg",
"path": "/path/in/server.jpg",
"url": "https:/example.com/example.jpg",
"meta": {"_type": "gradio.FileData"}
}
在终端可能显示如下:
event: complete
data: [{"path": "/tmp/gradio/359933dc8d6cfe1b022f35e2c639e6e42c97a003/image.webp", "url": "https://gradio-image-mod.hf.space/c/file=/tmp/gradio/359933dc8d6cfe1b022f35e2c639e6e42c97a003/image.webp", "size": null, "orig_name": "image.webp", "mime_type": null, "is_stream": false, "meta": {"_type": "gradio.FileData"}}]
至此,Gradio Client的三种使用方式:python、javascript和curl已讲解完毕,后续我们将讲解gradio-tools工具包,请继续关注博主龙焰。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。