云服务器内容精选

  • 性能调优总体原则和思路 PyTorch在昇腾AI处理器的加速实现方式是以算子为粒度进行调用(OP-based),即通过Python与C++调用CANN层接口Ascend Computing Language(AscendCL)调用一个或几个亲和算子组合的形式,代替原有GPU的实现方式,具体逻辑模型请参考PyTorch自动迁移。 在PyTorch模型迁移后进行训练的过程中,CPU只负责算子的下发,而NPU负责算子的执行,算子下发和执行异步发生,性能瓶颈在此过程中体现。在PyTorch的动态图机制下,算子被CPU逐个下发到NPU上执行。一方面,理想情况下CPU侧算子下发会明显比NPU侧算子执行更快,此时性能瓶颈主要集中在NPU侧;另一方面,理想情况下NPU侧算子计算流水线一直执行,不会出现NPU等待CPU算子下发即NPU空转的场景,如果存在,则CPU侧算子下发存在瓶颈。 图1 Host算子下发和Device算子执行 综上所述,性能优化的总体原则为:减少Host算子下发时间、减少Device算子执行时间。 训练代码迁移完成后,如存在性能不达标的问题,可参考下图所示流程进行优化。建议按照单卡、单机多卡、多机多卡的流程逐步做性能调优。 图2 性能调优总体思路 为了便于用户快速进行迁移调优,降低调优门槛,ModelArts提供了MA-Adivisor性能自动诊断工具。用户采集性能profiling数据后,可通过该工具自动扫描profiling数据,工具分析完数据后会给出可能的性能问题点及调优建议,用户可以根据调优建议做相应的修改适配。目前该工具对CV类模型给出的调优建议较多,LLM类建议稍少,但是总体都有性能提升,实测大约可提升10%~30%的性能,并且已经在多个迁移性能调优项目中实际应用。 父主题: PyTorch迁移性能调优
  • 使用Advisor工具分析生成调优建议 关于Advisor使用及安装过程请参见昇腾社区Gitee。最后生成导出的各类场景的建议包含以下两种: Terminal日志信息的概览建议。 包含Detail信息及修改示例的HTML信息。 按照建议信息做如下修改: 亲和优化器使能,在train.py中修改优化器为apex混合精度模式下的DDP优化方式(修改点:注释第161和167行,增加第168~170行)。 二进制调优使能,减少算子编译耗时,在train.py头文件导入之后添加 (修改点:增加第37行)。 torch_npu.npu.set_compile_mode(jit_compile=False) AICPU算子调优 ,Double类型输入切换成为Float减少cast算子调用耗时,修改diffusion/gaussian_diffusion.py (修改点:注释第871行,增加第872行)。 父主题: 性能调优
  • 环境准备 迁移环境准备有以下两种方式: 表1 迁移环境准备方式 方式 说明 ModelArts Notebook 该环境为在线调试环境,主要面向演示、体验和快速原型调试场景。 环境开通指导请参考Notebook环境创建。 ModelArts Lite DevServer 该环境为裸机开发环境,主要面向深度定制化开发场景。 环境开通指导请参考DevServer资源开通;环境配置指导请参考Snt9B裸金属服务器环境配置指南。 本文基于ModelArts Lite DevServer进行操作,请参考上表说明在贵阳一环境开通和配置指导完成裸机和容器开发初始化配置。 镜像地址为swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_1_ascend: pytorch_2.1.0-cann_8.0.rc2-py_3.9-hce_2.0.2312-aarch64-snt9b-20240727152329-0f2c29a。 请注意业务基础镜像选择Ascend+PyTorch镜像。
  • 场景介绍 DiT(Diffusion Transformers)模型是一种将Transformer架构引入扩散模型的新方法。传统的扩散模型通常使用U-Net架构,而DiT模型则用Transformer替代了U-Net,处理图像生成和去噪等任务。核心思想是通过Transformer的自注意力机制来捕捉序列中的依赖关系,从而提高生成图像的质量。研究表明,具有较高GFLOPs的DiT模型在图像生成任务中表现更好,尤其是在ImageNet 512×512和256×256的测试中,DiT-XL/2模型实现了2.27的FID值。 下文以Dit模型为例,介绍如何在昇腾设备上如何进行模型迁移,精度及性能调优。
  • 源端抽取慢 检查源端负载是否已到达源端数据源上限。优先查看源端数据源的监控指标,查看CPU、内存、IO等参数是否处于高负载状态。 在排除源端负载的情况下,如果源端是Mysql\Oracle\SqlServer\PostGres\OpenGauss等的全量+增量作业且作业处于全量抽取阶段,或者Kafka\hudi等数据源抽取速度慢,请优先尝试加大作业并发数,以提高作业的并发抽取速率。 Mysql\Oracle\SqlServer\PostGres\OpenGauss等关系型数据为保证事务有序,在增量阶段是单并发抽取,加大并发一般不会提升抽取性能。 如果第2步也无法有效提升性能,请参考对应链路性能调优文档尝试进行参数优化。 如果上述步骤仍然无法提升作业速度,请联系技术支持人员协助解决。
  • 目的端写入慢 检查目的端负载是否已达到目的端数据源上限。优先查看目的端数据源的监控指标,查看CPU、内存、IO等参数是否处于高负载状态。 在排除目的端负载的情况下,加大作业并发,以提高写入速度。 如果第2步也无法有效提升性能,请根据源端抽取慢排查源端的性能因素。 如果排除了源端问题的情况下,请参考对应链路性能调优文档尝试进行参数优化。 如果上述步骤仍然无法提升作业速度,请联系技术支持人员协助解决。
  • 查询操作 索引 根据业务需求,对经常查询的数据字段创建适当的索引。需注意,索引会占用一些空间,并且插入操作和索引更新会消耗资源。因此,建议每个集合的索引数量不超过5个。 案例:出现数据查询缓慢,如果没有创建索引,建议对经常查询的数据字段创建适当的索引,优化查询速度。 对于包含多个键的查询,建议创建包含这些键的复合索引。复合索引的键值顺序很关键,需遵循索引最左前缀原则,查询应包含最左索引字段,以索引创建顺序为准,与查询字段顺序无关。 给索引添加TTL属性,自动筛选过期文档并删除。创建TTL的索引必须是日期类型。TTL索引是单字段索引,而非复合索引。 需要在集合中某个字段上创建索引,但当集合中大量文档不包含该键值时,建议创建稀疏索引。 创建文本索引时,字段指定text,而不是1或者-1。每个集合只有一个文本索引,但它可以为任意多个字段建立索引。 命令使用 使用findOne方法,在数据库中查询匹配多个项目,将会在自然排序文件集合中返回第一个项目。如果需要返回多个文档,则使用find方法。 如果查询无需返回整个文档,或只是用来判断键值是否存在,可以通过投影$project来限制返回字段,减少网络流量和客户端的内存使用。 除了前缀样式查询,正则表达式查询执行的时间比大多数选择器更久,不建议使用索引。 查询中的某些含“$”的操作符可能会降低使用性能。在业务中尽量不要使用该类操作符:$or、$nin、$not、$ne、$exists。 表1 操作符说明 操作符 说明 $or 有多少个条件就会查询多少次,最后合并结果集,建议替换为$in。 $nin 可能会匹配到大多数的索引,此时,查询优化器会退化为全表扫描。 $not 可能会导致查询优化器无法匹配到具体的索引,退化为全表扫描。 $ne 选择字段值不等于指定值的文档,如果多数为取相反值的文档,将会扫描整个索引。 $exists 对于松散的文档结构,查询必须遍历每一个文档。 更多信息,请参见MongoDB官方文档。 注意事项 操作符$where和$exists中不能使用索引。 如果查询结果需要排序,尽量控制结果集的数量。 涉及多个字段的索引时,尽量将用于精确匹配的字段放在索引的前面。 如果查询条件中的键值顺序和复合索引中的创建顺序不一致,DDS会自动优化为查询跟索引顺序一致。 修改操作 通过操作符对文档进行修改,通常可以获得更好的性能。该方式不需要往返服务器来获取并修改文档数据,在序列化和传输数据上花费更少的时间。 批量插入 批量插入(batchInsert)可以减少数据向服务器的提交次数,提高使用性能。批量提交的数据的BSON Size不超过48MB。 聚合运算 聚合运算中,$match需前置于$group,减少$group操作符要处理的文档数量。
  • 数据库和集合的创建 使用短字段名,以节约存储空间。文档数据库与关系型数据库不同,集合中的每个文档都存储字段名,使用短字段名可以有效的节约存储空间。 有效的控制集合中的文档数量,避免影响查询性能。如果有必要,可以进行定期归档。 每条文档都提供默认的“_id”值,禁止向“_id”中保存自定义值。 固定集合相较其他集合,插入速度快,并且能够自动删除旧数据。用户可以根据业务需要,选择创建固定集合以提高性能。
  • 目的端优化 DWS写入优化 可通过在DWS的目的端配置中修改写入相关配置,且可以通过单击高级配置的“查看编辑”按钮,添加高级属性。 图2 添加高级属性 表3 DWS写入优化参数 参数名 类型 默认值 说明 写入模式 enum UPSERT DWS的写入模式,可在目的端配置中设置,实时处理集成作业推荐使用COPY MODE。 UPSERT:为批量更新入库模式。 COPY:为DWS专有的高性能批量入库模式。 批写最大数据量 int 50000 DWS单次写入的最大条数,可在目的端配置中设置。 当缓存的数据达到“批写最大数据量”和“定时批写时间间隔”之一的条件时,触发数据写入。 单次写入条数增大可以减少请求DWS的次数,但可能导致单次请求时长增加,同时也可能导致缓存的数据增加进而影响内存使用。请综合考虑DWS规格和负载, 适当调整该值。 定时批写时间间隔 int 3 DWS单次写入的时间间隔,可在目的端配置中设置。 当缓存的数据达到定时批写时间间隔的条件,触发数据写入。 增大该值有助于增加单次写入时缓存的数据条数,但由于写入频率降低,会提升DWS数据可见的时延。 sink.buffer-flush.max-size int 512 DWS单次写入的数据大小,默认为512MB,可在目的端配置的高级配置中设置。 当缓存的数据达到数据大小限制时,触发数据写入。 与批写最大数据量类似,单次写入大小增大可以减少请求DWS的次数,但可能导致单次请求时长增加,同时也可能导致缓存的数据增加进而影响内存使用。请综合考虑DWS规格和负载, 适当调整该值。
  • 源端优化 MySQL抽取优化 可通过在作业任务配置参数单击中“添加自定义属性”来新增MySQL同步参数。 图1 添加自定义属性 可使用的调优参数具体如下: 表1 全量阶段优化参数 参数名 类型 默认值 说明 scan.incremental.snapshot.backfill.skip boolean true 全量阶段是否跳过读取binlog数据,默认为true。跳过读取binlog数据可以有效降低内存使用。需要注意的是,跳过读取binlog功能只提供at-least-once保证。 scan.incremental.snapshot.chunk.size int 50000 分片大小,决定了全量阶段单个分片最大数据的数据条数以及分片个数。分片大小越大,单个分片数据条数越多,分片个数越小。 当表的条数过多时,作业会划分较多的分片,从而占用过多的内存导致内存问题,请解决表的条数适当调整该值。 当scan.incremental.snapshot.backfill.skip为false时,实时处理集成作业会缓存单个分片的数据,此时分片越大,占用内存越多,引发内存溢出,在此场景下,可以考虑降低分片大小。 scan.snapshot.fetch.size int 1024 全量阶段抽取数据时,从Mysql侧单次请求抽取数据的最大条数,适当增加请求条数可以减少对Mysql的请求次数提升性能。 debezium.max.queue.size int 8192 数据缓存队列条数,默认为8192,当源表中单条数据过大时(如1MB),缓存过多数据会导致内存溢出,可以考虑减小该值。 debezium.max.queue.size.in.bytes int 0 数据缓存队列大小,默认为0,即表示缓存队列不考虑数据大小,只按照数据条数计算。在debezium.max.queue.size无法有效限制内存占用时,考虑显式设置该值来限制缓存数据的大小。 jdbc.properties.socketTimeout int 300000 全量阶段连接Mysql的socket超时时间,默认为5分钟。当Mysql负载较高,作业出现SocketTimeout异常时,考虑增大该值。 jdbc.properties.connectTimeout int 60000 全量阶段连接Mysql的连接超时时间,默认为1分钟。当Mysq负载较高,作业出现ConnectTimeout异常时,考虑增大该值。 表2 增量阶段优化参数 参数名 类型 默认值 说明 debezium.max.queue.size int 8192 数据缓存队列条数,默认为8192,当源表中单条数据过大时(如1MB),缓存过多数据会导致内存溢出,可以考虑减小该值。 debezium.max.queue.size.in.bytes int 0 数据缓存队列大小,默认为0,即表示缓存队列不考虑数据大小,只按照数据条数计算。在debezium.max.queue.size无法有效限制内存占用时,考虑显式设置该值来限制缓存数据的大小。
  • 解决方法 分析慢SQL日志以及CPU使用率指标来定位效率低的查询,再优化查询效率低的语句。 查看慢SQL日志来确定是否存在运行缓慢的SQL查询以及各个查询的性能特征(如果有),从而定位查询运行缓慢的原因。 查询SQL Server日志,请参见查询慢日志。 查看华为云关系型数据库实例的CPU使用率指标,协助定位问题。 请参见通过Cloud Eye监控。 创建只读实例专门负责查询。减轻主实例负载,分担数据库压力。 多表关联查询时,关联字段要加上索引。 尽量避免用select*语句进行全表扫描,可以指定字段或者添加where条件。
  • TaurusDB标准版数据库内存使用率过高怎么处理 对于用户核心业务相关的库 请扩容实例规格,具体请参见变更TaurusDB标准版实例的CPU和内存规格。 对于非用户核心业务相关的库 查看本地计算机的内存使用率,如果使用率曲线持续平缓,则无需处理。 对于用户核心业务相关但是数据库规格配置很高的库 在业务低峰期,将数据库参数“performance_schema”的值调整为“OFF”。 通过 CES 监控面板,观察实例的内存使用情况。具体请参见查看TaurusDB标准版实例监控指标。 如果实例的内存使用率仍持续保持较高: 请扩容实例规格。 调整数据库参数“innodb_buffer_pool_size”的值。参数建议值见表1,实际可修改的取值范围以控制台界面为准。 表1 不同内存规格对应的参数建议值 内存(GB) 5.7建议值 8.0建议值 2 536,870,912 Byte(512 MB) 536,870,912 Byte(512 MB) 4 1,073,741,824 Byte(1 GB) 1,073,741,824 Byte(1 GB) 8 4,294,967,296 Byte(4 GB) 5,368,709,120 Byte(5 GB) 16 8,589,934,592 Byte(8 GB) 9,663,676,416 Byte(9 GB) 32 22,548,578,304 Byte(21 GB) 21,474,836,480 Byte(20 GB) 64 47,244,640,256 Byte(44 GB) 47,244,640,256 Byte(44 GB) 128 94,489,280,512 Byte(88 GB) 94,489,280,512 Byte(88 GB) 192 146,028,888,064 Byte(136 GB) 146,028,888,064 Byte(136 GB) 256 193,273,528,320 Byte(180 GB) 193,273,528,320 Byte(180 GB) 384 300,647,710,720 Byte(280 GB) 300,647,710,720 Byte(280 GB) 512 412,316,860,416 Byte(384 GB) 412,316,860,416 Byte(384 GB) 768 618,475,290,624 Byte(576 GB) 618,475,290,624 Byte(576 GB) 1024 824,633,720,832 Byte(768 GB) 824,633,720,832 Byte(768 GB) 请根据业务实际情况,调整参数“innodb_buffer_pool_size”的值。 MySQL本身具有内存动态平衡机制,内存使用率在90%以下您可无需关注,同时建议内存使用率告警阈值设置不低于90%。 在业务运行中缓冲池内存会逐渐增大至“innodb_buffer_pool_size”的值,可通过监控指标“缓冲池利用率”查看缓冲池内存的增长趋势。 TaurusDB标准版的内存分配可划分为Engine层与Server层。 Engine层的内存包括InnoDB Buffer Pool、Log Buffer、Full Text Index Cache,其中InnoDB Buffer Pool为常驻内存,占用内存较大。 InnoDB缓冲池是一个内存区域,用于保存InnoDB表、索引和其他辅助缓冲区的缓存数据,可以通过参数“innodb_buffer_pool_size”定义缓冲池大小。 Server层的内存占用较高的包括Thread Cache、BinLog Cache、Sort Buffer、Read Buffer、Join Buffer等线程缓存,这类缓存非常驻内存,往往会随着连接关闭而释放。 以上内存的分配导致TaurusDB标准版实例运行时内存使用率在80%左右。 父主题: 性能调优
  • 操作步骤 以下参数有如下两个配置入口: 服务器端配置 进入Yarn服务参数“全部配置”界面,在搜索框中输入参数名称。具体操作请参考修改集群服务配置参数章节。 客户端配置 直接在客户端中修改相应的配置文件。 HDFS客户端配置文件路径:客户端安装目录/HDFS/hadoop/etc/hadoop/hdfs-site.xml。 Yarn客户端配置文件路径:客户端安装目录/HDFS/hadoop/etc/hadoop/yarn-site.xml。 MapReduce客户端配置文件路径:客户端安装目录/HDFS/hadoop/etc/hadoop/mapred-site.xml。 表1 多CPU内核设置 配置 参数 配置描述 节点容器槽位数 yarn.nodemanager.resource.memory-mb 参数解释:节点上YARN可使用的物理内存总量。单位:M。 默认值: MRS 3.x之前版本: 8192 MRS 3.x及之后版本: 16384 参数入口: MRS 3.x之前版本:需要在MRS控制台上进行配置。 MRS 3.x及之后版本:需要在 FusionInsight Manager系统进行配置。 参数配置组合决定了每节点任务(map、reduce)的并发数。 如果所有的任务(map/reduce)需要读写数据至磁盘,多个进程将会同时访问一个磁盘。这将会导致磁盘的IO性能非常的低下。为了改善磁盘的性能,请确保客户端并发访问磁盘的数不大于3。 最大并发的container数量应该为[2.5 * Hadoop中磁盘配置数 ]。 mapreduce.map.memory.mb 参数解释:map任务的内存限制。单位:MB。 默认值:4096 参数入口:需要在客户端进行配置,配置文件路径:客户端安装目录/HDFS/hadoop/etc/hadoop/mapred-site.xml。 mapreduce.reduce.memory.mb 参数解释:Reduce任务的内存限制。单位:MB。 默认值:4096 参数入口:需要在客户端进行配置,配置文件路径:客户端安装目录/HDFS/hadoop/etc/hadoop/mapred-site.xml。 Map输出与压缩 mapreduce.map.output.compress 参数解释:指定了Map任务输出结果可以在网络传输前被压缩。这是一个per-job的配置。 默认值:true 参数入口:需要在客户端进行配置,配置文件路径:客户端安装目录/HDFS/hadoop/etc/hadoop/mapred-site.xml。 Map任务所产生的输出可以在写入磁盘之前被压缩,这样可以节约磁盘空间并得到更快的写盘速度,同时可以减少至Reducer的数据传输量。需要在客户端进行配置。 在这种情况下,磁盘的IO是主要瓶颈。所以可以选择一种压缩率非常高的压缩算法。 编解码器可配置为Snappy,Benchmark测试结果显示Snappy是非常平衡以及高效的编码器。 mapreduce.map.output.compress.codec 参数解释:指定用于压缩的编解码器。 默认值:org.apache.hadoop.io.compress.Lz4Codec 参数入口:需要在客户端进行配置,配置文件路径:客户端安装目录/HDFS/hadoop/etc/hadoop/mapred-site.xml。 Spills mapreduce.map.sort.spill.percent 参数解释:序列化缓冲区中的软限制。一旦达到该限制,线程将在后台开始将内容溢出到磁盘。 默认值:0.8 参数入口:需要在客户端进行配置,配置文件路径:客户端安装目录/HDFS/hadoop/etc/hadoop/mapred-site.xml。 磁盘IO是主要瓶颈,合理配置“mapreduce.task.io.sort.mb”可以使溢出至磁盘的内容最小化。 数据包大小 dfs.client-write-packet-size 参数解释:配置项可以指定该数据包的大小。可以通过每个job进行指定。 默认值:262144 参数入口:需要在客户端进行配置,配置文件路径:客户端安装目录/HDFS/hadoop/etc/hadoop/hdfs-site.xml。 当HDFS客户端写数据至数据节点时,数据会被累积,直到形成一个包。这个数据包会通过网络传输。 数据节点从HDFS客户端接收数据包,然后将数据包里的数据单线程写入磁盘。当磁盘处于并发写入状态时,增加数据包的大小可以减少磁盘寻道时间,从而提升IO性能。 dfs.client-write-packet-size = 262144
  • 如何提高TaurusDB标准版数据库的查询速度 可以参考如下建议: 如果产生了慢日志,可以通过查看慢日志来确定是否存在运行缓慢的SQL查询,以及各个查询的性能特征,从而定位查询运行缓慢的原因。查询TaurusDB标准版日志,请参见查看或下载TaurusDB标准版慢日志。 查看TaurusDB标准版实例的CPU使用率指标,协助定位问题。具体请参见查看TaurusDB标准版实例监控指标。 可以创建只读实例专门负责查询,减轻主实例负载,分担数据库压力。 如果是实例规格较小但负载过高,您可以提高CPU/内存规格,具体请参见变更TaurusDB标准版实例的CPU和内存规格。 多表关联查询时,关联字段要加上索引。 可以指定字段或者添加where条件进行查询,避免用select*语句进行全表扫描。 父主题: 性能调优
  • 应用场景 本文列举了一些常见的从checkpoint恢复的场景供您参考,如表1所示。 更多场景你可以使用从checkpoint恢复的原则结合实际情况进行判断。 表1 从checkpoint恢复的常见场景 场景 是否支持恢复 说明 调整或者增加并行数 不支持 该操作修改了作业的并行数,即修改了作业的运行逻辑。 修改Flink SQL语句、Flink Jar作业等操作 不支持 该操作修改了作业对资源的算法逻辑。 例如原有的算法的语句是执行加减运算,当前需要恢复的状态将算法的语句修改成为乘除取余的运算,是无法从checkpoint直接恢复的。 修改“静态流图” 不支持 该操作修改了作业对资源的算法逻辑。 修改“单TM所占CU数”参数 支持 对计算资源的修改并没有影响到作业算法或算子的运行逻辑。 作业运行异常或物理停电 支持 当对作业参数未作出修改。