当前位置: 首页 > news >正文

深入了解 Adam 优化器对显存的需求:以 LLaMA-2 7B 模型为例 (中英双语)

中文版

深入了解 Adam 优化器对显存的额外需求:模型参数与优化器状态的显存开销分析

在深度学习模型的训练过程中,显存是一个关键的资源,尤其在处理大型语言模型或深度神经网络时。训练时的显存需求不仅包括模型参数本身,还涉及梯度的存储以及优化器状态的额外开销。对于使用 AdamAdamW 优化器的训练过程,优化器的状态会增加额外的显存开销,这部分显存消耗需要单独分析。

本篇博客将重点讨论模型参数和优化器的状态所需的额外显存开销,并探讨如何分开计算这些部分,帮助你更好地理解训练显存的实际需求。

1. 模型训练与推理的显存需求对比

1.1 推理时的显存需求

在推理过程中,模型的显存需求较为简单,主要包括:

  • 模型参数:存储网络中每个参数的数值(例如权重和偏置)。
  • 激活值:在前向传播过程中,计算每层的输出需要存储中间结果(即激活值)。

对于大多数模型来说,推理时的显存需求主要集中在这两部分,它通常是模型参数所占显存的基础。具体来说,推理显存的计算大致为:
推理显存 = 模型参数显存 + 激活值显存(后者一般不考虑) \text{推理显存} = \text{模型参数显存} + \text{激活值显存}(后者一般不考虑) 推理显存=模型参数显存+激活值显存(后者一般不考虑)
推理时如果每次只处理一句话(例如一个短输入或一个 token),激活值显存需求会很小。

1.2 训练时的显存需求

与推理相比,训练时显存需求更为复杂,除了模型参数和激活值外,还要考虑:

  • 梯度存储:每次反向传播时,网络会计算并存储每个参数的梯度。这些梯度是训练中更新模型权重的关键,它们的存储和计算同样需要显存。
  • 优化器状态:如 Adam 等优化器需要存储每个参数的动量(一阶矩)和梯度平方的滑动平均(二阶矩),这部分开销会显著增加显存需求。

在计算训练时的显存需求时,通常可以按以下公式来估算:
训练显存 = 模型参数显存 + 梯度显存 + 优化器状态显存 \text{训练显存} = \text{模型参数显存} + \text{梯度显存} + \text{优化器状态显存} 训练显存=模型参数显存+梯度显存+优化器状态显存

2. 训练时的额外显存开销

训练时的显存需求大于推理时,主要来自于梯度存储和优化器状态的存储。具体来说:

  • 梯度存储:梯度的存储需要额外的显存。每个参数都会有一个对应的梯度,梯度和参数的大小相同,因此梯度所需的显存与模型参数显存相当。
  • 优化器状态存储:Adam 优化器需要为每个参数存储一阶矩和二阶矩(动量和梯度平方的滑动平均)。因此,优化器的显存需求通常是 模型参数显存的 2倍(即每个参数存储三项:参数本身、一阶矩、二阶矩)。
2.1 如何分开计算

在估算训练时显存需求时,可以将模型参数、梯度和优化器状态的显存开销分开计算。具体来说,训练时显存需求大致为:
训练显存 = 1 x ( 模型参数显存 ) + 1 x ( 梯度显存 ) + 1 − 2 x ( 优化器状态显存 ) \text{训练显存} = 1x \, (\text{模型参数显存}) + 1x \, (\text{梯度显存}) + 1-2x \, (\text{优化器状态显存}) 训练显存=1x(模型参数显存)+1x(梯度显存)+12x(优化器状态显存)
这意味着,训练所需的显存通常是推理显存的 4倍,其中:

  • 1x 为模型本身所占的显存。
  • 1x 为梯度的显存(和模型参数的显存相同)。
  • 1-2x 为优化器状态的显存。对于 Adam 优化器,这部分额外的显存开销通常是 模型显存的 2倍,因为 Adam 需要存储一阶和二阶矩(每个参数两项状态)。
2.2 Adam 优化器的显存消耗

Adam 优化器相比于传统的优化器,如 SGD,额外的显存消耗主要来自于两个部分:

  • 一阶矩(( m m m )):动量项,存储每个参数的梯度的指数加权平均。
  • 二阶矩(( v v v )):梯度平方的指数加权平均,类似于 RMSProp。

每个参数需要存储 三项数据:本身的值、一阶矩 ( m m m )、二阶矩 ( v v v ),因此显存需求为:
优化器状态显存 = 2 × 模型参数显存 \text{优化器状态显存} = 2 \times \text{模型参数显存} 优化器状态显存=2×模型参数显存
对于 AdamW,由于它与 Adam 在参数更新策略上有所不同,但在显存需求上几乎没有差异,因此我们可以认为它的额外显存消耗也是 2倍

2.3 不同精度下的显存需求

训练时的显存需求也受到数据类型精度的影响。常见的精度有 float32bfloat16,它们对显存的需求有所不同:

  • float32(32位浮动点数):每个参数、梯度和优化器状态都占 4 字节,因此显存需求相对较高。
  • bfloat16(16位浮动点数):每个参数、梯度和优化器状态仅占 2 字节,因此显存需求较低。

3. 实际计算:以 LLaMA-2 7B 模型为例

假设 LLaMA-2 7B 模型包含 70 亿个参数。我们以 float32 为例来计算训练时显存需求。

3.1 模型参数显存

每个参数占用 4 字节,总参数数量为 70 亿,则模型参数显存为:
模型参数显存 = 7 × 1 0 9 × 4 字节 = 28 GB ( 以1000为进位 ) \text{模型参数显存} = 7 \times 10^9 \times 4 \text{字节} = 28 \, \text{GB} \, (\text{以1000为进位}) 模型参数显存=7×109×4字节=28GB(1000为进位)

3.2 梯度显存

梯度显存与模型参数显存相同,因为每个参数都有一个对应的梯度:
梯度显存 = 28 GB \text{梯度显存} = 28 \, \text{GB} 梯度显存=28GB

3.3 优化器状态显存

Adam 优化器需要存储一阶矩和二阶矩,因此优化器状态的显存需求是模型参数显存的 2倍:
优化器状态显存 = 2 × 28 GB = 56 GB \text{优化器状态显存} = 2 \times 28 \, \text{GB} = 56 \, \text{GB} 优化器状态显存=2×28GB=56GB

3.4 训练显存需求

将模型参数显存、梯度显存和优化器状态显存加总,训练时的显存需求为:
训练显存 = 28 GB + 28 GB + 56 GB = 112 GB \text{训练显存} = 28 \, \text{GB} + 28 \, \text{GB} + 56 \, \text{GB} = 112 \, \text{GB} 训练显存=28GB+28GB+56GB=112GB

具体计算过程如下:

下面的python代码测试7B大模型本身的参数量:以float32计算。进位采用1024,计算得出:7B大模型的参数量为26.08 GB;当进位采用1000时,计算得出28.00 GB。为什么尝试1000,是因为在其他博文中看到28GB这个数字,自己测试一下,发现他们是在以1000为进位的时候测试得出的。参考文章:https://cuiyuhao.com/posts/c87c0f5d/

# 定义参数
num_parameters = 7 * 10**9  # 70 亿个参数
bytes_per_param = 4  # 每个参数占用 4 字节(32 位浮动数)# 计算显存需求(单位:字节)
memory_in_bytes = num_parameters * bytes_per_param# 将字节转换为 GB
memory_in_GB = memory_in_bytes / (1024 ** 3)  # 转换为 GB, 可调为1000print(f"模型需要的显存为: {memory_in_GB:.2f} GB")

以bf16为例,由于它是float32的一半,所以它的参数量为 26.08GB / 2 = 13.04GB (以1024为进位),当以1000进位的时候,28GB / 2 = 14GB

4. 总结

在深度学习模型训练中,除了模型参数显存外,梯度存储和优化器状态(如 Adam 优化器)会显著增加显存需求。通常情况下,训练显存需求是推理显存的 4倍,其中:

  • 1倍用于存储模型参数。
  • 1倍用于存储梯度。
  • 1-2倍用于存储优化器状态。

了解这些显存需求对于选择合适的硬件和优化训练过程至关重要。如果显存有限,可以通过使用混合精度训练(如 bfloat16)来降低显存消耗,或者利用梯度累积等技术来优化显存的使用。

5. 使用 bfloat16 计算显存消耗

与 float32 精度相比,使用 bfloat16 (16 位浮动数)来训练大模型可以显著降低显存消耗。bfloat16 精度的主要优点是相对于 float32,减少了内存的占用量,但保持了足够的数值表示精度,特别适用于训练深度神经网络。

5.1 bfloat16 对模型参数的影响

在使用 bfloat16 时,每个参数占用的内存从 float32 的 4 字节降到 2 字节。以 LLaMA-2 7B 模型为例,假设模型有 7 亿个参数:

  • 模型参数内存(使用 bfloat16):
    模型参数内存 = 7 × 1 0 9 × 2 字节 = 14 GB \text{模型参数内存} = 7 \times 10^9 \times 2 \, \text{字节} = 14 \, \text{GB} 模型参数内存=7×109×2字节=14GB
    因此,模型参数的内存需求降至 14 GB
5.2 bfloat16 对梯度的影响

梯度是通过反向传播计算得到的,用于更新模型参数。梯度的内存占用与模型参数相同,因此使用 bfloat16 计算梯度时,内存占用也将减半:

  • 梯度内存(使用 bfloat16):
    梯度内存 = 14 GB \text{梯度内存} = 14 \, \text{GB} 梯度内存=14GB
5.3 bfloat16 对优化器状态的影响

Adam 优化器的状态包括两个部分:一阶矩( m m m二阶矩( v v v。每个参数都需要存储这两项数据,导致优化器状态的内存占用是模型参数内存的两倍。

在 bfloat16 精度下,优化器状态的内存占用也将减少到 float32 的一半。因此,优化器状态的内存为:

  • 优化器状态内存(使用 bfloat16):
    优化器状态内存 = 2 × 14 GB = 28 GB \text{优化器状态内存} = 2 \times 14 \, \text{GB} = 28 \, \text{GB} 优化器状态内存=2×14GB=28GB
5.4 总训练显存需求

通过将 bfloat16 应用到模型参数、梯度和优化器状态的计算中,总的显存消耗将大幅下降。对于 LLaMA-2 7B 模型,使用 bfloat16 时的训练显存需求为:

训练显存 = 14 GB ( 模型参数 ) + 14 GB ( 梯度 ) + 28 GB ( 优化器状态 ) \text{训练显存} = 14 \, \text{GB} (\text{模型参数}) + 14 \, \text{GB} (\text{梯度}) + 28 \, \text{GB} (\text{优化器状态}) 训练显存=14GB(模型参数)+14GB(梯度)+28GB(优化器状态)
因此,使用 bfloat16 精度时,训练显存需求为 56 GB

5.5 总结
  • float32 精度:LLaMA-2 7B 模型训练需要约 112 GB 显存。
  • bfloat16 精度:LLaMA-2 7B 模型训练需要约 56 GB 显存。

使用 bfloat16 精度能有效减少训练时的显存需求,尤其是对于大模型来说,可以显著降低硬件成本,甚至使得原本无法在某些显卡上训练的大模型得以运行。因此,在显存资源有限的情况下,使用混合精度训练(例如采用 bfloat16)是一种提高训练效率的有效方法。

总之,选择合适的数值精度不仅能降低显存消耗,还能加速训练过程,特别是在面对大规模深度学习模型时,精度选择对训练的性能和可行性有着直接影响。

英文版

Understanding the Additional Memory Requirements of Adam Optimizer: Memory Consumption Breakdown for Model Parameters and Optimizer States

In deep learning model training, memory (or VRAM) is a critical resource, especially when dealing with large models like large language models or deep neural networks. The memory required for training is not only for storing the model parameters but also for the gradients and the additional memory consumed by the optimizer state. For optimizers like Adam or AdamW, the optimizer state introduces significant additional memory consumption, which is often overlooked when estimating memory requirements.

This blog post will focus on the memory overhead introduced by the optimizer and how to break down the memory requirements separately for model parameters and optimizer states. Understanding this is important for efficiently managing memory during training, especially for beginners who may not fully realize the impact of optimizers like Adam on memory consumption.

1. Memory Requirements for Inference vs. Training

1.1 Inference Memory Requirements

During inference (i.e., when you are just running the model and making predictions), the memory requirements are relatively straightforward and mainly include:

  • Model Parameters: Storing the model’s weights and biases.
  • Activations: The intermediate outputs produced during the forward pass that are required for computing the final result.

In most cases, the memory for inference is primarily used by these two components, and the memory formula can be simplified as:
Inference Memory = Model Parameters Memory + Activations Memory \text{Inference Memory} = \text{Model Parameters Memory} + \text{Activations Memory} Inference Memory=Model Parameters Memory+Activations Memory

1.2 Training Memory Requirements

In contrast to inference, training requires more memory due to the following additional components:

  • Gradients: During backpropagation, the gradients for each parameter need to be computed and stored. The gradients are necessary for updating the model parameters, and they take up memory equivalent to the size of the model parameters.
  • Optimizer State: Optimizers like Adam require additional memory to store per-parameter information such as the first moment (momentum) and the second moment (squared gradients). This memory overhead can be substantial, especially for large models.

Thus, the memory formula for training is:
Training Memory = Model Parameters Memory + Gradients Memory + Optimizer States Memory \text{Training Memory} = \text{Model Parameters Memory} + \text{Gradients Memory} + \text{Optimizer States Memory} Training Memory=Model Parameters Memory+Gradients Memory+Optimizer States Memory

2. The Additional Memory Overhead for Optimizer States

Training memory usage is higher than inference memory due to the extra storage required for gradients and optimizer states. Specifically:

  • Gradients: The memory required for storing gradients is the same as the memory for storing model parameters, because every parameter has a corresponding gradient.
  • Optimizer States: For Adam optimizer, each parameter requires storage for both the first and second moment (the running average of gradients and squared gradients), which results in the need for 2 times the memory of the model parameters.
2.1 Breaking Down the Memory Calculation

When estimating the total memory required for training, it is useful to break down the contributions from the model parameters, gradients, and optimizer state. The total memory for training is approximately:
Training Memory = 1 x ( Model Parameters Memory ) + 1 x ( Gradients Memory ) + 1 − 2 x ( Optimizer States Memory ) \text{Training Memory} = 1x \, (\text{Model Parameters Memory}) + 1x \, (\text{Gradients Memory}) + 1-2x \, (\text{Optimizer States Memory}) Training Memory=1x(Model Parameters Memory)+1x(Gradients Memory)+12x(Optimizer States Memory)
This means the memory for training is typically 4 times the memory required for inference:

  • 1x for the model parameters.
  • 1x for the gradients (same memory as model parameters).
  • 1-2x for the optimizer states. For Adam optimizer, the overhead is typically 2 times the model memory because it stores both the first and second moments.
2.2 Memory Consumption of Adam Optimizer

The Adam optimizer consumes extra memory because it needs to store both the first moment (( m m m )) and the second moment (( v v v )) for each parameter. Therefore, the memory consumed by the optimizer is:
Optimizer States Memory = 2 × Model Parameters Memory \text{Optimizer States Memory} = 2 \times \text{Model Parameters Memory} Optimizer States Memory=2×Model Parameters Memory
Similarly, AdamW optimizer, which differs from Adam only in the weight decay application, has almost the same memory consumption as Adam, so its extra memory overhead is also 2 times the model parameters memory.

2.3 Impact of Precision on Memory Requirements

The memory usage for training is also affected by the data type (precision) used. Commonly, float32 and bfloat16 are used for training, and the precision affects memory consumption as follows:

  • float32 (32-bit floating point): Each parameter, gradient, and optimizer state consumes 4 bytes, which results in higher memory usage.
  • bfloat16 (16-bit floating point): Each parameter, gradient, and optimizer state consumes 2 bytes, leading to reduced memory consumption.

Thus, using bfloat16 instead of float32 can significantly reduce the overall memory requirements for both the model parameters and the optimizer states.

3. Practical Example: LLaMA-2 7B Model

Let’s walk through an example of estimating the memory for training a LLaMA-2 7B model, which contains 7 billion parameters. We will first calculate the memory requirements assuming float32 precision.

3.1 Model Parameters Memory

Each parameter in the model requires 4 bytes (for float32), and with 7 billion parameters, the model parameters memory is:
Model Parameters Memory = 7 × 1 0 9 × 4 bytes = 28 GB ( using 1000-based units ) \text{Model Parameters Memory} = 7 \times 10^9 \times 4 \, \text{bytes} = 28 \, \text{GB} \, (\text{using 1000-based units}) Model Parameters Memory=7×109×4bytes=28GB(using 1000-based units)

3.2 Gradients Memory

The gradients memory is the same as the model parameters memory because we need to store one gradient per parameter:
Gradients Memory = 28 GB \text{Gradients Memory} = 28 \, \text{GB} Gradients Memory=28GB

3.3 Optimizer States Memory

Since the Adam optimizer needs to store both the first and second moments, the optimizer states memory will be 2 times the model parameters memory:
Optimizer States Memory = 2 × 28 GB = 56 GB \text{Optimizer States Memory} = 2 \times 28 \, \text{GB} = 56 \, \text{GB} Optimizer States Memory=2×28GB=56GB

3.4 Total Training Memory

The total memory required for training is the sum of model parameters, gradients, and optimizer states:
Training Memory = 28 GB + 28 GB + 56 GB = 112 GB \text{Training Memory} = 28 \, \text{GB} + 28 \, \text{GB} + 56 \, \text{GB} = 112 \, \text{GB} Training Memory=28GB+28GB+56GB=112GB

4. Summary

In summary, when estimating memory for training a deep learning model, especially using optimizers like Adam, you need to consider not only the model parameters but also the gradients and the additional memory consumed by the optimizer state. Typically, the memory required for training is about 4 times the memory required for inference, where:

  • 1x is for the model parameters.
  • 1x is for the gradients.
  • 1-2x is for the optimizer states.

Optimizers like Adam consume significant additional memory because they store both first and second moment estimates for each parameter. For large models, this memory overhead can be substantial, so it’s important to account for it when selecting hardware and configuring training settings. If memory is limited, techniques like mixed-precision training (e.g., using bfloat16) can help reduce memory usage.

5. Memory Consumption with bfloat16 Precision

Using bfloat16 (16-bit floating point) instead of float32 (32-bit floating point) during training can significantly reduce memory consumption. The primary advantage of bfloat16 is that it reduces memory usage while maintaining sufficient numerical precision, making it particularly well-suited for training deep neural networks.

5.1 Impact of bfloat16 on Model Parameters

With bfloat16 precision, each parameter consumes 2 bytes, as opposed to 4 bytes with float32. For example, for the LLaMA-2 7B model, which has 7 billion parameters:

  • Model Parameters Memory (using bfloat16):
    Model Parameters Memory = 7 × 1 0 9 × 2 bytes = 14 GB \text{Model Parameters Memory} = 7 \times 10^9 \times 2 \, \text{bytes} = 14 \, \text{GB} Model Parameters Memory=7×109×2bytes=14GB
    Therefore, the memory required for the model parameters is reduced to 14 GB when using bfloat16.
5.2 Impact of bfloat16 on Gradients

Gradients are computed during backpropagation and are used to update the model parameters. The memory required to store gradients is the same as for the model parameters. Thus, when using bfloat16 for gradients, memory usage is also halved:

  • Gradients Memory (using bfloat16):
    Gradients Memory = 14 GB \text{Gradients Memory} = 14 \, \text{GB} Gradients Memory=14GB
5.3 Impact of bfloat16 on Optimizer States

The Adam optimizer stores two components for each parameter: the first moment ( m m m) and the second moment ( v v v). This results in the optimizer state requiring 2 times the memory of the model parameters.

Since bfloat16 uses 2 bytes per value, the memory overhead for the optimizer state is also halved compared to float32. Thus, the optimizer states’ memory in bfloat16 will be:

  • Optimizer States Memory (using bfloat16):
    Optimizer States Memory = 2 × 14 GB = 28 GB \text{Optimizer States Memory} = 2 \times 14 \, \text{GB} = 28 \, \text{GB} Optimizer States Memory=2×14GB=28GB
5.4 Total Memory Requirement for Training

When applying bfloat16 to model parameters, gradients, and optimizer states, the overall memory consumption for training is significantly reduced. For the LLaMA-2 7B model, the total memory required for training with bfloat16 would be:

Training Memory = 14 GB ( Model Parameters ) + 14 GB ( Gradients ) + 28 GB ( Optimizer States ) \text{Training Memory} = 14 \, \text{GB} (\text{Model Parameters}) + 14 \, \text{GB} (\text{Gradients}) + 28 \, \text{GB} (\text{Optimizer States}) Training Memory=14GB(Model Parameters)+14GB(Gradients)+28GB(Optimizer States)
Thus, the total memory requirement for training the LLaMA-2 7B model using bfloat16 precision would be 56 GB.

5.5 Summary
  • float32 precision: The training memory requirement for LLaMA-2 7B is approximately 112 GB.
  • bfloat16 precision: The training memory requirement for LLaMA-2 7B is approximately 56 GB.

By using bfloat16 precision, the memory consumption for training is reduced by half compared to float32, which can significantly lower hardware costs and make it feasible to train large models on GPUs with limited memory. Therefore, when memory is a constraint, using mixed-precision training (e.g., with bfloat16) is an effective strategy to improve training efficiency.

In summary, choosing the right precision for your training process not only reduces memory usage but also accelerates training. This decision has a direct impact on the performance and feasibility of training large-scale deep learning models, making precision selection critical, especially when working with very large models.

后记

2024年11月29日17点14分于上海,在GPT4o大模型辅助下完成。

相关文章:

深入了解 Adam 优化器对显存的需求:以 LLaMA-2 7B 模型为例 (中英双语)

中文版 深入了解 Adam 优化器对显存的额外需求:模型参数与优化器状态的显存开销分析 在深度学习模型的训练过程中,显存是一个关键的资源,尤其在处理大型语言模型或深度神经网络时。训练时的显存需求不仅包括模型参数本身,还涉及…...

数据分析学习

数据分析的定义 数据分析是通过对收集到的数据进行清理、转换、建模、分析和解释,从中提取有用的信息和洞察,以帮助做出更好的决策。数据分析可以应用于各种领域,比如商业、金融、医疗、市场营销等,目的是通过数据来发现模式、趋…...

PaddleOCR:一款高性能的OCR工具介绍

一、引言 随着人工智能技术的不断发展,光学字符识别(OCR)技术在各行各业得到了广泛应用。OCR技术能够将图片、扫描件等非结构化数据中的文字信息提取出来,转换为可编辑的文本格式。在我国,百度开源了一款优秀的OCR工具…...

Transformers快速入门代码解析(一):注意力机制——Attention:Scaled Dot-product Attention

Attention:Scaled Dot-product Attention 引言Scaled Dot-product Attention代码 引言 请注意!!!本博客使用了教程Transformers快速入门中的全部代码!!! 只在我个人理解的基础上为代码添加了注释…...

Git中HEAD、工作树和索引的区别

在Git版本控制系统中,HEAD、工作树(Working Tree)和索引(Index)是三个非常重要的概念,它们分别代表了不同的状态或区域,下面我将对这三个概念进行详细的解释。 HEAD 定义:HEAD是一…...

【python量化教程】如何使用必盈API的股票接口,获取最新实时交易数据

实时交易数据简介 股票实时交易数据涵盖股票价格、成交量、涨跌幅等多类信息。其在股票交易中极为关键,高速准确的数据对各方意义重大。投资者可借此及时捕捉机会、优化策略与降低风险;实时准确的实时交易数据是股票市场有效运转的核心要素之一。 使用…...

【C++】动态内存与智能指针——shared_ptr 和 new 结合使用

12.1.3 shared_ptr 和 new 结合使用 如上文所述,如果我们不初始化一个智能指针,那么它将会被初始化为一个空指针(需要注意的是,智能指针与普通指针在此处有着非常明显的区别。如果只声明某个类型的普通指针,而不对它进…...

遥感数据集:FTW全球农田边界和对应影像数据,约160万田块边界及7万多个样本

Fields of The World (FTW) 是一个面向农业田地边界实例分割的基准数据集,旨在推动机器学习模型的发展,满足全球农业监测对高精度、可扩展的田地边界数据的需求。该数据集由kerner-lab提供,于2024年8月28日发布,主要特征包括&…...

马斯克的 AI 游戏工作室:人工智能与游戏产业的融合新纪元

近日,马斯克在 X 平台(前身为 Twitter)发文称,“太多游戏工作室被大型企业所拥有,xAI 将启动一个 AI 游戏工作室,让游戏再次变得精彩”。这一言论不仅展示了马斯克对游戏行业现状的不满,也揭示了…...

URDF(描述机器人模型)和SDF(Gazebo中用于描述仿真环境)

使用URDF&#xff08;Unified Robot Description Format&#xff09; URDF是ROS中用于描述机器人模型的XML格式文件。你可以使用XML文件定义机器人的几何形状、惯性参数、关节和链接等。 示例URDF文件&#xff08;my_robot.urdf&#xff09;&#xff1a; <?xml version&…...

力扣380:O(1)时间插入、删除和获取随机数

实现RandomizedSet 类&#xff1a; RandomizedSet() 初始化 RandomizedSet 对象bool insert(int val) 当元素 val 不存在时&#xff0c;向集合中插入该项&#xff0c;并返回 true &#xff1b;否则&#xff0c;返回 false 。bool remove(int val) 当元素 val 存在时&#xff0…...

【C++boost::asio网络编程】有关socket的创建和连接的笔记

socket的创建和连接 tcp客户端创建端点tcp服务端创建端点创建socket创建TCP 服务器端的 acceptor 套接字创建 acceptor 套接字并绑定客户端连接到服务器通过ip地址解析通过域名解析 服务端接收新连接 tcp客户端创建端点 int client_end_point() {std::string raw_ip_address …...

超级灵感:前端页面功能统一管理方案

前端页面功能统一管理方案 引言 我和朋友聊天想到一个灵感&#xff0c;关于支付状态机管理&#xff0c;这个类可以让我们知道具体上一个状态和下一个状态&#xff0c;这是由于那个事件触发改变&#xff0c;这个功能设计非常好&#xff01; 从而讨论出为什么我们不能把某一个…...

力扣第 77 题 组合

题目描述 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按任意顺序返回答案。 示例 示例 1 输入&#xff1a; n 4, k 2输出&#xff1a; [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]示例 2 输入&#xff1a; n 1, k …...

(超详细图文)PLSQL Developer 配置连接远程 Oracle 服务

1、下载配置文件 &#xff08;超详细图文详情&#xff09;Navicat 配置连接 Oracle-CSDN博客 将下载的文件解压到单独文件夹&#xff0c;如&#xff1a;D:\App\App_Java\Oracle\instantclient-basic-windows.x64-19.25.0.0.0dbru 2、配置 打开 PLSQL Developer&#xff0c;登…...

元器件选型与参数13 电源的分类-线性电源参数 RT9013 AMS1117 PCB布局布线

目录 一、线性电源 1、重要参数 2、线性电源效率一定低吗 3、线性电源并联扩流 4、常见电路 RT9013-LDO AMS1117-xx-LDO 5、布局布线 6、外置输入与电池供电 7、单片机控制其他模组供电实现低功耗 二、开关电源与线性电源配合 1、高效率与低噪声 DC-DC电源大致分为…...

RHEL7+Oracle11.2 RAC集群-多路径(multipath+udev)安装步骤

RHEL7Oracle11.2RAC集群-多路径&#xff08;multipathudev&#xff09;安装 配置虚拟存储 使用StarWind Management Console软件&#xff0c;配置存储 dggrid1: 1g*3 Dggrid2: 1g*3 Dgsystem: 5g*1 系统表空间&#xff0c;临时表空间&#xff0c;UNDO&#xff0c;参数文件…...

每日速记10道java面试题03

其他资料 每日速记10道java面试题01-CSDN博客 每日速记10道java面试题02-CSDN博客 目录 一、你使用过java的反射机制吗&#xff1f;如何应用反射&#xff1f; 二、什么是泛型&#xff1f;泛型的作用是什么&#xff1f; 三、java的泛型擦除是什么&#xff1f; 四、Java 中…...

Vue 3 的双向绑定原理

Vue 3 的双向绑定原理是基于 响应式系统 和 数据劫持 技术来实现的。在 Vue 3 中&#xff0c;双向绑定通常是通过 v-model 指令来完成的&#xff0c;它本质上是数据的双向同步&#xff1a;当数据改变时&#xff0c;视图自动更新&#xff0c;反之&#xff0c;视图的修改也会更新…...

如何使用 Chrome 无痕浏览模式访问网站?

无痕浏览&#xff08;Incognito Mode&#xff09;是 Google Chrome 浏览器提供的一种隐私保护功能&#xff0c;它允许用户在一个独立的会话中浏览网页&#xff0c;而不会记录用户的浏览历史、下载历史、表单数据等。这对于希望保护个人隐私或进行临时性匿名浏览的用户来说非常有…...

Idea 2024.3 突然出现点击run 运行没有反应,且没有任何提示。

写这篇文章的目的是为了提供一个新的解决思路&#xff0c;因为存在同病不同原因。 如果你进行了1. 检查运行配置 (Run Configuration) 2. 清理和重建项目 3. 清除缓存并重启 IDEA 4.排除kotlin 5.重装idea等等操作之后仍然没有解决&#xff0c;可以试着按一下步骤进行解决。 检…...

【小白学机器学习36】关于独立概率,联合概率,交叉概率,交叉概率和,总概率等 概念辨析的例子

目录 1 先说结论 2 联合概率 3 边缘概率 4 (行/列)边缘概率的和 总概率1 5 条件概率 5.1 条件概率的除法公式 5.2 条件概率和联合概率区别 1 先说结论 关于独立概率&#xff0c;联合概率&#xff0c;交叉概率&#xff0c;交叉概率和&#xff0c;总概率 类型含义 …...

Spring Boot 项目——分层架构

在创建一个 Spring Boot 项目时&#xff0c;为了提高代码的可维护性、可扩展性和清晰度&#xff0c;通常会按照一定的分层架构进行设计。常见的分层架构包括以下几层&#xff1a; 1. Controller 层&#xff08;Web 层&#xff09; 作用&#xff1a;接收用户请求&#xff0c;并…...

wordpress网站首页底部栏显示网站备案信息

一、页脚文件footer.php 例如&#xff0c;wordpress主题使用的是simple-life主题&#xff0c;服务器IP为192.168.68.89,在wordpress主题文件中有个页脚文件footer.php&#xff0c;这是一个包含网站页脚代码的文件。 footer.php 路径如下&#xff1a; /www/wwwroot/192.168.68…...

python面向对象编程练习

学生成绩管理系统 定义一个Student类&#xff0c;包括属性&#xff08;姓名、成绩&#xff09;和方法&#xff08;设置成绩、获取成绩、计算平均成绩&#xff09;。 实例化多个学生对象并调用方法。 功能说明&#xff1a; Student 类&#xff1a; init(self, name)&#xff1a;…...

OpenCV_Code_LOG

孔洞填充 void fillHole(const Mat srcBw, Mat &dstBw) {Size m_Size srcBw.size();Mat TempMat::zeros(m_Size.height2,m_Size.width2,srcBw.type());//延展图像srcBw.copyTo(Temp(Range(1, m_Size.height 1), Range(1, m_Size.width 1)));cv::floodFill(Temp, Point(…...

力扣第 74 题是 搜索二维矩阵

题目描述 给定一个 m x n 的矩阵 matrix 和一个目标值 target&#xff0c;请你编写一个函数来判断目标值 target 是否在矩阵中。 每行的元素按升序排列。每列的元素按升序排列。 示例 1 输入&#xff1a; matrix [[1, 4, 7, 11],[2, 5, 8, 12],[3, 6, 9, 16],[10, 13, 14…...

[极客大挑战 2019]BabySQL--详细解析

信息搜集 进入界面&#xff1a; 输入用户名为admin&#xff0c;密码随便输一个&#xff1a; 发现是GET传参&#xff0c;有username和password两个传参点。 我们测试一下password点位能不能注入&#xff1a; 单引号闭合报错&#xff0c;根据报错信息&#xff0c;我们可以判断…...

实现Linux平台自定义协议族

一 简介 我们常常在Linux系统中编写socket接收TCP/UDP协议数据&#xff0c;大家有没有想过它怎么实现的&#xff0c;如果我们要实现socket接收自定义的协议数据又该怎么做呢&#xff1f;带着这个疑问&#xff0c;我们一起往下看吧~~ 二 Linux内核函数简介 在Linux系统中要想…...

RL78/G15 Fast Prototyping Board Arduino IDE 平台开发过程

这是一篇基于RL78/G15 Fast Prototyping Board的Arduino IDE开发记录 RL78/G15 Fast Prototyping Board硬件简介&#xff08;背景&#xff09;基础测试&#xff08;方法说明/操作说明&#xff09;开发环境搭建&#xff08;方法说明/操作说明代码结果&#xff09;Arduino IDE RL…...

做海南旅游网站的初衷/线下推广活动策划方案

1背景转眼已经过了33岁生日。作为一个大龄程序媛&#xff0c;昨天又收到了阿里技术直接打过来的面试电话&#xff0c;照例客气的回答不考虑机会之后&#xff0c;算算今年下来阿里技术直接打过来的面试至少也有十几次了。每次都问你是多久不考虑机会呢&#xff1f;我回答几年吧。…...

wordpress 网络图片不显示图片/天津百度推广

TA-Lib(Technical Analysis Library, 即技术分析库)是Python金融量化的高级库,涵盖了150多种股票、期货交易软件中常用的技术分析指标,如MACD、RSI、KDJ、动量指标、布林带等。 首先打开python 安装包下载网站: 官网下载地址 https://www.lfd.uci.edu/~gohlke/pythonlib…...

怎么给网站做动图/北京seo网络推广

疫情期间&#xff0c;大多数学子的毕业季都很苦涩&#xff0c;除了求职难&#xff0c;很多同学们甚至无法认真告别&#xff0c;有些同学这次见不到&#xff0c;也许一生都不再见。百度也见证了一场别开生面的“云毕业”&#xff0c;这些同学们来自百度飞桨官方出品的《百度架构…...

专业网站建设制作/百度热搜榜今日头条排名

GitHub上&#xff0c;一份用Python做交互式图形的资源火了。 这一工具名为Bokeh&#xff0c;官方介绍称&#xff0c;它能读取大型数据集或者流数据&#xff0c;以简单快速的方式为网页提供优美、高交互性能的图形。 比如&#xff0c;有人用它做出了这样的图&#xff1a; 有人…...

建设银行网站的目的是什么/关键词词库

数据结构中的栈不要与 Java 中的栈混淆&#xff0c;他们俩不是一回事&#xff0c;数据结构中的栈是一种受限制的线性表&#xff0c;栈具有先进后出、后进先出的特点&#xff0c;因为栈只允许访问最后一个数据项&#xff0c;即最后插入的数据项。也许你会有疑问&#xff0c;栈既…...

健康私人定制网站怎么做/怎样开网站

作者(Alex Rodriguez, Alessandro Laio)提出了一种很简洁优美的聚类算法, 可以识别各种形状的类簇, 并且其超参数很容易确定. 算法思想 该算法的假设是类簇的中心由一些局部密度比较低的点围绕, 并且这些点距离其他有高局部密度的点的距离都比较大. 首先定义两个值: 局部密度以…...