SIGGRAPH 2022 | 节省50%内存占用,浙大、快手等提出量化仿真新方法

简介: SIGGRAPH 2022 | 节省50%内存占用,浙大、快手等提出量化仿真新方法

来自浙江大学、快手和美国犹他大学的研究人员联合提出了一种自动兼顾精度和内存消耗的量化仿真新方法。


在好莱坞大片特效等计算机图形学的典型应用场景中,高分辨率的物理仿真能提供很好的视觉效果。更高的仿真计算复杂度和分辨率可以带来更丰富的细节,但相应的计算需要占用更大的内存或者显存空间。例如,在电影《冰雪奇缘》中,300 米宽的溃坝场景使用了 9000 万个粒子对水体进行表达,全精度的仿真计算需要 4 块 NVIDIA Quadro P6000 显卡,一共占用约 96GB 显存。


为了节约计算时占用的数据存储空间,研究者将 “量化” 技术引入了物理仿真算法,也就是在仿真计算过程中,使用更少的比特位数来表达和存储物理变量。例如,在去年计算机图形学顶会 SIGGRAPH 2021 上,来自 MIT、浙大和快手的研究人员联合发表了一篇以 QuanTaichi 为题的论文,实现了一个由 “太极” 编译器支持的量化类型系统,允许用户用较少的位数来表示空间位置、速度等各种物理变量,从而在 GPU 显存消耗不变的情况下,以更高的分辨率进行物理仿真计算(参见参考文献[1])。然而,QuanTaichi 需要用户手工设计量化方案,指定仿真中使用到的每个变量的位数,并不断进行仿真计算试错,最终找到合适的方案。


在今年的 SIGGRAPH 2022 会议上,来自浙江大学、快手和美国犹他大学的研究人员联合发表了一篇题为《物理仿真的自动量化》的论文,提出了一种自动兼顾量化仿真精度和内存消耗的方法。与全精度的物理仿真相比,能够在视觉效果不受明显影响的前提下,节省 50% 以上的内存占用,从而大幅度提高了量化仿真的易用性和生产力。



论文地址:https://arxiv.org/abs/2207.04658

项目地址:https://github.com/Hanke98/AutoQuantizer


该方法的核心思想,是将物理仿真过程中由量化引起的精度损失建模为误差的传播过程,基于不确定性传播理论,将量化方案的自动求解问题描述为带约束的优化问题,将误差上限或者内存压缩率作为优化目标,并快速给出解析解作为可行的量化方案。


此外,该研究引入了抖动法(dithering)作为量化仿真的舍入方法来替代传统的四舍五入,降低了数据误差之间的相关性。在量化位数较少时,抖动法可以明显减少精度损失。以下是一组关于引入抖动法的效果对比。在上方未使用抖动法的仿真结果中,从同一水平位置开始自由落体运动的字母由于量化误差的影响,水平位置不再保持一致;在下方引入了抖动法的量化仿真结果中,所有字母在下落过程中能保持水平对齐,符合客观的物理规律。



下图展示了应用该方法实现的基于欧拉网格实现的量化的烟雾仿真。使用该方法自动求解量化方案实现了 1.93 倍的内存压缩,在单张 Nvidia RTX 3090 显卡上使用了超过 2.28 亿个的欧拉网格。


下图是基于物质点法实现的弹性体仿真。该方法实现了 2.01 倍的内存压缩,在单张 Nvidia RTX 3090 显卡上仿真了超过 2.95 亿个粒子。



下图是基于物质点法实现的流体仿真。该方法实现了 2.02 倍的内存压缩,在单张 Nvidia RTX 3090 显卡上仿真了 4 亿个粒子。



目前,相关的技术已成功落地,打开快手 APP,拍摄「别哭鸭」、「我要去潜水」和「火焰超能力」等魔法表情,即可体验到短视频行业内独家的移动端实时液体模拟特效技术。


【参考文献】

[1] Yuanming Hu, Jiafeng Liu, Xuanda Yang, Mingkuan Xu, Ye Kuang, Weiwei Xu, Qiang Dai, William T. Freeman, and Frédo Durand. 2021. QuanTaichi: A Compiler for Quantized Simulations. ACM Transactions on Graphics (Proceedings of SIGGRAPH 2021).

相关文章
|
2月前
|
Java 数据库连接
Java中的内存泄漏排查与预防方法
Java中的内存泄漏排查与预防方法
|
4月前
|
存储 Java C++
C++ 引用和指针:内存地址、创建方法及应用解析
C++中的引用是现有变量的别名,创建时需用`&`运算符,如`string &meal = food;`。指针存储变量的内存地址,使用`*`创建,如`string* ptr = &food;`。引用必须初始化且不可为空,而指针可初始化为空。引用在函数参数传递和提高效率时有用,指针适用于动态内存分配和复杂数据结构操作。选择使用取决于具体需求。
75 9
|
2月前
|
缓存 算法 Java
Java面试题:深入探究Java内存模型与垃圾回收机制,Java中的引用类型在内存管理和垃圾回收中的作用,Java中的finalize方法及其在垃圾回收中的作用,哪种策略能够提高垃圾回收的效率
Java面试题:深入探究Java内存模型与垃圾回收机制,Java中的引用类型在内存管理和垃圾回收中的作用,Java中的finalize方法及其在垃圾回收中的作用,哪种策略能够提高垃圾回收的效率
30 1
|
2月前
|
存储 监控 安全
内存卡数据恢复,3个方法帮你找回丢失的照片和视频
今天,针对内存卡数据恢复,本期做一个详细的归纳,分析常见的数据丢失原因、详细的数据恢复步骤、以及如何保护内存卡数据。
内存卡数据恢复,3个方法帮你找回丢失的照片和视频
|
2月前
|
监控 安全 Java
JVM内存问题之排查Direct Memory泄漏有哪些常用方法
JVM内存问题之排查Direct Memory泄漏有哪些常用方法
|
1月前
|
存储 Java 图形学
UNITY性能优化☀️一、GC介绍与Unity内存管理方法
UNITY性能优化☀️一、GC介绍与Unity内存管理方法
|
2月前
|
缓存 Prometheus 监控
Java面试题:如何监控和优化JVM的内存使用?详细讲解内存调优的几种方法
Java面试题:如何监控和优化JVM的内存使用?详细讲解内存调优的几种方法
73 3
|
3月前
|
存储 设计模式 Java
JavaSE 面向对象程序设计初级 2024方法变量封装javabean结合内存图详解
JavaSE 面向对象程序设计初级 2024方法变量封装javabean结合内存图详解
33 7
|
2月前
|
存储 设计模式 监控
Java面试题:简述JVM的内存结构,包括堆、栈、方法区等。栈内存优化的方法有 哪些?
Java面试题:简述JVM的内存结构,包括堆、栈、方法区等。栈内存优化的方法有 哪些?
34 0
|
2月前
|
编译器
8086 汇编笔记(六):更灵活的定位内存地址的方法
8086 汇编笔记(六):更灵活的定位内存地址的方法

热门文章

最新文章