工业软件研发中处理超大模型(9)--ChatGPT介绍的方法
在手机APP,微信支付宝毫秒级响应的2023年,工业设计仿真软件的大模型在普通服务器上运行几天仍是常态,也是超级计算机的主要客户。
这和其数据结构有关,工业软件领域的数据就类似一张大网,网上每个节点都和周围节点关联,从而形成“动一发而牵全身”的效应。
超大模型处理的性能问题符合典型的“木桶理论”:一只木桶能盛多少水,并不取决于最长的那块木板,而是取决于最短的那块木板,“木桶理论”也可称为“短板效应”。软硬件中任何一个短板或者bug都可能影响整体。针对超大模型,一般模型不起眼的问题也可能成为大的瓶颈。
工业软件研发中关于超大模型处理一直是介绍的重点,所有相关文章加起来大约有4万余字。整体内容较多,也比较分散,稍微整理总结归纳一下
1. 超大模型主要从两个方面定义,一个是几何单元的数量和结构,一个是网格的数量,分别对应几何复杂度和仿真复杂度
2. 尽可能不使用单个的复杂对象,而是用数量大的小模型
3. 尽可能使用单一数据模型(Single Data Model),避免大数据的拷贝操作
4. 精通编程语言,利用语言提供的高性能计算,比如寻址方式,Cache命中率,减少数据传递中的拷贝等等
5. 避免高频操作。控制高频操作的典型方法是使用缓存方法和Observer设计模式。即将需要频繁更新的数据进行缓存,只对缓存数据进行操作,通过Observer在适当的时候进行更新,避免全局进行频繁操作
6. 通过数据分级也是有效解决高频操作的方法,即根据业务逻辑,尽可能采用金字塔层级而非扁平的数据模型,这种结构有利于从架构上实现最小权力原则和高频局部数据操作,提升性能
7. 利用SIMD,GPU,OpenMPI, OpenMP,OpenCL,OpenACC,相关内容可自行百度和ChatGPT
8. 大模型处理的核心思想之一是分治(Divide And Conquer)。分治不是简单的分块,因为工业软件的大模型一般都是一个整体,所以多数情况下需要根据业务来进行分治。使用分治方法之前,需要明确对象是否合适分开处理,如果能满足以下条件就可以采用:
1.1.数据之间耦合度低;
1.2.分开之后的数据保留各自的属性,尽量保留整体属性;
1.3. 分治的相关数据操作之后能再次组合在一起;
1.4. 分治的各个数据规模开销相当
比如图工具,空间树结构,分块分表,大文件拆分等都是分治。
9. Krylov子空间方法是求解大规模线性方程组的一类方法,包括
Arnoldi降阶算法
共轭梯度系列相关算法
最小余量系列相关算法
C正交Arnoldi算法
块Arnoldi算法
对称和非对称Lanczos降阶算法
多重Krylove子空间降阶
等等
10. 求解器高性能计算包括:
1. 硬件资源
2. 框架并行性
3. 算法并行性
4. 编程语言支持
具体可以参考
11. 有限元(FEM),时域有限差分(FDTD),边界元(BEM)/矩量法(MOM),有限体积(FVM),格子玻尔兹曼(LBM),这五种数值计算方法基本涵盖了目前常用的大模型求解器求解场景,即
稀疏矩阵
稀疏对称矩阵
满秩矩阵
有网格无需解线性方程组
无网格无线性方程组迭代计算
12. 回归测试中加入性能回归测试
13. 根据数据特征,选择合理的数据结构和操作算法
这个涉及到软件研发中各种数据模型,一方面要精通软件研发中常用的数据结构和算法,另一方面对业务数据和逻辑也要比较熟悉。是一个最能体现研发人员研发功底的地方
14.轻量化底层组件
在工业仿真软件中,会使用各种各样的第三方库或者组件。这些第三方工具往往通用性较强,但并不适合专业的业务。所以可以考虑开发业务相关的底层模块,这样可以将业务做针对性的优化。
15.解耦性能瓶颈功能
利用各种性能查看工具,找到性能所在点。将各种造成性能瓶颈的问题抽象提炼出来,做成专用模块在外部处理。比如海量数据查询检索等,可以交给专业数据库。
16.模型提取和二次优化
通常超大的原始模型中,可能我们只对部分数据感兴趣。可以根据需求提取模型相关数据。对数据进行再加工,简化和重组,有点类似模型降阶技术,方便在定性分析充分之后再做定量分析。
17. 在求解线性方程组前,提取矩阵特征,尽可能在最细度上根据矩阵特征,同时结合模型和业务的特点,选取最合适的求解方法
18. 有限元方法是目前工业PDE最成熟,应用最广泛的数值计算方法,大模型求解参考工业软件研发中处理超大模型(6)--有限元求解器
19. 大模型文件处理性能提升可以采用文件拆分,内存映射,二进制方法,解耦IO/解析等方法
20. 其他一些更细节方法,可能重复
1. 识别非线性操作,并尽量避免
2. 数据压缩
3. 分治,避免合并
4. 动态加载,分步操作
5. LOD(Level of details)
6. 非阻塞多线程
7. 避免高频操作,批次合并
8. 大数据唯一,避免拷贝
9. 合理使用各种树结构
10. 利用业务逻辑取代一般性操作
11. 解耦性能瓶颈模块
21. 超大模型的处理也是考验软件架构设计的一个指标,好的软件架构能帮助定位发现问题,也方便功能扩展改进,在软件设计之初需要考虑到。在软件设计架构层面,尽可能建立自己的事务,事件以及消息处理机制,让程序更加灵活,便于大模型的调试和处理。
以上所有具体内容可以访问:
fasbridge.com (不加www)
也包含在纸质版本里 不再提供纸质书,只有电子版
最后,给研发人员配置最好的电脑,建议用户买最好的服务器