云服务器内容精选

  • 人工智能性能优化 1.训练优化模型性能提升实践 参数调优策略:调整模型flash attention、并行切分策略、micro batch size、重计算策略等参数。 尽可能充分利用显存和算力,通过参数调优,初步优化性能。 性能拆解 参数调优后性能仍然与转商目标有较大的差距,需要考虑进行profiling,采集性能数据后从更底层的算子、通信、调度和内存等维度将性能进行拆解分析,训练脚本中加入profiling代码。具体步骤:生成profiling数据目录结构;利用att工具,将NPU与竞品之间的数据进行端到端耗时对比分析;Tracing分析。 算子分析 通过生成profiling中的summary文件对具体的算子进行分析,考虑算子层面向FA与MM算子方向优化。 2.路由规划加速最佳实践 ranktable路由规划是一种用于分布式并行训练中的通信优化能力,在使用NPU的场景下,支持对节点之间的通信路径根据交换机实际topo做网络路由亲和规划,进而提升节点之间的通信速度。本案例介绍如何在ModelArts Lite场景下使用ranktable路由规划完成Pytorch NPU分布式训练任务,训练任务默认使用Volcano job形式下发到Lite资源池集群。详细步骤可参考最佳实践文档。 训练显存优化实践 pytorch的内存池基本管理策略 pytorch的内存池以block为粒度来进行管理,block池分为小内存池与大内存池,block是pytorch向device驱动申请内存的粒度,整存整取。用户/Pytorch代码向内存池申请内存的接口归一为tensor的申请释放(这点最开始也不是很好理解,也就是说:任何一个pytorch代码申请内存的地方,均表现为一个tensor的申请释放)。 tensor的生命周期使用类似智能指针的引用计数方式来管理,且打通了Python与C++的通道,即:一个Python的tensor对象关联一个C++的tensor对象,Python的tensor对象的消失会触发C++的tensor对象析构释放内存。一个在C++环境里创建的tensor对象可以返回成一个Python的tensor对象。 C++的tensor对象分为两部分:一部分是viewTensor,包含tensor的各种meta信息:shape, stride, dataType等,一部分是storageTensor,包含具体的内存addr,offset,对外呈现的是viewTensor,这是pytorch做view类操作后,多个tensor对应同一块内存的基本支撑。在storageTensor申请时,向pytorch的block池申请一块内存,找到空闲块之后,视实际要求对block进行切分使用并返回address指针。 pytorch的内存的跨流复用策略 如果一个stream上的内存池里申请的tensor需要给另一个stream使用,那么则需要进行recordStream操作,将这个tensor的所属block标识上新stream的信息,在这个tensor的生命周期消失触发address释放时,发现其所属block有其他stream信息,此时会给对应stream下发一个event_record task然后返回。 在之后本stream在每一次新申请内存时,均做一下event_query操作,如果发现event已经被record则其他stream上的task已经执行完成,此时可以放心地回收这个block。 Pytorch的内存统计信息说明 pytorch的内存一般看三个峰值信息:allocated / active / reserved。allocated对应host上的tensor实际申请了但是没释放的内存(注意:是在host上申请释放,不代表device状态)。active对应host上还未释放的内存+还在被别的流占用的内存。 举例,一个tensor在streamA上申请了,让供streamB做allreduce的集合通信操作,然后tensor进过一次add后被释放,此时:释放会减去allocated值,但是不会减去active 值,直至这个allreduce真实执行之后,通过query_event查询到结果之后触发释放,才会减去active值。 reserved对应pytorch向device申请了的内存,比如申请了100M,然后释放了,然后又申请了20M,还未释放,此时的allocated 为20M,reserved为100M。真实网络里,reserved里存在大量block被切小了的可使用内存但是当申请一个大块内存时又无法复用,这种会导致reserved 与 allocated 的较大差值,通常称为内存碎片。 pytorch的内存碎片影响因素 一个step里更多的内存申请释放内存次数理论上一定会导致更多的内存碎片,为什么说是一个step呢?因为pytorch内存池只取决于host上的训练脚本逻辑,而每个step的训练脚本逻辑是相同的,所以一般第一个step之后内存状态可以稳定下来。 不同生命周期的tensor交替地申请释放,因为pytorch向驱动申请是整存整取,所以:一个常规的优秀做法是把长生命周期放在最开始申请,这样不易形成碎片。而workspace内存由于可以绝对意义上地串行复用,因此对此单独做一个定制的内存池策略可以减少对内存碎片影响,在NPU上常见的非连续转连续操作,就是一个相对GPU来说较多的内存申请。 显存优化策略 由于大模型的参数成倍数的增长,远超出了单GPU物理显存所能承载的范围,大模型训练必然需要进行显存优化。显存优化要么是优化算法本身,降低模型算法的显存消耗;要么是去扩大显存,通过一些置换方式获得“额外“空间,由于显存物理大小一定,我们获得额外空间的方式不外乎两种:时间换空间和空间转移。其中,时间换空间通常会消耗算力、带宽;空间转移主要是消耗I/O带宽,有一定的时延,可能会降低吞吐。 观测性能指标 指标ID 指标名称 指标说明 cpu_usage CPU使用率 该指标用于统计ModelArts用户服务的CPU使用率。 mem_usage 内存使用率 该指标用于统计ModelArts用户服务的内存使用率。 gpu_util GPU使用率 该指标用于统计ModelArts用户服务的GPU使用情况。 gpu_mem_usage GPU显存使用率 该指标用于统计ModelArts用户服务的GPU显存使用情况。 npu_util NPU使用率 该指标用于统计ModelArts用户服务的NPU使用情况。 npu_mem_usage NPU显存使用率 该指标用于统计ModelArts用户服务的NPU显存使用情况。 disk_read_rate 磁盘读取速率 统计ModelArts用户服务的磁盘读取速率。 disk_write_rate 磁盘写入速率 统计ModelArts用户服务的磁盘写入速率。 全量指标可参考ModelArts支持的监控指标文档。 父主题: 云服务性能优化介绍
  • 数据库性能优化 以下章节我们结合一些具体建议和案例来说明如何针对数据库的使用进行性能优化: 1.优化数据库配置实践 数据库的配置参数应从具体业务诉求着手,根据实际需要进行设计;华为云在各个数据库云服务中均提供了默认的配置参数,以满足最普遍的业务需要。 华为云提供了多款数据库服务,不同服务的优化方式和注意事项均有差异,此方面需求,建议使用华为云提供的专业服务。 2.观测性能指标实践 性能监控有助于实时了解业务和系统的负载情况以及资源使用情况,结合告警规则的设置,云服务可自动对负载异常部分进行告警,以便更好地使用和维护云数据库系统。以GeminiDB 为例,您可以通过管理控制台,直观地查看GeminiDB Redis的各项监控指标。 3.设置数据分区实践 GaussDB数据库 支持的分区表为范围分区表,列表分区表,哈希分区表。分区表和普通表相比具有如改善查询性能、增强可用性、便于维护、均衡I/O等优势。 普通表若要转成分区表,需要新建分区表,然后把普通表中的数据导入到新建的分区表中。因此在初始设计表时,请根据业务提前规划是否使用分区表。 4. GaussDB SQL语句调优实践 根据数据库的SQL执行机制以及大量的实践,总结发现:通过一定的规则调整SQL语句,在保证结果正确的基础上,能够提高SQL执行效率。如果遵守这些规则,能够大幅度提升业务查询效率,如使用union all代替union、join列增加非空过滤条件、not in转not exists等都可以提升查询速度。 5.GaussDB语句下推调优实践 目前,GaussDB优化器在分布式框架下制定语句的执行策略时,有三种执行计划方式:生成下推语句计划、生成分布式执行计划、生成发送语句的分布式执行计划。在第3种策略中,要将大量中间结果从DN发送到CN,并且要在CN运行不能下推的部分语句,会导致CN成为性能瓶颈(带宽、存储、计算等)。在进行性能调优的时候,应尽量避免只能选择第3种策略的查询语句。 执行语句不能下推是因为语句中含有不支持下推的函数或者不支持下推的语法。一般都可以通过等价改写规避执行计划不能下推的问题。 语句下推典型场景包含单表查询语句下推与多表查询语句下推,一些特殊场景如语句中带有with recursive子句,列存表等不支持下推。 6.GaussDB子查询调优实践 应用程序通过SQL语句来操作数据库时会使用大量的子查询,这种写法比直接对两个表做连接操作在结构上和思路上更清晰,尤其是在一些比较复杂的查询语句中,子查询有更完整、更独立的语义,会使SQL对业务逻辑的表达更清晰更容易理解。GaussDB根据子查询在SQL语句中的位置把子查询分成了子查询SubQuery、子链接SubLink两种形式。 7..GaussDB算子级调优实践 一个查询语句要经过多个算子步骤才会输出最终的结果。由于各别算子耗时过长导致整体查询性能下降的情况比较常见。这些算子是整个查询的瓶颈算子。通用的优化手段是EXPLAIN ANALYZE/PERFORMANCE命令查看执行过程的瓶颈算子,然后进行针对性优化。 8.GaussDB(for MySQL)读写分离最佳实践 读写分离是指通过一个读写分离的连接地址实现读写请求的自动转发。创建实例后,您可以 开通读写分离 功能,通过GaussDB(for MySQL)的代理地址,写请求自动访问主节点,读请求按照读权重配比或者活跃连接数情况分发到各个节点。 开通读写分离时,需选择加入代理的节点(包括主节点和只读节点)。 9.GaussDB(for MySQL)持锁长事务导致后续业务报等锁超时的解决实践 由于持锁长事务长时间未提交或回滚导致后续操作阻塞,如果持锁长事务已经阻塞了后续的业务,需要将长事务KILL,后续业务侧尽量避免持锁长事务。 10.GaussDB(for MySQL)长事务产生大量临时表导致内存超限的解决实践 考虑升级实例规格,将内存利用率维持在合理范围,防止业务突增导致实例OOM,或根据业务实际情况优化慢查询。 11.GaussDB(for MySQL)联合索引设置不当导致慢SQL的解决实践 查询变慢首先确认是否由于CPU利用率达到性能瓶颈导致执行慢,考虑升级资源规格;或是库表结构设计不合理,索引缺失或索引设置不恰当,应进行语句调优。 12.GaussDB(for MySQL)使用INSTANT方式快速添加列 云数据库 GaussDB(for MySQL)兼容开源MySQL 8.0.22,支持使用ALGORITHM=INSTANT快速添加列,避免造成锁等待影响业务或者SQL执行超时无法新增成功。 13.DAS数据诊断优化性能问题实践 DBA智能运维功能基于运行数据结合算法对实例进行诊断,并对异常项提供具体的诊断结果以及优化建议。 14.观测性能指标(GaussDB为例) 指标ID 指标名称 指标说明 rds001_cpu_util CPU使用率 该指标用于统计测量对象的CPU使用率。 rds002_mem_util 内存使用率 该指标用于统计测量对象的内存使用率。 rds003_bytes_in 数据写入量 该指标用于统计测量对象对应VM的网络发送字节数,取时间段的平均值。 rds004_bytes_out 数据传出量 该指标用于统计测量对象对应VM的网络接受字节数,取时间段的平均值。 iops_usage IOPS使用率 当前IOPS与磁盘最大IOPS比值。 rds007_instance_disk_usage 实例数据磁盘已使用百分比 该指标用于统计测量对象的实例数据磁盘使用率,该值为实时值。 rds010_disk_usage 磁盘已使用百分比 该指标用于统计测量对象的节点数据磁盘使用率,该值为实时值。 更多指标与其他数据库指标信息可参考官方文档。 父主题: 云服务性能优化介绍