ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

深入 pylibraft:用 RAFT 为科学计算与图谱分析解锁 GPU 底层原语

深入 pylibraft:用 RAFT 为科学计算与图谱分析解锁 GPU 底层原语 深入 pylibraft用 RAFT 为科学计算与图谱分析解锁 GPU 底层原语【免费下载链接】scientific-agent-skillsTurn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000 scientists worldwide. 165 ready-to-use validated skills plus 100 scientific databases covering biology, chemistry, medicine, and drug discovery. Compatible with Cursor, Claude Code, Codex, Pi, Antigravity, and the open Agent Skills standard.项目地址: https://gitcode.com/GitHub_Trending/cl/scientific-agent-skillspylibraft 是 RAPIDS 生态中 RAFTReusable Accelerated Functions and Tools的 Python 绑定提供 GPU 加速的稀疏特征值求解、显存管理、随机图生成与多卡通信等底层构件是 cuML、cuGraph 等高层库的地基。本文以本项目 skills/optimize-for-gpu/references/raft.md 为骨架结合 optimize-for-gpu 技能 的决策框架与安装指引完整讲解 pylibraft 的安装、核心概念、四大核心原语、跨库互操作与性能实践让你在需要绕过完整 ML 框架开销、直接使用底层 GPU 原语时能快速落地。在 RAPIDS 生态中的定位什么时候该直接用 RAFT在 RAPIDS 体系中每一层库都有明确分工。根据 decision_framework.mdcuML 负责机器学习、cuGraph 负责图分析、cuVS 负责向量检索而 RAFT 提供的是这些库底层共享的积木GPU 加速的稀疏特征值问题scipy.sparse.linalg.eigsh的 GPU 替代底层 GPU 显存管理device_ndarray随机图生成R-MAT 模型用于基准测试多节点多 GPU 通信基础设施raft-dask该决策框架明确指出大多数用户应优先选择更高层的库只有在确实需要 RAFT 暴露的特定原语稀疏特征求解器、设备内存、图生成或 Dask 多 GPU 编排时才直接使用它。一个关键注意事项向量检索算法k-NN、IVFPQ、CAGRA 等已迁移到 cuVS不要在 RAFT 中做最近邻搜索请使用 cuVS 参考文档。本仓库 SKILL.md 的选择最小合适层表格同样把 RAFT 归类为低层 RAPIDS 原语稀疏特征求解器、资源、多 GPU 构建块并建议其他负载分别走 CuPy、cuDF、cuML、cuGraph、cuVS 等路径。安装与环境验证pylibraft 与 raft-dask 的 wheel 包含配套的libraftwheel同时发布在 NVIDIA 官方索引和 PyPI 上因此额外索引是可选的但保留它以保证可用性最稳妥。使用uv add安装独立示例遵循本仓库惯例若用户项目已配置其他包管理器遵循其既有工具链# pylibraft核心库 uv add --extra-index-urlhttps://pypi.nvidia.com pylibraft-cu1226.6.* # 适用于 CUDA 12.x uv add --extra-index-urlhttps://pypi.nvidia.com pylibraft-cu1326.6.* # 适用于 CUDA 13.x # raft-dask多节点多 GPU 支持可选 uv add --extra-index-urlhttps://pypi.nvidia.com raft-dask-cu1226.6.* # 适用于 CUDA 12.x uv add --extra-index-urlhttps://pypi.nvidia.com raft-dask-cu1326.6.* # 适用于 CUDA 13.x版本说明依据 installation.mdRAPIDS 26.06 要求 Python 3.11Linux 或 WSL2以及匹配的 CUDA 12.x 或 13.x wheel所有受维护的 RAPIDS 包都提供-cu12与-cu13变体CUDA 13 系统请替换为-cu13。安装完成后验证from pylibraft.common import DeviceResources handle DeviceResources() handle.sync() print(pylibraft is working)该验证片段与 installation.md 中的一致性检查一致。核心概念DeviceResources 与 StreamDeviceResourcesCUDA 资源句柄DeviceResources管理昂贵的 CUDA 资源——CUDA 流、流池、cuBLAS/cuSOLVER 的库句柄。创建一次并在多次 RAFT 调用间复用可避免重复分配的开销from pylibraft.common import DeviceResources, Stream # 默认流 handle DeviceResources() # 自定义流 stream Stream() handle DeviceResources(stream) # 使用 CuPy 流 import cupy cupy_stream cupy.cuda.Stream() handle DeviceResources(streamcupy_stream.ptr) # 读取结果前务必同步 handle.sync()RAFT 函数默认是异步的——它们立即返回GPU 上的计算继续执行。必须在访问 CPU 上的输出数据前调用handle.sync()。如果未传入handleRAFT 会在内部临时分配资源并在返回前同步方便但重复调用时更慢。StreamStream是cudaStream_t的轻量封装用于对 GPU 操作排序from pylibraft.common import Stream stream Stream() stream.sync() # 同步该流上的所有工作 ptr stream.get_ptr() # 获取原始 cudaStream_t 指针uintptr_t设备显存管理device_ndarraydevice_ndarray是 RAFT 的轻量 GPU 数组类型。它实现了__cuda_array_interface__可与 CuPy、Numba、PyTorch 及其他 GPU 库互操作from pylibraft.common import device_ndarray import numpy as np # 分配空的 GPU 数组 gpu_arr device_ndarray.empty((1000, 50), dtypenp.float32) # 从 NumPy 数组创建将数据拷贝到 GPU cpu_data np.random.rand(1000, 50).astype(np.float32) gpu_arr device_ndarray(cpu_data) # 拷回 NumPy将数据拷贝到 CPU result gpu_arr.copy_to_host() # 属性 print(gpu_arr.shape) # (1000, 50) print(gpu_arr.dtype) # float32 print(gpu_arr.c_contiguous) # True行主序 print(gpu_arr.f_contiguous) # False配置输出类型可以通过pylibraft.config让所有 RAFT 计算 API 返回 CuPy 数组或 PyTorch 张量而非默认的device_ndarrayimport pylibraft.config pylibraft.config.set_output_as(cupy) # 所有 API 返回 cupy 数组 pylibraft.config.set_output_as(torch) # 所有 API 返回 torch 张量 # 自定义转换 pylibraft.config.set_output_as(lambda arr: arr.copy_to_host()) # 返回 numpy从源码结构看set_output_as的 lambda 形式接收每个 API 的输出数组并执行任意转换这使你可以统一将结果落到 NumPy 或任何自定义容器而无需逐个函数处理返回类型。稀疏特征值问题eigshpylibraft.sparse.linalg.eigsh是 GPU 加速的 Lanczos 方法用于求解大型稀疏对称矩阵的特征值/特征向量是scipy.sparse.linalg.eigsh的直接替代品import cupy as cp import cupyx.scipy.sparse as sp from pylibraft.sparse.linalg import eigsh from pylibraft.common import DeviceResources # 创建稀疏对称矩阵CSR 格式 n 10000 density 0.01 A sp.random(n, n, densitydensity, dtypecp.float32, formatcsr) A A A.T # 保证对称 # 求 6 个最大特征值 handle DeviceResources() eigenvalues, eigenvectors eigsh(A, k6, whichLM, handlehandle) handle.sync() print(fEigenvalues shape: {eigenvalues.shape}) # (6,) print(fEigenvectors shape: {eigenvectors.shape}) # (10000, 6)参数说明参数含义取值/默认A稀疏对称 CSR 矩阵cupyx.scipy.sparse.csr_matrix必填k计算的特征值个数默认 6须满足1 k nwhich选择哪些特征值LM模最大默认、LA代数最大、SA代数最小、SM模最小v0起始向量可选None时随机ncvLanczos 向量个数须满足k 1 ncv nmaxiter最大迭代次数可选tol收敛容差0 表示机器精度seed随机种子用于可复现性handle可选的DeviceResources句柄可选典型使用场景谱方法谱聚类、图分割、类 PageRank 计算、稀疏数据的降维、大型稀疏哈密顿量的物理模拟、结构分析振动模态。从 SciPy 迁移的真实转换模式本仓库 code_transformation_patterns.md 给出了 CPU → GPU 的完整迁移对照核心改动只有三处稀疏矩阵转移到 GPU、替换 eigsh 导入、改用 CuPy 稀疏格式# BeforeCPU import numpy as np from scipy.sparse import random as sparse_random from scipy.sparse.linalg import eigsh A sparse_random(10000, 10000, density0.01, formatcsr, dtypenp.float32) A A A.T # 保证对称 eigenvalues, eigenvectors eigsh(A, k10, whichLM) # AfterGPU—— RAFT 稀疏特征求解器 import cupy as cp import cupyx.scipy.sparse as sp_gpu from pylibraft.sparse.linalg import eigsh as gpu_eigsh A_gpu sp_gpu.csr_matrix(A) # 转移到 GPU eigenvalues, eigenvectors gpu_eigsh(A_gpu, k10, whichLM)迁移时注意eigsh()要求cupyx.scipy.sparse.csr_matrix其他稀疏格式COO、CSC必须先转换且它只适用于实数对称/Hermitian 矩阵一般特征值问题需要其他求解器。随机图生成rmatpylibraft.random.rmat使用递归矩阵R-MAT模型生成随机图生成的图具有幂律度分布与社区结构常用于图算法基准测试import cupy as cp from pylibraft.random import rmat from pylibraft.common import DeviceResources n_edges 100000 r_scale 16 # 源节点数量的 log22^16 65536 个节点 c_scale 16 # 目标节点数量的 log2 theta_len max(r_scale, c_scale) * 4 # 输出边列表即 (src, dst) 对 out cp.empty((n_edges, 2), dtypecp.int32) # R-MAT 每一层的概率分布 theta cp.random.random_sample(theta_len, dtypecp.float32) handle DeviceResources() rmat(out, theta, r_scale, c_scale, seed42, handlehandle) handle.sync() print(fGenerated {n_edges} edges) print(fEdge list shape: {out.shape}) # (100000, 2) print(fSample edges:\n{out[:5].get()}) # 前 5 条边在 CPU 上查看典型使用场景图算法基准测试、生成合成社交/网络图、大规模测试图处理流水线。注意r_scale/c_scale是节点数量的对数尺度例如r_scale16代表 65536 个源节点。theta长度由max(r_scale, c_scale) * 4决定——R-MAT 递归分区的每一层都需要 4 个概率参数这是该模型递归矩阵结构的直接体现。多节点多 GPUraft-dask 的 Commsraft-dask提供Comms类负责管理 Dask 集群中 worker 间的 NCCL 与 UCX 通信是 RAPIDS 分布式 GPU 计算的基础from dask_cuda import LocalCUDACluster from dask.distributed import Client from raft_dask.common import Comms, local_handle # 搭建本地多 GPU Dask 集群 cluster LocalCUDACluster() client Client(cluster) def run_on_gpu(sessionId): handle local_handle(sessionId) # 在 RAFT 或 cuML 算法中使用该 handle return done # 初始化多 GPU 通信 comms Comms(clientclient) comms.init() # 向每个 GPU worker 提交任务 futures [ client.submit(run_on_gpu, comms.sessionId, workers[w], pureFalse) for w in comms.worker_addresses ] # 等待结果 from dask.distributed import wait wait(futures, timeout60) # 清理 comms.destroy() client.close() cluster.close()Comms 参数参数含义comms_p2p(bool)启用 UCX 点对点通信默认 False。需要直接 GPU 间传输的算法应启用clientDask distributed clientverbose(bool)启用详细日志streams_per_handle(int)每个 handle 的 CUDA 流数量配合 decision_framework.md 的组合建议RAFT raft-dask用于通过 Dask 将 GPU 负载扩展到多个 GPU/节点而RAFT CuPy组合则是用 CuPy/cupyx.scipy.sparse 构建稀疏矩阵后交给 RAFT 的eigsh()求解。跨库互操作性CUDA Array Interface 零拷贝共享RAFT 的device_ndarray实现了__cuda_array_interface__可与 CuPy、Numba、PyTorch、cuDF 等 GPU 库零拷贝共享数据import cupy as cp import torch import numpy as np from pylibraft.common import device_ndarray # pylibraft - CuPy零拷贝 raft_arr device_ndarray(np.random.rand(100).astype(np.float32)) cupy_arr cp.asarray(raft_arr) # pylibraft - PyTorch零拷贝 torch_tensor torch.as_tensor(raft_arr, devicecuda) # CuPy - pylibraft直接传入即可——RAFT API 接受 __cuda_array_interface__ cupy_data cp.random.rand(100, 50, dtypecp.float32) # 可直接把 cupy_data 传给 eigsh() 等 pylibraft 函数 # pylibraft - NumPy拷贝 numpy_arr raft_arr.copy_to_host()RAFT 函数接受任何实现__cuda_array_interface__的对象作为输入无需先转换为device_ndarray。这意味着 CuPy 数组、Numba 设备数组、PyTorch CUDA 张量、cuDF 列都可以直接传入。这与本仓库整体互操作策略一致——decision_framework.md 指出 CuPy、Numba、Warp、cuDF、cuML、cuGraph、cuVS、cuCIM、PyTorch、JAX 等库通过 CUDA Array Interface 实现零拷贝共享。提示零拷贝交换虽快但 SKILL.md 提醒应验证设备、dtype、连续性、所有权和流语义而不是假设每次转换都免费。性能建议复用 DeviceResources。创建DeviceResources会分配 CUDA 库句柄cuBLAS、cuSOLVER。只创建一次传给所有调用。批量同步。RAFT 调用是异步的。先排队多个操作再调用一次handle.sync()而不是每次调用后都同步。使用 float32。GPU 上 float32 的吞吐量比 float64 高 2~32 倍。仅在精度确实要求时使用 float64。预分配输出。许多 RAFT 函数接受out参数。预分配可避免反复的 GPU 显存分配。让数据留在 GPU 上。RAFT 通过__cuda_array_interface__与 CuPy、cuDF、cuML 互操作。在库之间直接传递 GPU 数组避免在 CPU 上往返。这些建议与 SKILL.md 的保持连贯的 GPU 数据路径原则一致输入只传输一次、中间结果保持设备驻留、复用分配并优先使用out或就地形式、批量小操作。常见陷阱忘记同步。RAFT 操作是异步的。未调用handle.sync()就读取结果会得到未定义/过期数据。若省略handle参数RAFT 会在内部同步安全但较慢。用 RAFT 做向量检索。向量检索k-NN、IVFPQ、CAGRA 等已迁移到 cuVSRAFT 不再维护这些算法。稀疏格式错误。eigsh()要求cupyx.scipy.sparse.csr_matrix。其他稀疏格式COO、CSC必须先行转换。对非对称矩阵用 eigsh。eigsh仅适用于实数对称/Hermitian 矩阵。一般特征值问题需要不同的求解器。dtype 不匹配。RAFT 函数对 dtype 很敏感。显式使用float32或float64不要依赖隐式转换。小结与进一步阅读pylibraft 是 RAPIDS 底层 GPU 原语的直接入口用DeviceResources管理 CUDA 资源、用device_ndarray管理显存、用eigsh加速稀疏特征值分解、用rmat生成基准图、用raft-dask编排多卡通信。在开始 GPU 优化代码前建议按本仓库惯例先阅读对应参考文档RAFT 参考本文主文档决策框架何时使用 RAFT安装与环境验证SciPy → RAFT 迁移示例optimize-for-gpu 技能总览覆盖 CuPy、cuDF、cuML、cuGraph、cuVS 等完整 RAPIDS 栈【免费下载链接】scientific-agent-skillsTurn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000 scientists worldwide. 165 ready-to-use validated skills plus 100 scientific databases covering biology, chemistry, medicine, and drug discovery. Compatible with Cursor, Claude Code, Codex, Pi, Antigravity, and the open Agent Skills standard.项目地址: https://gitcode.com/GitHub_Trending/cl/scientific-agent-skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表