Moonshot AI 新突破:MoBA 为大语言模型长文本处理提效论文速读
前言
在自然语言处理领域,随着大语言模型(LLMs)不断拓展其阅读、理解和生成文本的能力,如何高效处理长文本成为一项关键挑战。近日,Moonshot AI Research 联合清华大学、浙江大学的研究人员提出了一种创新方法 —— 混合块注意力机制(Mixture of Block Attention,MoBA),它将专家混合(Mixture of Experts,MoE)原理应用于注意力机制,为解决长文本处理难题带来了新的思路。
在 Transformer 架构广泛应用的当下,其注意力机制存在明显弊端。在处理长文本时,传统注意力机制需将每个 token 与其他所有 token 进行比较,这使得计算成本随序列长度呈二次方增长。当模型处理长篇文档、多章书籍、法律简报或大型代码库等包含大量文本信息的任务时,这种计算成本会变得难以承受。此前,为解决这一问题,研究人员尝试过多种方法。例如,滑动窗口机制将 token 限制在局部邻域内,虽降低了计算量,但会忽略重要的全局关系;而一些彻底改变基本架构的方法,如用全新结构替代 softmax 注意力机制,往往需要从头开始重新训练模型,难以利用现有的预训练成果。
核心原理
MoBA 的出现有效弥补了上述方法的不足。它的核心在于将输入划分为易于管理的 “块”,并借助可训练的门控系统来确定每个查询 token 相关的块。这种设计遵循 “少结构” 原则,不预先定义哪些 token 应该相互作用,而是由学习到的门控网络做出决策。与固定结构或近似处理的方法不同,MoBA 能让模型自主学习注意力的聚焦点。而且,MoBA 可与现有的基于 Transformer 的模型无缝协作,它作为一种 “插件” 或替代方案,保持与原模型相同的参数数量,避免架构膨胀,同时保留因果掩码,确保自回归生成的准确性。在实际应用中,MoBA 能在稀疏注意力和全注意力之间灵活切换。处理超长输入时,稀疏注意力可提升速度;而在训练的某些层或阶段,若需要全注意力,模型也能切换回标准模式。
从技术细节来看,MoBA 将上下文划分为多个块,每个块包含连续的 token 序列。门控机制通过比较查询 token 与块的池化键表示,计算查询 token 与每个块之间的 “亲和度” 分数,然后选择得分最高的块。这样,只有最相关块中的 token 才会对最终的注意力分布产生影响。同时,包含查询 token 本身的块始终被纳入,以确保局部上下文信息可访问。并且,MoBA 执行因果掩码,防止 token 关注未来位置,维持从左到右的自回归属性。这种基于块的方法大幅减少了 token 比较次数,使计算规模低于二次方,随着上下文长度增加到数十万甚至数百万个 token,效率提升愈发显著。此外,MoBA 与现代加速器和专用内核兼容性良好。研究人员将 MoBA 与 FlashAttention(一种高性能的快速、内存高效的精确注意力库)相结合,根据所选块对查询 - 键 - 值操作进行精心分组,进一步优化了计算流程。实验数据显示,在处理一百万个 token 时,MoBA 相比传统全注意力机制速度提升约 6 倍,凸显了其在实际应用中的优势。
在性能测试方面,MoBA 表现出色。技术报告显示,在多种任务中,MoBA 的性能与全注意力机制相当,但在处理长序列时可显著节省计算资源。在语言建模数据测试中,当序列长度为 8192 或 32768 个 token 时,MoBA 的困惑度与全注意力 Transformer 相近。更为关键的是,当研究人员将上下文长度逐渐扩展到 128000 及更长时,MoBA 仍能保持强大的长上下文理解能力。在 “尾随 token” 评估中,MoBA 能够有效处理长提示末尾附近的 token 预测任务,且预测质量没有明显下降。研究人员还对 MoBA 的块大小和门控策略进行了敏感性探索。实验表明,细化粒度(使用更小的块但选择更多的块)有助于模型更接近全注意力的效果。即使在忽略大部分上下文的情况下,自适应门控也能识别与查询真正相关的块。此外,“混合” 模式展现出一种平衡策略:部分层继续使用 MoBA 提升速度,少数层则恢复全注意力。这种混合方法在监督微调任务中尤为有益,例如当输入中的某些位置在训练目标中被屏蔽时,保留少数上层的全注意力,可使模型保持广泛的上下文覆盖,有助于需要全局视角的任务。
关键代码分析:
以下是对 MoBA 库关键代码 MixedAttention
类的分析以及关键代码的摘录与注释:
整体分析
MixedAttention
类是一个自定义的 torch.autograd.Function
,用于实现混合块注意力机制。这个类主要包含两个静态方法:forward
和 backward
,分别用于前向传播和反向传播。
class MixedAttention(torch.autograd.Function):# 前向传播函数@staticmethoddef forward(ctx,q, # 查询张量k, # 键张量v, # 值张量self_attn_cu_seqlen, # 自注意力累积序列长度moba_q, # MoBA 查询张量moba_kv, # MoBA 键值张量moba_cu_seqlen_q, # MoBA 查询累积序列长度moba_cu_seqlen_kv, # MoBA 键值累积序列长度max_seqlen, # 最大序列长度moba_chunk_size, # MoBA 块大小moba_q_sh_indices, # MoBA 查询块索引):# 保存一些参数,用于后续的反向传播ctx.max_seqlen = max_seqlenctx.moba_chunk_size = moba_chunk_sizectx.softmax_scale = softmax_scale = q.shape[-1] ** (-0.5)# 自注意力计算_, _, _, _, self_attn_out_sh, self_attn_lse_hs, _, _ = (_flash_attn_varlen_forward(q=q,k=k,v=v,cu_seqlens_q=self_attn_cu_seqlen,cu_seqlens_k=self_attn_cu_seqlen,max_seqlen_q=max_seqlen,max_seqlen_k=max_seqlen,softmax_scale=softmax_scale,causal=True,dropout_p=0.0,))# MoBA 注意力计算_, _, _, _, moba_attn_out, moba_attn_lse_hs, _, _ = _flash_attn_varlen_forward(q=moba_q,k=moba_kv[:, 0],v=moba_kv[:, 1],cu_seqlens_q=moba_cu_seqlen_q,cu_seqlens_k=moba_cu_seqlen_kv,max_seqlen_q=max_seqlen,max_seqlen_k=moba_chunk_size,softmax_scale=softmax_scale,causal=False,dropout_p=0.0,)# 转换 lse 形状,从 hs 转换为 sh(遵循传统混合注意力逻辑)self_attn_lse_sh = self_attn_lse_hs.t().contiguous()moba_attn_lse = moba_attn_lse_hs.t().contiguous()# 初始化输出缓冲区,形状与 q 相同output = torch.zeros((q.shape[0], q.shape[1], q.shape[2]), device=q.device, dtype=torch.float32)# 将输出张量展平为二维,便于后续索引操作output_2d = output.view(-1, q.shape[2])# 计算混合 lse# 减去最大 lse 以避免指数爆炸max_lse_1d = self_attn_lse_sh.view(-1)max_lse_1d = max_lse_1d.index_reduce(0, moba_q_sh_indices, moba_attn_lse.view(-1), "amax")self_attn_lse_sh = self_attn_lse_sh - max_lse_1d.view_as(self_attn_lse_sh)moba_attn_lse = (moba_attn_lse.view(-1).sub(max_lse_1d.index_select(0, moba_q_sh_indices)).reshape_as(moba_attn_lse))# 计算自注意力和 MoBA 注意力的 softmax 结果mixed_attn_se_sh = self_attn_lse_sh.exp()moba_attn_se = moba_attn_lse.exp()# 将 MoBA 注意力结果累加到自注意力结果上mixed_attn_se_sh.view(-1).index_add_(0, moba_q_sh_indices, moba_attn_se.view(-1))mixed_attn_lse_sh = mixed_attn_se_sh.log()# 加权自注意力输出factor = (self_attn_lse_sh - mixed_attn_lse_sh).exp() # [ vS, H ]self_attn_out_sh = self_attn_out_sh * factor.unsqueeze(-1)output_2d += self_attn_out_sh.reshape_as(output_2d)# 加权 MoBA 输出mixed_attn_lse = (mixed_attn_lse_sh.view(-1).index_select(0, moba_q_sh_indices).view_as(moba_attn_lse))factor = (moba_attn_lse - mixed_attn_lse).exp() # [ vS, H ]moba_attn_out = moba_attn_out * factor.unsqueeze(-1)raw_attn_out = moba_attn_out.view(-1, moba_attn_out.shape[-1])output_2d.index_add_(0, moba_q_sh_indices, raw_attn_out)# 将输出转换为与输入相同的数据类型output = output.to(q.dtype)# 恢复最大 lsemixed_attn_lse_sh = mixed_attn_lse_sh + max_lse_1d.view_as(mixed_attn_se_sh)# 保存中间结果,用于反向传播ctx.save_for_backward(output,mixed_attn_lse_sh,q,k,v,self_attn_cu_seqlen,moba_q,moba_kv,moba_cu_seqlen_q,moba_cu_seqlen_kv,moba_q_sh_indices,)return output# 反向传播函数@staticmethoddef backward(ctx, d_output):# 从上下文中获取保存的参数max_seqlen = ctx.max_seqlenmoba_chunk_size = ctx.moba_chunk_sizesoftmax_scale = ctx.softmax_scale(output,mixed_attn_vlse_sh,q,k,v,self_attn_cu_seqlen,moba_q,moba_kv,moba_cu_seqlen_q,moba_cu_seqlen_kv,moba_q_sh_indices,) = ctx.saved_tensors# 确保输入梯度连续d_output = d_output.contiguous()# 计算自注意力的梯度dq, dk, dv, _ = _flash_attn_varlen_backward(dout=d_output,q=q,k=k,v=v,out=output,softmax_lse=mixed_attn_vlse_sh.t().contiguous(),dq=None,dk=None,dv=None,cu_seqlens_q=self_attn_cu_seqlen,cu_seqlens_k=self_attn_cu_seqlen,max_seqlen_q=max_seqlen,max_seqlen_k=max_seqlen,softmax_scale=softmax_scale,causal=True,dropout_p=0.0,window_size=(-1, -1),softcap=0.0,alibi_slopes=None,deterministic=True,)# 计算 MoBA 注意力的梯度headdim = q.shape[-1]d_moba_output = (d_output.view(-1, headdim).index_select(0, moba_q_sh_indices).unsqueeze(1))moba_output = (output.view(-1, headdim).index_select(0, moba_q_sh_indices).unsqueeze(1))mixed_attn_vlse = (mixed_attn_vlse_sh.view(-1).index_select(0, moba_q_sh_indices).view(1, -1))dmq, dmk, dmv, _ = _flash_attn_varlen_backward(dout=d_moba_output,q=moba_q,k=moba_kv[:, 0],v=moba_kv[:, 1],out=moba_output,softmax_lse=mixed_attn_vlse,dq=None,dk=None,dv=None,cu_seqlens_q=moba_cu_seqlen_q,cu_seqlens_k=moba_cu_seqlen_kv,max_seqlen_q=max_seqlen,max_seqlen_k=moba_chunk_size,softmax_scale=softmax_scale,causal=False,dropout_p=0.0,window_size=(-1, -1),softcap=0.0,alibi_slopes=None,deterministic=True,)# 合并 MoBA 的键和值的梯度dmkv = torch.stack((dmk, dmv), dim=1)return dq, dk, dv, None, dmq, dmkv, None, None, None, None, None
代码关键部分解释
-
前向传播 (
forward
):- 分别计算自注意力和 MoBA 注意力的结果。
- 对注意力分数进行处理,包括形状转换、归一化等操作,以避免指数爆炸。
- 将自注意力和 MoBA 注意力的结果进行加权合并,得到最终的输出。
- 保存中间结果,用于后续的反向传播。
-
反向传播 (
backward
):- 根据前向传播保存的中间结果,计算自注意力和 MoBA 注意力的梯度。
- 最终返回各个输入张量的梯度。
小结
通过这种方式,MixedAttention
类实现了 MoBA 混合块注意力机制,通过将上下文划分为块并进行选择性的注意力计算,有效减少了计算量,提升了处理长文本的效率。
总结
总体而言,MoBA 非常适合处理涉及大量上下文的任务,如长篇文档阅读理解、大规模代码补全以及需要完整对话历史的多轮对话系统。它在提高效率的同时,性能损失极小,为大规模训练大语言模型提供了一种极具吸引力的方法。虽然目前 MoBA 主要应用于文本领域,但研究人员认为,其底层机制在其他数据模态中也具有应用潜力。只要序列长度足够长,引发计算或内存问题,将查询分配给块 “专家” 的思路就有望缓解瓶颈,同时保持处理关键全局依赖关系的能力。随着语言应用中的序列长度持续增长,像 MoBA 这样的方法可能会在推动神经语言建模的可扩展性和成本效益方面发挥关键作用,为人工智能的发展注入新的活力。
相关文章:
Moonshot AI 新突破:MoBA 为大语言模型长文本处理提效论文速读
前言 在自然语言处理领域,随着大语言模型(LLMs)不断拓展其阅读、理解和生成文本的能力,如何高效处理长文本成为一项关键挑战。近日,Moonshot AI Research 联合清华大学、浙江大学的研究人员提出了一种创新方法 —— 混…...
vue2 和 vue3 中 computer 计算属性的用法
Vue 2 中的 computed 在 Vue 2 中,计算属性是响应式的,并且基于 getter 进行缓存,只有依赖的响应式数据发生变化时才会重新计算。 基本用法 <template><div><p>原始消息:{{ message }}</p><p>反…...
Python爬虫入门到精通:从零开始的数据采集之旅
一、网络世界的"小蜘蛛":什么是爬虫? 想象一下,你是一只勤劳的小蜘蛛,每天在互联网这张巨大的网上爬来爬去。你不需要自己织网,只需要顺着别人织好的网络路径,把有价值的信息收集到自己的小篮子里。这就是爬虫最形象的比喻——一个自动化的信息采集程序。 Py…...
Python+Selenium+Pytest+POM自动化测试框架封装
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 1、测试框架简介 1)测试框架的优点 代码复用率高,如果不使用框架的话,代码会显得很冗余。可以组装日志、报告、邮件等一些高…...
【JMeter使用-2】JMeter中Java Request采样器的使用指南
Apache JMeter 是一款功能强大的性能测试工具,支持多种协议和测试场景。除了内置的采样器(如HTTP请求、FTP请求等),JMeter还允许通过 Java Request采样器 调用自定义的Java代码,从而实现更复杂的测试逻辑。本文将详细介…...
IntelliJ IDEA中Maven配置全指南
一、环境准备与基础配置 1.1 Windows 环境下载并配置 Maven 见此篇博文:环境配置 1.2 IDEA配置步骤 打开设置面板:File → Settings → Build → Build Tools → Maven 关键配置项: Maven home path E:\apache-maven-3.9.9 (…...
自学Java-AI结合GUI开发一个石头迷阵的游戏
自学Java-AI结合GUI开发一个石头迷阵的游戏 准备环节1、创建石头迷阵的界面2、打乱顺序3、控制上下左右移动4、判断是否通关5、统计移动步骤,重启游戏6、拓展问题 准备环节 技术: 1、GUI界面编程 2、二维数组 3、程序流程控制 4、面向对象编程 ∙ \bulle…...
NetLogon 权限提升漏洞
参考文章:CVE-2020-1472NetLogon权限提升漏洞_cve-2020-1472复现 谢公子-CSDN博客 域控机器账户:WIN-0V0GAORDC17 域控 ip:192.168.72.163 域内攻击者机器 ip:192.168.72.158,host:WIN10-01 攻击者 kali…...
UDP和TCP
UDP协议 报文中应该包含 源IP,源端口号目的IP,目的端口号UDP/TCP 一个进程是否可以绑定多个端口号? 可以。多个进程是否可以绑定一个端口号? 不可以,因为端口号的主要作用是唯一标识一台计算机上的一个特定服务或应…...
2025 年 1 月公链行业研报:比特币主导地位强化
2025 年 1 月公链行业研报 作者:Stella L (stellafootprint.network) 数据来源:Footprint Analytics 公链研究页面 2025 年 1 月,加密市场总市值增长 7.2% 至 2.8 万亿美元,主要区块链平台表现分化。在新的监管政策与人工智能基…...
在低功耗MCU上实现人工智能和机器学习
作者:Silicon Labs 人工智能(AI)和机器学习(ML)技术不仅正在快速发展,还逐渐被创新性地应用于低功耗的微控制器(MCU)中,从而实现边缘AI/ML解决方案。这些MCU是许多嵌入式…...
新数据结构(11)——Java类的产生和反射
反射是获取类信息的一种能力 类信息包括属性、方法、构造器、父类、接口等 类信息的来源 来自类的加载器,这是从.class文件到内存中的java虚拟器(JVM)中间的一个阶段(如下图) 类的加载器里,用Field数组存…...
智能网络感知,打造极致流畅的鸿蒙原生版中国移动云盘图文体验
背景 中国移动云盘(原“和彩云网盘”)是中国移动重磅推出的安全、智能、不限速、移动用户免流的智能云盘,致力于成为5G时代用户个人与家庭的数字资产管理中心,是中国移动继语音、短信、流量后的“第四项基础服务”。 照片、音视…...
MySQL查看视图
《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了的博客-CSDN博客 查看视图是查看数据库中已存在的视图的定义。查看视图必须要有SHOW VIE…...
量子计算的基本运算:Hadamard 门、CNOT 门、Pauli 门详解
量子计算是现代计算科学的前沿领域,它与经典计算机在处理信息的方式上有着本质的区别。量子计算机利用量子比特(qubit)的叠加态和量子纠缠等特性来进行计算,从而在某些特定任务上超越传统计算机。量子计算的核心运算单元是量子门,它们通过作用于量子比特来操控量子状态。本…...
java(spring boot)实现向deepseek/GPT等模型的api发送请求/多轮对话(附源码)
我们再启动应用并获取api密钥后就可以对它发送请求了,但是官方文档对于如何进行多轮对话以及怎么自定义参数并没有说的很清楚,给的模板也没有java的,因此我们需要自己实现。 import org.json.JSONArray; import org.json.JSONObject;import j…...
Flask flash() 消息示例
目录 安装 Flask 入门:Flask flash() 基本示例 进阶:使用 Flask-WTF Flash 登录结果消息 详解:get_flashed_messages() 详解:flash() 消息的完整生命周期 Flask 提供 flash() 用于向 用户传递临时消息,通常用于: • 表单提交成功或失败 • 用户登录、注册、退出提…...
ubuntu环境编译ffmepg支持nvidia显卡加速
文章目录 1. 安装NVIDIA驱动2. 安装CUDA&NV-CODEC2.1 安装CUDA2.2 安装NV-CODEC 3. 编译ffmpeg3.1 安装依赖3.2 下载源码安装依赖3.3 验证 4. 使用 1. 安装NVIDIA驱动 安装依赖包 sudo apt install -y ubuntu-drivers-common编辑 /etc/modprobe.d/blacklist-nouveau.conf 文…...
C++类与对象深度解析(一):从引用、内联函数到构造析构的编程实践
目录 一.引用 引用的特征:1.引用必须初始化 2.本质是别名 3.函数参数传递 4.常引用 5.函数返回值 6.权限 放大 缩小 平移 引用 vs 指针 二.内联函数 关键点说明 三.宏函数 四.类 什么是类? 简单的类 五.构造函数与析构函数 1. 构造函数&…...
SpringCloud-使用FFmpeg对视频压缩处理
在现代的视频处理系统中,压缩视频以减小存储空间、加快传输速度是一项非常重要的任务。FFmpeg作为一个强大的开源工具,广泛应用于音视频的处理,包括视频的压缩和格式转换等。本文将通过Java代码示例,向您展示如何使用FFmpeg进行视…...
Pytorch实现之粒子群优化算法在GAN中的应用
简介 简介:主要是采用了粒子群优化(PSO)算法来优化GAN的一个训练。PSO是一种是一种基于种群的随机优化技术。这种优化技术是通过粒子群进行的,粒子群在每次迭代中都会更新自己。对于给定的目标函数,这种方法利用一个搜索空间,在那里粒子群移动,找到所需的全局最小值。这…...
http+nginx
HTTP协议:超文本传输协议,Hyper Text transfer protocol(发明者:蒂姆.伯纳斯.李) 1.超文本 包含超链接(link)和各种多媒体元素的文本,这些超文本文件彼此相连,形成网状(web&…...
网络运维学习笔记 014网工初级(HCIA-Datacom与CCNA-EI)ACL访问控制列表
文章目录 ACL(Access Control List,访问控制列表)思科:实验1(标准ACL):实验2(扩展ACL):实验3(ACL在VTY的使用场景): 华为&…...
002 SpringCloudAlibaba整合 - Feign远程调用、Loadbalancer负载均衡
前文地址: 001 SpringCloudAlibaba整合 - Nacos注册配置中心、Sentinel流控、Zipkin链路追踪、Admin监控 文章目录 8.Feign远程调用、loadbalancer负载均衡整合1.OpenFeign整合1.引入依赖2.启动类添加EnableFeignClients注解3.yml配置4.日志配置5.远程调用测试6.服务…...
机器视觉检测中,2D面阵相机和线扫相机的区别
2D面阵相机和线扫相机是工业视觉系统中常用的两种相机类型,各有其特点和应用场景。 2D面阵相机 特点: 成像方式:通过二维传感器一次性捕捉整个场景的图像。 分辨率:分辨率由传感器的像素数决定,常见的有百万像素到几千…...
解锁观察者模式:Java编程中的高效事件管理之道
系列文章目录 后续补充~~~ 文章目录 一、引言:探索观察者模式的奥秘二、观察者模式的核心原理2.1 模式定义与概念2.2 关键角色剖析2.3 工作机制深度解析 三、观察者模式在 Java 中的实现3.1 手动实现观察者模式3.2 使用 JDK 内置的观察者模式3.3 代码示例解析与对比…...
Ubuntu编译ZLMediaKit
下载 git clone https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit git submodule update --init安装工具 sudo apt install -y build-essential sudo apt install -y gcc g sudo apt install -y cmakesudo apt install -y build-essential cmake git libssl-dev libsdl1.…...
全面指南:使用JMeter进行性能压测与性能优化(中间件压测、数据库压测、分布式集群压测、调优)
目录 一、性能测试的指标 1、并发量 2、响应时间 3、错误率 4、吞吐量 5、资源使用率 二、压测全流程 三、其他注意点 1、并发和吞吐量的关系 2、并发和线程的关系 四、调优及分布式集群压测(待仔细学习) 1.线程数量超过单机承载能力时的解决…...
鸿蒙初学者学习手册(HarmonyOSNext_API14)_自定义动画API(@ohos.animator (动画) )
前言 在纯血鸿蒙中最具有用户特色的效果就是自定义的动画效果。在纯血鸿蒙中有多种定义方式,但是今天介绍的是ApI中的自定义动画。 注意: 动画本身具有生命周期,但是不支持在UIAbility的文件使用,简单而言就是不允许在UIAbility生命周期中…...
Grok 3.0 Beta 版大语言模型评测
2025年2月17日至18日,全球首富埃隆马斯克(Elon Musk)携手其人工智能公司xAI,在美国重磅发布了Grok 3.0 Beta版。这款被誉为“迄今为止世界上最智能的语言模型”的AI,不仅集成了先进的“DeepSearch”搜索功能࿰…...
IDEA中查询Maven项目的依赖树
在Maven项目中,查看项目的依赖树是一个常见的需求,特别是当你需要了解项目中直接或间接依赖了哪些库及其版本时。你可以通过命令行使用Maven的dependency:tree插件来做到这一点。这个命令会列出项目中所有依赖的树状结构。 打开idea项目的终端ÿ…...
学习aigc
DALLE2 论文 Hierarchical Text-Conditional Image Generation with CLIP Latents [2204.06125] Hierarchical Text-Conditional Image Generation with CLIP LatentsAbstract page for arXiv paper 2204.06125: Hierarchical Text-Conditional Image Generation with CLIP L…...
springboot整合mybatis-plus【详细版】
目录 一,简介 1. 什么是mybatis-plus2.mybatis-plus特点 二,搭建基本环境 1. 导入基本依赖:2. 编写配置文件3. 创建实体类4. 编写controller层5. 编写service接口6. 编写service层7. 编写mapper层 三,基本知识介绍 1. 基本注解 T…...
【2024 CSDN博客之星】大学四年,我如何在CSDN实现学业与事业的“双逆袭”?
前言: Hello大家好,我是Dream。不知不觉2024年已经过去,自己也马上迈入23岁,感慨时间飞快,从19岁刚入大学加入CSDN,到现在大学毕业已经整整四年了。CSDN陪伴我走过了最青涩的四年大学时光,在这里…...
在VS中通过vcpkg包管理器来安装使用qt5
常用指令 .\vcpkg install 库名 .\vcpkg install 库名版本号.\vcpkg install 库名 --trip x86-windows.\vcpkg list.\vcpkg search 库名 .\vcpkg x-all-installed --7zip PS G:\vcpkg> .\vcpkg help usage: vcpkg <command> [--switches] [--optionsvalues] [argume…...
【C++篇】树影摇曳,旋转无声:探寻AVL树的平衡之道
文章目录 从结构到操作:手撕AVL树的实现一、AVL树介绍1.1 什么是AVL树1.2 平衡因子的定义1.3 平衡的意义1.4 AVL树的操作 二、AVL树的节点结构2.1 节点结构的定义: 三、插入操作3.1 插入操作概述3.2 步骤1:按二叉查找树规则插入节点3.3 步骤2…...
CPU、SOC、MPU、MCU--详细分析四者的区别
一、CPU 与SOC的区别 1.CPU 对于电脑,我们经常提到,处理器,内存,显卡,硬盘四大部分可以组成一个基本的电脑。其中的处理器——Central Processing Unit(中央处理器)。CPU是一台计算机的运算核…...
nacos编写瀚高数据库插件
1、下载nacos源码 git clone gitgithub.com:alibaba/nacos.git 2、引入瀚高驱动 <dependency><groupId>com.highgo</groupId><artifactId>jdbc</artifactId><version>${highgo.version}</version></dependency> 3、DataSource…...
使用excel中的VBA合并多个excel文件
需求是这样的: 在Windows下,用excel文件让多个小组填写了统计信息,现在我需要把收集的多个文件汇总到一个文件中,前三行为标题可以忽略,第四行为收集信息的列名,处理每一行数据的时候,发现某一行…...
linux 安装启动zookeeper全过程及遇到的坑
1、下载安装zookeeper 参考文章:https://blog.csdn.net/weixin_48887095/article/details/132397448 2、启动失败 1、启动失败JAVA_HOME is not set and java could not be found in PATH 已安装 JAVA 配置了JAVA_HOME,还是报错解决方法:参考…...
JAVA JUC 并发编程学习笔记(一)
文章目录 JUC进程概述对比 线程创建线程ThreadRunnableCallable 线程方法APIrun startsleep yieldjoininterrupt打断线程打断 park终止模式 daemon不推荐 线程原理运行机制线程调度未来优化 线程状态查看线程 同步临界区syn-ed使用锁同步块同步方法线程八锁 锁原理Monitor字节码…...
内容中台架构下智能推荐系统的算法优化与分发策略
内容概要 在数字化内容生态中,智能推荐系统作为内容中台的核心引擎,承担着用户需求与内容资源精准匹配的关键任务。其算法架构的优化路径围绕动态特征建模与多模态数据融合展开,通过深度强化学习技术实现用户行为特征的实时捕捉与动态更新&a…...
Java 内存区域详解
1 常见面试题 1.1 基本问题 介绍下Java内存区域(运行时数据区)Java对象的创建过程(五步,建议能够默写出来并且要知道每一步虚拟机做了什么)对象的访问定位的两种方式(句柄和直接指针两种方式)…...
jEasyUI 创建学校课程表
jEasyUI 创建学校课程表 引言 随着信息技术的飞速发展,教育行业也迎来了数字化转型的浪潮。学校课程表的创建和管理作为教育信息化的重要组成部分,其效率和准确性直接影响到学校的教学秩序。jEasyUI,作为一款优秀的开源UI框架,凭借其易用性、灵活性和丰富的组件,成为了许…...
利用 OpenCV 进行棋盘检测与透视变换
利用 OpenCV 进行棋盘检测与透视变换 1. 引言 在计算机视觉领域,棋盘检测与透视变换是一个常见的任务,广泛应用于 摄像机标定、文档扫描、增强现实(AR) 等场景。本篇文章将详细介绍如何使用 OpenCV 进行 棋盘检测,并…...
git-提交时间和作者时间的区别
1.介绍 定义介绍 提交时间(Committer Date):决定了提交在 Git 历史中的位置,通常影响 GitHub 上提交显示的顺序。 作者时间(Author Date):虽然不影响提交的排序,但在每个提交详情页…...
解决双系统开机显示gnu grub version 2.06 Minimal BASH Like Line Editing is Supported
找了好多教程都没有用,终于解决了!!我是因为ubuntu分区的时候出问题了 问题描述: 双系统装好,隔天开机找不到引导项,黑屏显示下列 因为我用的D盘划分出来的部分空闲空间,而不是全部,…...
基于Flask的京东商品信息可视化分析系统的设计与实现
【Flask】基于Flask的京东商品信息可视化分析系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 系统能够灵活地执行SQL查询,提取出用于分析的关键数据指标。为了将这…...
期权帮|股指期货中的套期保值如何操作?
锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 股指期货中的套期保值如何操作? 一、股指期货中的套期保值准备阶段 确定套保需求,投资者依据市场预判与投资组合分析,决定是否套保。 &…...
用Chrome Recorder轻松完成自动化测试脚本录制
前言 入门自动化测试,录制回放通常是小白测试首先用到的功能。而录制回放工具也一直是各大Web自动化测试必然会着重提供的一块功能。 早期WinRunner、QTP这样的工具,自动化测试可以说是围绕录制回放开展的。近年像Selenium也提供有录制工具 Selenium IDE,Playwright也包含…...