其他
大模型狂欢背后:AI基础设施的“老化”与改造工程
作者|River Riddle、Eric Johnson、Abdul Dakak
翻译|胡燕君、杨婷
1
AI模型配套工具的易用性不足
AI模型配套工具的易用性不足
机器学习中的图转换(Graph Transformations)、优化和编译器等技术的作用是提升AI模型的性能和便携性,让模型可以部署在某些目标硬件上。
编译器中,有TensorFlow Lite Converter这样的高层次“编译器”,它可以将TensorFlow SavedModel模型转换为高度优化的程序格式(如FlatBuffer格式),让模型可以在边缘设备上执行;也有XLA和TorchScript JIT Compiler这样针对特定领域的编译器,它们为AI模型创建中间表示(可能是一张“图”),然后将其编译成另一种格式——例如机器码或特定领域的运行时表示(如CUDA图)。
2
Modular编译栈中的MLIR
Modular编译栈中的MLIR
Modular的技术栈中,MLIR编译器架构负责表示和转换AI模型,包括AI算子图(用于多种框架)、中级运行时原语和低级机器码生成。
3 MLIR管理权重的方法还有待提高
MLIR的基本组成部分之一是属性机制(Attribute),可以把它理解为被unique(或被memoize、intern)的常量数据。属性是用户可拓展的,也就是说,可以根据不同用例使用不同的属性类型。很多类型的值都可以被赋予属性,比如常量表达式值(如“5”、“10.0”等)、字符串字面量、枚举值(如“小于”、“大于”、“等于”等),数据组等等。大多数基于MLIR的AI工具都使用属性来保存AI模型的权重。
4
内存占用:比拖慢开发效率更严重的影响
内存占用:比拖慢开发效率更严重的影响
这一设计机制本意虽好,但它有可能降低编译效率,即便用最好的编译器也无济于事。最明显的问题是它会导致编译、监控和转换模型的时间变长。但凡你曾用过“我的代码还在编译”作为日常摸鱼的借口,你就明白等待编译是多么痛苦的事情。采用这一机制,就意味着处理器不得不对GB级数据持续进行分配、复制和hash处理。
5
MLIR的核心改进
MLIR的核心改进
非必要不分配内存:对大型数据(比如权重)而言,从磁盘中实行内存映射比将数据复制到已分配内存的block中更高效。
无需进行hash或unique处理:我们不希望费力气去检查2 GB Blob数据的相等性;要辨别权重,希望能够通过名称辨别,而不是看具体内容有没有被unique。
允许内联变更(Inline Mutation):如果数据只需要在一处使用,应当允许在原位置量化、转化和操作数据,而不是先复制数据。
允许释放内存(deallocation):由于大模型的数据量十分庞大,因此当对某一数据的所有引用都不存在时,应当允许释放内存。
快速序列化:无论是即时编译,搜索优化参数,还是本地迭代,都需要缓存IR,所以这一步必须快。
上述观点并不新颖,但传统编译器(比如适用于典型CPU编程语言的编译器)却还没有实现这些要求。
6
调整权重属性
调整权重属性
上述前四点要求解决了我们应该如何使用MLIR这一基本问题:权重虽然是常量数据,但对它的管理应该区别于其他MLIR属性。一直以来,我们的权重管理方式都很不适宜,这就好比试图将一块方钉挤进圆孔中,不仅浪费了空间,降低了我们的开发速度,同时也增加了用户成本。
/// Here we have some MLIR operations.
module {
func.func @foo() {
// Cool stuff here ...
}
}
/// Here we have an `external_resources` section. The resource section's syntax is designed to be unique as to not conflict with other MLIR syntax (which is user extensible!).
{-#
external_resources: {
mlir_reproducer: {
pipeline: "func.func(cse,canonicalize),inline",
disable_threading: true
}
}
#-}
使用IR进行调试时更不容易出错,从而带来更好的开发体验:Resource是专门的信息段;我们不必担心在调试时会不小心转储整整4GB的数据。
我们可以在无需数据的情况下合理地处理IR:因为IR只保存对数据的引用,不保存数据本身,如果需要,我们可以省略底层Resource数据。这样做的好处包括可以极大地简化再生器生成流程,再生器本来就不需要用到大型权重数据(设想一下,你以前需要向同事发送1.2GB的再现器文件,现在的再生器文件只有20MB大)。
通过引入Resource这个新概念,我们在程序和数据之间建立清晰的分离机制。现在,我们不再将权重数据直接传递给某一属性。相反,我们向属性传入一个弱引用,并将权重数据传给一个专门的管理器。这样,我们就能更好地控制权重分配、变更和销毁的时间和方式。
7
新增MLIR二进制编码方式
新增MLIR二进制编码方式
有了更好的权重表示方法之后,下一步我们只需找到更高效的权重储存方法来完成MLIR表示的序列化。
8
用户收益
用户收益
为MLIR增加Resource机制和二进制编码方式大大加速了工具链和开发流程,并大幅降低内存占用,提高了性能和速度表现,也整体改善了MLIR。
速度提升:编译工作流
速度提升:序列化
内存占用
二进制序列化格式的mmap(一种内存映射方法)性能以及通过Resource机制实现的IR和数据的相互独立性可以大幅减少内存占用。测试发现,各种规模的模型编译流程中的内存占用都大大降低——因为以前需要为模型权重分配内存,现在不需要了。
9
升级AI生态
升级AI生态
(本文由OneFlow社区翻译,译文转载请联系OneFlow获得授权。原文:1. https://www.modular.com/blog/increasing-development-velocity-of-giant-ai-models;2.https://www.modular.com/blog/increasing-development-velocity-of-giant-ai-models-part-2)