全网最详细Gradio教程系列5——Gradio Client: python

全网最详细Gradio教程系列5——Gradio Client: python

  • 前言
  • 本篇摘要
  • 5. Gradio Client的三种使用方式
    • 5.1 使用Gradio Python Client
      • 5.1.1 安装gradio_client
      • 5.1.2 连接Gradio应用程序
        • 1. 通过URL连接
        • 2. 通过SpaceID连接
        • 3. 辅助:duplicate()和hf_token
        • 4. Colab Notebook
      • 5.1.3 查看API
        • 1. 函数调用view_api()
        • 2. 页面查看API
      • 5.1.4 使用API
        • 1. 直接调用predict()
        • 2. 异步调用job
  • 参考文献

前言

本系列文章主要介绍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等。

本系列文章目录如下:

  1. 《全网最详细Gradio教程系列1——Gradio简介》
  2. 《全网最详细Gradio教程系列2——Gradio的安装与运行》
  3. 《全网最详细Gradio教程系列3——Gradio的3+1种部署方式实践》
  4. 《全网最详细Gradio教程系列4——浏览器集成Gradio-Lite》
  5. 《全网最详细Gradio教程系列5——Gradio Client: python》
  6. 《全网最详细Gradio教程系列5——Gradio Client: javascript》
  7. 《全网最详细Gradio教程系列5——Gradio Client: curl》
  8. 《全网最详细Gradio教程系列6——Interfaces》
  9. 《全网最详细Gradio教程系列7——Blocks》
  10. 《全网最详细Gradio教程系列8——Custom Components》
  11. 《全网最详细Gradio教程系列9——Tabular Data Science And Plots 》

本篇摘要

本章讲解访问API的Gradio Client的三种使用方式:python、javascript和curl。受字数限制,所以分三篇博客发布。

5. Gradio Client的三种使用方式

程序部署完成后,如何将Gradio App作为API访问使用呢,这就用到Gradio Client。本章讲解Gradio Client的三种使用方式:python、javascript和curl,以下分别讲解。

5.1 使用Gradio Python Client

通过Gradio Python Client非常易于将Gradio应用程序作为API使用,本节讲述gradio_client安装、连接Gradio应用程序、查看可用API及其使用方式、job和session等用法。在使用前先安装gradio_client。

5.1.1 安装gradio_client

如果已安装gradio的最新版本(4.39.0),那么gradio_client将作为依赖项包含在内。但请注意,此文档使用了gradio_client的最新版本,如果不确定,请使用以下命令升级,并确保python版本在3.9及以上:

$ pip install --upgrade gradio_client

5.1.2 连接Gradio应用程序

Gradio Client可通过URL或SpaceID与任意托管的Gradio应用程序配合使用。

1. 通过URL连接

因此尽管Gradio Client主要用于Hugging Face Spaces上托管的应用程序,但也可用于本地或网络上部署的Gradio应用程序,通过其URL连接。

注意:在使用Gradio Client之前,读者不需要非常详细地了解Gradio库,但有必要大致熟悉Gradio的输入和输出组件概念。

比如还是以本地已部署的hello_name例程为例,代码如下:

from gradio_client import Clientclient = Client("http://127.0.0.1:7860/")
result = client.predict(name="Felix",api_name="/predict"
)
print(result)>> Loaded as API: http://127.0.0.1:7860/>> Hello Felix!!!!

程序先从gradio_client中导入对象Client,然后利用URL创建其实例client,这里的URL即可是本地URL也可是互联网上任意Gradio程序的URL。最后使用client的内置函数predict执行预测结果,参数name为输入值,api_name指定接受参数的函数,尤其在多个路径时需要特别指定,后续会讲predict的使用方法。

2. 通过SpaceID连接

当然也可用SpaceID创建Client对象。为增加对Gradio程序的了解,所以引入更多的例程。下面以huggingface Spaces的gradio/text_analysis为例,它对一句话进行语法分析,并输出highlight、json和html三种格式的分析结果,完整地址为:https://huggingface.co/spaces/gradio/text_analysis。那么创建Client对象语句为:client = Client(“gradio/text_analysis”)或client = Client(“https://huggingface.co/spaces/gradio/text_analysis”)。gradio/text_analysis的完整部署代码如下:

import gradio as gr
import os
# 以下括号中的代码也可在对应环境的命令行下运行
os.system('pip install spacy')
os.system('python -m spacy download en_core_web_sm')
import spacy
from spacy import displacynlp = spacy.load("en_core_web_sm")def text_analysis(text):doc = nlp(text)html = displacy.render(doc, style="dep", page=True)html = ("<div style='max-width:100%; max-height:360px; overflow:auto'>"+ html+ "</div>")pos_count = {"char_count": len(text),"token_count": len(doc),}pos_tokens = []for token in doc:pos_tokens.extend([(token.text, token.pos_), (" ", None)])return pos_tokens, pos_count, htmldemo = gr.Interface(text_analysis,gr.Textbox(placeholder="Enter sentence here..."),["highlight", "json", "html"],examples=[["What a beautiful morning for a walk!"],["It was the best of times, it was the worst of times."],],
)demo.launch()

程序运行截图如下:
在这里插入图片描述
对应创建的Client及预测.predict()的代码如下:

from gradio_client import Clientclient = Client("gradio/text_analysis")
result = client.predict(text="Find the API endpoint below corresponding to your desired function in the app.",api_name="/predict"
)
print(result)
3. 辅助:duplicate()和hf_token

虽然可以通过Hugging Face的公共Space作为Gradio Client的API,但当请求太多时会被Hugging Face限速。如果想无限次使用某个Space的Gradio程序,只需使用Client的类方法duplicate(),它将Space复制到本地并创建一个私人Space的Gradio应用。

当访问Hugging Face上私有Space或复制Space时,需传入HF_TOKEN或使用登录后的Hugging Face CLI。

这里使用的例程是Hugging Face上的abidlabs/en2fr,它将英语翻译为法语,其源代码如下:

import gradio as grfrom transformers import pipelinepipe = pipeline("translation", model="Helsinki-NLP/opus-mt-en-fr")def predict(text):return pipe(text)[0]["translation_text"]title = "English to French Translation"iface = gr.Interface(fn=predict, inputs=[gr.Textbox(label="text", lines=3)],outputs='text',title=title,
)iface.launch()

例程可在本地启动,也可直接使用Hugging Face上的abidlabs/en2fr,这里采用第二种方式。
使用HF_TOKEN方式连接,登录Colab NoteBook(详细用法见下)后在线运行,代码如下:

import os
from gradio_client import Client, file
from google.colab import userdata# 设置系统变量的hf_token,hf_token需在HuggingFace官网申请
HF_TOKEN = userdata.get('HF_TOKEN')client = Client.duplicate("abidlabs/en2fr", hf_token=HF_TOKEN, hardware = 'cpu-basic')
client.predict("Hello", api_name='/predict')# 输出如下
Using your existing Space: https://hf.space/shao918516/en2fr 🤗Loaded as API: https://shao918516-en2fr.hf.space ✔Bonjour.

注意

  1. 之前复制过Space,重新运行duplicate()将不会创建新的Space,相反,客户端将连接到先前创建的空间。因此,多次重新运行Client.duplicate()方法是安全的。
  2. 如果在Colab NoteBook运行,获取HF_TOKEN方法如下:
from google.colab import userdataHF_TOKEN = userdata.get('HF_TOKEN')
  1. 如果原始空间使用GPU,那么复制后的私人空间也会使用,这时你的Hugging Face账户将根据GPU的价格进行计费。为了最大限度地减少花费,共享空间会在不活动1小时后自动进入睡眠状态。如果不想扩大开销,我们也可以使用duplicate()的hardware参数来设置免费硬件:hardware= “cpu-basic”,其它可选参数包括[cpu-basic, zero-a10g, cpu-upgrade, cpu-xl, t4-small, t4-medium, l4x1, l4x4, a10g-small, a10g-large, a10g-largex2, a10g-largex4, a100-large, h100, h100x8, v5e-1x1, v5e-2x2, v5e-2x4]。
  2. 这里程序生成的Space地址https://hf.space/shao918516/en2fr有时不可用,进行替换即可:https://huggingface.co/spaces/shao918516/en2fr,即将hf.space替换为huggingface.co/spaces。
4. Colab Notebook

由于国内都是通过代理访问Hugging Face,因此通过SpaceID或国外URL创建Client对象时可能会报错:JSONDecodeError: Expecting value: line 1 column 1 (char 0)。报错原因:代理proxy出于“security reasons”不允许queuing/streaming传输所需的websocket连接,这几乎肯定不是Gradio的问题,而是与代理相关的问题,详细解释请参考《Gradio Streaming with Chat Interface with OpenAI: Expecting value: line 1 column 1 (char 0) #5371》及《WebSockets and a proxy》。

上述问题在国内属实无法解决,但如果依然想通过SpaceID或外网URL运行此类程序,可通过代理使用Google的Colab Notebook,地址:https://colab.research.google.com/,注册google账号并设置HF_TOKEN即可使用。这时Client语句clien t= Client(“http://127.0.0.1:7860/”)改为client = Client(“gradio/text_analysis”)或client = Client(“https://gradio-text-analysis.hf.space”),注意此处的URL并不是访问的"https://huggingface.co/spaces/gradio/text_analysis",原因将在curl连接时阐述。因为Colab Notebook是在线运行,数据在外网间传输,不需通过代理,因此可避免此类错误。Colab即Colaboratory(google合作实验室),是谷歌提供的一个在线工作平台,用户可以直接通过浏览器执行python代码并与他人分享合作,它还提供免费的GPU,同时它可以兼容jupyter的.ipynb文件。具体使用方法见参考文献1。

我们在Colab NoteBook中运行截图如下:
在这里插入图片描述注意左侧的Secret,在这里设置HF_TOKEN等环境变量。

5.1.3 查看API

如何获取已部署Gradio的API以便编程时使用呢?有两种方法可以实现:函数调用view_api()和页面查看API,使用时用Clilent内置predict方法的参数api_name指定相应API即可。

1. 函数调用view_api()

当使用Client连接到Gradio程序后,可以通过Client内置的函数view_api()查看可用的API接口,以gradio/text_analysis为例,在本地启动后得到URL:http://127.0.0.1:7860,然后创建Client并使用view_api()查看可用的API,如下所示:

from gradio_client import Clientclient = Client("http://127.0.0.1:7860/")
client.view_api()# 输出如下
Client.predict() Usage Info
---------------------------
Named API endpoints: 1- predict(text, api_name="/predict") -> (output_0, output_1, output_2)Parameters:- [Textbox] text: str (required)  Returns:- [Highlightedtext] output_0: List[Dict(token: str, class_or_confidence: str | float | None)] - [Json] output_1: Dict[Any, Any] (any valid json) - [Html] output_2: str 

我们看到在这个空间中有1个API Endpoint,并展示了如何使用API端点进行预测:我们应该调用.predict()方法(将在下面探讨),提供str类型的参数text,这是需要分析的语句,我们还应该为predict()方法提供参数api_name=‘/predict’。虽然这里只有一个命名端点predict,它是非必要的,但当Gradio程序中有多个端点时,就需要用这个参数指定要使用的endpoint。最后返回对应类型Highlightedtext、Json及Html的分析结果。

2. 页面查看API

在demo.launch()中的设置参数show_api:是否在app脚页显示api帮助文档,默认为True,启动后在WEB页面底部会显示“通过API使用”,如下图右侧黑框所示:
在这里插入图片描述
点击“通过API使用”,出现可用API页面,如图:
在这里插入图片描述关于页面参数的解释参考上一小节。注意:API页面还包括一个“API Recorder”,点击后可在页面底部看到被记录的调用(见本小节第一张图)。API Recorder可以让您正常地与Gradio UI交互,并将交互转换为相应的代码,以便与Python Client配合一起运行。

5.1.4 使用API

获取到可用的API endpoint后,接下来讲如何使用。这里介绍两种使用API的方法:直接调用predict()和异步调用job。以下使用SpaceID的Client,均通过Colab Notebook运行。

1. 直接调用predict()

使用API进行预测的最简单方法就是调用Client对象的predict()函数,如上文已使用的英转法abidlabs/en2fr:

from gradio_client import Clientclient = Client("abidlabs/en2fr")
client.predict("Hello", api_name='/predict')>> Bonjour

下面看看predict()其它形式的参数设置:

  1. 多个参数:当传递多个参数时,应将它们作为单独的参数传递给predict(),如提供计算器功能的Space"gradio/calculator",它的地址为:https://huggingface.co/spaces/gradio/calculator,源代码如下:
import gradio as gr
#from foo import BAR
#
def calculator(num1, operation, num2):if operation == "add":return num1 + num2elif operation == "subtract":return num1 - num2elif operation == "multiply":return num1 * num2elif operation == "divide":if num2 == 0:raise gr.Error("Cannot divide by zero!")return num1 / num2demo = gr.Interface(calculator,["number", gr.Radio(["add", "subtract", "multiply", "divide"]),"number"],"number",examples=[[45, "add", 3],[3.14, "divide", 2],[144, "multiply", 2.5],[0, "subtract", 1.2],],title="Toy Calculator",description="Here's a sample toy calculator. Allows you to calculate things like $2+2=4$",
)if __name__ == "__main__":demo.launch()

运行截图如下:
在这里插入图片描述多个参数的设置方法如下(建议提供关键字参数而不是位置参数):

from gradio_client import Clientclient = Client("gradio/calculator")
# 关键字参数:client.predict(num1=4, operation="add", num2=5)
client.predict(4, "add", 5)>> 9.0
  1. 默认参数:例如,Space"abidlabs/image_generator"中包括“滑块”组件steps的默认值,因此在使用客户端访问它时不需要提供该值,当然也可以进行指定,该程序的源代码为:
import gradio as gr
import numpy as np
import timedef fake_diffusion(text, steps):for i in range(steps):time.sleep(1)image = np.random.random((600, 600, 3))yield imageimage = np.ones((1000,1000,3), np.uint8)image[:] = [255, 124, 0]yield imagedemo = gr.Interface(fake_diffusion, inputs=[gr.Textbox(), gr.Slider(1, 10, 3)], outputs="image")if __name__ == "__main__":demo.launch()

默认参数设置方法如下所示:

from gradio_client import Clientclient = Client("abidlabs/image_generator")
client.predict(text="an astronaut riding a camel", steps=25)
  1. 文件或URL参数:我们可以将文件路径或URL以字符串形式传递给gradio_client.handle_file(),此函数负责将文件上传到Gradio服务器,并确保文件得到正确的预处理,如处理音频转录功能的"abidlabs/whisper",源代码为:
import gradio as grwhisper = gr.load("models/openai/whisper-small")def transcribe(audio):return whisper(audio)gr.Interface(transcribe, gr.Audio(type="filepath"), gr.Textbox()).launch()

其调用方法如下所示:

from gradio_client import Client, handle_fileclient = Client("abidlabs/whisper")
client.predict(audio=handle_file("https://audio-samples.github.io/samples/mp3/blizzard_unconditional/sample-0.mp3")
)## 输出如下
>> Loaded as API: https://abidlabs-whisper.hf.space ✔AutomaticSpeechRecognitionOutput(text=" My thought I have nobody by a beauty and will as you poured. Mr. Rochester is sir, but that so don\'t find simpus, and devoted abode, to at might in a", chunks=None)
2. 异步调用job

我们应该注意到.predict()是一个阻塞操作,因为它在返回预测之前等待操作完成。在多数情况下,在需要预测结果之前,最好让作业在后台运行。这时我们可以通过创建Job实例并利用其.submit()提交操作,让作业在后台运行,稍后调用其.result()来获取结果。代码如下:

from gradio_client import Clientclient = Client("abidlabs/en2fr")
job = client.submit("Hello", api_name="/predict")  # This is not blocking# Do something elsejob.result()  # This is blocking>> Bonjour

下面来看看job的其它功能:

  1. 添加回调:可以通过参数result_callbacks添加一个或多个回调,以便在作业完成运行后执行操作,如下所示:
from gradio_client import Clientdef print_result(x):print("The translated result is: {x}")client = Client(src="abidlabs/en2fr")job = client.submit("Hello", api_name="/predict", result_callbacks=[print_result])# Do something else>> The translated result is: Bonjour

作者运行回调函数时,并未打印出结果且没有报错,或许这个函数还是有些问题,只能等官方改进。

  1. 获取Status:Job对象可以通过调用其.status()方法来获取正在运行作业的状态。函数将返回一个StatusUpdate对象,它具有以下属性:code(状态代码,一组表示状态的字符串,请参阅utils.status类)、rank(此作业在队列中的当前位置)、queue_size(队列总大小)、eta(此作业将完成的估计时间)、success(表示作业是否成功完成)和time(生成状态的时间)等,如下:
from gradio_client import Clientclient = Client(src="gradio/calculator")
job = client.submit(5, "add", 4, api_name="/predict")
job.status()>> StatusUpdate(code=<Status.STARTING: 'STARTING'>, rank=None, queue_size=None, eta=None, success=None, time=datetime.datetime(2024, 7, 10, 10, 3, 21, 689817), progress_data=None, log=None)

另外Job类还有一个.done()实例方法,它返回一个指示作业是否完成的布尔值。

  1. 取消作业:Job类还有一个.cancel()实例方法,用于取消已排队但尚未启动的作业。例如运行:
from gradio_client import Client, handle_fileclient = Client("abidlabs/whisper")
job1 = client.submit(handle_file("audio_sample1.wav"))
job2 = client.submit(handle_file("audio_sample2.wav"))
job1.cancel()  # will return False, assuming the job has started
job2.cancel()  # will return True, indicating that the job has been canceled

如果第一个作业已开始处理,则不会取消该作业。如果第二个作业尚未启动,它将被成功取消并从队列中删除。

  1. 生成器端点:某些Gradio API端点不返回单个值,而是返回一系列值。这时可以通过运行job.outputs()来获取此类生成器端点返回的所有系列值。数数程序gradio/count_generator的源代码如下,它每0.5秒返回一个递增的数字:
import gradio as gr
import timedef count(n):for i in range(int(n)):time.sleep(0.5)yield idef show(n):return str(list(range(int(n))))with gr.Blocks() as demo:with gr.Column():num = gr.Number(value=10)with gr.Row():count_btn = gr.Button("Count")list_btn = gr.Button("List")with gr.Column():out = gr.Textbox()count_btn.click(count, num, out)list_btn.click(show, num, out)demo.queue()if __name__ == "__main__":demo.launch()

它的网址为:https://huggingface.co/spaces/gradio/count_generator。运行截图如下,点击“Count"会每隔0.5秒返回0到9的数字,点击"List"列出生成数字的列表:
在这里插入图片描述
我们运行job.outputs()来获取此类生成器端点返回的所有系列值:

from gradio_client import Client
import timeclient = Client(src="gradio/count_generator")
job = client.submit(3, api_name="/count")
while not job.done():time.sleep(0.1)
job.outputs()>> ['0', '1', '2']

注意:

  • 在生成器端点上运行job.result()时,只会返回端点生成的第一个值;
  • Job对象也是可迭代的,这意味着您可以使用Job作为迭代器来显示从端点返回的结果。以下是使用Job作为迭代器的等效示例:
from gradio_client import Clientclient = Client(src="gradio/count_generator")
job = client.submit(3, api_name="/count")for o in job:print(o)>> 0
>> 1
>> 2
  • 我们还可以取消具有迭代输出的作业,在这种情况下,只要当前轮次的迭代完成,作业job就会结束,如下:
from gradio_client import Client
import timeclient = Client("abidlabs/test-yield")
job = client.submit("abcdef")
time.sleep(3)
job.cancel()  # job cancels after 2 iterations>>True
  1. 带有session state的demos:最后看一下带有会话状态(seesion state)的demo。Gradio demos可以包括会话状态,这为demos提供了一种在页面会话中持久保存用户交互信息的方法。

例如下面的demo,它使用gr.State()组件维护了用户提交的单词列表。当用户提交一个新词时,它会被添加到状态words中,并显示该词以前出现的次数:

import gradio as grdef count(word, list_of_words):return list_of_words.count(word), list_of_words + [word]with gr.Blocks() as demo:words = gr.State([])textbox = gr.Textbox()number = gr.Number()textbox.submit(count, inputs=[textbox, words], outputs=[number, words])demo.launch()

运行截图如下:
在这里插入图片描述
如果我们使用Python Client连接此Gradio应用程序,使用view_api()函数会发现API信息仅显示单个输入和输出:

client = Client(src="http://127.0.0.1:7864")
client.view_api()# 输出如下
Loaded as API: http://127.0.0.1:7862/ ✔
Client.predict() Usage Info
---------------------------
Named API endpoints: 1- predict(word, api_name="/count") -> value_34Parameters:- [Textbox] word: str (required)  Returns:- [Number] value_34: float 

可以看到,输入输出参数自动忽略了gr.State()组件words,这是因为Python客户端会自动为我们处理状态——当我们发出一系列requests时,一个request返回的状态会存储在内部,并自动提供给后续request。如果想重置状态,可以通过调用Client.reset_session()来完成。

参考文献

  1. Colab使用教程(超级详细版)及Colab Pro/Pro+评测
  2. Getting Started with the Gradio Python client

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

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

相关文章

Java 并发编程:一文了解 Java 内存模型(处理器优化、指令重排序与内存屏障的深层解析)

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 022 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

使用AI大模型统计英语四六级试题高频词汇

引子 前些年我做过商品搜索&#xff0c;当时为了优化一些搜索词和搜索关联提示&#xff0c;接触到一点NLP的知识。所以后来有一场非全日制的研究生考试&#xff0c;为了高效的复习英语单词&#xff0c;我爬取了往年的历史真题数据&#xff0c;以及其他模拟等各种试题的数据。然…

AcWing最长连续不重复子序列

哈希表就完事儿了&#xff0c;key是a[j],value是a[j]出现次数 i丢到前面&#xff0c;j丢到后面&#xff0c;然后j往后面遍历&#xff0c;每次记录a[j]出现次数 m a p [ a [ j ] ] map[a[j]] map[a[j]]&#xff0c;如果a[j]出现次数2次及其以上 m a p [ a [ j ] ] > 1 map[a[…

Element Plus 动态编辑标签Tag使用@keyup.enter与@Blur冲突问题,

这是官方文档示例代码,文档具体链接https://element-plus.org/zh-CN/component/tag.html 问题描述: 发现存在使用keyup.enter与Blur冲突问题, keyup.enter(就是按回车键)发现handleInputConfirm方法被执行了两次,下面是问题代码 <template> <div class"flex ga…

PS5测试更新推送自适应充电功能:自带充电器码

原标题&#xff1a;PS5 更新推送自适应充电功能&#xff1a;仅适用于新型号 易采游戏网7月26日消息&#xff1a;近年来&#xff0c;游戏界的科技进步日新月异&#xff0c;各大厂商不断推出新的功能和技术来吸引玩家。作为游戏机市场的领导者之一&#xff0c;索尼的PlayStation…

Docker Minio rclone数据迁移

docker minio进行数据迁移 使用rclone进行数据迁移是一种非常灵活且强大的方式&#xff0c;特别是在处理大规模数据集或跨云平台迁移时。rclone是一款开源的命令行工具&#xff0c;用于同步文件和目录到多种云存储服务&#xff0c;包括MinIO。下面是使用rclone进行数据迁移至Mi…

学习型组织:知识创造的 SECI 螺旋模型 —— 隐性知识和显性知识的转换

《创造知识的企业》的日本学者野中郁次郎用了 30 多年的时间跟踪日本企业的变化&#xff0c;揭示日本企业成功的奥秘。 在野中之前和之后&#xff0c;也有不少学者聚焦日本&#xff0c;但是&#xff0c;多数人看到的&#xff0c;只是优良的生产技术&#xff0c;企业和顾客、供…

打卡Datawhale第一天!!!

最近参加了Datawhale的一个活动学习一些有趣的知识。 官方发的教程还是挺详细的嘛&#xff0c;跟着官方教程走&#xff0c;基本没什么错误 跑模型中... 跑完咯...gpu跑得就是快 等待评分... 最后结果&#xff1a; 总结&#xff1a;这次都是跟着教程来走的 &#xff0c;希望在后…

力扣高频SQL 50题(基础版)第十八题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第十八题1633. 各赛事的用户注册率题目说明思路分析实现过程准备数据实现方式结果截图 力扣高频SQL 50题&#xff08;基础版&#xff09;第十八题 1633. 各赛事的用户注册率 题目说明 用户表&#xff1a; Users --…

柯达sd卡数据丢失怎么办?分享有效数据恢复方法

随着科技的进步&#xff0c;数码相机已成为我们生活中不可或缺的一部分&#xff0c;而柯达作为摄影界的知名品牌&#xff0c;其相机及配件更是广受欢迎。然而&#xff0c;在日常使用中&#xff0c;难免会遇到数据丢失的情况&#xff0c;特别是SD卡中的数据丢失&#xff0c;常常…

AJAX-XMLHttpRequest 详解

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 前言 XMLHttpRequest 概述 主要用途 工作流程 示例代码 GET 请求示例 POST 请求示例 注意事项 工作…

API签名认证

前言&#xff08;项目背景&#xff09;&#xff1a; 这个API签名认证是API开放平台得一个重要环节&#xff0c;我们知道&#xff0c;这个API开发平台&#xff0c;用处就是给客户去调用现成得接口来完成某些事情得。 在讲API签名认证之前&#xff0c;我们先模拟一个场景并且介绍…

产业分析三部曲:如何快速完成存客产业识别、产业分布分析、区域产业分析?

2024年7月15日至18日&#xff0c;中国共产党第二十届中央委员会第三次全体会议在北京举行&#xff0c;审议通过了《中共中央关于进一步全面深化改革、推进中国式现代化的决定》。 《决定》提出&#xff0c;深化国资国企改革&#xff0c;完善管理监督体制机制&#xff0c;推动国…

Mistral新旗舰决战Llama 3.1,最强开源Large 2 123B,扛鼎多语言编程全能王

【新智元导读】紧跟着Meta的重磅发布&#xff0c;Mistral Large 2也带着权重一起上新了&#xff0c;而且参数量仅为Llama 3.1 405B的三分之一。不仅在编码、数学和多语言等专业领域可与SOTA模型直接竞争&#xff0c;还支持单节点部署。 昨天正式发布的Llama 3.1模型&#xff0…

react中路由跳转以及路由传参

一、路由跳转 1.安装插件 npm install react-router-dom 2.路由配置 路由配置&#xff1a;react中简单的配置路由-CSDN博客 3.实现代码 // src/page/index/index.js// 引入 import { Link, useNavigate } from "react-router-dom";function IndexPage() {const …

CSS常见属性详解——内边距与外边距

内边距与外边距 内边距 外边距 应用场景 在网页排版布局时&#xff0c;我们经常会希望元素与元素之间有一定的间距&#xff0c;此时我们可能会用到CSS的外边距或内边距属性&#xff0c;这两个属性都能让元素之间产生距离&#xff0c;那么他们之间有什么不同呢&#xff1f; …

Nginx系列-10 realIp模块使用

背景 Nginx对每个模块都有说明文档&#xff0c;可参考:https://nginx.org/en/docs/ 当请求被代理后&#xff0c;真实客户端相对服务器被隐藏&#xff0c;即服务端无法判断HTTP消息来源。 如上图所示&#xff0c;IP分别为100.100.100.1和100.100.100.2的两个客户端向服务器200.…

08 字符串和字节串

使用单引号、双引号、三单引号、三双引号作为定界符&#xff08;delimiter&#xff09;来表示字符串&#xff0c;并且不同的定界符之间可以相互嵌套。 很多内置函数和标准库对象也都支持对字符串的操作。 x hello world y Python is a great language z Tom said, "Le…

centos7 mysql 基本测试(6)主从简单测试

centos7 xtrabackup mysql 基本测试&#xff08;6&#xff09;主从简单测试 mysql -u etc -p 1234aA~1 参考&#xff1a; centos7 时区设置 时间同步 https://blog.csdn.net/wowocpp/article/details/135931129 Mysql数据库&#xff1a;主从复制与读写分离 https://blog.csd…

HTML常见标签——超链接a标签

一、a标签简介 二、a标签属性 href属性 target属性 三、a标签的作用 利用a标签进行页面跳转 利用a标签返回页面顶部以及跳转页面指定区域 利用a标签实现文件下载 一、a标签简介 <a>标签用于做跳转、导航&#xff0c;是双标签&#xff0c;记作<a></a>&#…