LLM架构与优化:从理论到实践的关键技术
标题:“LLM架构与优化:从理论到实践的关键技术”
文章信息摘要:
文章探讨了大型语言模型(LLM)开发与应用中的关键技术,包括Transformer架构、注意力机制、采样技术、Tokenization等基础理论,以及模型部署、应用开发、优化等实践技能。重点分析了预训练、后训练、监督微调(SFT)和偏好对齐(Preference Alignment)在提升模型性能中的作用,并对比了直接偏好优化(DPO)与近端策略优化(PPO)的优劣。此外,文章强调了监控训练关键指标和评估模型表现的重要性,为LLM的优化和改进提供了系统化的方法论。这些内容为LLM的研究和应用提供了全面的理论指导和实践参考。
==================================================
详细分析:
核心观点:LLM科学家需要深入理解LLM的架构,包括Transformer架构、注意力机制、采样技术等,这是开发和应用LLM的基础。
详细分析:
LLM科学家需要深入理解LLM的架构,因为这是开发和应用LLM的基础。以下是对这一点的详细展开:
1. Transformer架构
Transformer架构是现代LLM的核心。它最初由Vaswani等人在2017年提出,通过自注意力机制(self-attention)实现了对长距离依赖关系的有效建模。LLM科学家需要理解Transformer的基本组成部分,包括:
- 编码器-解码器结构:早期的Transformer模型(如BERT)主要使用编码器,而现代LLM(如GPT系列)则主要使用解码器。解码器架构更适合生成任务,因为它能够逐步生成文本。
- 多头注意力机制:这是Transformer的核心机制,允许模型在处理输入序列时关注不同位置的信息。多头注意力通过并行计算多个注意力头,增强了模型的表达能力。
- 位置编码:由于Transformer不依赖于序列的顺序,位置编码被引入以提供序列中每个词的位置信息。
2. 注意力机制
注意力机制是Transformer架构的核心,LLM科学家需要深入理解其工作原理和变体:
- 自注意力机制:自注意力机制允许模型在处理每个词时,考虑整个输入序列中的其他词。这种机制使得模型能够捕捉长距离依赖关系,从而更好地理解上下文。
- 多头注意力:通过并行计算多个注意力头,模型可以从不同的子空间中提取信息,增强了模型的表达能力。
- 变体:如稀疏注意力(Sparse Attention)和局部注意力(Local Attention),这些变体在特定任务中可以提高模型的效率和性能。
3. 采样技术
在文本生成任务中,采样技术决定了模型如何从概率分布中选择下一个词。LLM科学家需要掌握不同的采样策略及其优缺点:
- 贪婪搜索(Greedy Search):每次选择概率最高的词,简单但可能导致重复和缺乏多样性。
- 束搜索(Beam Search):保留多个候选序列,平衡了生成质量和多样性,但计算成本较高。
- 温度采样(Temperature Sampling):通过调整温度参数控制生成文本的随机性,温度越高,生成文本越随机。
- 核采样(Nucleus Sampling):只从概率最高的词集中采样,平衡了生成质量和多样性。
4. Tokenization
Tokenization是将文本转换为模型可以处理的数字表示的过程。LLM科学家需要理解不同的Tokenization策略及其对模型性能的影响:
- 子词Tokenization:如Byte Pair Encoding (BPE)和WordPiece,这些方法将词汇分解为子词单元,减少了词汇表的大小,同时保留了语义信息。
- 字符级Tokenization:将文本分解为单个字符,适用于处理罕见词汇,但可能导致序列过长。
- 词汇表大小:词汇表的大小会影响模型的性能和内存使用,科学家需要在两者之间找到平衡。
5. 模型架构的演进
LLM科学家还需要了解模型架构的演进,从早期的RNN、LSTM到现代的Transformer架构,理解这些演进背后的动机和技术细节。例如:
- 从RNN到Transformer:RNN和LSTM在处理长序列时存在梯度消失和计算效率低的问题,而Transformer通过自注意力机制解决了这些问题。
- 从编码器-解码器到解码器:现代LLM(如GPT系列)主要使用解码器架构,更适合生成任务。
6. 实践中的应用
理解这些架构和技术不仅仅是理论上的,还需要在实践中应用。LLM科学家需要通过实验和代码实现来验证这些理论,例如:
- 复现经典模型:通过复现经典的Transformer模型(如GPT、BERT)来深入理解其工作原理。
- 优化模型架构:通过调整模型架构(如层数、注意力头数)来优化模型性能。
- 调试和调优:通过调试和调优模型参数(如学习率、批量大小)来提高模型的训练效率和生成质量。
总之,LLM科学家需要深入理解LLM的架构,包括Transformer架构、注意力机制、采样技术等,这是开发和应用LLM的基础。只有掌握了这些基础知识,才能在LLM的研究和应用中取得突破。
==================================================
核心观点:LLM工程师需要掌握如何将LLM应用于实际场景,包括模型部署、应用开发和优化,这是将LLM从理论转化为实际应用的关键。
详细分析:
LLM工程师的核心任务是将大型语言模型(LLM)从理论转化为实际应用,这涉及到模型部署、应用开发和优化等多个方面。以下是对这些关键点的详细展开:
1. 模型部署
模型部署是将训练好的LLM集成到实际应用中的第一步。LLM工程师需要掌握以下技能:
- 模型压缩与优化:LLM通常非常庞大,直接部署可能会面临计算资源和存储空间的限制。工程师需要掌握模型压缩技术,如量化(Quantization)、剪枝(Pruning)和蒸馏(Distillation),以减少模型的大小和计算需求。
- 推理加速:为了在实时应用中快速响应,工程师需要优化模型的推理速度。这可以通过使用高效的推理框架(如TensorRT、ONNX Runtime)或硬件加速器(如GPU、TPU)来实现。
- 容器化与云部署:现代应用通常部署在云平台上。工程师需要熟悉容器化技术(如Docker)和云服务(如AWS、GCP、Azure),以便将模型打包并部署到云端,确保其可扩展性和高可用性。
2. 应用开发
LLM工程师需要将LLM集成到具体的应用中,这涉及到以下方面:
- API设计与开发:为了将LLM的能力暴露给其他系统或用户,工程师需要设计和开发RESTful API或GraphQL API。这些API允许外部系统通过HTTP请求与LLM进行交互。
- 用户界面集成:在许多应用中,LLM的输出需要直接呈现给用户。工程师需要将LLM与前端界面(如Web应用、移动应用)集成,确保用户能够方便地与模型进行交互。
- 多模态应用开发:随着多模态模型(如GPT-4 Vision)的发展,LLM工程师还需要掌握如何将文本、图像、音频等多种模态的数据结合起来,开发出更丰富的应用场景。
3. 应用优化
在实际应用中,LLM的性能和用户体验至关重要。工程师需要进行以下优化:
- 延迟优化:用户通常期望应用能够快速响应。工程师需要通过优化模型推理、减少网络延迟等方式,确保应用的响应时间在可接受范围内。
- 成本优化:LLM的推理成本可能很高,尤其是在大规模应用中。工程师需要优化资源使用,选择合适的硬件和云服务,以降低运营成本。
- 用户体验优化:LLM的输出质量直接影响用户体验。工程师需要通过调整模型的生成策略(如温度采样、核采样)或引入后处理步骤(如语法校正、内容过滤),确保生成的文本符合用户期望。
4. 持续监控与维护
部署后的LLM应用需要持续监控和维护,以确保其稳定性和性能:
- 性能监控:工程师需要设置监控系统,实时跟踪模型的推理速度、资源使用情况和错误率等关键指标,及时发现并解决问题。
- 模型更新:随着新数据的出现和用户需求的变化,LLM可能需要定期更新。工程师需要掌握如何在不中断服务的情况下,无缝更新模型。
- 安全与合规:LLM应用可能面临数据隐私和安全问题。工程师需要确保应用符合相关法律法规(如GDPR),并采取措施防止模型被滥用或攻击。
5. 实际应用场景
LLM工程师需要将LLM应用于各种实际场景,以下是一些常见的应用领域:
- 聊天机器人:LLM可以用于开发智能客服、虚拟助手等聊天机器人,提供自然语言交互能力。
- 内容生成:LLM可以用于自动生成文章、代码、营销文案等内容,提高内容创作的效率。
- 信息检索与问答系统:LLM可以用于构建智能问答系统,帮助用户快速找到所需信息。
- 个性化推荐:LLM可以分析用户的历史行为和偏好,生成个性化的推荐内容,提升用户体验。
总结
LLM工程师的角色是将LLM从理论转化为实际应用,这需要掌握模型部署、应用开发、优化和监控等多方面的技能。通过将这些技术应用于实际场景,LLM工程师能够推动LLM在各个领域的广泛应用,创造出具有实际价值的解决方案。
==================================================
核心观点:预训练和后训练是LLM开发中的关键步骤,涉及大规模数据处理、分布式训练和模型优化,这些步骤直接影响模型的性能和效果。
详细分析:
预训练(Pre-training)和后训练(Post-training)是大型语言模型(LLM)开发中的两个关键步骤,它们共同决定了模型的性能和效果。以下是对这两个步骤的详细展开:
1. 预训练(Pre-training)
预训练是LLM开发的基础阶段,主要目标是让模型从大规模文本数据中学习语言的基本结构和知识。这一阶段通常涉及以下几个关键方面:
1.1 数据准备
- 大规模数据集:预训练需要海量的文本数据(例如,Llama 3.1模型使用了15万亿个token进行训练)。这些数据需要经过仔细的筛选、清洗、去重和分词处理,以确保数据的高质量和多样性。
- 数据过滤:现代预训练流程通常包括复杂的过滤机制,以去除低质量或有害内容,确保模型学习到的知识是准确和有用的。
1.2 分布式训练
- 并行化策略:为了处理如此大规模的数据和模型参数,预训练通常采用多种并行化策略,包括数据并行(将数据批次分配到不同的GPU)、管道并行(将模型的不同层分配到不同的GPU)和张量并行(将单个操作分配到多个GPU)。这些策略需要优化的网络通信和内存管理,以确保训练的高效性。
- 训练优化:预训练过程中,使用自适应学习率、梯度裁剪和归一化等技术来防止梯度爆炸或消失。此外,混合精度训练(使用低精度浮点数)可以显著减少内存占用,提高训练速度。
1.3 监控与调试
- 关键指标监控:在预训练过程中,需要实时监控损失函数、梯度、GPU状态等关键指标,以便及时发现和解决训练中的问题。
- 性能分析:通过性能分析工具,识别计算和通信瓶颈,优化训练流程。
2. 后训练(Post-training)
后训练阶段是在预训练模型的基础上,进一步优化模型的行为和性能,使其更适合特定的任务或应用场景。后训练通常包括以下几个步骤:
2.1 监督微调(Supervised Fine-Tuning, SFT)
- 任务适应:SFT通过使用带有标注的数据集(如问答对)对模型进行微调,使其能够更好地理解和执行特定任务。这一过程通常涉及更新模型的所有参数,或者使用参数高效的微调技术(如LoRA、QLoRA)来减少计算资源的需求。
- 数据质量:在SFT过程中,数据质量至关重要。高质量的数据集可以显著提升模型的性能,而低质量的数据可能导致模型表现不佳。
2.2 偏好对齐(Preference Alignment)
- 人类偏好对齐:偏好对齐是后训练的一个重要步骤,旨在使模型的输出更符合人类的偏好和价值观。常见的偏好对齐算法包括直接偏好优化(DPO)和近端策略优化(PPO)。
- 减少有害输出:通过偏好对齐,可以减少模型生成的有害或不准确的内容(如毒性或幻觉),并提升模型的有用性和可靠性。
2.3 数据集生成与增强
- 合成数据生成:在后训练阶段,通常需要生成大量的合成数据来增强模型的泛化能力。这些数据可以通过前沿模型(如GPT-4)生成,并结合多样化的任务设计和系统提示来提高数据质量。
- 数据增强:通过技术手段(如验证输出、多答案采样、思维链等)增强现有数据集的多样性和复杂性,进一步提升模型的性能。
3. 预训练与后训练的关系
- 预训练奠定基础:预训练阶段为模型提供了广泛的语言知识和理解能力,奠定了模型的基础。
- 后训练优化性能:后训练阶段则通过微调和偏好对齐,进一步优化模型的行为,使其更适合特定的应用场景和任务需求。
4. 总结
预训练和后训练是LLM开发中不可或缺的两个阶段。预训练通过大规模数据处理和分布式训练,为模型提供了广泛的语言知识;而后训练则通过微调和偏好对齐,进一步优化模型的性能和适用性。这两个步骤的紧密结合,直接决定了LLM的最终效果和应用价值。
==================================================
核心观点:监督微调(SFT)和偏好对齐(Preference Alignment)是提升LLM性能和应用效果的重要技术,它们通过调整模型参数来适应特定任务和用户需求。
详细分析:
监督微调(Supervised Fine-Tuning, SFT)和偏好对齐(Preference Alignment)是提升大型语言模型(LLM)性能和应用效果的两项关键技术。它们通过调整模型参数来适应特定任务和用户需求,从而提升模型的实用性和用户体验。以下是对这两项技术的详细展开:
1. 监督微调(Supervised Fine-Tuning, SFT)
1.1 什么是监督微调?
监督微调是指在预训练模型的基础上,使用带有标注的数据(通常是问答对或指令-响应对)对模型进行进一步训练。通过这种方式,模型能够学习如何更好地遵循指令、生成结构化答案,并在特定任务上表现更好。
1.2 SFT 的主要目标
- 任务适应:让模型能够更好地完成特定任务(如问答、代码生成、文本摘要等)。
- 知识激活:通过微调,模型能够激活预训练阶段学到的知识,并将其应用于特定任务。
- 指令遵循:让模型学会理解和遵循复杂的指令,生成符合用户需求的输出。
1.3 SFT 的关键技术
- 全参数微调:更新模型的所有参数,适用于计算资源充足的情况。
- 参数高效微调:如 LoRA(Low-Rank Adaptation) 和 QLoRA(Quantized LoRA),通过训练少量适配器参数来减少内存需求,同时保持基础权重不变。
- LoRA:通过低秩矩阵分解来更新模型的部分参数,显著减少计算开销。
- QLoRA:在 LoRA 的基础上引入 4-bit 量化,进一步降低显存占用。
- 分布式训练:使用 DeepSpeed 或 FSDP(Fully Sharded Data Parallel)等技术在多 GPU 上扩展训练规模。
1.4 SFT 的训练参数
- 学习率:使用学习率调度器(如 warm-up)来优化训练稳定性。
- 批量大小:根据硬件资源调整批量大小和梯度累积步数。
- 优化器:如 8-bit AdamW,结合权重衰减(weight decay)进行正则化。
- 训练轮数:根据数据集大小和任务复杂度调整训练轮数。
1.5 SFT 的局限性
- 数据质量依赖:SFT 的效果高度依赖于标注数据的质量。低质量数据可能导致模型学习到错误的模式。
- 知识扩展有限:SFT 主要用于激活预训练阶段学到的知识,无法让模型学习全新的知识(如完全陌生的语言或领域)。
1.6 应用场景
- 助手类应用:如 ChatGPT、Claude 等,通过 SFT 让模型学会生成符合用户需求的对话。
- 任务特定模型:如代码生成模型(Codex)、文本摘要模型等。
2. 偏好对齐(Preference Alignment)
2.1 什么是偏好对齐?
偏好对齐是 SFT 之后的进一步优化阶段,旨在让模型的输出更符合人类的偏好。它通过调整模型的生成策略,减少有害内容(如毒性、偏见)和幻觉(如生成不准确的信息),同时提升生成内容的有用性和一致性。
2.2 偏好对齐的主要目标
- 减少有害内容:通过调整模型生成策略,减少毒性、偏见等不良输出。
- 提升生成质量:让模型生成更符合人类偏好的内容,如更准确、更连贯的答案。
- 增强实用性:通过优化生成策略,提升模型在实际应用中的表现。
2.3 偏好对齐的关键技术
- 拒绝采样(Rejection Sampling):为每个提示生成多个响应,并根据某种标准(如人类评分或奖励模型)选择最佳响应。
- 直接偏好优化(Direct Preference Optimization, DPO):直接优化模型策略,使其更倾向于生成被选择的响应,而不是被拒绝的响应。DPO 不需要额外的奖励模型,计算效率较高。
- 近端策略优化(Proximal Policy Optimization, PPO):通过奖励模型迭代优化策略,最大化生成内容的质量。PPO 需要更复杂的调参,但通常能生成更高质量的响应。
2.4 偏好对齐的训练参数
- 学习率:调整学习率以优化训练稳定性。
- 批量大小:根据硬件资源调整批量大小。
- PPO 剪裁范围:控制策略更新的幅度,防止模型偏离初始行为太远。
2.5 偏好对齐的局限性
- 奖励模型依赖:PPO 等方法需要高质量的奖励模型,而奖励模型的构建本身是一个复杂任务。
- 计算开销:偏好对齐通常需要更多的计算资源,尤其是在使用 PPO 时。
2.6 应用场景
- 对话系统:通过偏好对齐优化对话生成策略,提升用户体验。
- 内容生成:如生成高质量的文章、代码或创意内容。
3. SFT 和偏好对齐的关系
- SFT 是基础:SFT 让模型学会遵循指令和生成结构化答案,为偏好对齐奠定基础。
- 偏好对齐是优化:偏好对齐在 SFT 的基础上进一步优化生成策略,使模型输出更符合人类偏好。
- 互补性:两者结合可以显著提升模型的性能和实用性。
4. 实际案例
- ChatGPT:通过 SFT 和 RLHF(基于人类反馈的强化学习,一种偏好对齐方法)优化生成策略,使其成为强大的对话助手。
- Mistral-7b:通过 DPO 进行偏好对齐,生成更符合用户需求的响应。
5. 总结
监督微调(SFT)和偏好对齐(Preference Alignment)是提升 LLM 性能和应用效果的关键技术。SFT 通过标注数据让模型适应特定任务,而偏好对齐通过优化生成策略让模型输出更符合人类偏好。两者结合可以显著提升模型的实用性、准确性和用户体验,是构建高质量 LLM 应用的核心技术。
==================================================
核心观点:直接偏好优化(DPO)在计算效率上优于近端策略优化(PPO),但在生成质量上稍逊一筹,选择哪种优化方法需要根据具体应用场景和资源限制进行权衡。
详细分析:
直接偏好优化(Direct Preference Optimization, DPO)和近端策略优化(Proximal Policy Optimization, PPO)是两种用于大型语言模型(LLM)偏好对齐的优化方法。它们在计算效率和生成质量上各有优劣,选择哪种方法需要根据具体的应用场景和资源限制进行权衡。
1. 直接偏好优化(DPO)
DPO 是一种直接优化策略的方法,旨在最大化被选中的响应相对于被拒绝的响应的似然。它的主要优势在于计算效率高,因为它不需要额外的奖励模型(reward model)。DPO 通过直接比较生成的响应对(chosen/rejected pairs)来优化模型,避免了复杂的奖励建模过程。
-
优点:
- 计算效率高:DPO 不需要训练和维护一个独立的奖励模型,因此计算资源需求较低。
- 实现简单:DPO 的实现相对简单,因为它直接优化模型的输出,而不需要复杂的奖励函数或策略更新机制。
- 稳定性:由于 DPO 直接优化策略,避免了奖励模型的潜在偏差,因此在某些情况下可能更稳定。
-
缺点:
- 生成质量稍逊:与 PPO 相比,DPO 在生成质量上可能稍逊一筹,尤其是在需要高度精细调整的场景中。这是因为 DPO 依赖于直接比较,可能无法捕捉到更复杂的奖励信号。
2. 近端策略优化(PPO)
PPO 是一种基于强化学习的优化方法,它通过迭代更新策略来最大化奖励,同时保持策略的稳定性。PPO 使用一个奖励模型来评估生成的响应,并通过策略梯度方法进行优化。
-
优点:
- 生成质量高:PPO 能够通过奖励模型捕捉到更复杂的奖励信号,因此在生成质量上通常优于 DPO。
- 灵活性:PPO 允许更精细的调整,尤其是在需要处理复杂任务或高度定制化的场景中。
-
缺点:
- 计算成本高:PPO 需要训练和维护一个独立的奖励模型,这增加了计算资源的消耗。
- 实现复杂:PPO 的实现相对复杂,涉及到奖励模型的训练、策略更新和超参数调优等多个步骤。
- 稳定性问题:PPO 的训练过程可能不稳定,尤其是在奖励模型不够准确或超参数设置不当的情况下。
3. 选择哪种优化方法?
选择 DPO 还是 PPO 需要根据具体的应用场景和资源限制进行权衡:
-
资源有限:如果计算资源有限,或者需要快速迭代和部署模型,DPO 可能是更好的选择。它的计算效率高,实现简单,适合资源受限的场景。
-
生成质量优先:如果生成质量是首要考虑因素,尤其是在需要高度精细调整的场景中,PPO 可能更适合。尽管它的计算成本高,但能够提供更高的生成质量。
-
任务复杂度:对于简单的任务,DPO 可能已经足够;而对于复杂的任务,PPO 的灵活性可能更有优势。
-
稳定性需求:如果训练过程的稳定性是一个重要考虑因素,DPO 可能更合适,因为它避免了奖励模型的潜在偏差。
4. 总结
DPO 和 PPO 各有优劣,选择哪种方法取决于具体的应用需求。DPO 在计算效率上具有明显优势,适合资源有限的场景;而 PPO 在生成质量上表现更好,适合对生成质量要求较高的场景。在实际应用中,可以根据任务复杂度、资源限制和生成质量需求进行权衡,选择最适合的优化方法。
==================================================
核心观点:近端策略优化(PPO)通过迭代更新策略来最大化奖励,但需要复杂的超参数调优和奖励模型,这使得PPO在实现上更具挑战性。
详细分析:
近端策略优化(Proximal Policy Optimization, PPO)是一种强化学习算法,广泛应用于训练大型语言模型(LLMs)以使其生成的内容更符合人类的偏好。PPO的核心思想是通过迭代更新策略来最大化奖励,同时确保每次更新不会偏离当前策略太远,从而保持训练的稳定性。然而,PPO的实现相对复杂,主要体现在以下几个方面:
1. 奖励模型的构建与调优
PPO依赖于一个奖励模型来评估生成的文本是否符合人类的偏好。奖励模型通常是通过监督学习训练的,使用人类标注的数据来学习如何给不同的文本打分。构建一个高质量的奖励模型需要大量的标注数据,并且需要仔细设计模型的架构和训练过程,以确保其能够准确反映人类的偏好。
- 数据需求:奖励模型需要大量的高质量标注数据,这些数据通常由人类标注员提供,标注成本较高。
- 模型设计:奖励模型的设计需要考虑如何捕捉文本的语义、风格、一致性等多个维度,这增加了模型的复杂性。
- 训练调优:奖励模型的训练过程需要仔细调优,包括学习率、正则化、批次大小等超参数的选择,以确保模型能够稳定收敛。
2. 复杂的超参数调优
PPO本身有许多超参数需要调优,这些超参数的选择对训练的效果和稳定性有重要影响。常见的超参数包括:
- 学习率:学习率决定了策略更新的步长,过大的学习率可能导致训练不稳定,过小的学习率则可能导致收敛速度过慢。
- PPO Clip Range:PPO通过限制策略更新的幅度来避免过大的策略变化,这个范围(clip range)的选择对训练的稳定性至关重要。
- 批次大小:批次大小影响梯度估计的准确性,较大的批次可以提高训练的稳定性,但会增加计算开销。
- 折扣因子:折扣因子决定了未来奖励的重要性,选择不当可能导致模型过于短视或过于关注长期奖励。
这些超参数的选择通常需要通过大量的实验来确定,增加了PPO实现的复杂性。
3. 策略更新的迭代过程
PPO通过迭代更新策略来最大化奖励,每次更新都需要计算当前策略的梯度,并根据奖励模型的反馈进行调整。这个过程涉及到以下几个步骤:
- 采样:从当前策略中采样生成多个响应,并使用奖励模型对这些响应进行打分。
- 梯度计算:根据采样结果和奖励模型的反馈,计算策略的梯度。
- 策略更新:使用梯度更新策略参数,同时确保更新幅度不会过大(通过clip range限制)。
这个过程需要高效的并行计算和内存管理,尤其是在训练大规模语言模型时,计算资源的需求非常高。
4. 训练稳定性与收敛性
PPO的训练过程容易出现不稳定的情况,尤其是在策略更新幅度较大时,可能导致训练崩溃或收敛到次优解。为了保持训练的稳定性,PPO引入了clip机制,限制策略更新的幅度,但这也会增加调优的难度。
- 梯度爆炸与消失:在训练过程中,梯度可能会变得非常大或非常小,导致训练不稳定。PPO通过梯度裁剪和正则化等技术来缓解这个问题。
- 收敛速度:PPO的收敛速度较慢,尤其是在复杂的任务中,可能需要大量的迭代才能达到较好的效果。
5. 计算资源需求
PPO的训练过程需要大量的计算资源,尤其是在训练大规模语言模型时。由于PPO需要频繁地采样、计算梯度和更新策略,GPU集群的使用几乎是必需的。此外,奖励模型的训练和推理也需要额外的计算资源。
- GPU集群:PPO通常需要在多个GPU上并行训练,以加速采样和梯度计算过程。
- 内存管理:由于PPO需要存储大量的中间结果(如采样数据、梯度等),内存管理变得尤为重要,尤其是在训练大规模模型时。
总结
近端策略优化(PPO)是一种强大的强化学习算法,能够有效地训练语言模型以生成符合人类偏好的文本。然而,PPO的实现具有较高的复杂性,主要体现在奖励模型的构建与调优、复杂的超参数调优、策略更新的迭代过程、训练稳定性与收敛性以及计算资源需求等方面。这些挑战使得PPO在实际应用中需要更多的经验和资源,但也为模型性能的提升提供了更大的潜力。
==================================================
核心观点:监控LLM训练过程中的关键指标(如选择答案与拒绝答案之间的差距)对于优化模型性能至关重要,这些指标能够帮助识别和解决训练中的问题。
详细分析:
在大型语言模型(LLM)的训练过程中,监控关键指标是确保模型性能优化和问题识别的重要步骤。特别是在偏好对齐(Preference Alignment)阶段,监控选择答案与拒绝答案之间的差距(即偏好差距)尤为重要。以下是对这一点的详细展开:
1. 偏好差距的重要性
- 偏好差距是指在偏好对齐过程中,模型生成的选择答案与拒绝答案之间的差异。这个差距反映了模型在多大程度上能够区分出更符合人类偏好的回答。
- 通过监控偏好差距,可以评估模型是否在逐步学习到人类的偏好,并且是否在生成更符合预期的回答。
2. 监控偏好差距的作用
- 评估模型对齐效果:偏好差距的大小直接反映了模型在偏好对齐任务中的表现。如果差距逐渐增大,说明模型正在学习到如何生成更符合人类偏好的回答。
- 识别训练问题:如果偏好差距没有显著变化,甚至出现下降,可能意味着训练过程中存在问题,如数据质量不佳、超参数设置不当或模型架构不适合当前任务。
- 优化训练策略:通过持续监控偏好差距,可以动态调整训练策略,例如调整学习率、增加数据多样性或修改奖励模型的设计。
3. 如何监控偏好差距
- 实时监控:在训练过程中,实时记录每个批次的偏好差距,并将其可视化。这可以通过工具如Wandb或TensorBoard来实现。
- 趋势分析:观察偏好差距的变化趋势。理想情况下,偏好差距应逐渐增大并趋于稳定。如果出现波动或下降,需要进一步分析原因。
- 与其他指标结合:偏好差距应与其他关键指标(如损失函数、梯度范数、GPU利用率等)结合分析,以全面评估模型的训练状态。
4. 常见问题及解决方案
- 偏好差距过小:可能表明模型未能有效区分选择答案和拒绝答案。解决方案包括增加数据多样性、调整奖励模型或修改训练策略。
- 偏好差距波动大:可能表明训练不稳定。解决方案包括调整学习率、增加批量大小或使用更稳定的优化器。
- 偏好差距停滞:可能表明模型已达到当前训练策略的极限。解决方案包括引入新的数据源、调整模型架构或尝试不同的偏好对齐算法。
5. 实际应用中的案例
- DPO(Direct Preference Optimization):在DPO中,偏好差距是直接优化的目标。通过最大化选择答案的似然性,模型能够更有效地学习到人类的偏好。
- PPO(Proximal Policy Optimization):在PPO中,偏好差距通过奖励模型来评估。通过迭代更新策略,模型能够在保持稳定性的同时最大化奖励。
6. 总结
监控偏好差距是优化LLM训练过程的关键步骤。它不仅能够帮助评估模型的对齐效果,还能够识别和解决训练中的问题。通过持续监控和动态调整,可以显著提升模型的性能和实用性。
通过这种方式,研究人员和工程师可以更好地理解模型的训练动态,并采取相应的措施来优化模型性能。
==================================================
核心观点:评估LLM是一个复杂但必不可少的任务,能够为数据生成和训练提供宝贵的反馈,评估结果可以指导模型的进一步优化和改进。
详细分析:
评估大型语言模型(LLM)是一个复杂但至关重要的任务,因为它不仅能够为模型的优化和改进提供宝贵的反馈,还能帮助开发者理解模型在不同任务和场景下的表现。以下是关于LLM评估的详细展开:
1. 评估的重要性
- 反馈机制:评估为模型的训练和优化提供了直接的反馈。通过评估,开发者可以了解模型在哪些方面表现良好,哪些方面需要改进。
- 指导数据生成:评估结果可以帮助开发者调整数据生成策略,例如增加某些类型的数据或改进数据质量,以提升模型在特定任务上的表现。
- 优化训练过程:通过评估,开发者可以识别训练过程中的瓶颈或问题,例如过拟合、欠拟合或训练不稳定,从而调整训练参数或策略。
2. 评估的复杂性
- 多维度评估:LLM的表现不能仅通过单一指标来衡量。通常需要从多个维度进行评估,包括但不限于:
- 准确性:模型在特定任务上的正确率。
- 流畅性:生成文本的语法和语义是否自然流畅。
- 多样性:生成文本的多样性,避免重复或单调。
- 一致性:模型在不同上下文中的表现是否一致。
- 鲁棒性:模型在面对噪声或对抗性输入时的表现。
- 任务依赖性:不同任务对模型的要求不同,评估标准也会有所差异。例如,在问答任务中,准确性可能更为重要;而在创意写作任务中,流畅性和多样性可能更为关键。
- 主观性:某些评估指标(如文本的流畅性或创意性)具有较强的主观性,难以通过自动化工具完全量化,通常需要人工评估。
3. 评估方法
- 自动化评估:使用预定义的指标(如BLEU、ROUGE、Perplexity等)对模型进行自动化评估。这些指标可以快速提供反馈,但可能无法完全捕捉模型的实际表现。
- 人工评估:通过人工评估生成文本的质量,通常涉及多个评估者对文本的流畅性、相关性、创意性等进行评分。人工评估虽然耗时,但能提供更全面的反馈。
- 对抗性评估:通过设计对抗性输入或挑战性任务,测试模型在极端情况下的表现,评估其鲁棒性和泛化能力。
- 用户反馈:在实际应用中,用户的反馈也是评估模型表现的重要来源。通过分析用户的使用体验和反馈,可以进一步优化模型。
4. 评估的挑战
- Goodhart定律:当某个评估指标成为优化目标时,模型可能会过度拟合该指标,导致在其他方面的表现下降。因此,评估指标的设计需要谨慎,避免单一指标主导优化过程。
- 评估偏差:评估过程中可能存在偏差,例如数据偏差、评估者偏差等,这些偏差会影响评估结果的准确性。
- 动态环境:随着应用场景的变化,评估标准也需要不断调整。例如,模型在某个时间段内表现良好,但在新的数据或任务上可能表现不佳。
5. 评估的应用
- 模型选择:通过评估,开发者可以选择最适合特定任务的模型架构或预训练模型。
- 超参数调优:评估结果可以指导超参数的调优,例如学习率、批量大小、训练轮数等。
- 数据增强:通过评估,开发者可以识别数据中的不足,进而进行数据增强或数据清洗,提升模型的表现。
- 模型迭代:评估是模型迭代过程中的重要环节,通过不断评估和优化,模型可以逐步提升性能。
6. 未来方向
- 多模态评估:随着多模态模型的发展,评估标准也需要扩展到图像、音频等多模态数据。
- 实时评估:在实际应用中,实时评估模型的表现,并根据反馈进行动态调整,将是未来的一个重要方向。
- 可解释性评估:评估模型的可解释性,理解模型决策的过程,提升模型的透明度和可信度。
总之,评估LLM是一个复杂但必不可少的任务,它不仅为模型的优化和改进提供了宝贵的反馈,还能帮助开发者更好地理解模型的表现和局限性。通过多维度的评估和不断迭代,开发者可以逐步提升模型的性能,使其在实际应用中发挥更大的价值。
==================================================
相关文章:
LLM架构与优化:从理论到实践的关键技术
标题:“LLM架构与优化:从理论到实践的关键技术” 文章信息摘要: 文章探讨了大型语言模型(LLM)开发与应用中的关键技术,包括Transformer架构、注意力机制、采样技术、Tokenization等基础理论,以…...
深入理解Pytest中的Setup和Teardown
关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 对于简单程序而言,使用 Pytest 运行测试直截了当。然而,当你…...
PostgreSQL 约束
PostgreSQL 约束 引言 在数据库设计中,约束是确保数据完整性和一致性的关键工具。PostgreSQL,作为一款功能强大的开源关系型数据库管理系统,提供了丰富的约束类型来满足不同的数据库设计需求。本文将详细介绍PostgreSQL中的各种约束,包括其定义、用途和实现方法。 一、约…...
JAVA 接口、抽象类的关系和用处 详细解析
接口 - Java教程 - 廖雪峰的官方网站 一个 抽象类 如果实现了一个接口,可以只选择实现接口中的 部分方法(所有的方法都要有,可以一部分已经写具体,另一部分继续保留抽象),原因在于: 抽象类本身…...
【微服务与分布式实践】探索 Dubbo
核心组件 服务注册与发现原理 服务提供者启动时,会将其服务信息(如服务名、版本、所在节点的网络地址等)注册到注册中心。服务消费者则可以从注册中心发现可用的服务提供者列表,并与之通信。注册中心会存储服务的信息,…...
lightweight-charts-python 包 更新 lightweight-charts.js 的方法
lightweight-charts-python 是 lightweight-charts.js 的 python 包装,非常好用 lightweight-charts 更新比较频繁,导致 lightweight-charts-python 内置的 lightweight-charts 经常不是最新的。 新的 lightweight-charts 通常可以获得性能改进和bug修复…...
作業系統:設計與實現-母本
2023 南京大學《作業系統:設計與實現》 課程主頁(含講義):https://jyywiki.cn/OS/2023/ 【Python 实现操作系统模型 [南京大学2023操作系统-P4] (蒋炎岩)-哔哩哔哩】 https://b23.tv/jakxDbh 用Python实现操作系统模型讲义 一、操作系统基础概念 1.1 定义 操作系统(Oper…...
穿心莲内酯(andrographolide)生物合成CYP72-文献精读106
Two CYP72 enzymes function as Ent-labdane hydroxylases in the biosynthesis of andrographolide in Andrographis paniculata 两种CYP72酶在穿心莲(Andrographis paniculata)中作为Ent-labdane羟化酶,在穿心莲内酯(andrograp…...
IDM-VTON本地部署教程:双重编码 + 文字提示,解锁真实野外试穿
一、介绍 IDM-VTON:改进扩散模型,实现真实的野外虚拟试穿。 技术原理:改进扩散模型,利用视觉编码器提取服装高级语义信息并与交叉注意力层融合,通过并行 UNet 结构的 GarmentNet 捕捉服装低级特征并与自注意力层结合&…...
【微服务与分布式实践】探索 Sentinel
参数设置 熔断时长 、最小请求数、最大RT ms、比例阈值、异常数 熔断策略 慢调⽤⽐例 当单位统计时⻓内请求数⽬⼤于设置的最⼩请求数⽬,并且慢调⽤的⽐例⼤于阈值,则接下来的熔断时⻓内请求会⾃动被熔断 异常⽐例 当单位统计时⻓内请求数⽬⼤于设置…...
云计算与虚拟化技术讲解视频分享
互联网各领域资料分享专区(不定期更新): Sheet 前言 由于内容较多,且不便于排版,为避免资源失效,请用手机点击链接进行保存,若链接生效请及时反馈,谢谢~ 正文 链接如下(为避免资源失效&#x…...
[c语言日寄]越界访问:意外的死循环
【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…...
数据结构---哈希表
基本概念 哈希函数(Hash Function)是一种将输入的数据(通常是任意大小的)映射到固定大小的输出(通常是一个固定长度的值)的函数。这个输出值通常称为“哈希值”(Hash Value)或“哈希…...
【C语言----数组详解】
目录 ---------------------------------------begin--------------------------------------- 一、什么是数组 二、数组的声明和初始化 1. 数组的声明 2. 数组的初始化 三、数组元素的访问 四、数组的遍历 五、数组的应用 六、多维数组 七、总结 --------------------…...
C语言字符串详解
1. C语言中的字符串基础 C语言中的字符串是程序设计中不可忽视的部分。与现代高级编程语言不同,C语言对字符串的处理方式直接、灵活,并且强大。在C语言中,字符串并不是一种特殊的数据类型,而是字符数组的一种表现形式。字符串通常…...
基础IO(2)
基础IO(2) 理解“⼀切皆⽂件” ⾸先,在windows中是⽂件的东西,它们在linux中也是⽂件;其次⼀些在windows中不是⽂件的东西,⽐如进程、磁盘、显⽰器、键盘这样硬件设备也被抽象成了⽂件,你可以使…...
深入理解 Python 中的 `__all__`:控制模块的公共接口
在 Python 编程中,模块化设计是构建可维护和可扩展代码的关键。模块不仅帮助我们组织代码,还能通过隐藏实现细节来提高代码的可读性和安全性。Python 提供了多种机制来控制模块的可见性,其中 __all__ 是一个非常重要但常被忽视的特性。本文将…...
Python面试宝典7 | 正则表达式的match()与search(),精准匹配与全局搜索
今天,我们来聊聊Python正则表达式中两个常用的方法:match()和search()。它们都用于在字符串中查找匹配的模式,但有着重要的区别。 理论篇:匹配的起始位置 match()和search()最主要的区别在于它们匹配的起始位置: ma…...
代码随想录算法训练营第三十八天-动态规划-完全背包-279.完全平方数
把目标值当作背包容量,每个平方数当作物品,题目变更为装满指定容量的背包,最小用几个物品会不会出现拼凑不出来的情况?不会,因为有数字1,对任意正整数百分百能拼凑出来因此此题目与上一道题就变得一模一样了…...
996引擎 - NPC-添加NPC引擎自带形象
996引擎 - NPC-添加NPC引擎自带形象 截图参考添加NPC参考资料截图参考 添加NPC 编辑NPC表:Envir\DATA\cfg_npclist.xls 1.1. 需要临时隐藏NPC时可以在id前加 // 1.2. 如果NPC朝向不对,可以调整dir 列。(按8方向,上是0顺时针数。我这里给的4) 1.3. 形象代码:NPC代码、怪物…...
基于 NodeJs 一个后端接口的创建过程及其规范 -- 【elpis全栈项目】
基于 NodeJs 一个后端接口的创建过程及其规范 一个接口的诞生: #mermaid-svg-46HXZKI3fdnO0rKV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-46HXZKI3fdnO0rKV .error-icon{fill:#552222;}#mermaid-sv…...
笔记本跑大模型尝试
1,笔记本电脑资源 我是一台联想笔记本电脑,基本配置如下: CPU:12th Gen Intel(R) Core(TM) i7-1255U 1.70 GHz (12核心,2个P核和8个E核,共计10个核心) 显卡:NVIDIA GeForce MX550 内存&am…...
[论文阅读] (37)CCS21 DeepAID:基于深度学习的异常检测(解释)
祝大家新春快乐,蛇年吉祥! 《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢。由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正࿰…...
常见端口的攻击思路
端口号端口说明攻击方向21/22/69FTP/TFTP文件传输协议匿名上传/下载、嗅探、爆破2049NFS服务配置不当139Sanba服务爆破、远程代码执行389Ldap目录访问协议注入、匿名访问、弱口令22SSH远程连接爆破、SSH映射隧道搭建、文件传输23Telnet远程连接爆破、嗅探、弱口令3389RDP远程桌…...
复古壁纸中棕色系和米色系哪个更受欢迎?
根据最新的搜索结果,我们可以看到棕色系和米色系在复古壁纸设计中都非常受欢迎。以下是对这两种颜色系受欢迎程度的分析: 棕色系 受欢迎程度:棕色系在复古壁纸中非常受欢迎,因为它能够营造出温暖、质朴和自然的氛围。棕色系的壁纸…...
RocketMQ消息是如何存储的?
大家好,我是锋哥。今天分享关于【RocketMQ消息是如何存储的?】面试题。希望对大家有帮助; RocketMQ消息是如何存储的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RocketMQ 使用了一个高性能、分布式的消息存储架构…...
在FreeBSD下安装Ollama并体验DeepSeek r1大模型
在FreeBSD下安装Ollama并体验DeepSeek r1大模型 在FreeBSD下安装Ollama 直接使用pkg安装即可: sudo pkg install ollama 安装完成后,提示: You installed ollama: the AI model runner. To run ollama, plese open 2 terminals. 1. In t…...
[250128] Apache HTTP Server 2.4.63 发布 | Arm 发布首个芯片系统架构的公开规范
目录 Apache HTTP Server 2.4.63 发布,十五年创新成果!Arm 发布首个芯片系统架构的公开规范 Apache HTTP Server 2.4.63 发布,十五年创新成果! Apache 软件基金会和 Apache HTTP Server 项目组自豪地宣布 Apache HTTP Server 2.4…...
为什么要学习rust
内存管理:对于我来说,我就喜欢它的内存管理。我做了一个webapi,取100万行数据,导出到xlsx,再把这个xlsx文件发送给前端。分别用了java、c#、go和rust进行了相同的操作。只有rust做到了,启动时8MB内存&#…...
Linux进程调度与等待:背后的机制与实现
个人主页:chian-ocean 文章专栏-Linux 前言: 当一个进程发起某种操作(如I/O请求、信号、锁的获取等),但该操作需要的资源暂时不可用时,进程会被操作系统挂起,进入“等待队列”或“阻塞状态”。…...
Linux任务管理与守护进程
文章目录 🍅任务管理进程组概念作业概念会话概念相关操作前台进程&后台进程jobsfgbgps命令查看指定的选项 🫒守护进程守护进程的概念作用守护进程的查看守护进程的创建原生创建守护进程调用daemon函数创建守护进程模拟实现daemon函数 🍅任…...
《Trustzone/TEE/安全从入门到精通-标准版》
CSDN学院课程连接:https://edu.csdn.net/course/detail/39573 讲师介绍 拥有 12 年手机安全、汽车安全、芯片安全开发经验,擅长 Trustzone/TEE/ 安全的设计与开发,对 ARM 架构的安全领域有着深入的研究和丰富的实践经验,能够将复杂的安全知识和处理器架构知识进行系统整…...
java 字符串日期字段格式化前端显示
在 Java 应用程序中,如果你有一个字符串类型的日期字段,并希望将其格式化后显示在前端,可以通过多种方式实现。这通常涉及到在后端将字符串转换为 Date 或 LocalDateTime 等对象,然后使用适当的注解或配置来确保它们以正确的格式序…...
LabVIEW橡胶动态特性测试系统
本文介绍了一个利用LabVIEW软件和NI高速数据采集设备构建的橡胶动态特性测试系统。该系统实现了橡胶材料动态性能的精确测量,并通过虚拟仪器技术,提高了测试数据的处理效率和准确性。系统支持实时数据处理和多种信号的动态分析,适用于工业和科…...
deepseek-r1 本地部署
deepseek 最近太火了 1:环境 win10 cpu 6c 内存 16G 2: 部署 1>首先下载ollama 官网:https://ollama.com ollama 安装在c盘 模型可以配置下载到其他盘 OLLAMA_MODELS D:\Ollama 2>下载模型并运行 ollama run deepseek-r1:<标签> 1.5b 7b 8…...
28. 【.NET 8 实战--孢子记账--从单体到微服务】--简易报表--报表定时器与报表数据修正
这篇文章是《.NET 8 实战–孢子记账–从单体到微服务》系列专栏的《单体应用》专栏的最后一片和开发有关的文章。在这片文章中我们一起来实现一个数据统计的功能:报表数据汇总。这个功能为用户查看月度、年度、季度报表提供数据支持。 一、需求 数据统计方面&…...
具身智能技术趋势
参考: 【北京大学-董豪】具身智能技术趋势分析 2024.8 回答了具身智能技术G3、G4的必要性,以及真实数据、仿真数据、互联网数据之间的关系 具身智能趋势 趋势:寻求一个通用路径实现所有的上肢操作 要求:① 低成本 ② 拓展到所有…...
JavaScript逆向高阶指南:突破基础,掌握核心逆向技术
JavaScript逆向高阶指南:突破基础,掌握核心逆向技术 JavaScript逆向工程是Web开发者和安全分析师的核心竞争力。无论是解析混淆代码、分析压缩脚本,还是逆向Web应用架构,掌握高阶逆向技术都将助您深入理解复杂JavaScript逻辑。本…...
C#面试常考随笔6:ArrayList和 List的主要区别?
在 C# 中,ArrayList和List<T>(泛型列表)都可用于存储一组对象。推荐优先使用List<T>,因为它具有更好的类型安全性、性能和语法简洁性,并且提供了更丰富的功能。只有在需要与旧代码兼容或存储不同类型对象的…...
【数据结构】 并查集 + 路径压缩与按秩合并 python
目录 前言模板朴素实现路径压缩按秩合并按树高为秩按节点数为秩 总结 前言 并查集的基本实现通常使用森林来表示不同的集合,每个集合用一棵树表示,树的每个节点有一个指向其父节点的指针。 如果一个节点是它自己的父节点,那么它就是该集合的代…...
使用 Redis List 和 Pub/Sub 实现简单的消息队列
使用 Redis List 和 Pub/Sub 实现简单的消息队列 Redis 本身不是专门的消息队列系统,但它提供了多种数据结构(如 List、Pub/Sub、Stream)来实现消息队列功能。根据不同的业务需求,可以选择不同的方式: 在 Redis 中&a…...
aerodrome交易所读合约分析
池地址 0xb2cc224c1c9fee385f8ad6a55b4d94e92359dc59token0 0x4200000000000000000000000000000000000006token1 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913tickSpacing 100stakedLiquidity 4579376109215388530 snapshotCumulativesInside tickLower tickUpperslot0 …...
mybatis(112/134)
多对一 第一种方法: 一的表参数设置: <association property"clazz" javaType"Clazz"> <id property"cid" column"cid"/> <result property"cname" column"cname"/> <…...
Node.js与MySQL模块结合:打造安全高效的用户信息管理系统
摘要 本文探讨使用Node.js构建前端项目并导入MySQL模块创建数据库连接对象的方法。文中讲解了共享数据库连接对象,定义SQL语句查询和更新用户信息(排除密码字段以保护隐私),以及根据用户ID更新基本信息、重置密码和更新头像的具体…...
【C++】设计模式详解:单例模式
文章目录 Ⅰ. 设计一个类,不允许被拷贝Ⅱ. 请设计一个类,只能在堆上创建对象Ⅲ. 请设计一个类,只能在栈上创建对象Ⅳ. 请设计一个类,不能被继承Ⅴ. 请设计一个类,只能创建一个对象(单例模式)&am…...
在ubuntu下一键安装 Open WebUI
该脚本用于自动化安装 Open WebUI,并支持以下功能: 可选跳过 Ollama 安装:通过 --no-ollama 参数跳过 Ollama 的安装。自动清理旧目录:如果安装目录 (~/open-webui) 已存在,脚本会自动删除旧目录并重新安装。完整的依…...
【某大厂一面】数组和链表区别
在 Java 中,数组(Array)和链表(LinkedList)是两种常见的数据结构,它们在存储和操作方式上有显著的区别。了解它们的差异有助于选择适合特定应用场景的结构。下面是数组和链表之间的详细比较。 1. 存储结构…...
MySQL常用数据类型和表的操作
文章目录 (一)常用数据类型1.数值类2.字符串类型3.二进制类型4.日期类型 (二)表的操作1查看指定库中所有表2.创建表3.查看表结构和查看表的创建语句4.修改表5.删除表 (三)总代码 (一)常用数据类型 1.数值类 BIT([M]) 大小:bit M表示每个数的位数,取值范围为1~64,若…...
深入 Rollup:从入门到精通(三)Rollup CLI命令行实战
准备阶段:初始化项目 初始化项目,这里使用的是pnpm,也可以使用yarn或者npm # npm npm init -y # yarn yarn init -y # pnpm pnpm init安装rollup # npm npm install rollup -D # yarn yarn add rollup -D # pnpm pnpm install rollup -D在…...
3.日常英语笔记
screening discrepancies 筛选差异 The team found some screening discrepancies in the data. 团队在数据筛选中发现了些差异。 Don’t tug at it ,or it will fall over and crush you. tug 拉,拽,拖 He tugged the door open with all his might…...