为什么 AI 模型的计算成本如此之高?

news2024/11/24 7:08:04

生成式人工智能的热潮是受计算限制的。它具有独特的属性,即添加更多计算直接导致更好的产品。通常,研发投资与产品的价值更直接相关,而这种关系显然是亚线性的。但目前人工智能并非如此,因此,推动当今行业的一个主要因素就是训练和推理的成本。

虽然我们不知道真实的数字,但我们从信誉良好的消息来源听说,计算的供应非常有限,需求超过了它 10 倍(!因此,我们认为可以公平地说,目前,以最低的总成本访问计算资源已成为人工智能公司成功的决定性因素

事实上,我们已经看到许多公司将其筹集的总资本的 80% 以上用于计算资源!

在这篇文章中,我们试图分解人工智能公司的成本因素。当然,绝对数字会随着时间的推移而变化,但我们没有看到人工智能公司受到计算资源访问的束缚会立即得到缓解。所以,希望这是一个有用的框架,可以思考整个环境。

生成式 AI 模型种类繁多,推理和训练成本取决于模型的大小和类型。幸运的是,当今最流行的模型大多是基于 Transformer 的架构,其中包括流行的大型语言模型 (LLM),例如 GPT-3、GPT-J 或 BERT。虽然用于推理和学习转换器的确切操作数量是特定于模型的(参见本文),但有一个相当准确的经验法则,它仅取决于模型的参数数量(即神经网络的权重)以及输入和输出标记的数量。

标记本质上是几个字符的短序列。它们对应于单词或单词的一部分。获得代币直觉的最佳方法是尝试使用公开可用的在线代币化器(例如 OpenAI)进行代币化。对于 GPT-3,令牌的平均长度为 4 个字符。

Transformer 的经验法则是,对于具有 p 个参数的输入和输出序列的模型,每个参数的长度为 n 个标记,前向传递(即推理)大约需要 2*n*p 浮点运算 (FLOP)¹。同一模型的训练每个令牌大约需要 6*p 的 FLOP(即,额外的向后传递需要另外 4 个操作²)。您可以通过将其乘以训练数据中的令牌数量来估算总训练成本。

变压器的内存要求还取决于型号大小。为了进行推理,我们需要 模型参数来适应内存。为了学习(即反向传播),我们需要在前向和后向传递之间为每个参数存储额外的中间值。假设我们使用 32 位浮点数,则每个参数额外增加 8 个字节。为了训练一个 1750 亿参数的模型,我们需要在内存中保留超过 1 TB 的数据——这超过了目前存在的任何 GPU,并且需要我们将模型拆分到各个卡上。推理和训练的内存需求可以通过使用较短长度的浮点值来优化,16 位将变得普遍,预计在不久的将来将出现 8 位。

上表列出了几种常用模型的大小和计算成本。GPT-3 有大约 1750 亿个参数,对于 1,024 个代币的输入和输出,导致大约 350 万亿次浮点运算(即 Teraflops 或 TFLOP)的计算成本。训练像 GPT-3 这样的模型大约需要 3.14*10^23 次浮点运算。其他型号,如 Meta 的 LLaMA,具有更高的计算要求。训练这样的模型是人类迄今为止承担的计算密集型任务之一。

总而言之:人工智能基础设施之所以昂贵,是因为潜在的算法问题在计算上非常困难。与使用 GPT-3 生成单个单词的复杂性相比,对包含 100 万个条目的数据库表进行排序的算法复杂性微不足道。这意味着您要选择解决您的用例的最小模型。

好消息是,对于 Transformer 来说,我们可以很容易地估计出一定规模的模型将消耗多少计算和内存。因此,选择合适的硬件成为下一个考虑因素。

计算复杂性如何转化为时间?处理器内核通常每个周期可以执行 1-2 条指令,并且由于 Dennard Scaling 的结束,处理器时钟速率在过去 15 年中一直稳定在 3 GHz 左右。在不利用任何并行架构的情况下执行单个 GPT-3 推理操作将需要大约 350 TFLOPs/(3 GHz*1 FLOP) 或 116,000 秒或 32 小时。这是非常不切实际的;相反,我们需要专门的芯片来加速这项任务。

在实践中,当今所有 AI 模型都在使用大量专用内核的卡上运行。例如,NVIDIA A100 GPU 有 512 个“张量核心”,可以在单个周期内执行 4×4 矩阵乘法运算(相当于 64 次乘法和加法,或 128 次 FLOP)。AI 加速卡通常被称为 GPU(图形处理单元),因为该架构最初是为桌面游戏开发的。未来,我们预计人工智能将日益成为一个独特的产品系列。

A100 的标称性能为 312 TFLOPS,理论上可以将 GPT-3 的推理减少到大约 1 秒。但是,由于多种原因,这是一个过于简化的计算。首先,对于大多数用例,瓶颈不是 GPU 的计算能力,而是将数据从专用图形内存传输到张量核心的能力。其次,1750 亿的权重将占用 700GB,并且无法放入任何 GPU 的图形内存中。需要使用分区和权重流等技术。第三,有许多优化(例如,使用较短的浮点表示,如FP16、FP8或稀疏矩阵)被用于加速计算。但是,总的来说,上面的数学让我们对当今 LLM 的整体计算成本有了直观的了解。

训练 Transformer 模型每个令牌所需的时间大约是进行推理的三倍。但是,鉴于训练数据集大约是推理提示的 3 亿倍,因此训练需要的时间要长 10 亿倍。在单个 GPU 上,训练需要几十年的时间;在实践中,这是在专用数据中心的大型计算集群上完成的,或者更有可能是在云中完成的。训练也比推理更难并行化,因为必须在节点之间交换更新的权重。GPU 之间的内存和带宽通常成为一个更重要的因素,高速互连和专用结构很常见。对于训练非常大的模型,创建合适的网络设置可能是主要挑战。展望未来,人工智能加速器将在卡上甚至芯片上具有网络功能。

这种计算复杂性如何转化为成本?正如我们上面看到的,GPT-3 推理在 A100 上大约需要 1 秒,1,000 个代币的原始计算成本在 0.0002 美元到 0.0014 美元之间(相比之下,OpenAI 的定价为 0.002 美元/1000 个代币)。用户每天生成 100 个推理请求的成本约为每年美元。这是一个非常低的价格点,使得人类基于文本的人工智能的大多数用例在经济上是可行的。

另一方面,训练 GPT-3 的成本要高得多。同样,仅以上述速率计算 3.14*10^23 FLOP 的计算成本,我们估计单次训练运行的 A100 卡的计算成本为 560,000 美元。在实践中,对于训练,我们不会在 GPU 中获得接近 100% 的效率;但是,我们也可以使用优化来减少训练时间。GPT-3 训练成本的其他估计从 500,000 美元到 460 万美元不等,具体取决于硬件假设。请注意,这是单次运行的成本,而不是总成本。可能需要多次运行,云提供商将需要长期承诺(更多内容见下文)。训练顶级模型仍然很昂贵,但对于资金充足的初创公司来说,这是可以做到的。

总而言之,生成式人工智能需要对当今的人工智能基础设施进行大量投资。没有理由相信这种情况会在不久的将来改变。训练像 GPT-3 这样的模型是人类有史以来计算最密集的任务之一。虽然 GPU 的速度越来越快,而且我们找到了优化训练的方法,但 AI 的快速扩张抵消了这两种影响。

AI 基础架构的注意事项

到目前为止,我们试图为您提供一些直觉,以了解对 AI 模型进行训练和推理所需的规模,以及驱动它们的基本参数。在这种背景下,我们现在想就如何决定使用哪种 AI 基础设施提供一些实用指导。

外部基础设施与内部基础设施

让我们面对现实吧:GPU 很酷。许多工程师和具有工程头脑的创始人都偏向于配置自己的 AI 硬件,这不仅是因为它可以对模型训练进行细粒度控制,还因为利用大量计算能力很有趣(图 A)。

然而,现实情况是,许多初创公司——尤其是应用程序公司——不需要在第一天就构建自己的人工智能基础设施。取而代之的是,OpenAI或Hugging Face(用于语言)和Replicate(用于图像生成)等托管模型服务允许创始人快速搜索产品与市场的契合度,而无需管理底层基础设施或模型。

这些服务已经变得如此之好,以至于许多公司从未从中毕业。开发人员可以通过提示工程和高阶微调抽象(即通过 API 调用进行微调)实现对模型性能的有意义的控制。这些服务的定价是基于消费的,因此通常也比运行单独的基础设施便宜。我们已经看到应用公司产生了超过 5000 万美元的 ARR,估值超过 10 亿美元,它们在后台运行托管模型服务。

另一方面,一些初创公司(尤其是那些训练新基础模型或构建垂直集成 AI 应用程序的初创公司)无法避免直接在 GPU 上运行自己的模型。要么是因为模型实际上是产品,而团队正在寻找“模型-市场契合度”,要么是因为需要对训练和/或推理进行细粒度控制才能实现某些功能或大规模降低边际成本。无论哪种方式,管理基础设施都可以成为竞争优势的来源。

云与数据中心的构建

在大多数情况下,云是 AI 基础架构的正确位置。对于大多数初创公司和大公司来说,较低的前期成本、扩展和缩减的能力、区域可用性以及减少构建自己的数据中心的干扰是很有吸引力的。

但此规则也有一些例外:

  • 如果您的运营规模非常大,那么运行自己的数据中心可能会变得更具成本效益。确切的价格点因地理位置和设置而异,但通常每年需要超过 5000 万美元的基础设施支出。
  • 您需要无法从云提供商处获得的非常具体的硬件。例如,未广泛使用的 GPU 类型,以及不寻常的内存、存储或网络要求。
  • 你找不到一个可以接受地缘政治考虑的云。

如果您确实想建立自己的数据中心,那么针对您自己的设置,已经对 GPU 进行了全面的性价比分析(例如,Tim Dettmer 的分析)。除了显卡本身的成本和性能外,硬件选择还取决于电源、空间和散热。例如,两张 RTX 3080 Ti 显卡的原始计算能力与 A100 相似,但功耗分别为 700W 和 300W。在三年的生命周期内,以0.10美元/千瓦时的市场价格计算,3,500千瓦时的功率差异使RTX3080钛的成本增加了近2倍(约合1,000美元)。

综上所述,我们预计绝大多数初创公司都会使用云计算。

比较云服务提供商

亚马逊网络服务(AWS),Microsoft Azure和Google Cloud Platform(GCP)都提供GPU实例,但新的提供商似乎也特别关注AI工作负载。以下是我们看到许多创始人用来选择云提供商的框架:

价格:下表显示了截至 2023 年 4 月 7 日一些主要和小型专业云的定价。 此数据仅供参考,因为实例在网络带宽、数据出口成本、CPU 和网络的额外成本、可用折扣和其他因素方面差异很大。例如,Google 要求 A100 40GB 的 A2 加速优化实例,这可能会使成本增加 25%。

特定硬件上的计算能力是一种商品。天真地,我们期望价格相当统一,但事实并非如此。虽然云之间存在实质性的功能差异,但它们不足以解释按需 NVIDIA A100 的定价在提供商之间相差近 4 倍。

在价格范围的顶端,大型公有云根据品牌声誉、经过验证的可靠性以及管理各种工作负载的需求收取溢价。较小的专业人工智能提供商通过运行专门构建的数据中心(例如Coreweave)或套利其他云(例如Lambda Labs)来提供更低的价格。

实际上,大多数较大的买家直接与云提供商协商价格,通常承诺一些最低支出要求和最短时间承诺(我们已经看到 1-3 年)。经过谈判,云之间的价格差异有所缩小,但我们已经看到上表中的排名保持相对稳定。同样重要的是要注意,较小的公司可以从专业云中获得激进的定价,而无需大量支出承诺。

可用性:在过去 12 个多月中,最强大的 GPU(例如 Nvidia A100)一直供不应求。

考虑到前三大云提供商的庞大购买力和资源池,认为它们具有最佳的可用性是合乎逻辑的。但是,令人惊讶的是,许多初创公司并没有发现这是真的。大型云拥有大量硬件,但也有大量客户需求需要满足(例如,Azure 是 ChatGPT 的主要主机),并且不断增加/租赁容量以满足需求。与此同时,英伟达已承诺在整个行业内广泛提供硬件,包括为新的专业提供商分配硬件。(他们这样做既是为了公平,也是为了减少对一些与他们竞争的大客户的依赖。

因此,许多初创公司在较小的云提供商处找到了更多可用的芯片,包括尖端的 Nvidia H100。如果您愿意与较新的基础设施公司合作,您也许可以减少硬件的等待时间,并可能在此过程中节省资金。

计算交付模型:如今的大型云仅提供具有专用 GPU 的实例,原因是 GPU 虚拟化仍然是一个未解决的问题。专门的 AI 云提供其他模型,例如容器或批处理作业,这些模型可以处理单个任务,而不会产生实例的启动和拆卸成本。如果您对这种模式感到满意,它可以大大降低成本。

网络互连:具体而言,对于培训,网络带宽是选择提供商的主要因素。需要在节点之间具有专用结构的集群(例如 NVLink)来训练某些大型模型。对于映像生成,出口流量费用也可能是主要的成本驱动因素。

客户支持:大型云提供商为数千个产品 SKU 的大量客户提供服务。除非您是大客户,否则很难引起客户支持的注意或解决问题。另一方面,许多专门的 AI 云甚至为小客户提供快速响应的支持。这在一定程度上是因为他们的规模较小,但也因为他们的工作负载更加同质化,因此他们更有动力专注于特定于 AI 的功能和错误。

比较 GPU

在其他条件相同的情况下,高端 GPU 在几乎所有工作负载上的表现最佳。但是,如下表所示,最好的硬件也要贵得多。为您的特定应用选择正确类型的 GPU 可以大大降低成本,并可能在可行和不可行商业模式之间产生差异。

决定要走多远(即为您的应用程序确定最具成本效益的 GPU 选择)在很大程度上是一项技术决策,超出了本文的讨论范围。但我们将在下面分享一些我们看到的最重要的选择标准:

训练与推理:正如我们在上面的第一节中看到的,训练 Transformer 模型除了模型权重外,还需要存储 8 字节的数据进行训练。这意味着具有 12GB 内存的典型高端消费类 GPU 几乎无法用于训练 40 亿参数的模型。在实践中,训练大型模型是在机器集群上完成的,这些机器集群最好是每台服务器具有多个 GPU、大量 VRAM 以及服务器之间的高带宽连接(即使用高端数据中心 GPU 构建的集群)。

具体来说,许多型号在 NVIDIA H100 上最具成本效益,但截至今天,它很难找到,通常需要一年多的长期承诺。NVIDIA A100 可运行当今大多数模型训练;它更容易找到,但对于大型集群,可能还需要长期承诺。

内存要求:大型 LLM 的参数计数太高,无法放入任何卡中。它们需要拆分到多张卡上,并且需要类似于训练的设置。换句话说,即使进行 LLM 推理,您也可能需要 H100 或 A100。但较小的模型(例如,Stable Diffusion)需要的 VRAM 要少得多。虽然 A100 仍然很受欢迎,但我们已经看到初创公司使用 A10、A40、A4000、A5000 和 A6000,甚至 RTX 卡。

硬件支持:虽然我们采访过的公司的绝大多数工作负载都在 NVIDIA 上运行,但也有少数已经开始尝试其他供应商。最常见的是谷歌TPU,但英特尔的Gaudi 2似乎也得到了一些牵引力。这些供应商面临的挑战是,模型的性能通常高度依赖于这些芯片的软件优化的可用性。您可能需要进行 PoC 才能了解性能。

延迟要求:通常,延迟敏感度较低的工作负载(例如,批处理数据或不需要交互式 UI 响应的应用程序)可以使用功能较弱的 GPU。这可以将计算成本降低多达 3-4 倍(例如,在 AWS 上将 A100 与 A10 进行比较)。另一方面,面向用户的应用程序通常需要高端卡来提供引人入胜的实时用户体验。为了将成本控制在可管理的范围内,通常需要优化模型。

Spikiness:生成式人工智能公司经常看到需求急剧增加,因为这项技术是如此新颖和令人兴奋。根据新产品的发布,请求量在一天内增加 10 倍,或者每周持续增长 50%,这种情况并不少见。在低端 GPU 上处理这些峰值通常更容易,因为可能会按需提供更多计算节点。如果此类流量来自参与度较低或保留率较低的用户,那么使用低成本资源(以牺牲性能为代价)为此类流量提供服务通常也是有意义的。

优化和调度模型

软件优化可以极大地影响模型的运行时间,而 10 倍的增益并不少见。但是,您需要确定哪些方法对您的特定模型和系统最有效。

有些技术适用于相当广泛的模型。使用较短的浮点表示(即 FP16 或 FP8 与原始 FP32 相比)或量化(INT8、INT4、INT2)可实现通常与位减少呈线性关系的加速。这有时需要修改模型,但越来越多的技术可以自动处理混合精度或更短的精度。修剪神经网络通过忽略具有低值的权重来减少权重的数量。再加上高效的稀疏矩阵乘法,这可以在现代 GPU 上实现大幅加速。另一组优化技术解决了内存带宽瓶颈(例如,通过流模型权重)。

其他优化是高度特定于模型的。例如,Stable Diffusion 在推理所需的 VRAM 数量方面取得了重大进展。另一类优化是特定于硬件的。NVIDIA 的 TensorRT 包括许多优化,但仅适用于 NVIDIA 硬件。最后但并非最不重要的一点是,AI 任务的调度可能会造成巨大的性能瓶颈或改进。将模型分配给 GPU 以尽量减少权重交换的方式,为任务选择最佳 GPU(如果有多个 GPU 可用),以及通过提前批处理工作负载来最大程度地减少停机时间是常见的技术。

归根结底,模型优化仍然是一门黑色艺术,我们与之交谈的大多数初创公司都与第三方合作,以帮助解决其中一些软件方面的问题。通常,这些不是传统的 MLops 供应商,而是专门针对特定生成模型(例如 OctoML 或 SegMind)进行优化的公司。

人工智能基础设施成本将如何演变?

在过去几年中,我们看到模型参数和 GPU 计算能力呈指数级增长。目前尚不清楚这种趋势是否会持续下去。

今天,人们普遍认为,最佳参数数量与训练数据集的大小之间存在关系(有关更多信息,请参阅 Deepmind 的 Chinchilla 工作)。当今最好的 LLM 是在 Common Crawl(45 亿个网页的集合,约占现有所有网页的 10%)上训练的。训练语料库还包括维基百科和一系列书籍,尽管两者都要小得多(现存的书籍总数估计只有1亿左右)。已经提出了其他想法,例如转录视频或音频内容,但这些想法的大小都不大。目前尚不清楚我们是否可以获得比已经使用的数据集大 10 倍的非合成训练数据集。

GPU 性能将继续提高,但速度也会变慢。摩尔定律仍然完好无损,允许更多的晶体管和更多的内核,但功率和I/O正在成为限制因素。此外,许多唾手可得的优化成果也已被选中。

然而,这并不意味着我们预计对计算容量的需求不会增加。即使模型和训练集的增长放缓,人工智能行业的增长和人工智能开发人员数量的增加也将推动对更多、更快的GPU的需求。在模型的开发阶段,开发人员将很大一部分 GPU 容量用于测试,并且这种需求与员工人数呈线性关系。没有迹象表明我们今天的GPU短缺会在不久的将来缓解。

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

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

相关文章

实验2 路由器基本配置

实验2 路由器基本配置 一、 原理描述二、 实验目的三、 实验内容四、 实验步骤1.建立实验拓扑2.基础配置3.配置路由器接口IP地址4.查看路由器配置信息5.连通性测试6.使用抓包工具 一、 原理描述 华为设备支持多种配置方式,操作人员要熟悉使用命令行的方式进行设备管…

关于JVM-三色标记算法剖析

相关系列 深入理解JVM垃圾收集器-CSDN博客 深入理解JVM垃圾收集算法-CSDN博客 深入理解jvm执行引擎-CSDN博客 jvm优化原则-CSDN博客 jvm流程图-CSDN博客 三色标记产生的原因? 在并发标记的过程中,因为标记期间应用线程还在继续跑,对象间的引…

Android Activity 介绍

Activity Activity 是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或查看地图等操作。 每个 Activity 都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕,但也可小于屏幕并浮动在其他窗口之…

用Echarts词云数据可视化热词表白​​

目录 1、使用前准备 2、准备工作 3、盒子搭建 4、整体展现 1、使用前准备 找到表白对象(重中之重!),不要一见钟情(个人觉得:一见钟情属于见色起意!),因为数据可视化需…

3D Web轻量引擎HOOPS Communicator装配制造流程演示

介绍 该演示介绍了使用HOOPS Communicator的独特工作流程,该工作流程从零件列表中加载零件,并使用自定义配合操作符(例如共线、同心和共面)构建装配模型。该工作流程可用于各种行业,例如维护手册、工作指令或电子商务…

不使用 Docker 构建 Triton 服务器并在 Google Colab 平台上部署 HuggingFace 模型

Build Triton server without docker and deploy HuggingFace models on Google Colab platform EnvironmentBuilding Triton serverDeploying HuggingFace models客户端推荐阅读参考 Environment 根据Triton 环境对应表 ,Colab 环境缺少 tensorrt-8.6.1&#xff0…

2024/4/5—力扣—搜索旋转排序数组

代码实现&#xff1a; 思路&#xff1a;二分法 int search(int *nums, int numsSize, int target) {int l 0, r numsSize - 1;while (l < r) { // 左闭右闭int mid (l r) >> 1;if (nums[mid] target) {return mid;}if (nums[l] < nums[mid]) { // 说明l - mid…

ClickHouse 介绍

前言 一个通用系统意味着更广泛的适用性&#xff0c;但通用的另一种解释是平庸&#xff0c;因为它无法在所有场景内都做到极致。 ClickHouse 在没有像三驾马车这样的指导性论文的背景下&#xff0c;通过针对特定场景的极致优化&#xff0c;获得闪电般的查询性能。 ClickHous…

为说阿拉伯语的国家进行游戏本地化

阿拉伯语是由超过4亿人使用的语言&#xff0c;并且是二十多个国家的官方语言。进入这些国家的市场并非易事——虽然他们共享一种通用语言&#xff0c;但每个国家都有自己独特的文化&#xff0c;有自己的禁忌和对审查的处理方式。这就是为什么视频游戏公司长期以来都远离阿拉伯语…

C语言学习初级阶段(数据)——scanf读取标准输入

文章目录 一、scanf函数的原理1.1、自己理解1.2、王道解释1.3、注意 一、scanf函数的原理 输入和输出是通过标准函数库实现的&#xff0c;C语言通过scanf函数读取键盘输入&#xff0c;键盘输入又称标准输入。当scanf函数读取标准输入时&#xff0c;如果还没有输入任何内容&…

如何提升产品用户体验?4个工具+6张案例,让你快速吃透!

在数字时代的浪潮中&#xff0c;产品用户体验早已不再是简单的“好用”或“不好用”的评判标准&#xff0c;它不仅仅是功能的堆砌&#xff0c;更是情感的连接、智慧的体现。在这个竞争激烈的市场中&#xff0c;只有那些能够深入理解用户需求、精准把握用户心理的产品&#xff0…

ES6中 Promise的详细讲解

文章目录 一、介绍状态特点流程 二、用法实例方法then()catchfinally() 构造函数方法all()race()allSettled()resolve()reject() 三、使用场景# 参考文献 一、介绍 Promise&#xff0c;译为承诺&#xff0c;是异步编程的一种解决方案&#xff0c;比传统的解决方案&#xff08;…

(学习日记)2024.04.09:UCOSIII第三十七节:事件函数接口

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

uniapp请求后端接口

新建文件夹utils const request (config) > {// 拼接完整的接口路径config.url http://mm.test.cn config.url;//这里拼接的是访问后端接口的地址&#xff0c;http://mm.test.cn/prod-api/testconsole.log(config.url)//判断是都携带参数if(!config.data){config.data …

比派科技(BananaPI) 和 Qbee 达成战略合作伙伴关系,共同推动物联网技术发展

比派科技&#xff08;Banana PI&#xff09;&#xff08;https://banana-pi.org/&#xff09;和Qbee&#xff08;https://qbee.io/&#xff09;很高兴地宣布建立战略合作伙伴关系&#xff0c;旨在推动物联网&#xff08;IoT&#xff09;技术领域的创新和发展。 作为在物联网领…

[官方推荐]通义灵码做活动,送礼品,快来薅羊毛!!!

你的编辑器装上智能ai编辑了吗&#xff0c;的确挺好用的。 最近阿里云AI编码搞活动&#xff0c;可以免费体验并且还可以抽盲盒。有日历、马克杯、代金券、等等其他数码产品。 大多数都是日历。 点击链接参与「通义灵码 体验 AI 编码&#xff0c;开 AI 盲盒」 https://develope…

代码随想录阅读笔记-二叉树【总结】

二叉树的理论基础 代码随想录 (programmercarl.com)&#xff1a;二叉树的种类、存储方式、遍历方式、定义方式 二叉树的遍历方式 深度优先遍历 代码随想录阅读笔记-二叉树【递归遍历】-CSDN博客&#xff1a;递归三部曲初次亮相代码随想录阅读笔记-二叉树【迭代遍历】-CSDN博…

护眼灯值不值得买?入手不亏护眼灯十大品牌推荐

如今&#xff0c;我们不难发现越来越多的人早早地戴上了眼镜。这背后&#xff0c;或许是频繁接触电子产品&#xff0c;或许是长时间的学习&#xff0c;又或许是长时间处于不健康的光线环境。无论原因如何&#xff0c;我们都深知营造良好的光线环境对于保护视力至关重要。市面上…

Maven POM元素解析

这是对Maven中使用的Maven项目描述符的引用。 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/…

SQL语法 之 数据库多表查询

对这篇文章的延申 Mysql-全外连接-Union和Union ALL的辨析及练习-CSDN博客 其他SQL系列文章&#xff1a; MySQL《一》-数据库基础_宋红康主要课程-CSDN博客 MySQL《二》-基本查询语句&#xff08;Select)-CSDN博客 Mysql - 定点型(DECIMAL)的使用详解及练习-CSDN博客 MySQ…