¶
面向 graph message passing 程序的可微 JIT 编译器。
定义图,编写每条边传递的消息,再指定消息如何合并。调用程序即可得到节点结果, 并自动推导梯度,无需手写反向函数。日常使用不要求理解编译器 IR。
直接支持 PyTorch 的 torch.Tensor,
无需额外包装;通过 torch.autograd.grad 或 .backward() 求导,
可集成到现有 PyTorch 模型与训练流程中。
从这里开始¶
开发编译器¶
先了解 Python 编程模型,再进入内部实现。IR 教程先解释符号, 再展示 pass 与真实编译输出。
程序长什么样¶
下面的示例在 NVIDIA GPU 上计算邻居值的加权和,并通过 PyTorch 求导:
import torch
import tiga as tg
device = torch.device("cuda")
class WeightedAggregation(tg.MessagePassing):
reducer = tg.sum()
def edge(self, src, dst, edge):
return edge.weight * src.x
graph = tg.Graph.from_csr(
torch.tensor([0, 2, 3, 5], dtype=torch.int64, device=device),
torch.tensor([0, 2, 1, 0, 1], dtype=torch.int64, device=device),
num_src=3,
)
x = torch.tensor([1.0, 2.0, 3.0], device=device, requires_grad=True)
weight = torch.tensor([2.0, 3.0, 4.0, 5.0, 6.0], device=device, requires_grad=True)
program = WeightedAggregation()
out = program(
graph=graph,
src={"x": x},
dst={},
edge={"weight": weight},
)
print(out.tolist()) # [11.0, 8.0, 17.0]
dx, dw = torch.autograd.grad(out.sum(), (x, weight))
print(dx.tolist()) # [7.0, 10.0, 3.0]
print(dw.tolist()) # [1.0, 3.0, 2.0, 1.0, 2.0]
图提供边,edge() 提供每条边的消息,
reducer tg.sum()
负责按目标节点合并消息。tg 只是 tiga 的 import 别名,不是另一个包。
图索引、输入、输出和梯度均位于 GPU,无需包装 Tensor 或切换求导接口。 运行环境配置见安装指南; 执行诊断说明如何检查所选执行路径。
目前支持什么¶
支持 CPU 与 NVIDIA GPU 执行,以及面向大图的分层存储和分布式计算。
常规计算直接使用 torch.Tensor;分层存储与分布式等高级运行时功能
使用原生 tg.Tensor,见内存与分布式。
具体操作、数据类型与执行路径的覆盖范围见支持矩阵。
稀疏图与图神经网络算子¶
邻居加权聚合是一种稀疏矩阵运算,
自定义边函数则把它扩展到更一般的图程序。
PyTorch sparse 与 message passing 指南
用一个可核对结果的例子串起 torch.sparse.mm、CSR 图与
图神经网络(graph neural network,GNN)聚合。
Tiga 编译其中的算子,不替代完整的模型库与训练框架。
深入理解实现¶
编译器把图上的计算逐步变成遍历方式和执行计划。这些是内部决策,
不是需要额外编写的 API。编译器入门解释分层目的;
IR 实例教程展示真实的 gf.apply、
gf_iter.traverse、gf_kernel.launch 和 task 操作。
技术报告进一步讲述编程模型与编译器设计,
并提供性能评估及复现数据。
评估性能¶
性能与扩展性对比指定工作负载的执行时间、显存开销、 大图容量和分布式执行。测量协议定义计时与正确性核对方式, 基准归档提供更多测量案例。
查函数签名时使用 Python API 参考;了解项目定位时阅读同类对比。