小北的字节跳动青训营与调用模型:调用模型:OpenAI API vs 微调开源Llama2/ChatGLM(持续更新中~~~)

 前言

       最近,字节跳动的青训营再次扬帆起航,作为第二次参与其中的小北,深感荣幸能借此机会为那些尚未了解青训营的友友们带来一些详细介绍。青训营不仅是一个技术学习与成长的摇篮,更是一个连接未来与梦想的桥梁~

小北的青训营 X MarsCode 技术训练营——AI 加码,字节跳动青训营入营考核解答(持续更新中~~~)-CSDN博客https://blog.csdn.net/Zhiyilang/article/details/143384787?sharetype=blogdetail&sharerId=143384787&sharerefer=PC&sharesource=Zhiyilang&spm=1011.2480.3001.8118​编辑https://blog.csdn.net/Zhiyilang/article/details/143384787?sharetype=blogdetail&sharerId=143384787&sharerefer=PC&sharesource=Zhiyilang&spm=1011.2480.3001.8118https://blog.csdn.net/Zhiyilang/article/details/143384787?sharetype=blogdetail&sharerId=143384787&sharerefer=PC&sharesource=Zhiyilang&spm=1011.2480.3001.8118https://blog.csdn.net/Zhiyilang/article/details/143384787?sharetype=blogdetail&sharerId=143384787&sharerefer=PC&sharesource=Zhiyilang&spm=1011.2480.3001.8118icon-default.png?t=O83Ahttps://blog.csdn.net/Zhiyilang/article/details/143384787?sharetype=blogdetail&sharerId=143384787&sharerefer=PC&sharesource=Zhiyilang&spm=1011.2480.3001.8118

小北的字节跳动青训营与 LangChain 实战课:探索 AI 技术的新边界(持续更新中~~~)-CSDN博客​编辑https://blog.csdn.net/Zhiyilang/article/details/143454165https://blog.csdn.net/Zhiyilang/article/details/143454165https://blog.csdn.net/Zhiyilang/article/details/143454165icon-default.png?t=O83Ahttps://blog.csdn.net/Zhiyilang/article/details/143454165
小北的字节跳动青训营与LangChain系统安装和快速入门学习(持续更新中~~~)。-CSDN博客​编辑https://blog.csdn.net/Zhiyilang/article/details/143455380https://blog.csdn.net/Zhiyilang/article/details/143455380https://blog.csdn.net/Zhiyilang/article/details/143455380icon-default.png?t=O83Ahttps://blog.csdn.net/Zhiyilang/article/details/143455380

小北的字节跳动青训营用LangChain打造“易速鲜花”内部员工知识库问答系统(持续更新中~~~)-CSDN博客​编辑https://blog.csdn.net/Zhiyilang/article/details/143456544https://blog.csdn.net/Zhiyilang/article/details/143456544https://blog.csdn.net/Zhiyilang/article/details/143456544icon-default.png?t=O83Ahttps://blog.csdn.net/Zhiyilang/article/details/143456544小北的字节跳动青训营与提示工程(上):用少样本FewShotTemplate和ExampleSelector创建应景文案(持续更新中~~~)-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/Zhiyilang/article/details/143468624?sharetype=blogdetail&sharerId=143468624&sharerefer=PC&sharesource=Zhiyilang&spm=1011.2480.3001.8118小北的字节跳动青训营与提示工程(下):用思维链和思维树提升模型思考质量(持续更新中~~~)-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/Zhiyilang/article/details/143494432哈喽哈喽,这里是是zyll~,北浊.欢迎来到小北的 LangChain 实战课学习笔记! 

       在这个充满变革的时代,技术的每一次进步都在推动着世界的快速发展。在之前的课程中,小北带着友友们一起深入探讨了提示工程的原理及其在LangChain中的实际应用。今天,我们将聚焦Model I/O中的第二个关键子模块——LLM,并探讨一个核心问题:在OpenAI API与开源模型(如Llama2或ChatGLM)之间,我们应如何选择?更进一步,如果你想在本机上从头训练新模型并在LangChain中使用,又该如何操作?


大语言模型的发展脉络

友友们请和小北先简要回顾一下大语言模型的发展历程。

自Google在2018年提出Transformer架构以来,这一创新成为了几乎所有预训练模型的核心。Transformer通过自注意力机制,显著提升了自然语言处理任务的性能。基于Transformer预训练的大规模语言模型,如BERT,通过同时学习文本的前向和后向上下文信息,实现了对句子结构的深入理解,推动了NLP技术的快速发展。

然而,随着模型参数量的不断增加,训练成本也急剧上升,使得只有顶级大厂才能负担得起。这一现象引发了关于模型开源和可访问性的广泛讨论。


预训练+微调的模式

尽管如此,大型预训练模型仍被视为工程师的福音。预训练模型中的语义信息和语言知识能够轻松迁移至下游任务。通过微调(Fine-tuning),NLP应用人员可以根据特定任务需求对模型进行适应性调整,这一过程比从头训练要快得多,且需要的数据量也要少得多。

预训练阶段,模型在大规模无标注文本数据上学习自然语言的基础表达、上下文信息和语义知识。而微调阶段,则根据特定的下游任务对模型进行优化。这种预训练+微调的模式显著降低了模型部署的难度,提高了NLP技术在实际应用中的可用性和普及程度。

(Facebook)推出的Llama2。当然你可以去Llama的官网下载模型,然后通过Llama官方 GitHub 中提供的方法来调用它。但是,我还是会推荐你从HuggingFace下载并导入模型。因为啊,前天百川,昨天千问,今天流行Llama,明天不就流行别的了嘛。模型总在变,但是HuggingFace一直在那里,支持着各种开源模型。我们学东西,尽量选择学一次能够复用的知识。


用 HuggingFace 跑开源模型

注册并安装 HuggingFace(可参考小北之前的一篇博客)

小北的字节跳动青训营与LangChain实战课:深入解析模型I/O与提示模板(持续更新中~~~)-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/Zhiyilang/article/details/143464481https://huggingface.co/icon-default.png?t=O83Ahttps://huggingface.co/第一步,还是要登录 HuggingFace 网站,并拿到专属于你的Token。(如果友友们做了前面几节课的实战案例,那么应该已经有这个API Token了)

第二步,用 pip install transformers 安装HuggingFace Library。详见这里。

第三步,在命令行中运行 huggingface-cli login,设置你的API Token。

当然,也可以在程序中设置你的API Token,但是这不如在命令行中设置来得安全。

# 导入HuggingFace API Token
import os
os.environ['HUGGINGFACEHUB_API_TOKEN'] = '你的HuggingFace API Token'

使用开源模型:以Llama2为例

在HuggingFace的Model中,找到 meta-llama/Llama-2-7b。注意,各种各样版本的Llama2模型多如牛毛,我们这里用的是最小的7B版。此外,还有13b\70b\chat版以及各种各样的非Meta官方版。小北的字节跳动青训营与提示工程(下):用思维链和思维树提升模型思考质量(持续更新中~~~)-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/Zhiyilang/article/details/143494432

选择meta-llama/Llama-2-7b这个模型后,你能够看到这个模型的基本信息。如果你是第一次用Llama,你需要申请Access,因为我已经申请过了,所以屏幕中间有句话:“You have been granted access to this model”。从申请到批准,大概是几分钟的事儿。

通过 HuggingFace 调用 Llama

好,万事俱备,现在我们可以使用HuggingFace的Transformers库来调用Llama啦!

# 导入必要的库
from transformers import AutoTokenizer, AutoModelForCausalLM# 加载预训练模型的分词器
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-chat-hf")# 加载预训练的模型
# 使用 device_map 参数将模型自动加载到可用的硬件设备上,例如GPU
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-chat-hf", device_map = 'auto')  # 定义一个提示,希望模型基于此提示生成故事
prompt = "请给我讲个玫瑰的爱情故事?"# 使用分词器将提示转化为模型可以理解的格式,并将其移动到GPU上
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")# 使用模型生成文本,设置最大生成令牌数为2000
outputs = model.generate(inputs["input_ids"], max_new_tokens=2000)# 将生成的令牌解码成文本,并跳过任何特殊的令牌,例如[CLS], [SEP]等
response = tokenizer.decode(outputs[0], skip_special_tokens=True)# 打印生成的响应
print(response)

这段程序是一个很典型的HuggingFace的Transformers库的用例,该库提供了大量预训练的模型和相关的工具。

  • 导入AutoTokenizer:这是一个用于自动加载预训练模型的相关分词器的工具。分词器负责将文本转化为模型可以理解的数字格式。
  • 导入AutoModelForCausalLM:这是用于加载因果语言模型(用于文本生成)的工具。
  • 使用from_pretrained方法来加载预训练的分词器和模型。其中,device_map = 'auto' 是为了自动地将模型加载到可用的设备上,例如GPU。
  • 然后,给定一个提示(prompt):"请给我讲个玫瑰的爱情故事?",并使用分词器将该提示转换为模型可以接受的格式,return_tensors="pt" 表示返回PyTorch张量。语句中的 .to("cuda") 是GPU设备格式转换,因为我在GPU上跑程序,不用这个的话会报错,如果你使用CPU,可以试一下删掉它。
  • 最后使用模型的 .generate() 方法生成响应。max_new_tokens=2000 限制生成的文本的长度。使用分词器的 .decode() 方法将输出的数字转化回文本,并且跳过任何特殊的标记。

因为是在本地进行推理,耗时时间比较久。在我的机器上,大概需要30s~2min产生结果。

注意,由于模型大小和设备性能的差异,推理时间可能会有所不同。

这样的回答肯定不能直接用做商业文案,而且,我的意思是玫瑰花相关的故事,它明显把玫瑰理解成一个女孩的名字了。所以,开源模型,尤其是7B的小模型和Open AI的ChatGPT还是有一定差距的。


LangChain与HuggingFace的接口

接下来,我们将展示如何将HuggingFace中的模型接入LangChain。

通过HuggingFace Hub

使用HuggingFace Hub集成LangChain非常简单,只需指定模型名称即可。

第一种集成方式,是通过HuggingFace Hub。HuggingFace Hub 是一个开源模型中心化存储库,主要用于分享、协作和存储预训练模型、数据集以及相关组件。

我们给出一个HuggingFace Hub 和LangChain集成的代码示例:

# 导入HuggingFace API Token
import os
os.environ['HUGGINGFACEHUB_API_TOKEN'] = '你的HuggingFace API Token'# 导入必要的库
from langchain import PromptTemplate, HuggingFaceHub, LLMChain# 初始化HF LLM
llm = HuggingFaceHub(repo_id="google/flan-t5-small",#repo_id="meta-llama/Llama-2-7b-chat-hf",
)# 创建简单的question-answering提示模板
template = """Question: {question}Answer: """# 创建Prompt          
prompt = PromptTemplate(template=template, input_variables=["question"])# 调用LLM Chain --- 我们以后会详细讲LLM Chain
llm_chain = LLMChain(prompt=prompt,llm=llm
)# 准备问题
question = "Rose is which type of flower?"# 调用模型并返回结果
print(llm_chain.run(question))

然而,由于某些模型的兼容性问题,你可能需要尝试其他模型。

可以看出,这个集成过程非常简单,只需要在HuggingFaceHub类的repo_id中指定模型名称,就可以直接下载并使用模型,模型会自动下载到HuggingFace的Cache目录,并不需要手工下载。

初始化LLM,创建提示模板,生成提示的过程,你已经很熟悉了。这段代码中有一个新内容是我通过llm_chain来调用了LLM。这段代码也不难理解,有关Chain的概念我们以后还会详述。

不过,我尝试使用meta-llama/Llama-2-7b-chat-hf这个模型时,出现了错误,因此我只好用比较旧的模型做测试。我随便选择了google/flan-t5-small,问了它一个很简单的问题,想看看它是否知道玫瑰是哪一种花。

模型告诉我,玫瑰是花。对,答案只有一个字,flower。这...不得不说,2023年之前的模型,和2023年之后的模型,水平没得比。以前的模型能说话就不错了。

通过 HuggingFace Pipeline

既然HuggingFace Hub还不能完成Llama-2的测试,让我们来尝试另外一种方法,HuggingFace Pipeline。HuggingFace 的 Pipeline 是一种高级工具,它简化了多种常见自然语言处理(NLP)任务的使用流程,使得用户不需要深入了解模型细节,也能够很容易地利用预训练模型来做任务。

如果你想训练并使用自己的模型,LangChain也提供了支持。你可以创建一个自定义的LLM类,并实现_call方法。

让我来看看下面的示例:

# 指定预训练模型的名称
model = "meta-llama/Llama-2-7b-chat-hf"# 从预训练模型中加载词汇器
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained(model)# 创建一个文本生成的管道
import transformers
import torch
pipeline = transformers.pipeline("text-generation",model=model,torch_dtype=torch.float16,device_map="auto",max_length = 1000
)# 创建HuggingFacePipeline实例
from langchain import HuggingFacePipeline
llm = HuggingFacePipeline(pipeline = pipeline, model_kwargs = {'temperature':0})# 定义输入模板,该模板用于生成花束的描述
template = """为以下的花束生成一个详细且吸引人的描述:花束的详细信息:```{flower_details}```"""# 使用模板创建提示
from langchain import PromptTemplate,  LLMChain
prompt = PromptTemplate(template=template, input_variables=["flower_details"])# 创建LLMChain实例
from langchain import PromptTemplate
llm_chain = LLMChain(prompt=prompt, llm=llm)# 需要生成描述的花束的详细信息
flower_details = "12支红玫瑰,搭配白色满天星和绿叶,包装在浪漫的红色纸中。"# 打印生成的花束描述
print(llm_chain.run(flower_details))

这里简单介绍一下代码中使用到的transformers pipeline的配置参数。

生成的结果之一如下:

此结果不敢恭维。但是,后续的测试告诉我,这很有可能是7B这个模型太小,尽管有形成中文的相应能力,但是能力不够强大,也就导致了这样的结果。

至此,通过HuggingFace接口调用各种开源模型的尝试成功结束。下面,我们进行最后一个测试,看看LangChain到底能否直接调用本地模型。

用 LangChain 调用自定义语言模型

最后,我们来尝试回答这节课开头提出的问题,假设你就是想训练属于自己的模型。而且出于商业秘密的原因,不想开源它,不想上传到HuggingFace,就是要在本机运行模型。此时应该如何利用LangChain的功能?

我们可以创建一个LLM的衍生类,自己定义模型。而LLM这个基类,则位于langchain.llms.base中,通过from langchain.llms.base import LLM语句导入。

这个自定义的LLM类只需要实现一个方法:

  • _call方法:用于接收输入字符串并返回响应字符串。

以及一个可选方法:

  • _identifying_params方法:用于帮助打印此类的属性。

下面,让我们先从HuggingFace的这里,下载一个llama-2-7b-chat.ggmlv3.q4_K_S.bin模型,并保存在本地。

你可能会质疑我,不是说自己训练,自己微调,不再用HuggingFace了吗?

不好意思,容许我解释一下。自己训练一个能用的模型没那么容易。这个模型,它并不是原始的Llama模型,而是TheBloke这位老兄用他的手段为我们量化过的新模型,你也可以理解成,他已经为我们压缩或者说微调了Llama模型。

量化是AI模型大小和性能优化的常用技术,它将模型的权重简化到较少的位数,以减少模型的大小和计算需求,让大模型甚至能够在CPU上面运行。当你看到模型的后缀有GGML或者GPTQ,就说明模型已经被量化过,其中GPTQ 是一种仅适用于 GPU 的特定格式。GGML 专为 CPU 和 Apple M 系列设计,但也可以加速 GPU 上的某些层。llama-cpp-python这个包就是为了实现GGML而制作的。

所以,这里你就假设,咱们下载下来的llama-2-7b-chat.ggmlv3.q4_K_S.bin这个模型,就是你自己微调过的。将来你真的微调了Llama2、ChatGLM、百川或者千问的开源版,甚至是自己从头训练了一个mini-ChatGPT,你也可以保存为you_own_model.bin的格式,就按照下面的方式加载到LangChain之中。

然后,为了使用llama-2-7b-chat.ggmlv3.q4_K_S.bin这个模型,你需要安装 pip install llama-cpp-python 这个包。

# 导入需要的库
from llama_cpp import Llama
from typing import Optional, List, Mapping, Any
from langchain.llms.base import LLM# 模型的名称和路径常量
MODEL_NAME = 'llama-2-7b-chat.ggmlv3.q4_K_S.bin'
MODEL_PATH = '/home/huangj/03_Llama/'# 自定义的LLM类,继承自基础LLM类
class CustomLLM(LLM):model_name = MODEL_NAME# 该方法使用Llama库调用模型生成回复def _call(self, prompt: str, stop: Optional[List[str]] = None) -> str:prompt_length = len(prompt) + 5# 初始化Llama模型,指定模型路径和线程数llm = Llama(model_path=MODEL_PATH+MODEL_NAME, n_threads=4)# 使用Llama模型生成回复response = llm(f"Q: {prompt} A: ", max_tokens=256)# 从返回的回复中提取文本部分output = response['choices'][0]['text'].replace('A: ', '').strip()# 返回生成的回复,同时剔除了问题部分和额外字符return output[prompt_length:]# 返回模型的标识参数,这里只是返回模型的名称@propertydef _identifying_params(self) -> Mapping[str, Any]:return {"name_of_model": self.model_name}# 返回模型的类型,这里是"custom"@propertydef _llm_type(self) -> str:return "custom"# 初始化自定义LLM类
llm = CustomLLM()# 使用自定义LLM生成一个回复
result = llm("昨天有一个客户抱怨他买了花给女朋友之后,两天花就枯了,你说作为客服我应该怎么解释?")# 打印生成的回复
print(result)

代码中需要解释的内容不多,基本上就是CustomLLM类的构建和使用,类内部通过Llama类来实现大模型的推理功能,然后直接返回模型的回答。 

似乎Llama经过量化之后,虽然仍读得懂中文,但是不会讲中文了。

翻译成中文,他的回答是这样的。

当客户抱怨他们为女朋友买的花在两天内就枯萎了,我会以礼貌和专业的方式这样解释:

"感谢您把这个问题告诉我们。对于给您带来的任何不便,我深感抱歉。有可能这些花没有被正确地存储或照料,这可能影响了它们的生命期。我们始终以提供高质量的产品为荣,但有时可能会出现意外的问题。请您知道,我们非常重视您的满意度并随时为您提供帮助。您希望我为您提供替换或退款吗?"

看上去,除了中文能力不大灵光之外,Llama2的英文表现真的非常完美,和GPT3.5差距不是很大,要知道:

  1. 这可是开源模型,而且是允许商业的免费模型。
  2. 这是在本机 CPU 的环境下运行的,模型的推理速度还是可以接受的。
  3. 这仅仅是Llama的最小版本,也就是7B的量化版,就达到了这么好的效果。

基于上述三点原因,我给Llama2打98.5分。


总结

今天的课程涵盖了从选择模型到使用LangChain调用模型的全过程。我们深入了解了预训练+微调的模式,学习了如何使用HuggingFace调用开源模型,并探讨了如何在LangChain中使用自定义模型。

思考题

  1. 现在请你再回答一下,什么时候应该使用OpenAI的API?什么时候应该使用开源模型?或者自己开发/微调的模型? 提示:的确,文中没有给出这个问题的答案。因为这个问题并没有标准答案。  
  2. 请你使用HuggingFace的Transformers库,下载新的模型进行推理,比较它们的性能。  
  3. 请你在LangChain中,使用HuggingFaceHub和HuggingFace Pipeline这两种接口,调用当前最流行的大语言模型。 提示:HuggingFace Model 页面,有模型下载量的当月排序,当月下载最多的模型就是最流行的模型。
  1. 现在请你再回答一下,什么时候应该使用OpenAI的API?什么时候应该使用开源模型?或者自己开发/微调的模型? 提示:的确,文中没有给出这个问题的答案。因为这个问题并没有标准答案。  
  2. 请你使用HuggingFace的Transformers库,下载新的模型进行推理,比较它们的性能。  
  3. 请你在LangChain中,使用HuggingFaceHub和HuggingFace Pipeline这两种接口,调用当前最流行的大语言模型。 提示:HuggingFace Model 页面,有模型下载量的当月排序,当月下载最多的模型就是最流行的模型。

未来,随着NLP技术的不断发展,我们期待看到更多创新性的应用和解决方案。希望今天的课程能为你提供有价值的见解和启发。


延伸阅读

  1. Llama2,开源的可商用类ChatGPT模型,Facebook链接、GitHub链接
  2. HuggingFace Transformer 文档
  3. PyTorch 官方教程、文档
  4. AutoGPTQ 基于GPTQ算法的大模型量化工具包
  5. Llama CPP 支持 GGML,目标是在MacBook(或类似的非GPU的普通家用硬件环境)上使用4位整数量化运行Llama模型

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

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

相关文章

Axure设计之三级联动选择器教程(中继器)

使用Axure设计三级联动选择器(如省市区选择器)时,可以利用中继器的数据存储和动态交互功能来实现。下面介绍中继器三级联动选择器设计的教程: 一、效果展示: 1、在三级联动选择器中,首先选择省份&#xff…

七次课掌握 Photoshop:选区与抠图

Photoshop 是一门选择的艺术。Photoshop 提供了多种工具和方法来创建选区,适用于不同的场景和需求。 理解和熟练使用这些工具,是提高图像处理能力的关键。 ◆ ◆ ◆ 选区方法与操作 一、创建选区的工具和命令 1、选区工具 (1)选…

智慧商城项目-VUE2

实现效果 项目收获 通过本项目的练习,可以掌握以下内容: 创建项目 ##基本创建 基于 VueCli 自定义创建项目架子,并对相关的配置进行选择 vue create demo-shopping调整目录 删除文件 删除初始化的一些默认文件 src/assets/logo.pngsrc/components…

Java | Leetcode Java题解之第546题移除盒子

题目: 题解: class Solution {int[][][] dp;public int removeBoxes(int[] boxes) {int length boxes.length;dp new int[length][length][length];return calculatePoints(boxes, 0, length - 1, 0);}public int calculatePoints(int[] boxes, int l…

PDF多功能工具箱 PDF Shaper v14.6

如今对PDF处理的软件很多都是只是单一的功能。PDF Shaper给你完全不同的体验,因为PDF Shaper是一款免费的PDF工具集合的软件。有了PDF Shaper,你以后再也不用下载其他处理PDF的软件了。PDF Shaper的功能有:合并,分割,加…

论文阅读--捍卫基于激光雷达视野范围的三维目标检测

目前存在的问题: 常用的体素化或鸟瞰图(BEV)表示相比,范围视图表示更紧凑且没有量化误差,但其在目标检测方面的性能很大程度上落后于体素化或 BEV 。范围视图尺度变化的挑战2D 图像不同,虽然距离图像的卷积…

使用匿名管道时出现程序一直运行问题

父进程创建两个子进程,父子进程之间利用管道进行通信。要求能显示父进程、子进程各自的信息,体现通信效果。(源程序pipe_1.c) 一开始,我忘了初始化pipe,很傻*的直接把fd当管道使,出现了儿子喊爸爸"i am your father."的…

【笔记】开关电源变压器设计 - 工作磁通的选择原则

变压器设计中有一个重要的输入参数,是选定电路工作的磁路参数。涉及到磁场的上下震荡最高幅度。如上图所示。磁场的方向有正负,所以如果电流在越过零点震荡,只考虑半周来和Bs或者Bmax比对即可。Bs,Bmax与特定材料有关。材料给出的最大Bmax,或…

一文了解Android本地广播

在 Android 开发中,本地广播(Local Broadcast)是一种轻量级的通信机制,主要用于在同一应用进程内的不同组件之间传递消息,而无需通过系统的全局广播机制。这种方法既可以提高安全性(因为广播仅在应用内传播…

Spark本地模式安装

【图书介绍】《Spark SQL大数据分析快速上手》-CSDN博客 《Spark SQL大数据分析快速上手》【摘要 书评 试读】- 京东图书 大数据与数据分析_夏天又到了的博客-CSDN博客 Hadoop完全分布式环境搭建步骤-CSDN博客,前置环境安装参看此博文 Spark本地模式安装 Spark本地模式的安…

SpringSecurity6+OAuth2.0 从入门到熟练使用

文章目录 简介1、快速入门1.1 准备工作我们先要搭建一个SpringBoot工程① 创建工程 添加依赖② 创建启动类③ 创建Controller1.2 引入SpringSecurity2、 认证2.1 登录校验流程2.2 原理分析2.2.1 SpringSecurity完整流程2.2.2 认证流程详解概念速查:2.3 解决问题2.3.1 思路分析2…

计算机网络——SDN

分布式控制路由 集中式控制路由

自动驾驶革命:从特斯拉到百度,谁将主宰未来交通?

内容概要 自动驾驶技术正在经历一个前所未有的革命性变化,各大企业纷纷抢占这一充满潜力的新市场。以特斯拉和百度为代表的行业巨头,正利用各自的优势在这一技术的赛道上展开激烈竞争。特斯拉凭借其在电动汽车和自动驾驶领域的前瞻性设计与不断革新的技…

Group By、Having用法总结(常见踩雷点总结—SQL)

Group By、Having用法总结 目录 Group By、Having用法总结一、 GROUP BY 用法二、 HAVING 用法三、 GROUP BY 和 HAVING 的常见踩雷点3.1 GROUP BY 选择的列必须出现在 SELECT 中(🤣最重要的一点)3.2 HAVING 与 WHERE 的区别3.3 GROUP BY 可以…

MySQL存储目录与配置文件(ubunto下)

mysql的配置文件: 在这个目录下,直接cd /etc/mysql/mysql.conf.d mysql的储存目录: /var/lib/mysql Ubuntu版本号:

深度学习经典模型之Network in Network

1 Network in Network 1.1 模型介绍 ​ Network In Network (NIN)是由 M i n L i n Min Lin MinLin等人提出,在CIFAR-10和CIFAR-100分类任务中达到当时的最好水平,因其网络结构是由三个多层感知机堆叠而被成为NIN [ 5 ] ^{[5]} [5]。NIN以一种全新的角…

Java版ERP管理系统源码解析:利用Spring Cloud Alibaba和Spring Boot实现微服务架构

ERP系统,亦称为企业资源计划系统,是一种融合了企业多元部门和复杂业务的综合管理信息系统。在全球经济蓬勃发展及企业竞争日趋激烈的背景下,ERP系统已逐步跃升为现代企业管理的核心工具。该系统通过优化资源配置及提升业务流程效率&#xff0…

Python 基础笔记之生成器generator

生成斐波拉契数列 def fib(length):a,b0,1n0while n<length:yield aa,bb,abn1return abc g2fib(10) try:print(next(g2)) 生成器方法&#xff1a; __next__():获取下一个元素 send(value):向每次生成器调用中传值 注意&#xff1a;第一次调用send(None) def gen():i0while…

vscode翻译插件

vscode翻译插件 需求 &#xff1a; 在编写代码的时候&#xff0c; 打印或者定义变量的时候总是想不起来英文名称&#xff0c; 所有就开发了一款中文转换为英文的插件。 功能 1、目前支持选中中文&#xff0c;右键选择打印或者变量进行转换。 2、目前支持选中中文&#xff0…

美格智能5G车规级通信模组:高精度定位守护极致安全

物联网时代&#xff0c;众多应用和设备都需要位置相关服务&#xff0c;尤其是对移动场景而言&#xff0c;定位的需求更加重要。随着自动驾驶、高阶辅助驾驶等智能车载技术的高速发展&#xff0c;在智能车载领域的定位需求除基础的位置信息之外&#xff0c;还对信息获取的速度、…