OpenVLA-OFT——微调VLA的三大关键设计:并行解码、动作分块、连续动作表示以及L1回归目标

前言

25年3.26日,这是一个值得纪念的日子,这一天,我司「七月在线」的定位正式升级为了:具身智能的场景落地与定制开发商 ,后续则从定制开发 逐步过渡到 标准产品化

比如25年q2起,在定制开发之外,我司正式推出第一类具身产品(后续更多产品 详见七月官网):复现各个前沿具身模型的软硬全套的标准化产品,相当于已帮组装好的硬件,和对应复现好的程序,包括且不限于ALOHA/RDT/umi/dexcap/idp3/π0,如此软硬一体标准化的产品,省去复现过程中的

  • 各种硬件组装问题
  • 各种算法问题
  • 各种工程问题

真正做到:一旦拿来,开箱即用

我司具身落地中,过去半年用π0居多,其次idp3和其他模型,​也是目前国内具身落地经验最丰富的团队之一了

  • 其中有不少工作便涉及到对具身模型的微调——恍如18-20年期间 大家各种微调语言模型
    再之后随着GPT3、GPT3.5、GPT4这类语言模型底层能力的飞速提升,使得针对语言模型的微调呈逐年下降趋势
  • 但在具身方向,未来一两年,微调具身模型都是主流方向之一
    当然了,随着具身模型底层能力的越来越强、泛化性越来越好,也早晚会走到如今语言模型这般 微调偏少的地步

且始终保持对具身最前沿技术的沟通,这不,25年2月底,斯坦福的三位研究者

  1. Moo Jin Kim
    OpenVLA的一作
  2. Chelsea Finn
    ALOHA团队的指导老师,也是RT-2、π0的作者之一,是我过去一两年下来读的机器人论文中出现频率最高的一个人了
  3. Percy Liang
    OpenVLA的作者之一

提出OpenVLA-OFT「paper地址《Fine-Tuning Vision-Language-Action Models: Optimizing Speed and Success》、项目地址、GitHub地址」,在他们的角度上,揭示微调VLA的三大关键设计:并行解码、动作分块、连续动作表示以及L1回归目标

第一部分 OpenVLA-OFT

1.1 OpenVLA-OFT的提出背景与相关工作

1.1.1 OpenVLA-OFT的提出背景

​​​Kim等人[22]提出了OpenVLA通过LoRA进行参数高效的微调。然而,OpenVLA的自回归动作生成在高频控制(25-50+ Hz)中仍然过于缓慢(3-5 Hz),并且LoRA和自回归VLAs的全微调在双手操作任务中往往表现不佳[51,26,3]

尽管最近的方法通过更好的动作tokenization方案[2,36]提高了效率,实现了2到13倍的加速,但动作块之间的显著延迟(例如,最近的FAST方法[36]为750毫秒)仍然限制了在高频双手机器人上的实时部署

对此,三位作者使用OpenVLA(一种代表性的自回归VLA模型)作为基础模型,将VLA适配到新型机器人和任务中的关键设计决策。他们考察了三个关键设计选择并揭示了一些关键见解:

  1. 对于动作解码方案(自回归与并行生成)
    通过动作分块的并行解码不仅提高了推理效率,还改善了下游任务的成功率,同时增强了模型输入输出规范的灵活性
  2. 对于动作表示(离散与连续)
    与离散表示相比,连续动作表示进一步提高了模型质量
  3. 对于学习目标(下一个token预测、L1回归与扩散)
    使用L1回归目标对VLA进行微调在性能上与基于扩散的微调相当,同时提供了更快的训练收敛速度和推理速度

基于以上见解,他们引入了OpenVLA-OFT:一种优化微调(OFT)方案的具体实现,该方案结合了并行解码和动作分块、连续动作表示以及L1回归目标,以在保持算法简单性的同时提高推理效率、任务性能和模型输入输出灵活性

他们号称在标准化的LIBERO模拟基准测试和真实双手ALOHA机器人上的灵巧任务中进行了实验

  • 在LIBERO中,OpenVLA-OFT通过在四个任务套件中达到97.1%的平均成功率,建立了新的技术标准,超越了微调的OpenVLA策略[22](76.5%)和π0策略[3](94.2%),同时在动作生成中实现了26倍的速度提升(使用8步动作分块)
  • 对于真实的ALOHA任务[53],通过FiLM[35]增强了他们的方案以增强语言基础能力

1.1.2 相关工作

第一,以往的研究更关注什么呢?其主要关注模型开发

  1. 利用语言和视觉基础模型来增强机器人能力,将其用作预训练的视觉表示,从而加速机器人策略学习 [29-Vip,32-R3m,30-Liv,19-Language-driven representation learning for robotic,31]
    在机器人任务中进行物体定位 [9,45]

    以及用于高层次的规划和推理
    [1-SayCan,17,42-Progprompt,16-Language models as zero-shot planners: Extracting actionable knowledge for embodied agents,43-Llmplanner: Few-shot grounded planning for embodied agents with large language models,18-Voxposer,6-Manipulate-anything]
  2. 最近,研究人员探索了微调视觉-语言模型(VLMs)以直接预测低级别机器人控制动作,生成“视觉-语言-动作”模型(VLAs)
    [4-RT-2,33-Open x-embodiment,23-Vision-language foundation models as effective robot imitators,22-Openvla,7-An interactive agent foundation model,15-An embodied generalist agent in 3d world,8-Introducing rfm-1: Giving robots human-like reasoning capabilities,50-Lingo-2,55-3dvla,51-Tinyvla,3-π0,2-Minivla]

    这些模型展示了对分布外测试条件和未见语义概念的有效泛化能力

而三位作者则专注于开发微调此类模型的流程,并通过从实证分析中获得的见解来验证每个设计决策的合理性——这是OpenVLA-OFT工作的第一点意义

第二,相比OpenVLA,OpenVLA-OFT优势是什么呢

  1. 拒论文称,尽管微调对于现实世界中的VLA部署至关重要,但关于有效微调策略的经验分析仍然有限。Kim等人[22]研究了各种参数更新策略,并通过他们的研究发现,LoRA微调能够有效适应单臂机器人在低控制频率(<10Hz)下的操作,但OpenVLA的分析并未扩展到双臂机器人在高控制频率(25-50+ Hz)下的更复杂控制场景
  2. 而本次的研究,OpenVLA-OFT通过探索VLA适应设计决策,以实现快速推理和在具有25 Hz控制器的真实双臂操控器上可靠的任务执行——这是第二点意义

第三,相比π0_FAST(推理慢),OpenVLA-OFT意义在于什么呢

  1. 尽管π0_FAST通过新的动作tokenization化方案改进了VLA 的效率,使用矢量量化或基于离散余弦变换的压缩方法,以比简单的逐维分箱(如RT-2 [4] 和OpenVLA [22] 中使用的)更少的token表示动作块(动作序列)
  2. 尽管这些方法为自回归VLA——π0_FAST 实现了2 到13× 的加速,但三位作者探索了超越自回归建模的设计决策,而自回归建模本质上受到迭代生成的限制

    最终OpenVLA-OFT的并行解码方法,与动作分块结合时,实现了显著更高的加速:26× 到43× 的吞吐量,同时具有更低的延迟(单臂任务使用一张输入图像的延迟为0.07 ms,双臂任务使用三张输入图像的延迟为0.321 ms)

第四,与基于扩散的VLA(训练慢)相比

尽管这些基于扩散的视觉语言代理(VLA)通过同时生成多时间步的动作块实现了比自回归VLA更高的动作吞吐量,但它们在推理时通过较慢的训练和多个去噪或集成步骤引入了计算权衡

此外,这些扩散VLA在架构、学习算法、视觉语言融合方法以及输入输出规范方面差异很大——哪些设计元素对性能影响最大仍不清楚

通过受控实验,三位作者表明,使用更简单的L1回归目标微调的策略可以在任务性能上匹配更复杂的方法,同时显著提高推理效率

1.2 微调VLA的三大关键设计决策

在涉及到微调VLA的三个关键设计决策之前,有两点 需要先特别说明下

首先,三位作者使用 OpenVLA [22] 作为他们代表性的基础 VLA

  1. 这是一种通过在 Open X-Embodiment 数据集 [33] 的 100 万个episodes上对Prismatic VLM [20] 进行微调而创建的 7B 参数操控策略
  2. OpenVLA的原始训练公式使用 7 个离散机器人动作token的自回归预测,每个时间步有
    \rightarrow  3 个用于位置控制
    \rightarrow  3 个用于方向控制
    \rightarrow  1 个用于抓手控制
    它采用与语言模型类似的「交叉熵损失的下一个token预测」作为其学习目标

其次,先前的研究表明,动作分块——即预测并执行一系列未来动作而无需中间重新规划,在许多操作任务中提高了策略的成功率[53-ALOHA ACT, 5-Diffusion policy, 27-Bidirectional decoding]

  1. 然而,OpenVLA 的自回归生成方案使得动作分块变得不切实际,因为即使生成单个时间步的动作,在NVIDIA A100 GPU 上也需要0.33秒
  2. 对于块大小为K 个时间步和动作维度为D 的情况,OpenVLA 需要进行KD 次顺序解码器前向传递,而无需分块时仅需D 次。这种K 倍的延迟增加使得在OpenVLA的原始公式下,动作分块对于高频机器人来说变得不切实际
    在下一节中,三位作者提出了一种并行生成方案,使得高效的动作分块成为可能

1.2.1 VLA微调设计决策

现有的方法使用基础模型的自回归训练策略微调VLA时面临两个主要限制:

  1. 推理速度较慢(3-5 Hz),不适合高频控制
  2. 以及在双手操作器上的任务执行可靠性不足 [51-Tinyvla,26-Rdt-1b,3-π0]

为了解决这些挑战,三位作者研究了VLA微调的三个关键设计组件:

  1. 动作生成策略(图2,左):
    比较了需要逐个token顺序处理的自回归生成与同时生成所有动作并支持高效动作分块的并行解码
  2. 动作表示(图2,右):
    对通过基于 softmax 的token预测处理的离散动作(对归一化动作进行 256 个分箱的离散化)与由多层感知机(MLP)动作头直接生成的连续动作进行了比较
    \rightarrow  对于离散动作,语言模型解码器的最终隐藏状态被线性投影为对数几率,然后通过 softmax 操作处理,形成动作token的概率分布
    \rightarrow  而对于连续动作,最终隐藏状态则通过一个单独的动作头MLP直接映射到归一化的连续动作
  3. 学习目标(图2,右侧)
    比较了通过
    \rightarrow  下一个token预测微调离散动作的策略
    \rightarrow  L1回归微调连续动作的策略[53]
    \rightarrow  以及条件去噪扩散微调连续动作的策略[5-diffusion policy](类似于Chi等人[5]的研究)

    他们使用OpenVLA [22]作为基础模型,并通过LoRA微调[14]对其进行适配,这是因为的训练数据集相对较小(500个示例,相比于预训练的1百万个示例)

1.2.2 实现替代设计组件

OpenVLA 最初采用自回归生成离散动作token,并通过下一个token预测进行优化。三位作者实施了不同的微调设计决策,同时保持原始预训练不变

第一,并行解码和动作分块

与需要按顺序token预测的自回归生成不同

  1. 并行解码使模型能够在一次前向传递中将输入嵌入映射到预测的输出序列「parallel decoding enables the model to map input embeddingsto the predicted output sequence in a single forward pass
  2. 为此,三位作者修改了模型,使其接收空的动作嵌入作为输入,并用双向注意力替换因果注意力掩码,从而使解码器能够同时预测所有动作
    这将动作生成从D 次顺序传递减少到一次传递,其中D 是动作的维度「This reduces action generation from D sequential passes to asingle pass, where D is the action dimensionality

此外,并行解码可以自然地扩展到动作分块

  1. 为了预测多个未来时间步的动作,只需在解码器的输入中插入额外的空动作嵌入,这些嵌入随后会被映射到未来的一组动作
  2. 对于分块大小为 K 的情况,模型在一次前向传递中预测 KD 个动作,吞吐量增加 K 倍,而对延迟的影响极小
    虽然从理论上讲,并行解码可能不如自回归方法那样具有表现力,但三位作者的实验表明,在各种任务中均未出现性能下降

第二,连续动作表示

OpenVLA 最初使用离散动作token,其中每个动作维度被归一化到[−1, +1] 并均匀离散化为256 个区间。虽然这种方法很方便,因为它不需要对底层VLM进行架构修改,但离散化过程可能会牺牲细粒度的动作细节

对此,三位作者研究了连续动作表示,并从突出的模仿学习方法中提取了两个学习目标

  1. L1 回归,该动作头直接将解码器最后一层隐藏状态映射到连续动作值。模型被训练为最小化预测动作与真实动作之间的平均 L1 差异,同时保持并行解码的效率优势并可能提高动作精度
  2. 其次,受 Chi 等人 [5] 的启发,他们实现了条件去噪扩散建模
    在训练过程中,模型学习预测在前向扩散期间添加到动作样本中的噪声
    在推理过程中,策略通过反向扩散逐渐去噪噪声动作样本以生成真实动作

    虽然这种方法提供了可能更具表现力的动作建模,但它在推理期间需要多次前向传递(在三位作者的实现中为 50 次扩散步骤),即使使用并行解码也会影响部署延迟

第三,额外的模型输入和输出

虽然原始 OpenVLA 处理单个摄像头视图,但一些机器人设置包括多个视角和额外的机器人状态信息

故三位作者实现了一个灵活的输入处理管道:

  • 对于摄像头图像,三位作者使用 OpenVLA 的双视觉编码器提取每个视图的 256 个patch嵌入,这些嵌入通过共享投影网络被投影到语言嵌入空间
  • 对于低维机器人状态输入(例如关节角度和夹持器状态),三位作者使用单独的投影网络将这些映射到与摄像头图像相同的嵌入空间——从而作为另一个输入嵌入

所有输入嵌入——视觉特征机器人状态语言token——在传递给解码器之前沿序列维度进行连接。这种统一的潜在表示使模型能够在生成动作时关注所有可用信息

且结合并行解码和动作分块,这种架构可以高效处理丰富的多模态输入,同时生成多时间步的动作,如下图图1所示

1.2.3 使用 FiLM 增强 OpenVLA-OFT 的语言基础能力

当在 ALOHA 机器人设置中部署时,包含来自腕部安装摄像头的多个视角,三位作者观察到由于视觉输入中的伪相关性,策略可能难以跟随语言

  1. 在训练过程中,策略可能会在预测动作时学习依赖这些伪相关性,而不是正确关注语言指令,导致在测试时无法很好地遵循用户的命令
  2. 此外,语言输入可能仅在任务的特定时刻是关键的——例如,在“将X 舀入碗中”任务中,抓住勺子后决定舀取哪种成分,如第 VI 节所述。因此,如果没有特殊技术,训练模型适当地关注语言输入可能特别具有挑战性

为了增强语言跟随能力,三位作者采用了特征线性调制(FiLM)[35],它将语言嵌入注入到视觉表示中,以使模型更加关注语言输入

三位作者计算任务描述中的语言嵌入 x的平均值,并将其投影以获得缩放和偏移向量γ 和 β。这些向量通过仿射变换调制视觉特征F

\operatorname{FiLM}(\mathbf{F} \mid \gamma, \beta)=\hat{\mathbf{F}}=(1+\gamma) \odot \mathbf{F}+\beta

一个关键的实现细节是选择什么代表视觉Transformer中用于调制的” 特征”。尽管人们可能自然地考虑将单个patch 嵌入作为需要调制的特征,但三位作者发现这种方法会导致较差的语言跟随能力

相反,借鉴FiLM 在卷积网络中的操作方式,其中调制以空间无关的方式通过缩放和偏移整个特征图来实现,他们将γ 和β 的每个元素应用于所有视觉patch 嵌入中的对应隐藏单元,从而使γ 和β 影响所有patch 嵌入

  1. 具体来说,这使得γ 和β 成为DV iT维向量,其中DV iT 是视觉patch 嵌入中的隐藏维度数量
  2. 三位作者在每个ViT块的自注意力层之后和前馈层之前应用 FiLM,每个块都有单独的投影器(见原论文中的图 8)
    更多实现细节请参见附录 C。他们仅在第 VI 节讨论的 ALOHA 实验中使用 FiLM,在这些实验中,多个摄像机视角导致视觉输入中存在更多的虚假相关性

1.3 对VLA微调设计决策的评估

根据原论文,下面将通过旨在回答三个关键问题的控制实验,评估他们提出的 VLA 适配设计决策的效果

  1. 每个设计决策如何影响微调策略在下游任务上的成功率
  2. 每个设计决策如何影响模型推理效率(动作生成吞吐量和延迟)
  3. 替代的微调形式如何影响模型输入输出规范的灵活性

1.3.1 LIBERO 实验设置

在 LIBERO 模拟基准 [25] 上进行评估,该基准包含一个 Franka Emika Panda 机械臂模拟,演示数据包括相机图像、机器人状态、任务注释和末端执行器位姿变化的动作

他们使用四个任务套件——LIBERO-Spatial、LIBERO-Object、LIBERO-Goal 和LIBERO-Long,每个套件提供 10 个任务的 500 个专家演示,用于评估策略在不同空间布局、物体、目标

根据Kim 等人[22] 的方法,他们筛选出不成功的示范,并通过LoRA [14] 独立地对每个任务集微调OpenVLA

  1. 针对非扩散方法训练50 −150 K 次梯度步
    对于扩散方法(收敛较慢)训练100 −250 K 次梯度步
    并使用跨8 个A100/H100 GPU 的64-128 的批量大小
  2. 每隔50K 步测试一次检查点,并报告每次运行的最佳性能。除非另有说明,策略接收一张第三人称图像和语言指令作为输入
  3. 对于使用动作分块的方法,将块大小设置为K = 8,以匹配Diffusion Policy 基线[5],并在重新规划前执行完整的块,这一设置被发现可以同时提高速度和性能。超参数的详细信息见附录D

1.3.2 LIBERO任务性能比较

为了实现令人满意的部署,机器人策略必须展示出可靠的任务执行能力

三位作者首先评估不同的VLA微调设计决策如何影响LIBERO基准测试中的成功率。根据效率分析显示,并行解码PD和动作分块AC对于高频控制(25-50+ Hz)是必要的,特别是对于具有双倍动作维度的双臂机器人

因此,他们评估了同时使用这两种技术的OpenVLA策略,并比较了使用离散动作、带L1回归的连续动作以及带扩散的连续动作的变体

下表表I的结果显示

  1. 并行解码和动作分块不仅提高了吞吐量,还显著提升了性能,使得自回归OpenVLA策略的平均成功率绝对提高了14%。这一改进在LIBERO-Long中尤为显著,这表明动作分块有助于捕获时间依赖性[27]并减少复合错误[39],最终导致更平滑和更可靠的任务执行
  2. 此外,谈发现使用连续动作变体相较于离散动作变体,成功率进一步提高了 5%(绝对值),这可能是由于动作预测的精度更高所致
  3. L1回归和扩散变体表现相当,这表明高容量的OpenVLA模型即使使用简单的L1回归也能有效建模多任务动作分布

1.3.3 LIBERO 推理效率比较

高效的推理对于在高频控制机器人上部署 VLAs 至关重要。故原论文中评估了并行解码(PD)、动作分块(AC)和连续动作表示如何影响模型推理速度

  1. 他们通过在 NVIDIA A100 GPU 上对每种模型变体进行 100 次查询来测量平均延迟(生成一个机器人动作或动作块所需的时间)和吞吐量(每秒生成的总动作数)
  2. 每次查询处理一个 224 x 224 像素的图像和一个示例 LIBERO 语言指令(“拾起alphabet soup并将其放入篮子中”)

下表表II 中的结果表明

  1. 通过将策略中解码器部分的 7 次顺序前向传递替换为单次传递,并行解码将延迟降低了 4 倍,并将吞吐量提高了 4 倍
    Results in Table II show that parallel decoding reduces latency and increases throughput by 4× by replacing 7 se-quential forward passes through the decoder portion of the policy with a single pass
  2. 添加动作分块(K = 8)会使延迟增加 17%,这是由于解码器中的注意力序列变长所致,但当与并行解码结合使用时,它能显著提高吞吐量,比基准 OpenVLA 快 26 倍
  3. 带有 L1 回归的连续动作变体在效率方面几乎没有差异,因为额外的 MLP 动作头仅增加了极少量的计算量
    扩散变体需要50个去噪步骤,因此延迟增加了3倍。然而,通过并行解码和分块,它的吞吐量仍然比基线OpenVLA高出2倍
    这意味着尽管动作块之间的暂停时间更长,扩散变体仍然比原始自回归变体更快地完成机器人操作周期

1.3.4 模型输入输出的灵活性

// 待更

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

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

相关文章

【论文阅读】Dynamic Adversarial Patch for Evading Object Detection Models

一、介绍 这篇文章主要是针对目标检测框架的攻击&#xff0c;不同于现有的攻击方法&#xff0c;该论文主要的侧重点是考虑视角的变化问题&#xff0c;通过在车上布置多个显示器&#xff0c;利用视角动态选择哪一个显示器播放攻击内容&#xff0c;通过这种方法达到隐蔽与攻击的…

多模态技术概述(一)

1.1 多模态技术简介 1.1.1 什么是多模态 多模态(Multimodal)涉及多种不同类型数据或信号的处理和融合&#xff0c;每种数据类型或信号被称为一种模态。常见的模态包括文本、图像、音频、视频等。多模态技术旨在同时利用这些不同模态的数据&#xff0c;以实现更全面、更准确的理…

nginx2

Nginx反向代理(七层代理)、Nginx的TCP/UDP调度器(四层代理)、 一、Nginx反向代理(七层代理) 步骤&#xff1a; ​ 部署后端web服务器集群 ​ 配置Nginx代理服务器 ​ 配置upstream集群池 ​ 调节集群池权重比 <img src"/home/student/Deskt…

调用kimi api

官网支持python&#xff0c;curl和node.js 因为服务器刚好有php环境&#xff0c;所以先用curl调个普通的语音沟通api <?php // 定义 API Key 和请求地址 define(MOONSHOT_API_KEY, sk-PXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXgk1); define(MOONSHOT_API_URL, https://…

关于 UPDATE 语句 和 SELECT ... FOR UPDATE 的对比分析,包括语法、功能、锁机制、使用场景及示例代码

以下是关于 UPDATE 语句 和 SELECT ... FOR UPDATE 的对比分析&#xff0c;包括语法、功能、锁机制、使用场景及示例代码&#xff1a; 1. UPDATE 语句 功能 直接修改数据&#xff1a;立即更新表中的数据&#xff0c;并提交修改。无显式锁&#xff1a;虽然会自动加锁&#xff…

在航电系统中提高可靠性的嵌入式软件设计

1.总线余度设计 数据传输采用双余度总线设计&#xff0c;CANFD为主&#xff0c;RS485为备。发送方将相同的数据分别通过双总线来发送&#xff0c;接收方优先处理主线数据。由于总线上数据频率固定&#xff0c;可设置定时器监控主总线的数据&#xff0c;当定时器超时后&#xff…

第十五届蓝桥杯大赛软件赛省赛Python 大学 C 组:5.回文数组

题目1 回文数组 小蓝在无聊时随机生成了一个长度为 n 的整数数组&#xff0c;数组中的第 i 个数为 ai&#xff0c;他觉得随机生成的数组不太美观&#xff0c;想把它变成回文数组&#xff0c;也是就对于任意 i∈[1,n] 满足 a i a n − i 1 a_ia_{n−i}1 ai​an−i​1。 小蓝…

netty中的WorkerGroup使用详解

Netty中WorkerGroup的深度解析 WorkerGroup是Netty线程模型中的从Reactor线程组&#xff0c;负责处理已建立连接的I/O读写、编解码及业务逻辑执行。其设计基于主从多Reactor模型&#xff0c;与BossGroup分工协作&#xff0c;共同实现高并发网络通信的高效处理。 一、WorkerGro…

模运算核心性质与算法应用:从数学原理到编程实践

目录 &#x1f680;前言&#x1f31f;数学性质&#xff1a;模运算的理论基石&#x1f4af;基本定义&#xff1a;余数的本质&#x1f4af;四则运算规则&#xff1a;保持同余性的关键 &#x1f99c;编程实践&#xff1a;模运算的工程化技巧&#x1f4af;避免数值溢出&#xff1a;…

#Git 变基(Rebase)案例

适合学习理解的 Git 变基&#xff08;Rebase&#xff09;案例 为了帮助你更好地理解 Git 变基&#xff08;Rebase&#xff09;的操作和效果&#xff0c;下面通过一个简单的案例来演示变基的过程和影响。 案例背景 假设我们有一个 Git 仓库&#xff0c;包含两个分支&#xff1…

泰博云平台solr接口存在SSRF漏洞

免责声明&#xff1a;本号提供的网络安全信息仅供参考&#xff0c;不构成专业建议。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权&#xff0c;请及时与我联系&#xff0c;我将尽快处理并删除相关内容。 漏洞描述 SSRF漏洞是一种在未能获取服务器…

MyBatis 动态SQL 详解!

目录 一、 什么是动态 SQL&#xff1f;二、 为什么需要动态 SQL&#xff1f;三、 MyBatis 动态 SQL 标签四、 标签详解及示例1、 if 标签2、 choose、when、otherwise 标签3、 where 标签4、 set 标签5、 foreach 标签6、 sql、include 标签 五、 总结 &#x1f31f;我的其他文…

阿里云服务器遭遇DDoS攻击有争议?

近年来&#xff0c;阿里云服务器频繁遭遇DDoS攻击的事件引发广泛争议。一方面&#xff0c;用户质疑其防御能力不足&#xff0c;导致服务中断甚至被迫进入“黑洞”&#xff08;清洗攻击流量的隔离机制&#xff09;&#xff0c;轻则中断半小时&#xff0c;重则长达24小时&#xf…

如何在Springboot的Mapper中轻松添加新的SQL语句呀?

在如今的软件开发界&#xff0c;Spring Boot可是非常受欢迎的框架哦&#xff0c;尤其是在微服务和RESTful API的构建上&#xff0c;真的是让人爱不释手&#xff01;今天&#xff0c;我们就来聊聊如何为Spring Boot项目中的Mapper添加新的SQL语句吧&#xff01;说起来&#xff0…

Qt 中 findChild和findChildren绑定自定义控件

在 Qt 中&#xff0c;findChild 和 findChildren 是两个非常实用的方法&#xff0c;用于在对象树中查找特定类型的子对象。这两个方法是 QObject 类的成员函数&#xff0c;因此所有继承自 QObject 的类都可以使用它们。当您需要查找并绑定自定义控件时&#xff0c;可以按照以下…

leecode第19天

15、三数之和 # 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c; # 同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 # 注意&#xff1a;答案中不可以包含重复…

2109. 向字符串添加空格

2109. 向字符串添加空格 题目链接&#xff1a;2109. 向字符串添加空格 代码如下&#xff1a; class Solution { public:string addSpaces(string s, vector<int>& spaces) {string res "";int j 0;//直接遍历即可for (int i 0;i < spaces.size();i…

Java Spring Boot 与前端结合打造图书管理系统:技术剖析与实现

目录 运行展示引言系统整体架构后端技术实现后端代码文件前端代码文件1. 项目启动与配置2. 实体类设计3. 控制器设计4. 异常处理 前端技术实现1. 页面布局与样式2. 交互逻辑 系统功能亮点1. 分页功能2. 搜索与筛选功能3. 图书操作功能 总结 运行展示 引言 本文将详细剖析一个基…

CSRF跨站请求伪造——入门篇【DVWA靶场low级别writeup】

CSRF跨站请求伪造——入门篇 0. 前言1. 什么是CSRF2. 一次完整的CSRF攻击 0. 前言 本文将带你实现一次完整的CSRF攻击&#xff0c;内容较为基础。需要你掌握的基础知识有&#xff1a; 了解cookie&#xff1b;已经安装了DVWA的靶场环境&#xff08;本地的或云的&#xff09;&am…

BT-Basic函数之首字母R

BT-Basic函数之首字母R 文章目录 BT-Basic函数之首字母Rrandomizercallremoterenamereportreport clearreport fault syndromereport isreport level isreport outreport usingre‑savere‑storereturnrevision$rexitrinitrli$rndrotaterpmcrpsrun randomize 以下是这段英文的…