《AI 数据库的内存优化之路-陈迪豪.pdf》由会员分享,可在线阅读,更多相关《AI 数据库的内存优化之路-陈迪豪.pdf(58页珍藏版)》请在三个皮匠报告上搜索。
1、AI数据库的内存优化之路陈迪豪2023-02-07 第四范式/陈迪豪AI数据库的内存优化之路议程1.AI 数据库与内存性能优化2.OpenMLDB 与 Spark 内存案3.OpenMLDB 统编码优化实现4.内存优化在 AI 场景的应实践标 了解前沿的 AI 数据库架构设计 了解数据库内存优化思路以及实现细节 了解 OpenMLDB 内存优化在 AI 场景的实践议程1.AI 数据库与内存性能优化2.OpenMLDB 与 Spark 内存案3.OpenMLDB 统编码优化实现4.内存优化在 AI 场景的应实践AI 数据库介绍从 AlphaGo 到 ChatGPT,AI 落地应如后春笋般出现AI
2、 基础设施项越来愈多,涵盖芯设计、模型框架、数据库等AI 数据库逐渐成为 MLOps 的重要组件AI 数据库萌芽2017年开发以FE为核的数据库服务2020年落地超过100个机器学习场景2021年开源 OpenMLDB 数据库项OpenMLDB 数据库介绍致于解决 AI 程化落地的数据治理难题选 SQL 和数据库开发体验降低开发槛天然保证线上线下计算致性,实现毫秒级的计算延迟OpenMLDB 数据库介绍OpenMLDB 架构设计OpenMLDB 架构设计OpenMLDB 架构设计OpenMLDB 内存架构Row编码,同多列使连续内存存储离线在线使相同 Parser、Optimizer、Code
3、genLLVM JIT,对表达式成平台相关的优化执代码Spark集成,基于 Java JNI 调 C+代码接思考下Spark 内存优化与 OpenMLDB Row 优化如何解决冲突?议程1.AI 数据库与内存性能优化2.OpenMLDB 与 Spark 内存案3.OpenMLDB 统编码优化实现4.内存优化在 AI 场景的应实践Spark 简介Apache Spark has rapidly emerged as the de facto standard for big data processing.Spark Tungsten 内存优化Memory Management and Bina
4、ry ProcessingCache-aware computationCode generationSpark Tungsten 内存优化字符串“abcd”,UTF-8占4个字节JVM字符串Header占12个字节JVM字符串Hash代码占8个字节字符串内容4字节-JVM实际占24字节数据来源:https:/ Tungsten 内存优化基于多个 Column 对象实现 RowJVM 管理量对象,GC压Spark 需要频繁创建和销毁 JVM 对象Spark 了解数据流以及内存块命周期Spark UnsafeRow 优化基于 JVM Unsafe API(intrinsic)基于 Schema
5、和指针实现 Row存储,使连续内存读性能减少 JVM 对象和 GC 压Spark UnsafeRow 优化数据来源:https:/ UnsafeRow 优化64bit(8byte)对,内存空间不紧凑但有利于提访存性能端存储,这样低位类型存到位内存(如存int到64位)不需要额外编码所有列不管什么类型都按64bit存储,变内容顺延存储Nullbitset以64位为单位按需增加Spark UnsafeRow 优化GenericInternalRowUnsafeRowSpark UnsafeRow 优化通过 queryExecution 获取底层执计划InternalRow 默认实现为 Unsafe
6、Row通过指针和偏移获取列值Known issue:4paradigm/OpenMLDB#2880思考下Spark UnsafeRow 优化有什么问题?Spark 对 OpenMLDB Spark议程1.AI 数据库与内存性能优化2.OpenMLDB 与 Spark 内存案3.OpenMLDB 统编码优化实现4.内存优化在 AI 场景的应实践OpenMLDB 内存编码优化和Spark样,基于存储,最化在线读取性能相于Spark,基于C+指针实现,没有GC overhead相于Spark,增加Version header,持多版本格式相于Spark,Nullbitset以byte(8 bits)
7、为单位按需分配相于Spark,不同类型按需分配空间,内存布局更加紧凑OpenMLDB 内存编码优化Spark 与 OpenMLDB 内存对Spark 与 OpenMLDB 内存对Spark UnsafeRow:nullbitset(16),int(8),float(8),string(8+1),timestamp(8)Spark Row Size=16+8*20+8*20+9*20+8*5=556OpenMLDB Row:headser(6),nullbitset(9),int(4),float(4),string(1+1),timestamp(8)OpenMLDB Row Size=6+9+
8、4*20+4*20+2*20+8*5=255以20 int、20 float、20 string(with 1 byte)、5 timestamp为例(单位Byte):思考解答Spark 内存优化与 OpenMLDB Row 优化如何解决冲突?OpenMLDB 离线引擎与 Spark 整合OpenMLDB 离线引擎与 Spark 整合Spark UnsafeRow 与 OpenMLDB Row 内存格式不同OpenMLDB 提供 C API 进平台相关的LLVM JIT CompileSpark 提供分布式 RDDRow 和 RDDInternalRowOpenMLDB 离线引擎与 Spark
9、 整合案:Encoder and Decoder for Spark Row OpenMLDB 离线引擎与 Spark 整合EncoderDecoderOpenMLDB 离线引擎与 Spark 整合SQL with simple projectSparkOpenMLDBOpenMLDB 离线引擎与 Spark 整合案:Update Spark UnsafeRow memory layoutOpenMLDB 离线引擎与 Spark 整合修改nullbitset计算逻辑修改int列分配内存OpenMLDB 离线引擎与 Spark 整合修改int列内存偏移修改int列初始化OpenMLDB 离线引擎
10、与 Spark 整合案三:Make OpenMLDB compatible with Spark UnsafeRowOpenMLDB UnsafeRowOpt 优化Fix unsaferow for window#1298Support window union with unsaferow opt#1312Set fversion,sversion and size in row bytes for UnsafeRowOpt#1343Support unsaferow format for codec#1362Refactor row format with slice formant an
11、d single/multi slice row format#1381Support setInt for openmldb joined row for UnsafeRowOpt#1475Update row index for UnsafeRowOpt#1773Refactor to make sure c row is released for UnsafeRowOpt#1943Fix unsaferowopt create managed slice#2142Fix unsaferowopt with string columns#2273New and memcpy row for
12、 unsaferowopt#2352OpenMLDB UnsafeRowOpt 优化获取RDDInternalRow通过UnsafeRow获取列值传递Unsafe Byte指针避免内存拷OpenMLDB UnsafeRowOpt 性能OpenMLDB UnsafeRowOpt 性能计算采样数为3394(4958-1093-471)计算占3.41%(4.95%-1.07%-0.47%)OpenMLDB UnsafeRowOpt 性能计算采样数为1451计算占为1.43%结论:编码开销,计算时间减少,整体性能提升!议程1.AI 数据库与内存性能优化2.OpenMLDB 与 Spark 内存案3.O
13、penMLDB 统编码优化实现4.内存优化在 AI 场景的应实践内存优化在 AI 场景的应实践以 AI 推荐系统场景为例基于机器学习算法建模,保证在线离线特征致性在线响应延时P99于20毫秒,持并发在线请求离线持数据分布式计算,优化内存提计算效率内存优化在 AI 场景的应实践内存优化在 AI 场景的应实践内存优化在 AI 场景的应实践内存优化在 AI 场景的应实践内存优化在 AI 场景的应实践统的计算引擎保证了在线离线特征致性紧凑的内存布局让在线数据库内存利率和性能都竞品兼容 Spark 的 UnsafeRowOpt 让离线编解码不再成为瓶颈总结1.AI 数据库与内存性能优化2.OpenMLDB 与 Spark 内存案3.OpenMLDB 统编码优化实现4.内存优化在 AI 场景的应实践关注我们OpenMLDB 社区群