大模型国产化适配11-LLM训练性能基准测试(昇腾910B3)

大模型国产化适配11-LLM训练性能基准测试(昇腾910B3)

大模型国产化适配11-LLM训练性能基准测试(昇腾910B3)

原创 吃果冻不吐果冻皮  2024年07月17日 08:01 四川

随着 ChatGPT 的现象级走红,引领了AI大模型时代的变革,从而导致 AI 算力日益紧缺。与此同时,中美贸易战以及美国对华进行AI芯片相关的制裁导致 AI 算力的国产化适配势在必行。之前也分享过一些国产 AI 芯片、使用国产 AI 框架 Mindformers 基于昇腾910训练大模型,使用 MindIE 进行大模型服务化等。

大模型国产化适配1-华为昇腾AI全栈软硬件平台总结

大模型国产化适配2-基于昇腾910使用ChatGLM-6B进行模型推理

大模型国产化适配3-基于昇腾910使用ChatGLM-6B进行模型训练

大模型国产化适配4-基于昇腾910使用LLaMA-13B进行多机多卡训练

大模型国产化适配6-基于昇腾910B快速验证ChatGLM3-6B/BaiChuan2-7B模型推理

AI芯片技术原理剖析(一):国内外AI芯片概述

大模型国产化适配7-华为昇腾LLM落地可选解决方案(MindFormers、ModelLink、MindIE)

MindIE 1.0.RC1 发布,华为昇腾终于推出了针对LLM的完整部署方案,结束小米加步枪时代

大模型国产化适配8-基于昇腾MindIE推理工具部署Qwen-72B实战(推理引擎、推理服务化)

大模型国产化适配9-LLM推理框架MindIE-Service性能基准测试

大模型国产化适配10-快速迁移大模型到昇腾910B保姆级教程(Pytorch版)

另外,我撰写的大模型相关的博客及配套代码均整理放置在Github:https://github.com/liguodongiot/llm-action,有需要的朋友自取。

之前对进行了性能测试。下面对训练框架(ModelLink/MindFormers)进行训练测试。

训练性能的定义

训练性能在本文指机器(GPU、NPU或其他平台)在指定模型和输入数据的背景下,完成一次端到端训练所需要花费的时间,考虑到不同模型的训练数据量和训练轮次(epoch)差异,此处定义的性能是在完成一个batch训练所需花费的时间。而端到端通常是指完成一个AI模型单步训练的过程。也就是说,本文所讨论的性能的衡量和性能的优化,都是站在模型角度上。

对于一个batch而言,训练所花费的时间主要由以下部分构成:

单batch总时间 = 数据加载时间 + 模型前反向时间 + 优化器时间 + 模型后处理时间 + 通信时间 + 调度时间

数据加载时间:指的是模型在加载自身所需要的数据(如图片、视频和文本等)的时间,包括将数据从硬件存储设备读取到CPU(Central Processing Unit)中、CPU中数据的预处理(编解码等操作)、CPU数据放到Device(GPU/NPU...)上的时间。特别地,对于一些需要切分在若干张卡上的模型,数据加载还包括从数据加载卡广播到其他卡上的时间。

模型前反向时间:指深度学习模型的前向过程和反向过程,即Forward和Backward过程,包含前向的数据计算和反向的数据微分求导。

优化器时间:通常指的是模型参数更新时间。

模型后处理时间:一般指的是优化器更新后的时间,包括数据的后处理或者一些必要的同步操作,通常取决于模型特有操作。

通信时间:概念比较宽泛,一般将单节点内卡与卡多节点间的通信行为归为通信时间,由于一些AI框架(如:PyTorch)的特殊机制或者优化,通信和计算通常可以并行起来(即通信计算重叠),因此我们一般考虑的是未被计算掩盖的通信时间。

调度时间:指的是模型从CPU的指令到调用NPU侧的核(Kernel)所需要的时间。

训练性能指标

在模型训练过程中,通常关注的性能指标如下:

指标名称单位指标含义
吞吐率samples/s、tokens/s单位时间(例如1s)内处理的Token数/训练样本数
单步时间s执行一个step所花费的时间
线性度、加速比values单卡训练扩展到多卡,单机拓展到集群的效率度量指标
内存占用百分比-
带宽占比百分比-
训练效率tokens/day-
浮点运算TFLOPS每秒浮点运算次数,是计算设备的计算性能指标
模型算力利用率(Model FLOPs Utilization, MFU)百分比模型一次前反向计算消耗的矩阵算力与机器算力的比值
硬件算力利用率(Hardware FLOPs Utilization, HFU)百分比考虑重计算后,模型一次前反向计算消耗的矩阵算力与机器算力的比值

在计算性能指标时,通常的优先级排序为:吞吐率 > 单步迭代时间 > 线性度 > 内存占用 > 带宽占用 > 训练效率 > 浮点计算次数每秒 > 算力利用率

FLOPS 与 FLOPs的不同之处

概念不同:FLOPS 表示每秒浮点运算次数,是计算设备的计算性能指标;而 FLOPs 表示模型中的浮点运算操作总数,是模型计算复杂度的指标。

应用不同:FLOPS 用于评估计算设备的处理能力和性能;FLOPs 用于衡量模型的计算复杂度和计算量。

单位不同:FLOPS 的单位是每秒浮点运算次数(如 TFLOPS、GFLOPS);FLOPs 的单位是浮点运算操作总数(如 MFLOPs、GFLOPs)。

吞吐量

与涉及单个样本数据处理的延迟(Latency)不同,为了实现最大吞吐率(Throughput),我们希望在集群训练的过程中有效并行处理尽可能多的样本数据。这种有效的并行性依赖于数据、模型和设备规模。因此,为了正确测量最大吞吐率,可以执行以下两个步骤:

估计允许最大并行度的最佳训练样本数据批量大小,即Batch Size;

在AI训练集群中,给定这个最佳Batch Size,测量神经网络模型在一个step每1秒钟内可以处理的训练样本数据。

要找到最佳Batch Size值,一个好的经验法则是达到AI加速卡(GPU/NPU...)对给定数据类型的内存限制,即Batch Size接近占满内存。这取决于硬件类型、神经网络的参数大小以及输入数据的大小等。

要找到这个最大的Global Batch Size,最快方法是执行二分搜索。当时间不重要时,简单的顺序搜索就足够了。不过在大模型训练的过程中,Batch Size的值会影响到重计算、Pipeline并行、Tensor并行等不同并行模式的配比,还有micro Batch Size的数据配比。因此,默认Batch Size为16的倍数比较合理。

在确定了在AI加速卡上最大Batch Size值后,可以使用以下公式计算实际吞吐量:

每秒处理的训练数据样本数:

对于每一个AI框架,由于使用的并行策略和优化方法的不同,Global  Batch  Size计算方法也不同,以DeepSpeed为例,Global  Batch  Size 为:

global_train_batch_size = train_micro_batch_size_per_gpu * gradient_accumulation_steps * number of GPUs

而 MindFormers 中,Global  Batch  Size 为

global_batch_size = batch_size * data_parallel * micro_batch_num * micro_batch_interleave_num

每秒处理的Token数:

假设GLM10B网络模型使用DGX A100(8x 80GB)训练的吞吐量为25 samples/s,max seq_len为1024,那么按照tokens来计算吞吐量为 25 * 1024 = 25600 tokens/s,也就是每秒能处理2万多个tokens。单卡吞吐量为 3200 token/s/p。

线性度

线性度,又名加速比(speed up),指单机拓展到集群的效率度量指标。

单机内部线性度单机多卡总吞吐量单卡吞吐量卡数

单机多卡总吞吐率,在NLP大语言模型中以tokens/s为基本单位,在CV大模型中以samples/s为基本单位。

集群线性度多机多卡总吞吐量单卡吞吐量卡数集群机器数据

即:

集群线性度多机多卡总吞吐量单机总吞吐量集群机器数据

线性度的取值范围为0~1,数值越接近于1,其性能指标越好。

如果多卡或多机的加速比接近高线性度(即线性度接近于1),说明在扩展时通信不是瓶颈,则可以通过改变或者增加通信带宽提升性能,对于整体AI大模型训练的性能提升在通信上问题就会比较小。

当线性度不高(例如:小于0.8,具体视服务器集群的规模而定)时,排除数据IO和CPU的本身因素影响后,可以判断此时分布式通信存在瓶颈。

算力利用率

算力利用率指负载在集群上每秒消耗的实际算力占集群标称算力的比例。

标称算力是指硬件或设备在正常工作状态下的理论计算能力,通常以单位时间内能够完成的浮点运算次数(FLOPS)或整数运算次数(IOPS)来衡量。

模型算力利用率(Model FLOPs Utilization, MFU) 是指模型一次前反向计算消耗的矩阵算力与机器算力的比值

硬件算力利用率(Hardware FLOPs Utilization, HFU) 是指考虑重计算后,模型一次前反向计算消耗的矩阵算力与机器算力的比值

MFU

对一个典型的GPT类大模型,其主要的浮点算力都由Transformer层和logit层中的矩阵乘(GEMMs)贡献。比如千亿盘古大模型,99%以上的浮点算力都由fp16的矩阵乘贡献。通常只考虑矩阵运算(Matrix Multiplications,GEMMs)。

对于一个GPT类Transformer大模型,

transformer 模型的层数为 l

隐藏层维度为 h

注意力头数为 a

词表大小为 V

批次大小为 b

序列长度为 s

GPU单卡的峰值算力 F

训练使用GPU的卡数 N

训练一次迭代时间 T

因此,每次迭代的浮点预算数为

model FLOPs per iteration =

MLP 中将tensor维度从h提升到4h 再降低到h,浮点计算数为

第一个线性层,矩阵乘法的输入和输出形状为 [𝑏,𝑠,ℎ]×[ℎ,4ℎ]→[𝑏,𝑠,4ℎ] 。计算量为  。

第二个线性层,矩阵乘法的输入和输出形状为 [𝑏,𝑠,4ℎ]×[4ℎ,ℎ]→[𝑏,𝑠,ℎ] 。计算量为 。

Q,K,V的变化([𝑏,𝑠,ℎ]×[ℎ,ℎ]→[𝑏,𝑠,ℎ]),浮点计算数为

Attention矩阵运算,浮点计算数为

Attention后到线性层的运算([𝑏,𝑠,ℎ]×[ℎ,ℎ]→[𝑏,𝑠,ℎ]),浮点计算数为

logits运算([b,s,h]x[h,V]->[b,s,V]),浮点计算数为

整个语言模型的每个step的前向传播 FLOPs:

考虑反向计算,反向传播的计算量大约是前向传播的2倍;因此,每个step总FLOPs =  =  =

第一项来自 QKVO 和 FFN 中的矩阵乘法

第二项来自 attention 矩阵的计算,当s << 6h 时,可以忽略

第三项来自 LM head,当V << 12lh ,可以忽略

对于 LLaMa-13B 来说,

6h = 6 * 5120 = 30720

通常序列长度 s 为 2048,所以 Attention 矩阵的计算其实占比很小(1/15),可以忽略。

12lh = 12 * 50 * 5120 = 3072000

词表大小为 32000。所以 LM head 占比也很小(0.01),也可以忽略。

MFU 计算公式:

在模型固定的情况下,减少卡数和一次迭代时间,可以增大MFU。所以减少训练时间就是提高MFU。

www.zeeklog.com  - 大模型国产化适配11-LLM训练性能基准测试(昇腾910B3)

吃果冻不吐果冻皮

专注于AI工程化(LLM、MLOps、LLMOps、RAG、Agent)落地。

148篇原创内容

公众号

HFU

使用了激活重新计算,在反向传播之前需要进行额外的前向传播,HFU的计算公式:

=

这里由于存在不同的重计算策略,计算方式会有一些差异。比如:Reducing Activation Recomputation in Large Transformer Models 中提到的选择性激活重计算(selective activation recomputation),提出了一种策略,即只对那些占用大量内存但重新计算成本不高的Transformer层的部分激活进行存储和重计算。例如,在自注意力机制中,某些操作(如: 矩阵乘法、softmax、softmax dropout和对V的注意力)会产生较大的激活,但每个输入元素所需的浮点运算次数却相对较低。通过选择性地存储这些激活,可以在使用较少内存的同时,以较低的计算开销重新计算未存储的激活。

www.zeeklog.com  - 大模型国产化适配11-LLM训练性能基准测试(昇腾910B3)

image.png

通信性能指标

针对同一通信算子在不同卡之间通信时间的波动的分析,其主要目的在于需要识别一些可能存在的通信算子内部瓶颈单元。在分析过程中,主要采用以下几个指标:

算子的执行时间以及内部等待耗时的变化和比例

该指标可以用来初步识别是否存在慢卡瓶颈,对每块卡上的wait_ratio,通过比较wait_ratiowait_ratio_threshold(当前设置为0.2)的关系,识别是否存在慢节点。

www.zeeklog.com  - 大模型国产化适配11-LLM训练性能基准测试(昇腾910B3)

image.png

通信带宽分析

当通信算子内部不存在慢节点时,进行通信带宽分析。

主要有如下步骤:

对比该通信算子在各卡上的数据传输耗时 ,得到通信带宽最慢的rank

计算该rank上的sdma_bw和rdma_bw,并结合sdma_transit_time和rdma_transit_time给出对应平均带宽:

SDMA(System DMA, 系统直接内存访问),一种异步数据传输技术,可以在不占用CPU资源的情况下,实现数据在内存和外设之间的高速传输。

RDMA(Remote DMA, 远程直接数据存取),就是为了解决网络传输中服务器端数据处理的延迟而产生的。

同时,我们会设置一个经验带宽,一般设置为最大带宽的0.8,如图所示。

www.zeeklog.com  - 大模型国产化适配11-LLM训练性能基准测试(昇腾910B3)

只有SDMA通信:

SDMA平均带宽接近经验带宽,表示该通信算子瓶颈是SDMA带宽;SDMA平均带宽小于经验带宽,表示该通信算子瓶颈是SDMA通信效率低。

只有RDMA通信:

RDMA平均带宽接近经验带宽,表示该通信算子瓶颈是RDMA带宽;RDMA平均带宽小于经验带宽,表示该通信算子瓶颈是RDMA通信效率低。

SDMA通信和RDMA通信:

SDMA耗时最长,表示当前通信算子主要瓶颈在于SDMA通信,瓶颈是SDMA带宽或SDMA通信效率低;

RDMA耗时最长,表示当前通信算子主要瓶颈在于RDMA通信,瓶颈是RDMA带宽或RDMA通信效率低。

流水线并行效率指标

流水线并行是将神经网络中的算子切分成多个阶段(Stage),再把阶段映射到不同的设备上,使得不同设备去计算神经网络的不同部分。

流水线并行适用于模型是线性的图结构,如图所示,将4层MatMul的网络切分成4个阶段,分布到4台设备上。正向计算时,每台机器在算完本台机器上的MatMul之后将结果通过通信算子发送(Send)给下一台机器,同时,下一台机器通过通信算子接收(Receive)上一台机器的MatMul结果,同时开始计算本台机器上的MatMul;反向计算时,最后一台机器的梯度算完之后,将结果发送给上一台机器,同时,上一台机器接收最后一台机器的梯度结果,并开始计算本台机器的反向。

www.zeeklog.com  - 大模型国产化适配11-LLM训练性能基准测试(昇腾910B3)

image.png

简单地将模型切分到多设备上并不会带来性能的提升,因为模型的线性结构,同一时刻只有一台设备在工作,而其它设备在等待,造成了资源的浪费(流水线空泡bubble)。为了提升效率,流水线并行进一步将小批次(MiniBatch)切分成更细粒度的微批次(MicroBatch),在微批次中采用流水线式的执行序,从而达到提升效率的目的,如图所示。将小批次切分成4个微批次,4个微批次在4个组上执行形成流水线。微批次的梯度汇聚后用来更新参数,其中每台设备只存有并更新对应组的参数。其中白色序号代表微批次的索引。

www.zeeklog.com  - 大模型国产化适配11-LLM训练性能基准测试(昇腾910B3)

image.png

1F1B (1 forward 1 backward,一次前向,一次反向)的流水线并行实现中对执行序进行了调整,来达到更优的内存管理。如图所示,在编号为0的MicroBatch的正向执行完后立即执行其反向,这样做使得编号为0的MicroBatch的中间结果的内存得以更早地释放,进而确保内存使用的峰值更低。

www.zeeklog.com  - 大模型国产化适配11-LLM训练性能基准测试(昇腾910B3)

image.png

假设MicroBatch Num是m,pipeline stage是p,流水线并行的效率是:

分布式训练并行策略及优化技术

目前,对于LLM而言,传统的单机单卡已经无法满足其训练要求,因此,需要采用多机多卡进行分布式并行训练来扩展模型参数规模,同时使用一些训练优化技术去降低显存、通信、计算等,从而提升训练性能。

分布式训练并行技术

数据并行

张量并行

流水线并行

MOE并行(稀疏化)

之前的文章也介绍过目前常见的分布式并行方案。

大模型分布式训练并行技术(一)-概述

大模型分布式训练并行技术(二)-数据并行

大模型分布式训练并行技术(三)-流水线并行

大模型分布式训练并行技术(四)-张量并行

大模型分布式训练并行技术(五)-序列并行

大模型分布式训练并行技术(六)-多维混合并行

大模型分布式训练并行技术(七)-自动并行

大模型分布式训练并行技术(八)-MOE并行

大模型分布式训练并行技术(九)-总结

这里就不再一一介绍了,本文仅考虑DP/TP/PP这三者最常见的并行技术。

混合精度训练

FP16 / BF16:降低训练显存的消耗,还能将训练速度提升2-4倍。

FP8:NVIDIA H系列GPU开始支持FP8,兼有FP16的稳定性和INT8的速度,Nvidia Transformer Engine 兼容 FP8 框架,主要利用这种精度进行 GEMM(通用矩阵乘法)计算,同时以 FP16 或 FP32 高精度保持主权重和梯度。MS-AMP训练框架 (使用FP8进行训练),与广泛采用的 BF16 混合精度方法相比,内存占用减少 27% 至 42%,权重梯度通信开销显著降低 63% 至 65%。运行速度比广泛采用的 BF16 框架(例如 Megatron-LM)快了 64%,比 Nvidia Transformer Engine 的速度快了 17%。

**重计算(Recomputation)/梯度检查点(gradient checkpointing)**:一种在神经网络训练过程中使动态计算只存储最小层数的技术。一种用计算换显存的方法。通过减少保存的激活值来压缩模型占用空间,在计算梯度时必须重新计算没有存储的激活值。

梯度累积:它将多个Batch训练数据的梯度进行累积,在达到指定累积次数后,使用累积梯度统一更新一次模型参数,以达到一个较大Batch Size的模型训练效果。累积梯度等于多个Batch训练数据的梯度的平均值。

FlashAttention v1 and v2 :通过分块计算和kernel融合,减少了HBM访问次数,实现了计算加速,同时减少了显存占用。 参考:Megatron-deepspeed , 训练推理都可以使用。

MQA / GQA:一定程度的Key value的共享,从而可以使模型体积减小,减少了数据的读取。

卸载(Offload)技术:一种用通信换显存的方法,简单来说就是让模型参数、激活值等在CPU内存和GPU显存之间左右横跳。如:ZeRO-Offload、ZeRO-Infinity等。

基于昇腾910B3进行 LLM 训练性能测试

性能测试说明:

AI框架:ModelLink、MindFormers

模型:baichuan2-7b/13b、qwen1.5-7b/14b、llama2-34b

分布式并行策略:DP/TP/PP

训练优化技术:FlashAttn、GQA、混合精度等

指标:吞吐量、显存(仅为当前分布式策略下的吞吐量,并不是最大吞吐量)

训练数据集:alpaca-52k、belle-random-10k

服务器配置:3 台 910B3 x 8 (其中,某两台在同一个交换机,另外一台在另一个交换机)

下面在910B3上对不同训练框架、不同模型参数规格、不同卡进行了几组对比实验,比如:同一框架同一模型不同参数规模对比,同一框架同一模型不同卡对比,同一框架同一模型不同并行策略对比、不同框架同一模型对比等。

声明:本文LLM训练性能测试数据仅供参考,同时,每种框架里面的训练优化技术没有严格对齐(当然能够提供一组默认的最佳的训练参数是AI框架性能和易用性的隐性衡量标准);因此,具体性能实测为准

www.zeeklog.com  - 大模型国产化适配11-LLM训练性能基准测试(昇腾910B3)

image.png

总结

本文简要介绍了常见的LLM训练评估指标以及分布式训练并行策略和显存优化技术。同时,使用MindFormers/ModelLink框架对不同的大模型的吞吐量进行了简要的测试。

Read more

60个“特征工程”计算函数(Python代码)

60个“特征工程”计算函数(Python代码)

转自:coggle数据科学 近期一些朋友询问我关于如何做特征工程的问题,有没有什么适合初学者的有效操作。 特征工程的问题往往需要具体问题具体分析,当然也有一些暴力的策略,可以在竞赛初赛前期可以带来较大提升,而很多竞赛往往依赖这些信息就可以拿到非常好的效果,剩余的则需要结合业务逻辑以及很多其他的技巧,此处我们将平时用得最多的聚合操作罗列在下方。 最近刚好看到一篇文章汇总了非常多的聚合函数,就摘录在下方,供许多初入竞赛的朋友参考。 聚合特征汇总 pandas自带的聚合函数 * 其它重要聚合函数 其它重要聚合函数&分类分别如下。 def median(x):     return np.median(x) def variation_coefficient(x):     mean = np.mean(x)     if mean != 0:         return np.std(x) / mean     else:         return np.nan def variance(x):     return

By Ne0inhk
90w,确实可以封神了!

90w,确实可以封神了!

要说24年一定最热的技术,还得是AIGC! 前段时间阿里旗下的开源项目,登上GitHub热榜! AI大热,如今ChatGPT的优异表现,必然会出现各种细分场景应用的工具软件,和大量岗位项目! 山雨欲来风满楼,强人工智能的出现,所有科技公司已经开始巨量扩招此领域的人才。算法的岗位,近三个月已经增长68%!这件事在HR届也是相当震撼的。 目前各行各业都不景气的市场,人工智能岗位却一直保持常青!甚至同属AI边缘岗都比其他岗薪资高40%! 与此同时,AI算法岗上岸也不简单,竞争激烈,好公司核心岗位不用说,谁都想去。 所以事实就是,想要上岸,门槛也逐渐变高,项目经历、实习经历都很重要,越早明白这个道理就越能提前建立起自己的优势。 但我在b站逛知识区的时候,经常看到有些同学,因为一些客观原因导致无法参加实习,这种情况下,如果你想提升背景,增加项目经历的话,可以试试这个《CV/NLP 算法工程师培养计划》。 目前已经有上千位同学通过该计划拿到offer了,最新一期学员就业薪资最高能拿到78K!年薪94w! 优势就是有BAT大厂讲师带领,手把手带做AI真实企业项目(包含CV、NLP等

By Ne0inhk
再见nohup!试试这个神器,Python Supervisor!

再见nohup!试试这个神器,Python Supervisor!

👇我的小册 45章教程:() ,原价299,限时特价2杯咖啡,满100人涨10元。 作者丨Ais137 https://juejin.cn/post/7354406980784373798 1. 概述 Supervisor 是一个 C/S 架构的进程监控与管理工具,本文主要介绍其基本用法和部分高级特性,用于解决部署持久化进程的稳定性问题。 2. 问题场景 在实际的工作中,往往会有部署持久化进程的需求,比如接口服务进程,又或者是消费者进程等。这类进程通常是作为后台进程持久化运行的。 一般的部署方法是通过 nohup cmd & 命令来部署。但是这种方式有个弊端是在某些情况下无法保证目标进程的稳定性运行,有的时候 nohup 运行的后台任务会因为未知原因中断,从而导致服务或者消费中断,进而影响项目的正常运行。 为了解决上述问题,通过引入 Supervisor 来部署持久化进程,提高系统运行的稳定性。 3. Supervisor 简介 Supervisor is a client/

By Ne0inhk
第一本给程序员看的AI Agent图书上市了!

第一本给程序员看的AI Agent图书上市了!

AI Agent火爆到什么程度? OpenAI创始人奥特曼预测,未来各行各业,每一个人都可以拥有一个AI Agent;比尔·盖茨在2023年层预言:AI Agent将彻底改变人机交互方式,并颠覆整个软件行业;吴恩达教授在AI Ascent 2024演讲中高赞:AI Agent是一个令人兴奋的趋势,所有从事AI开发的人都应该关注。而国内的各科技巨头也纷纷布局AI Agent平台,如:钉钉的AI PaaS、百度智能云千帆大模型平台等等。 Agent 是未来最重要的智能化工具。对于程序员来说,是时候将目光转向大模型的应用开发了,率先抢占AI的下一个风口AI Agent。 小异带来一本新书《大模型应用开发 动手做 AI Agent》,这本书由《GPT图解》的作者黄佳老师创作,从0到1手把手教你做AI Agent。现在下单享受5折特惠! ▼点击下方,即可5折起购书 有这样一本秘籍在手,程序员们这下放心了吧,让我们先来揭开 Agent 的神秘面纱。 AI Agent 面面观

By Ne0inhk