「Taichi 有哪些应用场景?」,「Taichi 能否在其它平台运行?」,「编程新人如何快速上手 Taichi?」等一系列问题,让不少对 Taichi 有兴趣的人感到好奇。
前不久,我司两位全能高手——资深研究科学家刘天添和技术布道师赵亮,详细聊了聊 Taichi 的设计,使用方法和应用案例,分享中,正有对这些问题最直接的回答。
以下为精华版文字实录,分为四个部分:
Taichi 是什么 Taichi 提供了哪些功能 大家都在用 Taichi 做什么 新手如何快速入门 动图封面 使用 Taichi 仿真 7 亿个四面体的犰狳 01 Taichi 是什么? Taichi 是一种嵌入在 Python 中的并行编程语言。通过即时编译的方式将 Python 编译成高性能的并行机器代码来执行,并且可以让每个 Python 程序员都可以轻松玩转这些高性能的计算代码,尤其是在数值计算上。
Taichi 的前端在设计时保留了和 Python 非常接近的语法,几乎可以让用户简单地添加一个 @显示链接 修饰符就可以无缝地把自己的 Python 函数变成高效的 Taichi Kernel。每个 Kernel 被 Taichi 编译器接管即时编译并进行编译器优化,编译完成的 Taichi Kernel 会选择用户指定的后端转译成可执行的机器代码,被部署到 CPU 或 GPU 上运行。
虽然 Taichi 的前端在 Python 中,并可以让用户通过 pip 来直接安装,但是它拥有独立中间表示和编译系统。所以理论上来说,Taichi 也可以被镶嵌到不同的前端当中进行调用。没错,Taichi 是一种支持多平台运行,代码量少、运行还快的编程语言。
02 Taichi 提供了哪些功能? 早期,大部分的 Taichi 程序是被用来做仿真的,比如粒子和网格系统,下图这是一个 MLS-MPM 系统,这个系统拥有 1,000 万个粒子在屏幕中同时运行。
动图封面 #自动并行和解耦数据排布和计算 Automatic Parallelization & Data-oriented Language Design Taichi 程序之所以能被高效运行,除了编译器优化之外,主要是得益于它的两个设计理念:第一是 Taichi 可以自动并行每个 Taichi kernel 最外层的 for 循环,这使得每个 Taichi 程序可以最大化调用计算硬件的性能;第二则是解耦数据排布和计算,这可以让用户在不修改计算代码的同时,测试不同的数据排布产生的影响,提高内存访问的效率。
#稀疏计算 Sparse Computing 除此之外,Taichi 还包含很多更加复杂的功能。比如稀疏计算,在下面这个多物理的仿真系统里面,可以看到有沙子、流体、弹性物体,但这些仿真的粒子并不会占满整个空间。在 2D 系统中,它们可能只占了屏幕中的一半左右的空间;在 3D 系统中,它们占用的空间比例会更少。Taichi 为此自动提供了稀疏计算,对无用的 Grid Space 不进行存储和操作,从而降低内存消耗,大幅提升运算效率。
#量化计算 Quantization 什么是量化计算?平时我们用的整型或浮点型通常是固定位数的,比如说 16 位、32 位、64 位。但是很多时候,我们需要在程序性能、精确度、内存占用方面做一些权衡,比如用更低的精确度换取更高的分辨率和性能。量化计算就能通过操作基础数据类型的位数,实现上述目标。下面的 Stable Fluids 仿真,正是经过量化计算,生成了超高分辨率的仿真系统。
动图封面 #非结构网格的并行 Efficient Computing for Meshes Taichi 还可以被用来进行非结构网格的并行,上面我们看到的所有网格都是结构化的(Grid),而在很多图形学程序中,我们也需要使用非结构的网格,通常我们叫它 Mesh。非结构网格会定义诸如节点-节点,边-节点,面-节点的连接关系,通过一种显式的方式去构造网格,而 Taichi 也可以在这样的网格上进行并行加速。如下图中,我们把一个拥有 19 万个顶点的弹性小鹿模型随机打乱,并采用隐式积分来完成有限元仿真,最终的结果可以被加速到 34 FPS 供用户实时交互。
动图封面 #自动微分 Automatic Differentiation Taichi 还有一些有意思的功能,比如自动微分。我们可以使用Taichi 的自动微分系统,把仿真器和渲染器的导数传给机器学习框架进行训练。下面这个程序,我们使用 Taichi 做了一个可微的流体仿真和渲染系统。我们把一个水波的仿真,盖在一张松鼠图片上,结果就能作为对抗网络骗过一个机器学习的框架,让它认为这是一条金鱼,而且可能性高达 99.91%。
动图封面 03 大家都在用 Taichi 做什么? #渲染 在 Twitter 上有一位热心用户 Brian,他提到在 Taichi 真的实现了 Ray Tracing in One Weekend,同时放出了用 Taichi 渲染的、非常炫酷的图片。他之后还做了一个 Blender 的插件,可以让 Taichi 在 Blender 里面也进行渲染。
#流体力学 有一位日本热心网友,使用 Taichi 做出一个 2D 的流体仿真系统,模拟了一个不可压缩的流体,可以观察到流体穿过障碍物时形成的涡流和涡的扩散过程。
#物理仿真动画 去年,苏黎世联邦理工使用 Taichi 进行了计算机图形学的教学,同学们创作出很多精彩的物理仿真动画。后来我们联系到这门课程的助教,谈到「为什么要选择 Taichi?」,助教表示「用 Taichi 真的省时省力」。相比 C++,使用 Taichi 可以节省很多脚手架代码。同时,借鉴 Taichi 之前沉淀的太极图形课、GAMES 课程中的开源代码,学生们能快速上手,减少学习成本。此外,学生们不必纠结于 C++ 编译部分,也不需要学习 CUDA 编程,可以把精力专注于算法的实现。
动图封面 学生作业:关于沙子的物理仿真 下面的作品来自哥廷根大学的陈浩老师,他用 Taichi 实现了一个涡流与极小曲面的动画。什么是极小曲面?假设你拿一根铁丝围成一个闭曲线,在肥皂水里面蘸一下,拿出来的时候,表面就会覆盖一层薄膜,这个薄膜满足张力最小,它是一个极小曲面。极小曲面不但是微分几何学的重要研究对象,在材料科学、工程学,建筑设计领域也有广泛应用。
动图封面 #同时定位与地图构建 这个作品来自香港科技大学的徐浩同学,主要研究方向为无人机(UAV),无人机集群 (Aerial Swarm),协同定位与建图(CSLAM)。他使用 Taichi 实现了一个 SLAM 定位中的八叉树地图构建。这个原理和体素(Voxel)很像,假设一个房间当中有很多的障碍物,这些障碍物可以用一个小方块近似地去表示。为了存储房间中的障碍物,我们不必使用一个完整的 128×128×128 空间大小的网格,实际上只要记录那些有障碍物的网格就可以。通过使用 Taichi 的稀疏矩阵表示,我们可以把需要存储的障碍物信息压缩在一个很小的空间内,这样可以减小显存消耗,也使我们计算得更快。
动图封面 04 新手如何快速入门 Taichi? 前面我们提到,Taichi 依托于 Python 的前端,所以你可以在拥有 Python 环境的电脑上,一键安装最新版 Taichi Lang
python3 -m pip install 显示链接 --upgrade Taichi 可以在 Windows、Linux 和 Mac OS 系统上跑起来,而且不管你的电脑是 CPU 还是 GPU,Taichi 都能找到指定后端,并在上面高效运行。
安装完成后,Taichi 还提供了一套比较简单的命令行,进行一些基础程序的调用,比如使用ti gallery执行交互式的 Demo,或访问ti example查看 Taichi 所有例程。
|