Llama 3.1 技术研究报告-2

3.3 基础设施、扩展性和效率

我们描述了⽀持Llama 3 405B⼤规模预训练的硬件和基础设施,并讨论了⼏项优化措施,这些措施提⾼了训练效率。

3.3.1 训练基础设施

Llama 1和2模型在Meta的AI研究超级集群(Lee和Sengupta,2022)上进⾏了训练。随着我们进⼀步扩展,Llama 3的训练迁移到了Meta的⽣产集群(Lee等⼈,2024)。此设置优化了⽣产级别的可靠性,这对于我们扩⼤训练⾄关重要。
在这里插入图片描述

计算。Llama3 405B在⾼达16K的H100 GPU上进⾏训练,每个GPU运⾏在700W TDP下,配备80GB HBM3,使⽤Meta的Grand Teton AI服务器平台(Matt Bowman,2022)。每个服务器配备有⼋个GPU和两个CPU。在服务器内部,这⼋个GPU通过NVLink连接。使⽤MAST(Choudhury等⼈,2024),Meta的全球规模训练调度器,来安排训练作业。

存储。Tectonic(Pan等⼈,2021),Meta的通⽤分布式⽂件系统,⽤于为Llama 3预训练构建存储⽹络(Battey和Gupta,2024)。它提供了7,500个配备SSD的服务器上的240PB存储空间,并⽀持2TB/s的可持续吞吐量和7TB/s的峰值吞吐量。⼀个主要挑战是⽀持在短时期间饱和存储⽹络的⾼突发性检查点写操作。检查点保存每个GPU的模型状态,每个GPU的范围从1MB到4GB,⽤于恢复和调试。我们的⽬标是最⼩化检查点期间GPU的暂停时间,并增加检查点频率,以减少恢复后丢失的⼯作量。

⽹络。Llama 3 405B使⽤了基于Arista 7800和Minipack2开放计算项⽬OCP机架交换机的RDMA over Converged Ethernet (RoCE)⽹络。Llama 3系列中较⼩的模型使⽤Nvidia Quantum2 Infiniband⽹络进⾏训练。RoCE和Infiniband集群都在GPU之间利⽤400Gbps的互连。尽管这些集群的底层⽹络技术存在差异,但我们调整了它们,以便为这些⼤型训练⼯作负载提供等效的性能。由于我们完全拥有RoCE⽹络的设计,我们将更详细地阐述我们的RoCE⽹络。

网络拓扑。我们的基于RoCE的AI集群由24K GPU组成,通过三层Clos⽹络连接(Lee等⼈,2024)。在底层,每个机架托管16个GPU,分成两台服务器,并通过单个Minipack2机架顶部(ToR)交换机连接。在中层,192个这样的机架通过集群交换机连接,形成⼀个拥有3,072个GPU的pod,具有完整的双⼯带宽,确保没有过订。在顶层,同⼀数据中⼼⼤楼内的⼋个这样的pod通过聚合交换机连接,形成⼀个24K GPU的集群。然⽽,在聚合层的⽹络连接没有保持完整的双⼯带宽,⽽是有⼀个1:7的过订⽐率。我们的模型并⾏⽅法(⻅第3.3.2节)和训练作业调度器(Choudhury等⼈,2024)都针对⽹络拓扑进⾏了优化,旨在最⼩化跨pod的⽹络通信。

负载均衡。⼤型语⾔模型(LLM)训练产⽣的⽹络流量很⼤,这使得使⽤传统的如等价成本多路径(ECMP)路由⽅法在所有可⽤⽹络路径上进⾏负载均衡变得困难。为了应对这⼀挑战,我们采⽤了两种技术。⾸先,我们的集合库创建了16个⽹络流进⾏负载均衡。其次,我们增强的ECMP(E-ECMP)协议通过在RoCE数据包头部的额外字段上进⾏哈希处理,有效地在不同⽹络路径上平衡了这16个流。
在这里插入图片描述

拥塞控制。我们在主⼲⽹上使⽤了深度缓冲交换机(Gangidi等⼈,2024年),以适应由集合通信模式引起的瞬态拥塞和缓冲。这种设置有助于限制由慢服务器引起的持续拥塞和⽹络反压的影响,这在训练中很常⻅。最后,通过E-ECMP实现的更好的负载均衡显著降低了拥塞的可能性。有了这些优化,我们成功地运⾏了⼀个24K GPU集群,⽽⽆需使⽤传统的拥塞控制⽅法,如数据中⼼量化拥塞通(DCQCN)。

3.3.2 模型扩展的并⾏性

为了扩展我们最⼤模型的训练,我们采⽤了4D并⾏性⸺结合四种不同类型的并⾏⽅法来切分模型。
这种⽅法有效地在多个GPU之间分配计算,并确保每个GPU的模型参数、优化器状态、梯度和激活能够适应其HBM。我们在图5中展⽰了4D并⾏性的实现。它结合了张量并⾏性(TP;Krizhevsky等⼈(2012年);Shoeybi等⼈(2019年);Korthikanti等⼈(2023年))、流⽔线并⾏性(PP;Huang等⼈(2019年);Narayanan等⼈(2021年);Lamy-Poirier(2023年))、上下⽂并⾏性(CP;Liu等⼈(2023年))和数据并⾏性(DP;Rajbhandari等⼈(2020年);Ren等⼈(2021年);Zhao等⼈(2023年))。

张量并⾏性将个别权重张量分割成不同设备上的多个块。流⽔线并⾏性通过层将模型垂直划分为不同的阶段,以便不同的设备可以并⾏处理完整模型流⽔线的不同阶段。上下⽂并⾏性将输⼊上下⽂分割成段,减少了⾮常⻓的序列⻓度输⼊的内存瓶颈。我们使⽤的是完全分⽚的数据并⾏性(FSDP;Rajbhandari等⼈,2020年;Ren等⼈,2021年;Zhao等⼈,2023年),它在实现数据并⾏性的同时,对模型、优化器和梯度进⾏分⽚,该数据并⾏性在多个GPU上并⾏处理数据,并在每个训练步骤后同步。我们在Llama 3中使⽤FSDP对优化器状态和梯度进⾏分⽚,但对于模型分⽚,在前向计算后我们不重新分⽚,以避免在反向传递期间产⽣额外的全收集通信。

GPU利⽤率。通过对并⾏配置、硬件和软件的精⼼调整,我们实现了表4所⽰配置的BF16模型FLOPs利⽤率(MFU;Chowdhery等⼈(2023年))为38-43%。在16K GPU上,当DP=128时MFU略有下降⾄41%,⽽8K GPU上DP=64时为43%,这是由于在训练期间需要保持每个批次的全局标记数恒定,因此每个DP组的批量⼤⼩需要降低。

流⽔线并⾏性改进我们在使⽤现有实现时遇到了⼏个挑战

批量⼤⼩限制。当前实现对每个GPU⽀持的批量⼤⼩有限制,要求它可以被流⽔线阶段的数量整除。例如,在图6中的流⽔线并⾏性的深度优先调度(DFS)中(Narayanan等⼈,2021年),需要N = PP = 4,⽽⼴度优先调度(BFS;Lamy-Poirier(2023年))需要N = M,其中M是微批次的总数,N是同⼀阶段的前向或后向的连续微批次的数量。然⽽,预训练通常需要调整批量⼤⼩的灵活性。

内存不平衡。现有的流⽔线并⾏性实现导致资源消耗不平衡。第⼀阶段由于嵌⼊和热⾝微批次⽽消耗更多的内存。

计算不平衡。在模型的最后⼀层之后,我们需要计算输出和损失,使这个阶段成为执⾏延迟的瓶颈。
在这里插入图片描述

为解决这些问题,我们修改了流⽔线调度计划,如图6所⽰,该计划允许灵活设置N⸺在本例中N=5,可以在每个批次中运⾏任意数量的微批次。这允许我们执⾏

(1) 当我们在⼤规模时有批量⼤⼩限制时,运⾏的微批次少于阶段数;或者(2) 运⾏更多的微批次以隐藏点对点通信,寻找DFS(深度优先调度)和BFS(⼴度优先调度)之间的最佳通信和内存效率的平衡点。为了平衡流⽔线,我们分别从第⼀和最后阶段各减少⼀个Transformer层。这意味着第⼀阶段的第⼀个模型块仅有嵌⼊层,⽽最后阶段的最后⼀个模型块仅有输出投影和损失计算。为了减少流⽔线泡沫,我们采⽤了交错调度(Narayanan等⼈,2021年),在⼀个流⽔线等级上使⽤V个流⽔线阶段。整体流⽔线泡沫⽐率是(PP−1)/V*M。

此外,我们在PP中采⽤异步点对点通信,这在⽂档掩码引⼊额外计算不平衡的情况下显著加快了训练速度。我们启⽤了TORCH_NCCL_AVOID_RECORD_STREAMS,以减少异步点对点通信的内存使⽤。

最后,为了减少内存成本,基于详细的内存分配分析,我们主动释放了未来计算中不会使⽤的张量,包括每个流⽔线阶段的输⼊和输出张量。通过这些优化,我们得以在不使⽤激活检查点的情况下对8K标记的Llama 3进⾏预训练。

⻓序列的上下⽂并⾏性。我们利⽤上下⽂并⾏性(CP)在扩展Llama 3的上下⽂⻓度时提⾼内存效率,并能够训练⻓达128K的极⻓序列。在CP中,我们跨序列维度进⾏分区,特别是我们将输⼊序列划分为2 × CP块,以便每个CP等级接收两个块以实现更好的负载平衡。第i个CP等级接收了第i个和第(2 × CP − 1 − i)个块。

与现有的在环状结构中重叠通信和计算的CP实现不同(Liu等⼈,2023年),我们的CP实现采⽤了基于all-gather的⽅法,我们⾸先all-gather关键(K)和值(V)张量,然后计算局部查询(Q)张量块的注意⼒输出。尽管all-gather通信延迟在关键路径上暴露出来,但我们仍然采⽤这种⽅法,主要有两个原因
(1) 在基于all-gather的CP注意⼒中,⽀持不同类型的注意⼒掩码(如⽂档掩码)更容易、更灵活;

(2) 由于使⽤了GQA(Ainslie等⼈,2023年),通信的K和V张量⽐Q张量⼩得多,因此暴露的all-gather延迟很⼩。因此,注意⼒计算的时间复杂度⽐all-gather⼤⼀个数量级(O(S^2)与O(S),其中S表⽰全因果掩码中的序列⻓度),使all-gather的开销可以忽略不计。
在这里插入图片描述

⽹络感知的并⾏配置。并⾏维度的顺序[TP, CP, PP, DP]针对⽹络通信进⾏了优化。最内层的并⾏需要最⾼的⽹络带宽和最低的延迟,因此通常限制在同⼀个服务器内。最外层的并⾏可以跨越多跳⽹络,并应能容忍更⾼的⽹络延迟。因此,基于对⽹络带宽和延迟的要求,我们按照[TP, CP, PP, DP]的顺序放置并⾏维度。DP(即FSDP)是最外层的并⾏,因为它可以通过异步预取分⽚模型权重和减少梯度来容忍更⻓的⽹络延迟。在避免GPU内存溢出的同时,找到最⼩化通信开销的最佳并⾏配置是具有挑战
性的。我们开发了⼀个内存消耗估计器和性能预测⼯具,帮助我们探索各种并⾏配置,并有效预测整体训练性能和识别内存缺⼝。

数值稳定性。通过⽐较不同并⾏设置之间的训练损失,我们解决了⼏个影响训练稳定性的数值问题。

为确保训练收敛性,我们在多个微批次的反向计算中使⽤FP32梯度累积,并在FSDP中跨数据并⾏⼯作器使⽤FP32进⾏reduce-scatter梯度。对于在前向计算中多次使⽤的中间张量,例如视觉编码器的输出,反向梯度也以FP32累积。

3.3.3 集体通信

我们的Llama 3集体通信库是基于Nvidia的NCCL库的⼀个分⽀,称为NCCLX。NCCLX显著提⾼了NCCL的性能,特别是对于⾼延迟⽹络。回想⼀下,平⾏维度的顺序是[TP, CP, PP, DP],其中DP对应于FSDP。最外层的平⾏维度,PP和DP,可能通过多跳⽹络进⾏通信,延迟⾼达数⼗微秒。原始的NCCL集合体⸺FSDP中的all-gather和reduce-scatter,以及PP中的点对点⸺需要数据分块和分阶段数据复制。这种⽅法存在⼏个效率问题,
包括(1)需要在⽹络上交换⼤量的⼩控制消息以促进数据传输,
(2)额外的内存复制操作,以及(3)使⽤额外的GPU周期进⾏通信。对于Llama 3训练,我们通过调整分块和数据传输以适应我们的⽹络延迟来解决这些效率问题的⼀个⼦集,这些延迟在⼤型集群中可能⾼达数⼗微秒。我们还允许⼩控制消息以更⾼的优先级穿越我们的⽹络,特别是避免在深缓冲核⼼交换机中被阻塞。我们为未来Llama版本进⾏的持续⼯作涉及在NCCLX中进⾏更深⼊的更改,以全⾯解决上述所有问题。
在这里插入图片描述

3.3.4 可靠性和运营挑战

16K GPU训练的复杂性和潜在故障场景超过了我们运营的更⼤的CPU集群。此外,训练的同步性质使其对故障的容忍度较低⸺单个GPU故障可能需要重启整个作业。尽管存在这些挑战,对于Llama 3,我们在⽀持⾃动化集群维护(如固件和Linux内核升级(Vigraham和Leonhardi,2024年))的同时,实现了超过90%的有效训练时间,这导致⾄少每天有⼀次训练中断。有效训练时间衡量的是流逝时间内⽤于有⽤训练的时间。

在预训练的54天快照期间,我们经历了总共466次作业中断。其中,47次是计划内的中断,由于⾃动化维护操作,如固件升级或操作员启动的操作,如配置或数据集更新。其余419次是意外的中断,在表5中有分类。约78%的意外中断归因于确认的硬件问题,如GPU或主机组件故障,或疑似与硬件相关的问题,如静默数据损坏和计划外的单个主机维护事件。GPU问题是最⼤的类别,占所有意外问题的58.7%。尽管失败数量众多,但在这段时间内,仅三次需要重⼤⼿动⼲预,其余问题由⾃动化处理。

为了增加有效训练时间,我们减少了作业启动和检查点时间,并开发了快速诊断和问题解决⼯具。我们⼴泛使⽤PyTorch内置的NCCL⻜⾏记录器(Ansel等⼈,2024年),这是⼀个捕捉集体元数据和堆栈跟踪到环形缓冲区的功能,因此允许我们在⼤规模上快速诊断挂起和性能问题,特别是与NCCLX相关的。利⽤这个,我们有效地记录了每个通信事件和每次集体操作的持续时间,并且在NCCLX看⻔狗或⼼跳超时时⾃动转储跟踪数据。我们通过在线配置更改(Tang等⼈,2015年)根据需要在⽣产中选
择性地启⽤更多计算密集型的跟踪操作和元数据收集,⽆需代码发布或作业重启。

调试⼤规模训练中的问题由于我们⽹络中混合使⽤NVLink和RoCE⽽变得复杂。

NVLink上的数据传输通常通过由CUDA内核发出的加载/存储操作进⾏,远程GPU或NVLink连接的故障通常表现为CUDA内核内的加载/存储操作停滞,⽽没有返回清晰的错误代码。NCCLX通过与PyTorch的紧密共同设计,提⾼了故障检测和定位的速度和准确性,允许PyTorch访问NCCLX的内部状态并跟踪相关信息。虽然由于NVLink故障引起的停滞⽆法完全防⽌,但我们的系统监控通信库的状态,并在检测到此类停滞时⾃动超时。此外,NCCLX跟踪每个NCCLX通信的内核和⽹络活动,并提供失败的NCCLX集体的内部状态的快照,包括所有等级之间已完成和待定的数据传输。我们分析这些数据以调试NCCLX扩展问题。

有时,硬件问题可能导致仍在运⾏但缓慢的落后者,这很难检测。即使是单个落后者也可以减慢数千个其他GPU的速度,通常表现为通信功能正常但速度慢。我们开发了⼯具,以优先处理选定进程组中可能存在问题的通信。通过仅调查少数⼏个头号嫌疑对象,我们通常能够有效地识别落后者。

⼀个有趣的观察是环境因素对⼤规模训练性能的影响。对于Llama 3 405B,我们注意到基于⼀天中的时间的⽇间1-2%的吞吐量变化。这种波动是由于中午更⾼的温度影响GPU动态电压和频率缩放所致。

在训练期间,数万个GPU可能同时增加或减少功耗,例如,由于所有GPU等待检查点或集体通信完成,或整个训练作业的启动或关闭。当这种情况发⽣时,它可能导致数据中⼼的功耗瞬间波动数⼗兆⽡,考验电⽹的极限。随着我们为未来的、甚⾄更⼤的Llama模型扩展训练,这是我们⾯临的⼀个持续挑战。

3.4 训练配方

⽤于预训练Llama 3 405B的配⽅包括三个主要阶段:
(1)初始预训练,
(2)⻓上下⽂预训练,以及
(3)退⽕。
下⾯分别描述这三个阶段。我们使⽤类似的配⽅来预训练8B和70B模型。

3.4.1 初始预训练

我们使⽤余弦学习率计划对Llama 3 405B进⾏预训练,峰值学习率为8 × 10^−5,线性预热8,000
步,然后在1,200,000个训练步骤中衰减到8 × 10^−7。我们在训练初期使⽤较⼩的批量⼤⼩以提⾼训
练稳定性,并随后增加它以提⾼效率。具体来说,我们最初的批量⼤⼩为4M个标记,序列⻓度为4,096,然后在预训练了252M个标记后,将这些值加倍到8M个标记,序列⻓度为8,192。
我们在预训练了2.87T个标记后再次将批量⼤⼩加倍到16M。我们发现这种训练配⽅⾮常稳定:我们观察到的损失峰值很少,并且不需要⼲预来纠正模型训练发散。

调整数据混合。在训练期间,我们对预训练数据混合进⾏了⼏次调整,以提⾼模型在特定下游任务上的性能。特别是,我们在预训练期间增加了⾮英语数据的百分⽐,以提⾼Llama 3的多语⾔性能。我们还上采样数学数据以提⾼模型的数学推理性能,我们在预训练的后期增加了更多最新的⽹络数据以推进模型的知识截⽌⽇期,并且我们对后来被识别为质量较低的预训练数据⼦集进⾏了下采样。

3.4.2 长上下文预训练

在预训练的最后阶段,我们对⻓序列进⾏训练,以⽀持⾼达128K个标记的上下⽂窗⼝。我们之所以没有提前对⻓序列进⾏训练,是因为⾃注意⼒层的计算在序列⻓度上呈⼆次⽅增⻓。我们逐步增加⽀持的上下⽂⻓度,直到模型成功适应增加的上下⽂⻓度。我们通过测量(1)模型在短上下⽂评估上的性能是否完全恢复,以及(2)模型是否能够完美解决⻓达那个⻓度的“针尖上的针”任务来评估成功的适应。在Llama 3 405B预训练中,我们从最初的8K上下⽂窗⼝开始,逐步增加了上下⽂⻓度,经过六个阶段,最终达到128K上下⽂窗⼝。这个阶段的⻓上下⽂预训练使⽤了⼤约800B个训练标记。 在这里插入图片描述

3.4.3 退火

在最后的40M个标记的预训练中,我们将学习率线性退⽕⾄0,同时保持上下⽂⻓度为128K个标记。在这个退⽕阶段,我们还调整了数据混合,以增加对极⾼质量数据源的采样;⻅第3.1.3节。最后,在退火期间,我们计算模型检查点(Polyak(1991年)平均)的平均值,以产⽣最终的预训练模型。

注:上述文章内容来自于LLama3.1的技术报告,本文是翻译文章!!!

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

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

相关文章

探索存内计算的未来,高能效内存计算实训专场有感~

写在前面,首先感谢活动方:存内计算开发者社区的邀请来参加本次探索存内计算的未来,高能效内存计算实训专场。下面我给大家分享一下本次的活动实操感受😀。 活动议程 本次活动邀请存内技术专家李阳老师分享存内计算是什么&#xf…

Subdominator:一款针对漏洞奖励计划的子域名安全枚举工具

关于Subdominator Subdominator是一款针对漏洞奖励计划的子域名安全枚举工具,可用于在漏洞搜寻和侦察过程中进行被动子域名枚举。它旨在通过高效枚举子域名和各种免费被动资源来帮助研究人员和网络安全专业人员发现潜在的安全漏洞。 Subdominator 与各种免费和付费…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-24

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-24 1. Enriching Datasets with Demographics through Large Language Models: What’s in a Name? K AlNuaimi, G Marti, M Ravaut, A AlKetbi, A Henschel… - arXiv preprint arXiv …, 2024 通过大型语言…

python获取百度地图路径规划

自制语音助手想做一个查询交通路线的功能,于是就想到了百度地图。在百度地图的服务器端应用中,提供了“轻量级路线规划”API接口,正好可以满足需求。要用这个接口,需要注册百度地图账号并创建一个服务器端的应用。有关开通百度地图…

Docekrfile和docker compose编写指南及注意事项

Dockerfile 基础语法 我们通过编写dockerfile,将每一层要做的事情使用语法固定下来,之后运行指令就可以通过docker来制作自己的镜像了。 构建镜像的指令:docker build /path -t imageName:tag 注意,docker build后的path必须是dockerfile…

Selenium与数据库结合:数据爬取与存储的技术实践

目录 一、Selenium与数据库结合的基础概念 1.1 Selenium简介 1.2 数据库简介 1.3 Selenium与数据库结合的优势 二、Selenium爬取数据的基本步骤 2.1 环境准备 2.2 编写爬虫代码 2.3 数据提取 2.4 异常处理 三、数据存储到数据库 3.1 数据库连接 3.2 数据存储 3.3 …

网络编程(10)——json序列化

十、day10 今天学习如何使用jsoncpp将json数据解析为c对象,将c对象序列化为json数据。jsoncp经常在网络通信中使用,也就是服务器和客户端的通信一般使用json(可视化好);而protobuf一般在服务器之间的通信中使用 json…

【YashanDB知识库】yashandb执行包含带oracle dblink表的sql时性能差

本文内容来自YashanDB官网,具体内容请见https://www.yashandb.com/newsinfo/7396959.html?templateId1718516 问题现象 yashandb执行带oracle dblink表的sql性能差: 同样的语句,同样的数据,oracle通过dblink访问远端oracle执行…

可视化服务编排:jvs-logic API出参加密实战教程

在现代软件开发与系统集成的过程中,API(应用程序接口)非常重要,它能使不同系统之间连接,进行数据交换和功能调用。当然,数据交换的数据安全肯定是不可忽视的,为了确保数据在传输过程中的保密性和…

虫情测报灯的工作原理

TH-CQ3】果园、森林等区域病虫害的实时监测、预警和科学管理。病虫害监测系统通常由以下几个部分组成:包括图像传感器、声音传感器、气象传感器等,用于实时采集作物及其周围环境的数据,如叶片变化、虫鸣声、温度、湿度、光照等。对采集到的数…

基于RealSense D435相机实现手部姿态重定向

基于Intel RealSense D435相机和MediaPipe的手部姿态检测,进一步简单实现手部姿态与机器人末端的重定向,获取手部的6D坐标(包括位置和姿态)。 假设已经按照【基于 RealSenseD435i相机实现手部姿态检测】配置好所需的库和环境&…

海口网站建设的最佳实践

海口网站建设的最佳实践 随着互联网的迅猛发展,海口的企业和个人越来越重视网站建设。一个高质量的网站不仅能提升企业形象,还能有效促进品牌传播和业务发展。以下是海口网站建设的一些最佳实践,希望能为相关从业者提供帮助。 1. 明确目标和…

一文说清楚:如何学习好K8s、OpenStack、Docker、Linux?

大家好,我是你们熟悉的-CloudJourney。在这个信息爆炸的时代,我一直致力于通过博客、公众号等平台,与大家分享关于Linux、K8S、Docker、网络、服务器以及OpenStack等前沿技术的见解与心得。然而,随着交流的深入,我逐渐…

[论文精读]TorWard: Discovery, Blocking, and Traceback of Malicious Traffic Over Tor

期刊名称:IEEE Transactions on Information Forensics and Security 发布链接:TorWard: Discovery, Blocking, and Traceback of Malicious Traffic Over Tor | IEEE Journals & Magazine | IEEE Xplore 中文译名:TorWard:…

EDM平台大比拼 用户体验与营销效果双重测评

本文评测了ZohoCampaigns、Mailchimp、Sendinblue、AWeber四款EDM平台,分别适合中小企业、多平台集成、多功能集成、初学者等需求。建议企业根据自身规模、技术水平和功能需求选择最适合的平台。 一、Zoho Campaigns 功能概述 Zoho Campaigns是Zoho旗下的一款专注…

前端框架:选择的艺术

一、简介 在现代 web 开发中,前端框架扮演着至关重要的角色。 首先,它们极大地提升了开发效率。以 React、Vue 和 Angular 为例,这些框架采用组件化的开发模式,允许开发者将页面拆分成独立的、可复用的组件。例如,在一…

学校周赛(2)

A.Minimize! 题目 思路 本题只需要遍历c的取值&#xff0c;实时更新答案即可 代码 #include<iostream> #include<algorithm> using namespace std;void todo(){int a,b;cin>>a>>b;int ansINT_MAX;for(int ca;c<b;c){ansmin(ans,(c-a)(b-c));}co…

面试题:MySQL你用过WITH吗?领免费激活码

感谢Java面试教程的Java多线程文章&#xff0c;点击查看>原文 Java面试教程&#xff0c;发mmm116可获取IDEA-jihuoma 在MySQL中&#xff0c;WITH子句用于定义临时表或视图&#xff0c;也称为公共表表达式&#xff08;CTE&#xff09;。它允许你在一个查询中定义一个临时结果…

耳机检测系统源码分享

耳机检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

spring-boot 整合 mybatis

文章目录 Spring boot 整合Mybatis将数据返回到浏览器1、准备数据2. 创建一个 pojo 包&#xff0c;创建User实体类3. 创建一个mapper包&#xff0c;写一个UserMapper接口4. 创建一个service包&#xff0c;写一个UserService接口。5. 在 Service 包下创建一个子包&#xff0c;im…