keops

keops

大规模矩阵运算与自动微分的高效GPU加速库

KeOps是一个开源库,专门用于高效计算大型数组的归约运算。它集成了高效C++程序和自动微分引擎,支持Python、Matlab和R等多种编程语言。KeOps尤其适合处理核矩阵向量乘积、K近邻查询和N体问题等计算,即使在核矩阵或距离矩阵超出内存容量的情况下也能高效运行。与PyTorch GPU基准相比,KeOps在多种几何应用中能实现10-100倍的性能提升,广泛应用于核方法和几何深度学习等领域。

KeOpsGPU计算自动微分符号矩阵核方法Github开源项目

logo


<!-- [![Build status](https://ci.inria.fr/keops/buildStatus/icon?job=keops%2Fmain)](https://ci.inria.fr/keops/job/keops/job/main/) -->

PyPI 版本 PyPI 下载量 CRAN 版本 CRAN 下载量

请访问我们的网站获取文档、贡献指南和教程。

在 GPU 上进行内核运算,支持自动微分,无内存溢出

KeOps 库允许你计算大型数组的归约操作,其中数组的元素由数学公式神经网络给出。它结合了高效的 C++ 例程自动微分引擎,可与 Python(NumPy、PyTorch)、MatlabR 一起使用。

它非常适合计算内核矩阵向量乘积、K 近邻查询、N 体相互作用、点云卷积及其相关梯度。关键是,即使相应的内核或距离矩阵不适合 RAM 或 GPU 内存,它也能表现出色。与 PyTorch GPU 基准相比,KeOps 在广泛的几何应用中提供了10-100 倍的加速,从内核方法到几何深度学习。

符号矩阵

为什么使用 KeOps? 数学库将大多数对象表示为矩阵和张量:

  • (a) 密集矩阵。 变量通常被编码为密集数值数组 M<sub>i,j</sub> = M[i,j]。这种表示方法便捷且得到广泛支持,但也给计算机内存带来了沉重负担。不幸的是,大型数组在移动时代价高昂,甚至可能无法装入 RAM 或 GPU 内存。

    实际上,这意味着大多数科学程序都受到内存限制。大多数神经网络和数学计算的运行时间并非受限于 CPU 和 CUDA 核心的原始能力,而是受限于大型数组从内存电路到算术计算单元的耗时传输

  • (b) 稀疏矩阵。 为解决这个问题,一个常见的解决方案是依赖稀疏矩阵:具有少量非零系数的张量。我们使用索引列表 (i<sub>n</sub>,j<sub>n</sub>) 和值 M<sub>n</sub> = M<sub>i<sub>n</sub>,j<sub>n</sub></sub> 来表示这些对象,它们对应于少量非零条目。然后使用索引方法和分散内存访问来实现矩阵向量运算。

    这种方法很优雅,允许我们用较小的内存占用表示大型数组。但不幸的是,它在 GPU 上流式处理效果不佳:并行计算设备被设计为执行块式内存访问,难以处理随机索引 (i<sub>n</sub>,j<sub>n</sub>) 列表。因此,与密集数组相比,稀疏编码只有在矩阵非零系数少于 1% 时才能加速计算。这种限制性条件使得稀疏矩阵在图形和网格处理之外的用途有限。

  • (c) 符号矩阵。 KeOps 提供了另一种加速张量程序的解决方案。我们的关键发现是,机器学习和应用数学中使用的大多数大型数组都具有共同的数学结构距离矩阵、内核矩阵、点云卷积注意力层都可以描述为符号张量:给定两个向量集合 (x<sub>i</sub>) 和 (y<sub>j</sub>),它们在位置 (i,j) 处的系数 M<sub>i,j</sub>数学公式 F(x<sub>i</sub>,y<sub>j</sub>) 给出,该公式在数据样本 x<sub>i</sub> 和 y<sub>j</sub> 上求值。

    这些对象在传统意义上并不"稀疏"...但仍然可以使用数学公式 F 和相对较小的数据数组 (x<sub>i</sub>) 和 (y<sub>j</sub>) 高效地描述。KeOps 库的主要目的是为这种抽象提供支持,同时具备深度学习库的所有优点

    • 透明的 接口,支持 CPU 和 GPU 集成。
    • 大量 教程基准测试
    • 全面支持自动微分批处理和近似计算。

实际上,KeOps 符号张量既快速内存高效。我们利用 CUDA 寄存器的结构来绕过算术和内存电路之间昂贵的内存传输。这使我们能够在广泛的设置中为 PyTorch GPU 程序提供10-100 倍的加速

使用我们的 Python 接口,一个典型的代码示例如下:

# 在 GPU 上创建两个具有 3 列和(巨大)行数的数组 import torch # 也支持 NumPy、Matlab 和 R M, N, D = 1000000, 2000000, 3 x = torch.randn(M, D, requires_grad=True).cuda() # x.shape = (1e6, 3) y = torch.randn(N, D).cuda() # y.shape = (2e6, 3) # 将我们的密集张量转换为 KeOps 符号变量,在位置 0 和 1 处有"虚拟"维度(用于"i"和"j"索引): from pykeops.torch import LazyTensor x_i = LazyTensor(x.view(M, 1, D)) # x_i.shape = (1e6, 1, 3) y_j = LazyTensor(y.view(1, N, D)) # y_j.shape = ( 1, 2e6,3) # 现在我们可以进行大规模计算,而不会出现内存溢出: D_ij = ((x_i - y_j)**2).sum(dim=2) # 符号 (1e6,2e6,1) 平方距离矩阵 K_ij = (- D_ij).exp() # 符号 (1e6,2e6,1) 高斯核矩阵 # 我们通过在两个"符号"维度 0 和 1 之一上使用归约操作(如 .sum()、.logsumexp() 或 .argmin()) # 回到普通的 PyTorch 张量或 NumPy 数组。 # 这里,核密度估计 a_i = sum_j exp(-|x_i-y_j|^2) # 使用具有线性内存占用的 CUDA 方案计算, # 性能比标准 PyTorch 实现提高两个数量级。 a_i = K_ij.sum(dim=1) # 真正的 torch.cuda.FloatTensor,a_i.shape = (1e6, 1), # 关键是,KeOps 完全支持自动微分! g_x = torch.autograd.grad((a_i ** 2).sum(), [x])

KeOps 让你能够充分利用硬件而不影响易用性。它提供:

  • 众多计算类型的线性(而非二次)内存占用
  • 支持广泛的可自由组合的数学公式
  • 无缝计算导数梯度,可达任意阶。
  • Sum、LogSumExp、Min、Max 以及 ArgMin、ArgMax 或 K-min 归约
  • 用于大规模样条插值和高斯过程回归的共轭梯度求解器
  • 标准包的透明集成,如用于线性代数的 SciPy 求解器
  • 块稀疏和从粗到细策略的接口。
  • 支持多 GPU 配置。

更多详细信息请参见:

使用 KeOps 的项目

符号矩阵之于几何学习,就像稀疏矩阵之于处理。因此,KeOps 可以在广泛的领域中使用,从形状分析(配准、几何深度学习、最优传输...)到机器学习(核方法、K-means、UMAP...)、高斯过程、计算生物学物理学

KeOps 为以下项目和库提供核心例程:

  • GPyTorch(来自康奈尔大学、哥伦比亚大学、宾夕法尼亚大学)和 Falkon(来自热那亚大学和 Sierra Inria 团队),两个用于高斯过程回归的库,现在可以扩展到十亿级数据集

  • Deformetrica,来自 Aramis Inria 团队的计算解剖学软件。

  • Gudhi 库,用于拓扑数据分析和高维几何理解,来自 DataShape Inria 团队。

  • GeomLoss,一个用于 Chamfer(Hausdorff)距离、Kernel(Sobolev)散度和地球移动(Wasserstein)距离的 PyTorch 包。它提供的最优传输求解器可以在几秒钟内处理数百万个样本

  • 深度图匹配共识模块,用于学习和精炼图之间的结构对应关系。

  • FshapesTkShapes 工具箱,两个面向研究的 LDDMM 工具包。

  • HyenaDNA,用于 S4D 内核中使用的范德蒙德矩阵乘法内核和归约的并行计算。

许可、引用、学术使用

本库基于宽松的 MIT 许可证 发布,完全兼容学术商业应用。

如果您在研究论文中使用此代码,请引用我们的原始出版物

Charlier, B., Feydy, J., Glaunès, J. A., Collin, F.-D. & Durif, G. 在GPU上进行核操作,具有自动微分功能,且无内存溢出。机器学习研究期刊 22, 1–6 (2021)。

@article{JMLR:v22:20-275, author = {Benjamin Charlier and Jean Feydy and Joan Alexis Glaunès and François-David Collin and Ghislain Durif}, title = {在GPU上进行核操作,具有自动微分功能,且无内存溢出}, journal = {机器学习研究期刊}, year = {2021}, volume = {22}, number = {74}, pages = {1-6}, url = {http://jmlr.org/papers/v22/20-275.html} }

关于几何(深度)学习的应用, 您也可以参考我们的NeurIPS 2020论文

@article{feydy2020fast, title={使用符号矩阵的快速几何学习}, author={Feydy, Jean and Glaun{\`e}s, Joan and Charlier, Benjamin and Bronstein, Michael}, journal={神经信息处理系统进展}, volume={33}, year={2020} }

作者

如有任何错误报告问题功能请求,请通过在我们的GitHub问题追踪器上提交报告与我们联系!

核心库 - KeOps、PyKeOps、KeOpsLab:

R语言绑定 - RKeOps:

贡献者:

除了明确的代码贡献外,KeOps的发展还得益于与应用数学家和机器学习专家的多次讨论。我们特别感谢 Alain TrouvéStanley DurrlemanGabriel PeyréMichael Bronstein 的宝贵建议和财务支持。

KeOps在2023年获得了法国高等教育和研究部颁发的开放科学奖("希望 - 文档"类别)。

编辑推荐精选

商汤小浣熊

商汤小浣熊

最强AI数据分析助手

小浣熊家族Raccoon,您的AI智能助手,致力于通过先进的人工智能技术,为用户提供高效、便捷的智能服务。无论是日常咨询还是专业问题解答,小浣熊都能以快速、准确的响应满足您的需求,让您的生活更加智能便捷。

imini AI

imini AI

像人一样思考的AI智能体

imini 是一款超级AI智能体,能根据人类指令,自主思考、自主完成、并且交付结果的AI智能体。

Keevx

Keevx

AI数字人视频创作平台

Keevx 一款开箱即用的AI数字人视频创作平台,广泛适用于电商广告、企业培训与社媒宣传,让全球企业与个人创作者无需拍摄剪辑,就能快速生成多语言、高质量的专业视频。

即梦AI

即梦AI

一站式AI创作平台

提供 AI 驱动的图片、视频生成及数字人等功能,助力创意创作

扣子-AI办公

扣子-AI办公

AI办公助手,复杂任务高效处理

AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!

TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
蛙蛙写作

蛙蛙写作

AI小说写作助手,一站式润色、改写、扩写

蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。

AI辅助写作AI工具蛙蛙写作AI写作工具学术助手办公助手营销助手AI助手
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
下拉加载更多