如何定位Milvus性能瓶颈并优化
假设您拥有一台强大的计算机系统或一个应用,用于快速执行各种任务。但是,系统中有一个组件的速度跟不上其他部分,这个性能不佳的组件拉低了系统的整体性能,成为了整个系统的瓶颈。在软件领域中,瓶颈是指整个路径中吞吐量最低的部分。如果机器中的某个齿轮转得不够快,整个系统的速度都会受到影响。因此,及时识别和解决瓶颈问题的重要性不言而喻,能显著提升计算机系统和应用的效率。
在此前的文章中,我们已经介绍了评估各种向量数据库时使用的关键指标和性能测试工具。本文将以 Milvus 向量数据库为例,特别关注 Milvus 2.2 或以上版本,讲解如何监控搜索性能、识别瓶颈并优化向量数据库性能。
性能评估及监控指标
在向量数据库系统中,最常用且最重要的评估指标包括召回率(Recall)、延迟(Latency)和每秒查询数(QPS)。这些指标反映了系统的准确性、响应速度以及能够处理的请求量。
Recall
召回率是指在搜索查询中成功检索到的相关内容的比例。但是,通常并不是所有接近的向量都能被准确识别。这一不足往往源于索引算法的近似性(除了暴搜以外)。这些算法牺牲召回率以换取速度的提升。这些索引算法的配置旨在为特定生产需求寻找一个合适的平衡。更多详细信息,请参阅milvus的文档页面:内存索引和磁盘索引。
计算召回率可能会消耗大量资源,通常由客户端完成。由于确立 Ground truth 需要大量计算,因此通常不会显示在监控仪表板上。在接下来的指南中,我们假定已经达到了一个可接受的召回率水平,且已经为向量索引选定了适当的索引参数。
Latency
延迟指的是响应速度——即从发起查询到接收到结果所需的时间,就好比水从一端流到另一端所需要的时间。较低的延迟可以确保更快的响应速度,这对于实时应用来说非常关键。
QPS
QPS 是衡量系统吞吐量的一个重要指标,它显示了系统每秒能处理的查询数量,类似于水流通过管道的流速。更高的 QPS 值意味着系统能够更有效地处理大量并发请求,这是衡量系统性能的关键因素。
QPS 和延迟之间的关系通常较为复杂。在传统数据库系统中,当 QPS 接近系统的最大容量并耗尽所有资源时,延迟往往会增加。但在 Milvus 中,系统通过批量处理查询来优化性能。这种策略减小了网络数据包的大小,并可能同时提高延迟和 QPS,从而提升系统的整体效率。
性能监控工具
我们将使用 Prometheus 来收集和分析 Milvus 性能。此外,我们还会使用 Grafana 的可视化界面来及时发现性能瓶颈问题。
如何发现性能瓶颈
以下流程图展示了如何使用 Grafana 来有效识别性能瓶颈。图中的黄色菱形框代表需要评估的决策点,浅蓝框则提示具体操作或更多详细信息。在文章接下来的部分中,我们将指导您按照流程图所示的每一步骤监控和诊断性能问题。
前提条件
在开始监控 Milvus 向量数据库的性能之前,请先在 Kubernetes 上部署监控服务,并通过 Grafana 仪表盘对收集的指标进行可视化处理。 更多详细信息,请查阅我们的相关文档页面:
-
在 Kubernetes 上部署监控服务
-
设置 Milvus 集群和 K8s
-
在 Grafana 中可视化 Milvus 指标
重要提示:Grafana 的最小间隔会影响性能监控结果
在开始使用 Grafana 监控 Milvus 前,需要先注意 Grafana 中的最小显示间隔(Minimum interval)可能与设定的间隔不一致。因此,经过平均处理后,图表中的一些尖峰可能会变得更加平滑,或者甚至不再可见。
为了解决这个问题:
-
点击指标名称,选择 Edit (编辑)或按下 e 键。
-
点击 Query Options(查询选项)。
-
将最小间隔(Min interval)改为 15 秒。
重要提示:NUMA 硬件会影响 Milvus 性能
非统一内存访问(NUMA)模式是多处理器系统中采用的一种内存设计方式。在 NUMA 架构下,每个 CPU 核心都直接链接到特定的内存块。访问与执行当前任务的处理器相连的本地内存要比访问连接到其他处理器的远程内存快。当处理器需要从没有直接连接的内存块中获取数据时,因为路径较长,将会产生额外的延迟。
在 NUMA 架构的机器上部署 Milvus 时,推荐使用 numactl
、cpuset
或类似的工具来分配 Milvus 组件,以保证处理器的亲和性(affinity)。例如,Sapphire Rapids 处理器通常每个 NUMA 节点包含 32 核心,而传统的处理器通常每节点有 16 核心。可以通过在实例上执行 lscpu
命令来确认这一点。
现在,我们可以开始监控 Milvus 的性能,并查找可能存在的性能瓶颈。
1.打开 Grafana 仪表盘
成功在 Kubernetes 上部署监控服务并通过 Grafana 可视化指标之后,请打开 Grafana 仪表盘,如下所示。
注意:本文中,我们采用 Grafana V2 来进行性能监控和瓶颈分析。如果你使用的是 Grafana V1,监控流程可能会有所不同。
2.检查每个组件的 CPU 用量
我们需要检查几个关键组件(Proxy、QueryNode、IndexNode 等)的 CPU 使用情况。要查看每个组件的 CPU 用量,先展开“Overview”(概览)然后选择“CPU usage”(CPU 使用率)。
注意:
-
当使用 Milvus 监控 CPU 使用率时,监控数据是在 pod 级别获取的。运行 Standalone Milvus 会显示一条单独的线,代表该 pod 的 CPU 使用情况。运行分布式 Milvus 则可以查看多个 pod 的 CPU 使用情况。在图表中,可以通过一个明显的浅蓝色线条识别 Proxy 的 CPU 使用率,该线条触及上限阈值时,表示已达到 CPU 上限。
-
如果面板丢失,且在“Service Quality”(服务质量)下找不到任何图表,您可以:
-
查看“Runtime”(运行时)下的 CPU Usage。这里显示的是 Kubernetes 的单位使用情况,而非百分比。
-
或添加 pod 用量面板。点击 “Add”(添加)按钮并选择“Visualization”(可视化)。
-
输入 PromQL 查询。
sum(rate(container_cpu_usage_seconds_total{namespace="$namespace",pod=~"$instance-milvus.*",image!="",container!=""}[2m])) by (pod, namespace) / (sum(container_spec_cpu_quota{namespace="$namespace",pod=~"$instance-milvus.*",image!="",container!=""}/100000) by (pod, namespace))
-
选择“Unit”(单位)。
-
保存设置。
Proxy
当 QPS 较高并且执行网络密集型任务时,如搜索 Top-K 较大、启用 Partition key 以及在输出字段返回向量等,Proxy 可能会成为瓶颈。
如何解决这个问题?
要解决这个问题,您可以:
-
垂直扩展 Proxy:增加主机的 CPU/内存
-
水平扩展:增加更多 Proxy pods,并在前端使用负载均衡器(Load balancer)
QueryNode
如果查询节点(QueryNode)的性能受到 CPU 使用率的限制,可能有几个原因,您可以根据以下流程图所示的指示进行操作。
如果某个查询节点的 CPU 使用率达到 100%,如图所示,它可能承担了分发器(Delegator)的角色。
在 Milvus 中,Delegator 的作用类似于军队的指挥官。当搜索请求提交给 Proxy 时,Proxy 首先将请求发送至 Delegator,随后再将其分发到其他 QueryNode 并开始在各个 Segment 上执行搜索。搜索结果将按反向顺序返回。您可以通过选择:QueryNode > DML virtual channel 来验证 QueryNode 是否承担了 Delegator 的角色。
要查看段 Segment 的整体分布情况,请在仪表盘上选择“Query(查询) > Segment Loaded Num(已加载 Segment 数量)”。
如何解决这个问题?
基于您所插入的数据量,维护如此之多的 QueryNode 是否必要?过多的 QueryNode 可能导致 Delegator 需要处理更多的消息,从而降低整体性能。因此,缩减 QueryNode 的数量可能有助于减轻 Delegator 的负担。
另外,还可以考虑垂直扩展 QueryNode——这包括增加托管 QueryNode 的单个 pod 或实例的计算资源,例如 CPU 和内存。这样的调整能够显著提升处理能力,而不增加 Delegator 承担的消息负载。
如果您的数据库是静态的,可以通过手动将数据 Segment 平衡到其他查询节点来解决这个问题,这样 Delegator 就不进行 Segment 搜索,只专注于请求的分发和结果的简化。实施步骤包括:
-
在 Milvus 的 YAML 文件中关闭
autoBalance
功能。 -
通过 SDK 调用
LoadBalance
API。参见:均衡查询负载。
如果您关闭了 autoBalance
并且向数据库中添加了新的向量,您可能需要重新触发 LoadBalance
。
注意:如果您已经按照上述步骤操作,但 Delegator 仍是性能瓶颈,那么请通过 GitHub 提交问题或直接与我们联系。
IndexNode
当 IndexNote 的 CPU 使用率达到 100% 时,通常是因为 IndexNodes 正在创建索引。如果搜索请求不紧急且新数据的输入暂时中断,建议让 IndexNode 完成索引创建的过程。这样做可以确保在开始任何搜索操作之前,所有的索引都已创建成功。在数据插入的同时进行搜索查询可能会显著降低搜索性能。性能下降的程度受到多种因素的影响,包括您插入向量的方式以及您是否希望在插入后立即返回这些新插入的向量。
如何解决这个问题?
我们提供一些策略可以最小化影响:
-
如果条件允许,建议采用批量插入而不是单个插入向量。这可以减少网络传输并绕过“Growing segment”,从而加速数据插入和搜索。更多相关信息,请参考 Bulk insert 文档。
-
如果不要求数据即时可见,可以考虑以下建议:
-
忽略 Growing segments;在搜索参数中使用
ignore_growing
,具体方法请参考 https://milvus.io/docs/search.md。 -
在 API 调用是将搜索的一致性等级(Consistency level)设置为
Eventually
。更多详情,请参考 https://milvus.io/docs/consistency.md。
-
其他组件
在 Milvus 的架构中,MixCoord、DataNode 等组件用于高效执行各自的任务,通常不会成为搜索性能的瓶颈。但是,如果监控结果表明这些组件的 CPU 利用率接近或达到满载,暗示可能出现瓶颈,那么请立即扩展这些组件。
3.检查使用的 Milvus 版本
如果您使用的是 Milvus 2.3.x 或以上版本,请跳过此步骤。
Milvus 2.2.x 及以下版本允许用户估算其 CPU 资源消耗,但这一功能在 Milvus 2.3.x 及后续版本中已被删除,因为它可能导致性能问题。
下方图表的 y 轴表示 CPU 数量与百分比的乘积,例如,12个 CPU 的完全利用率在 y 轴上的显示值为1200。
说明:这种估算有时可能会错误地表现为 CPU 的忙碌程度,导致实际 CPU 使用率较低时仍发生任务排队。
如何解决这个问题?
建议将 queryNode.scheduler.cpuRatio
的值调低,其默认值为10.0。
4.检查磁盘性能
如果您在创建索引时选择使用 DiskANN,请检查磁盘性能。
对于 DiskANN 索引类型,推荐使用 NVMe SSD。在 SATA SSD 或 HDD 上创建和搜索磁盘索引可能会因为 I/O 操作受限而导致较大的 Latency 和较低的 QPS。
如需检测磁盘性能,您可以使用 fio
或其他类似的 I/O 性能测试工具来评估 IOPS。一个 NVMe SSD 的 IOPS 应接近 500k。
# Write Testfio -direct=1-iodepth=128 -rw=randwrite -ioengine=libaio -bs=4K -size=10G -numjobs=10 -runtime=600 -group_reporting -filename=/fiotest/test -name=Rand_Write_IOPS_Test# Read Testfio --filename=/fiotest/test --direct=1 --rw=randread --bs=4k --ioengine=libaio --iodepth=64 --runtime=120 --numjobs=128 --time_based --group_reporting --name=iops-test-job --eta-newline=1 --readonly
在 Grafana 中查看 pod 级别的 IOPS:
-
在右上角,点击“Pod”,然后选择“Kubernetes / Compute Resources / Pod”。如果您在使用 V2 仪表盘,请点击“Milvus2.0”。
-
选择您想要检查的 pod:
-
向下滚动并找到“Storage IO”。
如何解决这个问题?
-
考虑将 SATA SSD 或 HDD 升级到 NVMe SSD,以降低您当前系统的 Latency。多数云服务提供商,例如 AWS,提供 NVMe SSD 的存储选项。比如,AWS 的 m6id 实例在 m6 系列中就配备了基于 NVMe 的本地 SSD。但需要注意的是,虽然 EBS 采用 NVMe 驱动,但其提供的低延迟优势并不及本地 NVMe SSD。
-
在磁盘索引方面,我们强烈建议选择 NVMe SSD。如果您目前使用的是 SATA SSD 或 HDD,将它们配置为 RAID(独立磁盘冗余阵列)可以帮助减少延迟。
5.检查带宽
带宽限制往往会在系统中形成关键瓶颈,但这种挑战可能往往不会立即显现——可能会出现系统性能提升但 QPS 仍然不变的情况,或者像 gRPC 操作执行时间意外延长这样的间接效果。
理解带宽在这些场景中的角色对于诊断和解决性能限制是至关重要的。例如,在查询维度为 1024 且 TopK 设为 100 的 KNN 搜索请求中,每个请求可能消耗大约 4.8 KB,用于客户端与代理之间的双向通信。1000 的 QPS 意味着大约 4.7 MB的数据通过通道传输。因此,带宽至少应能支持 37 Mbps,以避免拉低 QPS。
虽然初看可能不觉得重要,但提高每秒查询数(QPS)或在输出字段中加入向量会大幅增加所需带宽。举个例子,如果输出字段需要包含向量,上述例子中需要的带宽会上升至至少 3 Gbps。
尽管进行这些计算可能比较繁琐,但使用 Grafana 这类监控工具可以帮助检查进出带宽,有效评估系统性能。
注意:如果您以集群模式部署Milvus,请不要忘记检查Milvus pods之间的带宽。
下图仅显示proxy的网络使用情况:
如何解决这个问题?
-
增加带宽
为了应对带宽限制,您可以考虑通过云平台控制台增加带宽,或联系云服务提供商或 DevOps 团队以获得支持。
-
启用压缩
我们正在 Milvus 中开发一项新功能,该功能将支持在 Milvus 各组件间以及 Milvus 与 SDK 客户端间实施 gRPC 压缩。通过压缩数据,能够显著降低数据量,虽然这可能因编解码过程而增加 CPU 使用率。预计该功能将在 Milvus 2.4.x 版本中推出,敬请期待!
6.检查性能测试客户端
设想这样一个场景:一个水龙头慢慢地向一根大水管滴水。如果水龙头的出水量很小,那么它将永远无法达到水管的最大容量。同理,当一个客户端每秒只发送少数几个请求时,它无法充分发挥 Milvus 处理大量数据的能力。为了验证客户端是否是性能瓶颈,您可以尝试以下方法:
-
增加并发数,查看是否有差异。
-
在不同的计算机或主机上部署多个客户端进行测试。
如何解决这个问题?
如果发现客户端是性能瓶颈,请考虑增加请求的数量。
-
检查并调整可能限制数据流的网络限制器。
-
如果您使用 PyMilvus:
a.在多进程操作中,选择使用 spawn
方法而非 fork
。
b.在每一个进程中,执行以下操作:导入 from pymilvus import connections
,然后运行 connections.connect(args)
。
3.进行水平扩展——增加客户端数量,直至 QPS 值稳定。
联系我们
我们希望这份指南能够帮助您充分提升 Milvus 性能!但如果您无法定位性能瓶颈或在解决性能问题时需要帮助,欢迎随时联系我们。我们随时准备帮助您突破这些挑战!
欢迎通过以下方式联系我们:
-
提交 GitHub issue
-
加入 GitHub Discussions
-
加入 Milvus Discord 社区
点击下方链接,立即体验Zilliz Cloud:
Zilliz Cloud 向量数据库?utm_source=csdn
相关文章:
如何定位Milvus性能瓶颈并优化
假设您拥有一台强大的计算机系统或一个应用,用于快速执行各种任务。但是,系统中有一个组件的速度跟不上其他部分,这个性能不佳的组件拉低了系统的整体性能,成为了整个系统的瓶颈。在软件领域中,瓶颈是指整个路径中吞吐…...
阿里云服务器 篇三:提交搜索引擎收录
文章目录 系列文章推荐:为网站注册域名判断网站是否已被搜索引擎收录主动提交搜索引擎收录未查询到收录结果时,根据提示进行提交网站提交网站时一般需要登录账号主动提交网站可缩短爬虫发现网站链接时间,但不保证一定能够收录所提交的网站百度提交地址360搜索提交地址搜狗提…...
powe bi界面认识及矩阵表基本操作 - 1
powe bi界面认识及矩阵表操作 1. 界面认识1.1 选择数据源1.2 选择相关表及点击加载1.3 表字段显示位置1.4 表属性按钮位置1.5 界面布局按钮认识 2. 矩阵表基本操作2.1 选择矩阵表2.2 创建矩阵表2.3 设置字体大小2.4 行填充:修改高度2.5 列宽:设置列的宽度…...
SpringBoot 项目 pom.xml 中 设置 Docker Maven 插件
在Spring Boot项目中,使用Docker Maven插件(通常是docker-maven-plugin或者fabric8io/docker-maven-plugin)来自动化构建Docker镜像并将其推送到远程仓库。 这里分别介绍这两种插件的基本配置,并说明如何设置远程仓库推送。 1、…...
k8s二次开发-kubebuiler一键式生成deployment,svc,ingress
一 Kubebuilder环境搭建 注:必须在当前的K8S集群有 nginx这个ingressclass rootk8s:~# kubectl get ingressclass NAME CONTROLLER PARAMETERS AGE nginx k8s.io/ingress-nginx <none> 19h1.1 下载kubebuilder wget https://gi…...
Flutter 状态管理新境界:多Provider并行驱动UI
前言 在上一篇文章中,我们讨论了如何使用 Provider 在 Flutter 中进行状态管理。 本篇文章我们来讨论如何使用多个 Provider。 在 Flutter 中,使用 Provider 管理多个不同的状态时,你可以为每个状态创建一个单独的 ChangeNotifierProvider…...
标识符和关键字的区别是什么,常用的关键字有哪些?自增自减运算符,移位运算符continue、break、return的区别是什么?
标识符和关键字的区别是什么,常用的关键字有哪些? 标识符标识符就是当我们给变量,方法,类命名时候的名字,而被赋予特殊含义的标识符就是关键字。例如生活中,当我们需要开一家店时候,我们不能将…...
在VS Code上搭建Vue项目教程(Vue-cli 脚手架)
1.前期环境准备 搭建Vue项目使用的是Vue-cli 脚手架。前期环境需要准备Node.js环境,就像Java开发要依赖JDK环境一样。 1.1 Node.js环境配置 1)具体安装步骤操作即可: npm 安装教程_如何安装npm-CSDN博客文章浏览阅读836次。本文主要在Win…...
AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理
AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理 目录 AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理 一、简单介绍 二、零样本学习 (Zero-shot Learning) 和少样本学习 (Few-shot Learning) 1、零样本学…...
Docker 和 k8s 之间是什么关系?
Docker 简介 Docker 功能: Docker 是一款可以将程序和环境打包并运行的工具软件。通过 Docker,可以将程序及其依赖环境打包,确保在不同操作系统上一致的运行效果。 环境一致性问题: 程序依赖于特定的环境,不同操作系统…...
敲详细的springframework-amqp-rabbit源码解析
看源码时将RabbitMQ的springframework-amqp-rabbit和spring-rabbit的一套区分开,springboot是基于RabbitMQ的Java客户端建立了简便易用的框架。 springboot的框架下相对更多地使用消费者Consumer和监听器Listener的概念,这两个概念不注意区分容易混淆。…...
Telegram Bot、小程序开发(三)Mini Apps小程序
文章目录 一、Telegram Mini Apps小程序二、小程序启动方式三、小程序开发小程序调试模式初始化小程序Keyboard Button Mini Apps 键盘按钮小程序【依赖具体用户信息场景,推荐】**Inline Button Mini Apps内联按钮小程序**initData 的自动传递使用内联菜单时候哪些参数会默认传…...
Django F()函数
F()函数的作用 F()函数在Django中是一个非常强大的工具,主要用于在查询表达式中引用模型的字段。它允许你在数据库层面执行各种操作,而无需将数据加载到Python内存中。这不仅提高了性能,还允许你利用数据库的优化功能。 字段引用 在查询表达…...
GraphRAG的实践
好久没有体验新技术了,今天来玩一下GraphRAG 顾名思义,一种检索增强的方法,利用图谱来实现RAG 1.配置环境 conda create -n GraphRAG python3.11 conda activate GraphRAG pip install graphrag 2.构建GraphRAG mkdir -p ./ragtest/i…...
自动驾驶三维车道线检测系列—LATR: 3D Lane Detection from Monocular Images with Transformer
文章目录 1. 概述2. 背景介绍3. 方法3.1 整体结构3.2 车道感知查询生成器3.3 动态3D地面位置嵌入3.4 预测头和损失 4. 实验评测4.1 数据集和评估指标4.2 实验设置4.3 主要结果 5. 讨论和总结 1. 概述 3D 车道线检测是自动驾驶中的一个基础但具有挑战性的任务。最近的进展主要依…...
守护动物乐园:视频AI智能监管方案助力动物园安全与秩序管理
一、背景分析 近日,某大熊猫参观基地通报了4位游客在参观时,向大熊猫室外活动场内吐口水的不文明行为。这几位游客的行为违反了入园参观规定并可能对大熊猫造成严重危害,已经被该熊猫基地终身禁止再次进入参观。而在此前,另一熊猫…...
FairGuard游戏加固入选《嘶吼2024网络安全产业图谱》
2024年7月16日,国内网络安全专业媒体——嘶吼安全产业研究院正式发布《嘶吼2024网络安全产业图谱》(以下简称“产业图谱”)。 本次发布的产业图谱,共涉及七大类别,127个细分领域。全面展现了网络安全产业的构成和重要组成部分,探…...
数据仓库事实表
数据仓库中的三种常见事实表类型:事务事实表、周期快照事实表和累积快照事实表 事务事实表: 事务事实表是记录事务级别数据的事实表。它记录了每个事务发生的具体度量指标,如销售金额、数量等。事务事实表的优势在于能够提供详细的事务级别…...
LeetCode题练习与总结:两数之和Ⅱ-输入有序数组--167
一、题目描述 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 < index1 < index…...
在 Java 中,怎样设计一个可扩展且易于维护的微服务架构?
在Java中设计一个可扩展且易于维护的微服务架构,可以考虑以下几个方面: 模块化设计:将应用拆分为多个小的、独立的模块,每个模块负责处理特定的业务逻辑。每个模块可以独立开发、测试和部署,增加或替换模块时不会影响其…...
零基础入门鸿蒙开发 HarmonyOS NEXT星河版开发学习
今天开始带大家零基础入门鸿蒙开发,也就是你没有任何编程基础的情况下就可以跟着石头哥零基础学习鸿蒙开发。 目录 一,为什么要学习鸿蒙 1-1,鸿蒙介绍 1-2,为什么要学习鸿蒙 1-3,鸿蒙各个版本介绍 1-4࿰…...
Chromium CI/CD 之Jenkins实用指南2024-在Windows节点上创建任务(九)
1. 引言 在现代软件开发流程中,持续集成(CI)和持续交付(CD)已成为确保代码质量和加速发布周期的关键实践。Jenkins作为一款广泛应用的开源自动化服务器,通过其强大的插件生态系统和灵活的配置选项…...
ceph进程网卡绑定逻辑
main() //如osd进程,是ceph_osd.cc文件的main函数;mon进程,是ceph_mon.cc文件的main函数 -->pick_addresses() // 会读取"cluster_network_interface"和"public_network_interface"这两个配置项来过滤ip ---->fill…...
学习opencv
初步学习可以参考: OpenCV学习之路(附加资料分享)_opencv资料-CSDN博客 【OpenCV】OpenCV常用函数合集【持续更新】_opencv函数手册-CSDN博客 整体框架可以参考: OpenCV学习指南:从零基础到全面掌握(零…...
利用双端队列 实现二叉树的非递归的中序遍历
双端队列:双向队列:支持插入删除元素的线性集合。 java官方文档推荐用deque实现栈(stack)。 pop(): 弹出栈中元素,也就是返回并移除队头元素,等价于removeFirst(),如果队列无元素,则…...
昇思25天学习打卡营第18天 | 基于MindSpore的GPT2文本摘要
昇思25天学习打卡营第18天 | 基于MindSpore的GPT2文本摘要 文章目录 昇思25天学习打卡营第18天 | 基于MindSpore的GPT2文本摘要数据集创建数据集数据预处理Tokenizer 模型构建构建GPT2ForSummarization模型动态学习率 模型训练模型推理总结打卡 数据集 实验使用nlpcc2017摘要数…...
科研绘图系列:R语言circos图(circos plot)
介绍 Circos图是一种数据可视化工具,它以圆形布局展示数据,通常用于显示数据之间的关系和模式。这种图表特别适合于展示分层数据或网络关系。Circos图的一些关键特点包括: 圆形布局:数据被组织在一个或多个同心圆中,每个圆可以代表不同的数据维度或层次。扇区:每个圆被划…...
追踪Conda包的踪迹:深入探索依赖关系与管理
追踪Conda包的踪迹:深入探索依赖关系与管理 Conda作为Python和其他科学计算语言的包管理器,不仅提供了安装、更新和卸载包的功能,还有一个强大的包跟踪功能,帮助用户理解包之间的依赖关系和管理环境。本文将详细解释如何在Conda中…...
苹果电脑pdf合并软件 苹果电脑合并pdf 苹果电脑pdf怎么合并
在数字化办公日益普及的今天,pdf文件因其跨平台兼容性强、格式稳定等特点,已经成为工作、学习和生活中不可或缺的文件格式。然而,我们常常面临一个问题:如何将多个pdf文件合并为一个?这不仅有助于文件的整理和管理&…...
axios(ajax请求库)
json-server(搭建http服务) json-server用来快速搭建模拟的REST API的工具包 使用json-server 下载:npm install -g json-server创建数据库json文件:db.json开启服务:json-srver --watch db.json axios的基本使用 <!doctype html>…...
在线做效果图的网站有哪些/做seo必须有网站吗
先上图:DockerDcoker基本概念Docker 包括三个基本概念:镜像(Image):Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境…...
龙岩做网站开发价格/挖掘关键词工具
最近在学习在windows平台用flask框架提供Restful API服务,需要使得flask的windows应用能够开机自动运行,并且后台运行,所以通过service来实现。 首先尝试的是在自己派生的serivice类的中直接调用 create_app(debugTrue).run(host0.0.0.0, po…...
wordpress评论采集插件/新手seo要学多久
接口与类的调用在java并发编程开发项目中是非常常见的一种开发需求,而今天我们就通过案例分析来了解一下,java并发编程常见的接口与类都有哪些类型。1、接口:ConditionCondition为接口类型,它将Object监视器方法(wait、notify和notifyAll)分解…...
自学建设网站/福州网站建设团队
中考语文3500常用汉字七年级上课文篇目 需掌握的字 正确读音 课文篇目 需掌握的字 正确读音为你打开一扇门 憧憬 chōng jǐng 十三岁的际遇 白驹过隙 jū x 裨益 b 蓦然 m 广袤 mo 积攒 zǎn 跌宕 dng 安恬 tin 诠释 qun 樯橹 qing 真谛 d 惆怅 chuchng 繁星 半明半昧 mi 伟人…...
下拉网站导航用ps怎么做/桂平网络推广
大家都知道,现在Spring框架几乎无处不用,目前最新版本据说是Spring5,现在常用的基本还是Spring4.X,很多公司甚至用的还是Spring3.x,而Spring领域其中最好用的莫过于SpringBoot,这是从SpringMVC衍变出来的&a…...
网站制作有哪些创新/百度权重查询
说实话,css用过不少,但是伪类与伪元素是啥意思呢?不复习真不知道用了那么多的: :;竟然就是伪类与伪元素的意思。来,跟我一起来复习下。 先来看看这张图片 CSS 选择器 种类如下 类型、类和ID选择器标签属性选择器运算符伪类与伪元…...