【阅读记录-章节1】Build a Large Language Model (From Scratch)

目录

  • 1. Understanding large language models
    • 1.1 What is an LLM?
      • 补充介绍
        • 人工智能、机器学习和深度学习的关系
        • 机器学习 vs 深度学习
        • 传统机器学习 vs 深度学习(以垃圾邮件分类为例)
    • 1.2 Applications of LLMs
    • 1.3 Stages of building and using LLMs
    • 1.4 Introducing the transformer architecture
    • 1.5 Utilizing large datasets
    • 1.6 A closer look at the GPT architecture
    • 1.7 Building a large language model
    • 总结:

1. Understanding large language models

大语言模型(LLMs) 如ChatGPT,依托深度学习和transformer架构,能够在多种自然语言处理(NLP)任务中表现出色,尤其是在理解、生成和处理复杂语言方面

与传统的NLP模型不同,LLMs不仅能够完成如文本分类和翻译等特定任务,还能处理更具挑战性的任务,如解析复杂指令和生成连贯的原创文本。这些模型的成功得益于大规模文本数据的训练transformer架构的应用,使它们能够捕捉语言中的深层次语境和细节。

正是这种技术进步,推动了NLP领域的变革,使得我们能够使用更强大的工具与人类语言进行互动。接下来的讨论将基于transformer架构,逐步实现一个类似ChatGPT的LLM,帮助理解LLMs的工作原理。

1.1 What is an LLM?

LLM(Large Language Model)是一种神经网络,旨在理解、生成和回应类人文本。这些模型通常是深度神经网络,经过大量文本数据的训练,数据量通常覆盖了互联网上的公共文本。

  • "Large"的含义:大语言模型中的“large”指的是两个方面:

    1. 模型大小:通常这些模型拥有数十亿甚至数百亿个参数。参数是模型在训练过程中需要优化的权重,用来预测文本中的下一个单词。
    2. 训练数据集的规模:这些模型训练所使用的数据集通常非常庞大,包括了互联网上的海量文本。
  • 训练目标:大语言模型的核心任务之一是“下一个词预测”。这是因为语言本身具有序列性,模型通过学习上下文、结构和文本之间的关系来理解语言。因此,尽管“下一个词预测”看似是一个简单任务,但它却能生成非常强大的模型。

LLM通常使用Transformer架构,这是当前自然语言处理领域最流行的架构之一。Transformer的关键特点是它能够在生成文本时选择性地关注输入文本的不同部分,从而帮助模型更好地理解语言的细微差别。

  • Transformer的优点是它能并行处理输入序列中的所有部分,而不是像传统的循环神经网络(RNN)那样逐步处理,从而加速训练和提高性能。

LLM常被视为 生成性人工智能(Generative AI, GenAI) 的一种形式。生成性AI指的是利用深度神经网络创造新的内容,比如文本、图像或其他媒体形式。LLM的目标是生成与人类语言相似的文本,因此它也属于生成性人工智能的范畴。
正如这幅展示不同领域关系的层次结构图所示,大语言模型(LLM)代表了深度学习技术的具体应用,利用其处理和生成类人文本的能力。深度学习是机器学习的一个专门分支,专注于使用多层神经网络。机器学习和深度学习是两个旨在实现使计算机从数据中学习并执行通常需要人类智能的任务的算法领域。

补充介绍

人工智能、机器学习和深度学习的关系
  1. 人工智能(AI):人工智能是一个广泛的领域,旨在让机器具备类似人类的智能。这包括理解语言、识别模式和做出决策等任务。

  2. 机器学习(Machine Learning, ML):机器学习是人工智能的一个子领域,致力于开发能够从数据中学习并基于数据做出预测或决策的算法。

  3. 深度学习(Deep Learning, DL):深度学习是机器学习的一个子领域,专注于使用多层神经网络(即深度神经网络)来建模复杂的数据模式。


机器学习 vs 深度学习
  • 传统机器学习:在传统的机器学习方法中,特征提取是由人工完成的。例如,在垃圾邮件过滤任务中,专家会手动选择特征(如特定词汇的出现频率、感叹号的数量或邮件中的链接等)来训练模型。

  • 深度学习:深度学习则不需要人工提取特征。深度学习算法能够自动从原始数据中学习和提取特征,并建模更复杂的模式和关系。因此,深度学习可以处理更为复杂和多样化的数据集,而无需依赖人工设计的特征。


传统机器学习 vs 深度学习(以垃圾邮件分类为例)
  • 在传统的机器学习中,模型训练依赖于人工选择的特征。专家通过分析数据并挑选出重要的特征,来构建训练数据集。

  • 在深度学习中,模型通过对数据进行训练,自动学习到哪些特征最为重要,从而提高预测的准确性,不需要人工干预。

1.2 Applications of LLMs

由于大语言模型(LLMs)具备解析和理解非结构化文本数据的强大能力,它们在多个领域中具有广泛的应用。以下是LLMs的一些主要应用:

  1. 机器翻译:LLMs被广泛应用于不同语言之间的翻译任务。
  2. 文本生成:LLMs能够生成新的文本,例如写作小说、文章,甚至计算机代码。
  3. 情感分析:分析文本中的情感倾向,例如判定评论或文章是正面、负面还是中立。
  4. 文本摘要:将长篇文章或内容进行总结,提取核心信息。
  5. 内容创作:LLMs在创作内容方面表现出色,如自动写作小说、文章等。
  6. 聊天机器人和虚拟助手:如OpenAI的ChatGPT和谷歌的Gemini(前身为Bard),这些应用可以回答用户问题并增强传统搜索引擎(如谷歌搜索或微软Bing)的功能。
  7. 知识检索:LLMs能够高效地从大量的专业领域文本中提取知识,例如医学和法律领域。这包括查阅文档、总结长篇段落,并回答技术性问题。

LLM的潜力与未来:LLMs能够自动化几乎所有涉及文本解析和生成的任务,其应用几乎是无限的。随着技术的不断创新和新的使用场景的探索,LLMs有可能重新定义我们与技术的关系,使其更加对话化、直观且易于访问。

1.3 Stages of building and using LLMs

从零开始编写一个大语言模型(LLM)是一个非常好的练习,它能帮助我们深入理解模型的工作原理和局限性。此外,构建自己的LLM还为我们提供了预训练或微调现有开源LLM架构的知识,使我们能够将模型应用于特定领域的数据集或任务。

PyTorch与LLM
目前,许多大语言模型是使用PyTorch深度学习库实现的,这也是我们将使用的工具。对于PyTorch的全面介绍,请参见附录A。

研究表明,定制的大语言模型(特别是为特定任务或领域量身定制的LLMs)在性能上往往优于通用的大语言模型(如ChatGPT),后者是为广泛的应用场景设计的。定制模型的例子包括BloombergGPT(专为金融领域设计)和专为医学问答设计的LLMs(有关更多细节,请见附录B)。

定制LLM的另一个显著优势是数据隐私。例如,企业可能不希望将敏感数据与第三方LLM提供商(如OpenAI)共享,因为存在保密性问题。此外,开发较小的定制LLM能够直接在客户设备(如笔记本电脑和智能手机)上部署,这是像苹果公司等公司正在探索的方向。这样做不仅可以大幅减少延迟,还能降低服务器相关的成本。

定制LLM还给予开发人员完全的控制权,使他们可以根据需要更新或修改模型。

创建LLM的流程

创建LLM的通用流程包括预训练微调

  • 预训练阶段,指的是对模型进行初步训练,通常是在一个大型、多样化的数据集上训练,以开发模型对语言的广泛理解。此阶段的模型被称为预训练模型,例如GPT-3模型,它能够执行基本的文本补全任务,并具有有限的少量样本学习(few-shot learning)能力。
  • 微调是对模型进行进一步训练,使其能够执行特定任务或应用。微调阶段,通常使用较小的标注数据集,来训练模型专注于某些领域或任务。
    预训练LLM涉及在大型文本数据集上进行下一个词预测。然后,可以使用较小的标注数据集对预训练的LLM进行微调。
    预训练和微调的具体步骤
  1. 预训练:首先,我们需要使用大规模的文本数据对LLM进行训练,这些数据通常是未标注的文本(即“原始文本”)。在这个阶段,模型使用自监督学习,通过预测文本中的下一个单词来“生成”标签,从而学习语言的结构和模式。

  2. 微调:当我们有了一个经过预训练的LLM后,可以使用标注数据进行微调。微调分为两类:

    • 指令微调:使用包含问题和答案对的标注数据集(如翻译任务中的问题和正确翻译文本)。
    • 分类微调:使用包含文本和相应类别标签的数据集(如垃圾邮件分类任务中的“垃圾邮件”和“非垃圾邮件”标签)。

微调后的LLM可以完成更多复杂的任务,如文本分类、翻译和问答等。

通过从头开始构建LLM,我们不仅能深入理解LLM的工作机制和局限性,还能获得定制和优化现有开源LLM模型的能力,特别是针对特定领域的任务。同时,定制LLM有助于解决数据隐私问题,并可部署在本地设备上减少延迟和服务器成本。在LLM的开发过程中,预训练和微调是两个关键步骤,前者通过大量数据训练模型,后者则通过特定任务的标注数据进行精细化训练。

1.4 Introducing the transformer architecture

现代大型语言模型(LLMs)依赖于Transformer架构,它是一种深度神经网络架构,最初在2017年的论文《Attention Is All You Need》中提出。理解LLMs需要先理解原始的Transformer,它最初是为机器翻译任务设计的,旨在将英文文本翻译为德语或法语。

Transformer架构包括两个子模块:编码器(Encoder)和解码器(Decoder)。编码器处理输入的文本,并将其编码成一系列数字表示(向量),这些向量捕捉了输入文本的上下文信息。然后,解码器利用这些编码向量生成输出文本。在机器翻译任务中,编码器会将源语言的文本编码成向量,解码器则解码这些向量,生成目标语言的文本。
这是原始Transformer架构的简化示意图,Transformer是一种用于语言翻译的深度学习模型。Transformer由两部分组成:(a)编码器,处理输入文本并生成文本的嵌入表示(一个数值表示,捕捉文本中多个不同维度的因素);(b)解码器,利用这些嵌入表示逐个单词地生成翻译后的文本。此图展示了翻译过程的最后阶段,解码器只需根据原始输入文本(“This is an example”)和部分翻译的句子(“Das ist ein”),生成最终的翻译单词(“Beispiel”),以完成翻译。
关键的组件是自注意力机制(Self-attention),它允许模型根据每个词或标记之间的相对重要性来加权它们。这使得模型能够捕捉到输入数据中的长程依赖关系和上下文关系,从而增强生成连贯且符合上下文的输出的能力。

之后,Transformer架构的变体,如BERTGPT,在此基础上进行了改进,并被用于不同的任务。BERT专注于掩码词预测,它的训练方式与GPT不同,BERT通过预测句子中被遮蔽的词来训练,因此特别适合用于文本分类任务,如情感分析和文档分类。而GPT则主要关注生成任务,如文本生成、机器翻译和编写代码等。
这是Transformer的编码器和解码器子模块的视觉表示。在左侧,编码器部分展示了类似BERT的LLM,专注于掩码词预测,主要用于文本分类等任务。右侧的解码器部分展示了类似GPT的LLM,旨在执行生成任务,生成连贯的文本序列。
GPT模型被设计为文本补全任务的生成模型,并具备显著的多功能性,能够进行零-shot学习少-shot学习零-shot学习指的是在没有任何具体示例的情况下完成任务,而少-shot学习则是在只提供少量示例的情况下进行学习。
除了文本补全,类似GPT的LLM还可以根据输入解决各种任务,无需重新训练、微调或任务特定的模型架构更改。有时,提供目标示例作为输入是有帮助的,这种设置称为少量示例(few-shot)设置。然而,类似GPT的LLM也能够在没有特定示例的情况下完成任务,这种情况称为零-shot设置。
最终,TransformerLLMs通常是可以互换使用的术语,但并非所有Transformer模型都是LLMs,也并非所有LLMs都基于Transformer架构。虽然LLMs的计算效率可以通过其他架构(如循环神经网络或卷积神经网络)进行改进,但这些替代架构能否与基于Transformer的LLMs竞争,以及它们是否会被实际采用,还需要进一步观察。

1.5 Utilizing large datasets

大型语言模型(LLMs),如GPT-3,如何使用庞大的、多样化的训练数据集进行预训练。这些数据集涵盖了各种主题,包括自然语言和计算机语言。

例如,GPT-3的预训练数据集如下表所示:

数据集名称数据集描述令牌数量数据在训练中的比例
CommonCrawl(过滤)网络爬虫数据4100亿60%
WebText2网络爬虫数据190亿22%
Books1基于互联网的书籍语料120亿8%
Books2基于互联网的书籍语料550亿8%
Wikipedia高质量文本30亿3%

数据集中的“令牌”是模型读取的文本单位,令牌的数量大致等于文本中的单词和标点符号的数量。GPT-3模型的预训练数据集包含了大约3000亿个令牌,尽管其中有4990亿个令牌在数据集中。这些庞大的数据集使得模型能够在语言语法、语义和上下文等多种任务中表现良好。

进一步的GPT-3模型变体(如Meta的LLaMA)还扩展了训练数据源,加入了如Arxiv研究论文和StackExchange代码相关Q&A等数据。

GPT-3的预训练需要大量资源,估计成本为460万美元。然而,许多预训练模型作为开源工具提供,可以用于文本的写作、提取和编辑。LLMs还可以通过较小的数据集进行微调,从而提高在特定任务中的表现,并减少计算资源的需求。

我们将编写预训练代码来学习如何在消费级硬件上完成LLM预训练,并使用开源模型的权重来省去高成本的预训练步骤,实现微调。

1.6 A closer look at the GPT architecture

  1. GPT的起源和发展

    • GPT(生成式预训练模型)最早由OpenAI在论文《通过生成式预训练改进语言理解》中提出。GPT-3是这个模型的扩展版本,拥有更多的参数,并在更大规模的数据集上进行训练。
    • ChatGPT的原始版本是通过对GPT-3进行微调得到的,微调使用的是OpenAI在InstructGPT论文中提出的大规模指令数据集。
  2. 任务能力与训练方法

    • GPT模型的预训练任务非常简单——“预测下一个词”。这个任务属于一种“自监督学习”,即模型通过预测文本中的下一个词来自动生成训练标签,因此可以使用大规模的无标签文本进行训练。
    • 通过这种方法,GPT不仅能完成文本补全,还能进行拼写检查、分类、翻译等多种任务。这种多任务能力很特别,因为GPT的训练目标只是预测下一个词,而并非专门针对特定任务。
  3. 自回归生成过程

    • GPT使用的“解码器”架构是原始Transformer架构的一部分,适用于自回归生成。每次生成一个词,该词会成为下一次预测的输入,这样一轮接一轮地生成完整的文本,使生成结果更加连贯。
  4. 模型规模的扩展

    • GPT-3具有96层Transformer层和1750亿参数,大大超越了最初的Transformer架构(编码器和解码器各6层)。这种规模的增加提升了模型的理解和生成能力。
  5. 突现行为(Emergent Behavior)

    • 由于GPT在多语言和多样化的文本数据上训练,出现了“突现行为”——模型可以执行一些没有明确训练的任务,如翻译。这种能力表明,通过大规模数据的训练,模型可以自发地“学习”某些复杂的模式。

GPT架构仅使用了原始Transformer的解码器部分。它设计为单向的从左到右的处理方式,非常适合文本生成和逐词预测任务,以迭代的方式一次生成一个词。
总结来说,GPT的架构虽然简单,但通过大量数据的预训练,实现了多种自然语言处理任务。这些任务并不是专门设计的,而是基于模型在多语言、多情境数据中的训练,自发地涌现出的能力。

1.7 Building a large language model

大型语言模型开发的三阶段:构建、预训练与微调这张图展示了从头开始构建一个大型语言模型(LLM)的三个主要阶段:
这张图展示了从头开始构建一个大型语言模型(LLM)的三个主要阶段:

Stage 1:LLM 的基础构建

  1. 数据准备和采样(Data preparation & sampling):这一步骤主要是收集和处理数据。因为大型语言模型需要大量的数据来进行训练,所以这里的数据准备包括采样、清洗和标注等过程。
  2. 注意力机制(Attention mechanism):实现并理解注意力机制是构建 LLM 的关键步骤。注意力机制允许模型更好地理解句子中的重要词汇及其关系。
  3. LLM 架构设计(LLM architecture):这一步是设计模型的整体架构,包括层数、维度、编码方式等。常见的架构有 Transformer、GPT、BERT 等。
  4. 预训练(Pretraining):在完成前几步之后,将模型在大量无标签数据上进行预训练。这是为了让模型学习到语言的基本结构和词汇关系。

在这个阶段结束后,得到了一个基础的 LLM,实现了数据采样、注意力机制和架构的基础。

Stage 2:构建基础模型(Foundation Model)

  1. 训练循环(Training loop):这一阶段的核心是建立训练循环。模型会在大量数据上进行训练,逐步优化参数,使其在语言任务上表现得更好。
  2. 模型评估(Model evaluation):训练过程中,需要定期评估模型性能,查看是否收敛或是否需要调整超参数。
  3. 加载预训练权重(Load pretrained weights):在一些情况下,可以加载已有的预训练权重进行微调,避免从头开始训练。

在这个阶段的末尾,得到了一个基础模型(Foundation Model),可以用作进一步任务的微调(fine-tuning)。

Stage 3:微调模型

  1. 微调分类器(Fine-tuning for classification):在一些任务中,基础模型会被微调以实现分类功能。这里需要一个有标签的数据集,通过训练让模型能够准确分类。
  2. 微调为助手模型(Fine-tuning for a personal assistant):在其他任务中,可以将基础模型微调成一个助手或对话模型,通过带有指令的数据集训练,让模型能够回答问题或提供交互支持。

最后,经过微调后,得到了特定任务的模型,例如分类器或个人助手(聊天模型)。

总结:

  1. LLM对NLP的影响:LLM革新了自然语言处理(NLP)领域,从以往基于规则和简单统计方法转向深度学习方法,提升了机器对人类语言的理解、生成和翻译能力。

  2. LLM的训练步骤

    • 预训练:在无标签的大规模文本数据上进行预训练,采用预测句子下一个词的方式。
    • 微调:在较小的有标签数据集上微调,以执行指令或分类任务。
  3. 架构基础:LLM基于Transformer架构,其核心是注意力机制,使模型在逐词生成时可以选择性地访问输入序列的全部信息。

  4. Transformer架构组成:原始架构包括用于解析文本的编码器和生成文本的解码器。GPT-3和ChatGPT等生成型LLM仅使用解码器模块,简化了架构。

  5. 大规模数据需求:LLM的预训练需要包含数十亿词的大规模数据集。

  6. 涌现能力:虽然LLM的预训练任务只是预测下一个词,但模型在分类、翻译和总结等任务上展现出涌现的能力。

  7. 微调效率:预训练后的LLM基础模型可通过微调更高效地执行下游任务,在特定任务上表现优于通用LLM。

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

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

相关文章

平台整合是网络安全成功的关键

如今,组织面临着日益复杂、动态的网络威胁环境,随着恶意行为者采用越来越阴险的技术来破坏环境,攻击的数量和有效性也在不断上升。我们最近的 Cyber​​Ark 身份威胁形势报告(2024 年 5 月)发现,去年 99% 的…

PlantUML——时序图

PlantUML时序图 背景 时序图(Sequence Diagram),又名序列图、循序图,是一种UML交互图,用于描述对象之间发送消息的时间顺序,显示多个对象之间的动态协作。时序图的使用场景非常广泛,几乎各行各…

【MYSQL】分库分表

一、什么是分库分表 分库分表就是指在一个数据库在存储数据过大,或者一个表存储数据过多的情况下,为了提高数据存储的可持续性,查询数据的性能而进行的将单一库或者表分成多个库,表使用。 二、为什么要分库分表 分库分表其实是两…

Spring纯注解开发

在我的另一篇文章中(初识Spring-CSDN博客),讲述了Bean,以及通过xml方式定义Bean。接下来将讲解通过注解的方法管理Bean。 我们在创建具体的类的时候,可以直接在类的上面标明“注解”,以此来声明类。 1. 常…

git push时报错! [rejected] master -> master (fetch first)error: ...

错误描述:在我向远程仓库push代码时,即执行 git push origin master命令时发生的错误。直接上错误截图。 错误截图 错误原因: 在网上查了许多资料,是因为Git仓库中已经有一部分代码,它不允许你直接把你的代码覆盖上去…

java常用工具包介绍

Java 作为一种广泛使用的编程语言,提供了丰富的标准库和工具包来帮助开发者高效地进行开发。这些工具包涵盖了从基础的数据类型操作到高级的网络编程、数据库连接等各个方面。下面是一些 Java 中常用的工具包(Package)及其简要介绍&#xff1…

latex中,两个相邻的表格,怎样留一定的空白

目录 问题描述 问题解决 问题描述 在使用latex写论文时,经常表格需要置顶写,则会出现两个表格连在一起的情况。下一个表名容易与上面的横线相连,如何通过明令,留出一定的空白。 问题解决 在第二个表格的 \centering命令之后…

react中如何在一张图片上加一个灰色蒙层,并添加事件?

最终效果: 实现原理: 移动到图片上的时候,给img加一个伪类 !!此时就要地方要注意了,因为img标签是闭合的标签,无法直接添加 伪类(::after),所以 我是在img外…

C++builder中的人工智能(27):如何将 GPT-3 API 集成到 C++ 中

人工智能软件和硬件技术正在迅速发展。我们每天都能看到新的进步。其中一个巨大的飞跃是我们拥有更多基于自然语言处理(NLP)和深度学习(DL)机制的逻辑性更强的AI聊天应用。有许多AI工具可以用来开发由C、C、Delphi、Python等编程语…

【项目开发】URL中井号(#)的技术细节

未经许可,不得转载。 文章目录 前言一、# 的基本含义二、# 不参与 HTTP 请求三、# 后的字符处理机制四、# 的变化不会触发网页重新加载五、# 的变化会记录在浏览器历史中六、通过 window.location.hash 操作七、onhashchange 事件八、Google 对 # 的处理机制前言 2023 年 9 月…

AUTOSAR_EXP_ARAComAPI的7章笔记(5)

☞返回总目录 相关总结:典型的 SOME/IP 多绑定用例总结 7.3.3 典型的SOME/IP多绑定用例 在前面的章节中,我们简要提到,在一个典型的SOME/IP 网络协议的部署场景中,AP SWC不太可能自己打开套接字连接来与远程服务通信。为什么不…

Jenkins下载安装、构建部署到linux远程启动运行

Jenkins详细教程 Winodws下载安装Jenkins一、Jenkins配置Plugins插件管理1、汉化插件2、Maven插件3、重启Jenkins:Restart Safely插件4、文件传输:Publish Over SSH5、gitee插件6、清理插件:workspace cleanup system系统配置1、Gitee配置2、…

Flutter:Dio下载文件到本地

import dart:io; import package:dio/dio.dart;main(){// 创建dio对象final dio Dio();// 下载地址var url https://*******.org/files/1.0.0.apk;// 手机端路径String savePath Directory.systemTemp.path/ceshi.apk;print(savePath);downLoad(dio,url,savePath); }downLo…

【C++笔记】C++三大特性之多态

【C笔记】C三大特性之多态 🔥个人主页:大白的编程日记 🔥专栏:C笔记 文章目录 【C笔记】C三大特性之多态前言一.多态1.1 多态的概念1.2 虚函数1.3 虚函数的重写/覆盖1.4 多态的定义及实现 二.虚函数重写的⼀些其他问题2.1 协变(…

2.STM32之通信接口《精讲》之USART通信

有关通信详解进我主页观看其他文章!【免费】SPIIICUARTRS232/485-详细版_UART、IIC、SPI资源-CSDN文库 通过以上可以看出。根据电频标准,可以分为TTL电平,RS232电平,RS485电平,这些本质上都属于串口通信。有区别的仅是…

麒麟V10,arm64,离线安装docker和docker-compose

文章目录 一、下载1.1 docker1.2 docker-compose1.3 docker.service 二、安装三、验证安装成功3.1 docker3.2 docker-compose 需要在离线环境的系统了里面安装docker。目前国产化主推的是麒麟os和鲲鹏的cpu,这块的教程还比较少,记录一下。 # cat /etc/ky…

云原生之运维监控实践-使用Telegraf、Prometheus与Grafana实现对InfluxDB服务的监测

背景 如果你要为应用程序构建规范或用户故事,那么务必先把应用程序每个组件的监控指标考虑进来,千万不要等到项目结束或部署之前再做这件事情。——《Prometheus监控实战》 去年写了一篇在Docker环境下部署若依微服务ruoyi-cloud项目的文章,当…

三十九、Python(pytest框架-中)

一、执行用例的方式 1.工具执行 2.在终端使用命令行运行 命令:pytest -s 用例代码文件 -s 的作用是输出显示代码中的 print。 3.在主函数main中执行 if __name__ "__main__": # 主函数pytest.main([-s, 用例代码文件]) import pytestclass TestDemo…

丹摩征文活动|丹摩助力selenium实现大麦网抢票

丹摩征文活动|丹摩助力selenium实现大麦网抢票 1.引言 在人工智能飞速发展的今天,丹摩智算平台(DAMODEL)以其卓越的AI算力服务脱颖而出,为开发者提供了一个简化AI开发流程的强大工具。通过租赁GPU资源,丹…

【计算机网络】协议定制

一、结构化数据传输流程 这里涉及协议定制、序列化/反序列化的知识 对于序列化和反序列化,有现成的解决方案:①json ②probuff ③xml 二、理解发送接收函数 我们调用的所有发送/接收函数,根本就不是把数据发送到网络中!本质都是…