大模型WebUI:Gradio全解系列9——Additional Features:附加功能(上)

大模型WebUI:Gradio全解系列9——Additional Features:附加功能(上)

  • 前言
  • 本篇摘要
  • 9. Additional Features:附加功能
    • 9.1 队列
      • 9.1.1 使用方法
      • 9.1.2 配置队列演示
    • 9.2 输入输出流
      • 9.2.1 输出流
        • 1. 生成器yield
        • 2. 流媒体
      • 9.2.2 输入流
        • 1. 流事件
        • 2. 图像滤镜
      • 9.2.3 统一的输入输出流
      • 9.2.4 跟踪过去的输入或输出
    • 9.3 提示及进度条
      • 9.3.1 提示
      • 9.3.2 进度条
    • 参考文献

前言

本系列文章主要介绍WEB界面工具Gradio。Gradio是Hugging Face发布的简易webui开发框架,它基于FastAPI和svelte,便于部署人工智能模型,是当前热门的非常易于开发和展示机器学习大语言模型LLM及扩散模型DM的UI框架。本系列文章分为前置概念和实战演练两部分。前置概念先介绍Gradio的详细技术架构、历史、应用场景、与其他框架Gradio/NiceGui/StreamLit/Dash/PyWebIO的区别,然后详细介绍了大模型及数据的资源网站Hugging Face,包括三种资源models/datasets/spaces、六类开源库transformers/diffusers/datasets/PEFT/accelerate/optimum实战。实战演练部分先讲解了多种不同的安装、运行和部署方式,安装包括Linux/Win/Mac三类系统安装,运行包括普通方式和热重载方式,部署包括本地部署、HuggingFace托管、FastAPI挂载和Gradio-Lite浏览器集成;然后按照先整体再细节的逻辑,讲解Gradio的多种高级特性:三种Gradio Clients(python/javascript/curl)、Gradio Tools、Gradio的模块架构和环境变量等,方便读者对Gradio整体把握;最后深入细节,也是本系列文章的核心,先实践基础功能Interface、Blocks和Additional Features,再详解高级功能Chatbots、Data Science And Plots和Streaming。本系列文章注解详细,代码均可运行并附有大量运行截图,方便读者理解,Gradio一定会成为每个技术人员实现奇思妙想的最称手工具。

本系列文章目录如下:

  1. 《Gradio全解系列1——Gradio简介》
  2. 《Gradio全解系列1——Gradio的安装与运行》
  3. 《Gradio全解系列2——Gradio的3+1种部署方式实践》
  4. 《Gradio全解系列2——浏览器集成Gradio-Lite》
  5. 《Gradio全解系列3——Gradio Client:python客户端》
  6. 《Gradio全解系列3——Gradio Client:javascript客户端》
  7. 《Gradio全解系列3——Gradio Client:curl客户端》
  8. 《Gradio全解系列4——Gradio Tools:将Gradio用于LLM Agents》
  9. 《Gradio全解系列5——Gradio库的模块架构和环境变量》
  10. 《Gradio全解系列6——Interface:高级抽象界面类(上)》
  11. 《Gradio全解系列6——Interface:高级抽象界面类(下)》
  12. 《Gradio全解系列7——Blocks:底层区块类(上)》
  13. 《Gradio全解系列7——Blocks:底层区块类(下)》
  14. 《Gradio全解系列8——Additional Features:附加功能(上)》
  15. 《Gradio全解系列8——Additional Features:附加功能(下)》
  16. 《Gradio全解系列9——Chatbots:聊天机器人(上)》
  17. 《Gradio全解系列9——Chatbots:聊天机器人(下)》
  18. 《Gradio全解系列10——Data Science And Plots:数据科学与绘图》
  19. 《Gradio全解系列11——Streaming:数据流(上)》
  20. 《Gradio全解系列11——Streaming:数据流(下)》

本篇摘要

本篇介绍Gradio的其它附加功能,这些功能辅助Interface/Blocks实现更绚丽效果和更多功能。本章附加功能主要包括队列、输入输出流、提示及进度条、批处理函数、安全访问文件和资源清理,下面逐一讲述。

9. Additional Features:附加功能

本篇介绍Gradio的其它附加功能,这些功能辅助Interface/Blocks实现更绚丽效果和更多功能。本章附加功能主要包括队列、输入输出流、提示及进度条、批处理函数、安全访问文件和资源清理,下面逐一讲述。

9.1 队列

每个Gradio程序提供了一个内置的队列系统,可以处理数千个并发用户。由于许多事件监听器可能涉及繁重的处理任务,Gradio 会自动为每个事件监听器创建一个队列来处理后端的事件,因此每个事件监听器都会自动拥有一个队列来处理传入的事件。

9.1.1 使用方法

如果函数推理时间较长(比如目标检测),或者应用程序处理流量过大,则需要使用queue方法进行排队。queue方法使用websockets,可以防止网络超时,通过启用队列,可以控制用户在队列中的位置。

队列使用方式如下:

demo = gr.Interface(...).queue()
demo.launch()
#或
with gr.Blocks() as demo:#...
demo.queue()
demo.launch()

以Blocks为例,演示如下:

with gr.Blocks() as demo:button = gr.Button(label="Generate Image")button.click(fn=image_generator, inputs=gr.Textbox(), outputs=gr.Image())
demo.queue(max_size=10)
demo.launch()

9.1.2 配置队列演示

每个事件监听器默认都有自己的队列,一次处理一个请求,但可以通过事件监听器的两个参数进行配置:

  • concurrency_limit:设置事件监听器的最大并发执行数。默认情况下限制为 1,除非在 Blocks.queue() 中的参数default_concurrency_limit另行配置。你也可以将其设置为None以表示无限制(即无限数量的并发执行);
  • concurrency_id:允许事件监听器通过分配相同的ID来共享队列。当使用共享队列管理多个事件监听器时,使用concurrency_id指定队列,例如如果你的设置中只有2个GPU,但多个函数需要访问GPU访问,此时可以为所有这些函数创建一个共享队列。

两个参数的设置示例如下:

import gradio as grwith gr.Blocks() as demo:prompt = gr.Textbox()image = gr.Image()generate_btn_1 = gr.Button("Generate Image via model 1")generate_btn_2 = gr.Button("Generate Image via model 2")generate_btn_3 = gr.Button("Generate Image via model 3")generate_btn_1.click(image_gen_1, prompt, image, concurrency_limit=2, concurrency_id="gpu_queue")generate_btn_2.click(image_gen_2, prompt, image, concurrency_id="gpu_queue")generate_btn_3.click(image_gen_3, prompt, image, concurrency_id="gpu_queue")

在这个例子中,所有三个事件监听器共享一个标识为 “gpu_queue” 的队列。该队列最多可以同时处理 2 个并发请求,额外的请求将被排队,直到有可用的槽位。这些配置易于Gradio管理队列行为。注意事项:

  1. 要确保事件监听器的并发无限制,可以将 concurrency_limit设置为None,这在用户函数调用外部 API(该API自行处理请求的速率限制)时非常有用。
  2. 所有队列的默认并发限制可以使用Blocks.queue()中的default_concurrency_limit参数全局设置。

9.2 输入输出流

对于图像、音频、视频等文件,需要用流进行操作,本节通过讲述输出流、输入流、统一的输入输出流以及跟踪流等,让大家掌握如何处理多媒体文件。

9.2.1 输出流

在某些情况下,我们需要流式输出一系列结果,而不是一次性显示单个输出。例如,某个图像生成模型希望显示每一步生成的图像,直到最终图像生成;或者某个聊天机器人,它逐词流式输出响应,而不是一次性返回所有内容。在这种情况下,可以向Gradio提供一个生成器函数。

1. 生成器yield

在Python中创建生成器非常简单:通常yield语句会放在某种循环中,该函数不是返回单个值,而是生成一系列值。可以像提供常规函数一样向Gradio提供生成器。

例如,以下是一个模拟的图像生成模型,它在输出图像之前生成若干步噪声,使用gr.Interface类进行演示:

import gradio as gr
import numpy as np
import timedef fake_diffusion(steps):rng = np.random.default_rng()for i in range(steps):time.sleep(1)image = rng.random(size=(600, 600, 3))yield imageimage = np.ones((1000,1000,3), np.uint8)image[:] = [255, 124, 0]yield imagedemo = gr.Interface(fake_diffusion,inputs=gr.Slider(1, 10, 3, step=1),outputs="image")demo.launch()

运行截图如下:
在这里插入图片描述
请注意,我们在迭代器中添加了 time.sleep(1),它在步骤之间创建一个人为的暂停,这样就能够观察到迭代器的每一步。但在真实的图像生成模型中,这可能是不必要的。

Gradio同样可以处理输入流,例如,每当用户在文本框中输入一个字母时,图像生成模型都会重新运行。这在关于构建响应式界面的中有更详细的介绍,请参考Interface章节中关于实时Interface的讲解。

2. 流媒体

Gradio可以直接从生成器函数中流式输出音频和视频,这让用户几乎在函数生成音频或视频的同时就能听到或看到。实现流式媒体只需执行以下操作:

  1. 在 gr.Audio 或 gr.Video 输出组件中设置 streaming=True,图像自动转换为 base64 格式;
  2. 编写一个 Python 生成器,生成下一个音频或视频的“chunk”块;
  3. 设置 autoplay=True,以便媒体自动开始播放。

对于音频,下一个“块”可以是 .mp3 或 .wav 文件,也可以是音频的字节序列。对于视频,下一个“块”必须是 .mp4 文件或使用 h.264 编解码器且扩展名为 .ts 的文件。为了确保流畅播放,请确保每个块的长度一致且大于 1 秒。

我们将通过一些简单的示例来说明这些要点,以音频为例:

import gradio as gr
from time import sleepdef keep_repeating(audio_file):for _ in range(10):sleep(0.5)yield audio_filegr.Interface(keep_repeating,gr.Audio(sources=["microphone"], type="filepath"),gr.Audio(streaming=True, autoplay=True)
).launch()

运行后点击submit,输出与输入同步播放,截图如下:
在这里插入图片描述
同样也可以视频为例,只需将gr.Audio替换为gr.Video即可:gr.Video(sources=["webcam"], format="mp4"),设置也一样,不再重复。关于流的端到端演示请参考后续的数据流章节。

9.2.2 输入流

在上一小节中,我们介绍了如何从事件处理程序中流式输出一系列结果。Gradio还可以将用户摄像头中的图像或麦克风中的音频块流式输入到事件处理程序中,这可以用于创建实时对象检测应用程序或使用Gradio构建对话式聊天应用。

1. 流事件

目前,gr.Image 和 gr.Audio 组件支持通过 stream 事件实现输入流。比如创建一个最简单的流式应用程序,直接返回未修改的网络摄像头流:

import gradio as grwith gr.Blocks() as demo:with gr.Row():with gr.Column():input_img = gr.Image(label="Input", sources="webcam")with gr.Column():output_img = gr.Image(label="Output")input_img.stream(lambda s: s, input_img, output_img, time_limit=15, stream_every=0.1, concurrency_limit=30)if __name__ == "__main__":demo.launch()

运行截图如下:
在这里插入图片描述
可以自己运行看一下效果。当用户开始录制时,stream 事件会被触发。底层逻辑是网络摄像头每 0.1 秒拍摄一张照片并将其发送到服务器,然后服务器会返回该图像。

stream 事件有两个独特的关键字参数:

  • time_limit:这是 Gradio 服务器处理事件的时间限制。多媒体流本质上是无限制的,因此设置时间限制非常重要,以防止一个用户长期占用 Gradio 队列。时间限制仅计算处理流所花费的时间,不包括在队列中等待的时间。输入图像底部显示的橙色条表示剩余时间。当时间限制到期时,用户将自动重新加入队列。
  • stream_every:这是流捕获输入并将其发送到服务器的频率(以秒为单位)。对于图像检测或处理等演示,设置较小的值可以实现“real-time”实时效果。对于语音转录等演示,较高的值更有用,因为可以使转录算法可以更好地理解上下文。
2. 图像滤镜

本节创建一个图像滤镜演示,用户可以选择多种应用于网络摄像头输入流的滤镜,滤镜种类包括边缘检测滤镜、卡通滤镜,或者简单地垂直翻转流滤镜。代码如下:

import gradio as gr
import numpy as np
import cv2def transform_cv2(frame, transform):if transform == "cartoon":# prepare colorimg_color = cv2.pyrDown(cv2.pyrDown(frame))for _ in range(6):img_color = cv2.bilateralFilter(img_color, 9, 9, 7)img_color = cv2.pyrUp(cv2.pyrUp(img_color))# prepare edgesimg_edges = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)img_edges = cv2.adaptiveThreshold(cv2.medianBlur(img_edges, 7),255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,9,2,)img_edges = cv2.cvtColor(img_edges, cv2.COLOR_GRAY2RGB)# combine color and edgesimg = cv2.bitwise_and(img_color, img_edges)return imgelif transform == "edges":# perform edge detectionimg = cv2.cvtColor(cv2.Canny(frame, 100, 200), cv2.COLOR_GRAY2BGR)return imgelse:return np.flipud(frame)with gr.Blocks() as demo:with gr.Row():with gr.Column():transform = gr.Dropdown(choices=["cartoon", "edges", "flip"],value="flip", label="Transformation")input_img = gr.Image(sources=["webcam"], type="numpy")with gr.Column():output_img = gr.Image(streaming=True)dep = input_img.stream(transform_cv2, [input_img, transform], [output_img],time_limit=30, stream_every=0.1, concurrency_limit=30)demo.launch()

运行后选择边缘检测滤镜,截图如下:
在这里插入图片描述
需要注意的是:

  1. 当更改滤镜值时,它会立即在输出流中生效。这是流事件与其他 Gradio 事件的一个重要区别:在处理流的过程中,可以更改流相关的输入值并立即生效。
  2. 我们将图像输出组件的 streaming 参数设置为True,这样可以让服务器自动将输出图像转换为 base64 格式,这是一种适合流高效传输的格式。

9.2.3 统一的输入输出流

对于一些图像流式传输演示(如上面的示例),我们不需要分别显示输入和输出组件,只显示修改后的输出流,应用程序看起来会更简洁。

我们可以通过将输入图像组件指定为流事件的输出来实现这一点,省略重复代码,另外加入一些CSS格式,核心代码如下:

css=""".my-group {max-width: 500px !important; max-height: 500px !important;}.my-column {display: flex !important; justify-content: center !important; align-items: center !important};"""with gr.Blocks(css=css) as demo:with gr.Column(elem_classes=["my-column"]):with gr.Group(elem_classes=["my-group"]):transform = gr.Dropdown(choices=["cartoon", "edges", "flip"],value="flip", label="Transformation")input_img = gr.Image(sources=["webcam"], type="numpy", streaming=True)input_img.stream(transform_cv2, [input_img, transform], [input_img], time_limit=30, stream_every=0.1)demo.launch()

运行截图如下:
在这里插入图片描述

9.2.4 跟踪过去的输入或输出

通常流式函数应该是无状态的,它应该接受当前输入并返回相应的输出。然而在某些情况下,可能希望跟踪过去的输入或输出。例如可能希望在缓冲区保留前 k 个输入,以提高音频转录演示的准确性。可以使用 Gradio 的 gr.State()组件来实现这一点,示例如下:

def transcribe_handler(current_audio, state, transcript):next_text = transcribe(current_audio, history=state)state.append(current_audio)# 保留前3个输入state = state[-3:]return state, transcript + next_textwith gr.Blocks() as demo:with gr.Row():with gr.Column():mic = gr.Audio(sources="microphone")state = gr.State(value=[])with gr.Column():transcript = gr.Textbox(label="Transcript")mic.stream(transcribe_handler, [mic, state, transcript], [state, transcript],time_limit=10, stream_every=1)demo.launch()

9.3 提示及进度条

当程序运行出现状况时,如何告知用户,以及让用户知道等待时间,这就用到提示和进度条。

9.3.1 提示

提示组件分为三类:gr.Error()、 gr.Warning() 和gr.Info() 。我们希望向用户显示提示错误信息,为此可以在函数中抛出 gr.Error(“自定义消息”) ,这时函数停止执行并向用户显示错误信息。

我们还可以通过在函数中单独使用 gr.Warning(“自定义消息”) 或 gr.Info(“自定义消息”) 来立即显示模态框,同时继续执行函数。gr.Info() 和 gr.Warning() 之间的唯一区别是提示框的颜色。演示如下:

import gradio as gr
from functools import partialwith gr.Blocks() as demo:with gr.Row():duration = gr.Number(label="Duration", info="Set to -1 for infinite", value=10, minimum=-1)with gr.Row():error = gr.Button("Error")info = gr.Button("Info")warning = gr.Button("Warning")def display_message(type, msg, duration):duration = None if duration < 0 else durationif type == "error":raise gr.Error(msg, duration=duration)elif type == "info":gr.Info(msg, duration=duration)elif type == "warning":gr.Warning(msg,  duration=duration)error.click(partial(display_message, "error", "ERROR 💥"),  [duration])info.click(partial(display_message, "info", "INFO ℹ️"), [duration])warning.click(partial(display_message, "warning", "WARNING ⚠️"), [duration])

运行结果如下:
在这里插入图片描述
提示:请注意gr.Error()是一个必须引发的异常,而gr.Warning()gr.Info()可以让函数继续运行。

9.3.2 进度条

Gradio 支持创建自定义进度条,可以自定义和控制进度更新,以便向用户展示。要启用此功能,只需在方法中添加一个参数,该参数的默认值为 gr.Progress 实例;然后通过直接调用此实例并传入一个介于 0 和 1 之间的浮点数来更新进度,或者使用 Progress 实例的 tqdm() 方法来跟踪可迭代对象的进度,演示如下:

import gradio as gr
import timedef 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_stringdemo = gr.Interface(slowly_reverse, gr.Text(), gr.Text())
demo.launch()

运行截图如下:
在这里插入图片描述
如果使用 tqdm 库,甚至可以通过将gr.Progress()的参数track_tqdm设置为True,自动从任意函数中已存在的 tqdm.tqdm 报告进度更新!

参考文献

  1. Gradio - guides - Additional Features

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/65519.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java - 日志体系_Apache Commons Logging(JCL)日志接口库_桥接Logback 及 源码分析

文章目录 PreApache CommonsApache Commons ProperLogging &#xff08;Apache Commons Logging &#xff09; JCL 集成logbackPOM依赖配置文件 logback.xml使用 源码分析jcl-over-slf4j 的工作原理1. LogFactory 的实现2. SLF4JLogFactory 和 Log 的实例化过程3. SLF4JLog 和 …

文档大师:打造一站式 Word 报告解决方案1

前言 在政府、医院、银行、财务以及销售等领域&#xff0c;常常需要创建各种报告文件来展开工作汇报&#xff0c;譬如季度销售报告、年度总结报告、体检报告和保险合同等。在没有报表工具支持之前&#xff0c;这类报告主要通过 Word 制作&#xff0c;费时费力且难以维护&#…

阿尔萨斯(JVisualVM)JVM监控工具

文章目录 前言阿尔萨斯(JVisualVM)JVM监控工具1. 阿尔萨斯的功能2. JVisualVM启动3. 使用 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff…

<数据集>芝麻作物和杂草识别数据集<目标检测>

数据集下载链接 &#xff1c;数据集&#xff1e;芝麻作物和杂草识别数据集&#xff1c;目标检测&#xff1e;https://download.csdn.net/download/qq_53332949/90181548数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1300张 标注数量(xml文件个数)&#xff1a;130…

STM32-笔记18-呼吸灯

1、实验目的 使用定时器 4 通道 3 生成 PWM 波控制 LED1 &#xff0c;实现呼吸灯效果。 频率&#xff1a;2kHz&#xff0c;PSC71&#xff0c;ARR499 利用定时器溢出公式 周期等于频率的倒数。故Tout 1/2KHZ&#xff1b;Ft 72MHZ PSC71&#xff08;喜欢设置成Ft的倍数&…

JVM实战—4.JVM垃圾回收器的原理和调优

大纲 1.JVM的新生代垃圾回收器ParNew如何工作 2.JVM老年代垃圾回收器CMS是如何工作的 3.线上部署系统时如何设置垃圾回收相关参数 4.新生代垃圾回收参数如何优化 5.老年代的垃圾回收参数如何优化 6.问题汇总 1.JVM的新生代垃圾回收器ParNew如何工作 (1)JVM的核心运行原理…

E-commerce .net+React(一)——项目初始化

文章目录 项目地址一、创建.Net环境1.1环境配置1.1.1 使用vscode创建webapi1.1.2 Clean architecture结构创建1.1.3 将创建好结构的项目添加到git里1.1.4 EF Core配置1. 在infrastructure里安装EF所需环境2. 创建Product数据模型3. 创建EF Core的DbContext 数据库上下文4. 创建…

elasticsearch-java客户端jar包中各模块的应用梳理

最近使用elasticsearch-java客户端实现对elasticsearch服务的Api请求&#xff0c;现对elasticsearch-java客户端jar包中各模块的应用做个梳理。主要是对co.elastic.clients.elasticsearch路径下的各子包的简单说明。使用的版本为&#xff1a;co.elastic.clients:elasticsearch-…

vscode实用插件(持续更新)

目录 Git History Diff Git Graph Error Lens Git History Diff 用于将当前分支的某个文件夹与远程分支的相同文件夹做对比&#xff0c;方便代码评审&#xff01;解决了为了一个问题而多次commit&#xff0c;导致代码不好评审&#xff0c;即不晓得和远程分支相比&#xff0…

full-stack-fastapi-template postgres 管理系统安装指南

full-stack-fastapi-template postgres 管理系统安装指南 本项目基于 full-stack-fastapi-template 模板开发 1. 环境准备 请确保您的系统已安装以下软件&#xff1a; Python 3.9 Node.js 16 PostgreSQL 13 Git Docker (可选&#xff0c;用于容器化部署) 2. 获取代码 # 2.…

Prompt提示工程上手指南(七)Prompt编写实战-基于智能客服问答系统下的Prompt编写

前言 本系列文章从最初的基础原理与入门实践切入&#xff0c;一直延伸到主流策略、引导策略、RAG&#xff08;检索增强生成&#xff09;、思维树&#xff08;ToT&#xff09;与避免幻觉&#xff08;Hallucination&#xff09;的策略这种渐进的结构方便了对初学者和进阶者的双向…

mac系统vsCode中使用Better Comments在.vue文件里失效

问题&#xff1a;关于Better Comments默认在html、TS、JS中有效&#xff0c;在vue中无效,需要单独进行配置 windows系统可以参考友链Better Comments&#xff08;注释高亮&#xff09;在vue文件里失效的问题 关于Better Comments电脑的配置路径&#xff1a; Windows系统&…

mac中idea中英文版本切换

1.快捷键command&#xff0c;或者 2.找到插件&#xff08;plugins&#xff09;&#xff0c;搜索chinese&#xff0c;安装 第一次安装好点击应用会提示重启&#xff0c;直接重启就好了&#xff0c;如果已经安装过&#xff0c;只需要切换中英文 3.中英文切换 外观与行为&#xf…

贝叶斯神经网络(Bayesian Neural Network)

最近在研究贝叶斯神经网络,一些概念一直搞不清楚,这里整理一下相关内容,方便以后查阅。 贝叶斯神经网络(Bayesian Neural Network) 贝叶斯神经网络(Bayesian Neural Network)1. BNN 的核心思想2. BNN 的优化目标3. BNN 的结构与特点4. BNN 的训练过程5. BNN 的优缺点6. …

关于Promise的小测验

关于Promise的小测验 题目 // 编码挑战 #1 /* 在这个挑战中&#xff0c;你将构建一个函数 ‘whereAmI’&#xff0c;该函数仅基于 GPS 坐标显示国家信息。为此&#xff0c;你将使用第二个 API 来对坐标进行地理编码。 以下是你的任务&#xff1a; 第一部分 创建一个函数 ‘whe…

“邂逅”良渚遗址 “巧造”苏绣非遗 《牧神记》焕新有“玄机”

由bilibili与玄机科技联合出品的动画番剧《牧神记》自10月27日上线以来&#xff0c;累计收获了1.2亿播放量、超150万用户追番&#xff0c;B站评分9.7分&#xff0c;多次入选豆瓣口碑华语剧集周榜的动画冠军。放眼今年的国产新番&#xff0c;成绩相当可观。巧妙融合诸多传统元素…

AI文献阅读ChatDOC 、ChatPDF 哪个好?

作为AI产品的深度使用者&#xff0c;基本每天都在使用AI。AI诞生后仿佛给所有的产品打开了新世界大门。当然AI在文献阅读方面自然也不会缺席。 先来简单对比一下ChatDOC vs ChatPDF 从表格里可以看到ChatDOC与ChatPDF都是基于GPT的产品&#xff0c;但在功能上ChatDOC还是比Chat…

Flutter DragTarget拖拽控件详解

文章目录 1. DragTarget 控件的构造函数主要参数&#xff1a; 2. DragTarget 的工作原理3. 常见用法示例 1&#xff1a;实现一个简单的拖拽目标解释&#xff1a;示例 2&#xff1a;与 Draggable 结合使用解释&#xff1a; 4. DragTarget 的回调详解5. 总结 DragTarget 是 Flutt…

Huggingface数据集采样之后得到的arrow文件无法用Dataset.load_from_disk加载解决方法

问题起源 我现在有数据集 我想要采样1/10构成一个新的数据集。起初我只是简单的使用save_to_disk保存&#xff0c;如下代码&#xff1a; from datasets import Dataset import os# 原数据集路径 source_dataset_path "~/.cache/huggingface/datasets/allenai___tulu-3-…

mac中idea菜单工具栏没有git图标了

1.右击菜单工具栏 2.选中VCS&#xff0c;点击添加 3.搜索你要的工具&#xff0c;选中点击确定就添加了 4.回到上面一个界面&#xff0c;选中你要放到工具栏的工具&#xff0c;点击应用就好了 5.修改图标&#xff0c;快捷键或者右击选中编辑图标 6.选择你要的图标就好了