注意
RAFT 中的向量搜索和聚类算法正在迁移到专用于向量搜索的新库 cuVS。在此迁移期间,我们将继续支持 RAFT 中的向量搜索算法,但在 RAPIDS 24.06(六月)版本之后将不再更新它们。我们计划在 RAPIDS 24.10(十月)版本之前完成迁移,并且它们将在 24.12(十二月)版本中完全从 RAFT 中移除。
数据生成#
make_blobs#
#include <raft/random/make_blobs.cuh>
namespace raft::random
-
template<typename DataT, typename IdxT, typename layout>
void make_blobs(raft::resources const &handle, raft::device_matrix_view<DataT, IdxT, layout> out, raft::device_vector_view<IdxT, IdxT> labels, IdxT n_clusters = 5, std::optional<raft::device_matrix_view<DataT, IdxT, layout>> centers = std::nullopt, std::optional<raft::device_vector_view<DataT, IdxT>> const cluster_std = std::nullopt, const DataT cluster_std_scalar = (DataT)1.0, bool shuffle = true, DataT center_box_min = (DataT)-10.0, DataT center_box_max = (DataT)10.0, uint64_t seed = 0ULL, GeneratorType type = GenPC)# sklearn.datasets.make_blobs 的 GPU 等效实现。
- 模板参数:
DataT – 输出数据类型
IdxT – 索引算术类型
- 参数:
handle – [in] 用于管理昂贵资源的 raft 句柄
out – [out] 生成的数据 [在设备上] [维度 = n_rows x n_cols]
labels – [out] 生成数据的标签 [在设备上] [长度 = n_rows]
n_clusters – [in] 要生成的簇(或类别)数量
centers – [in] 每个簇的中心,如果需要随机生成,则传入 nullptr [在设备上] [维度 = n_clusters x n_cols]
cluster_std – [in] 每个簇中心的标准差,如果要从
cluster_std_scalar
读取,则传入 nullptr。[在设备上] [长度 = n_clusters]cluster_std_scalar – [in] 如果 ‘cluster_std’ 为 nullptr,则将其用作所有维度的标准差。
shuffle – [in] 打乱生成的数据集和标签
center_box_min – [in] 用于选择簇中心的框的最小值。仅当 ‘centers’ 为 nullptr 时有用。
center_box_max – [in] 用于选择簇中心的框的最大值。仅当 ‘centers’ 为 nullptr 时有用。
seed – [in] RNG 的种子
type – [in] RNG 类型
make_regression#
#include <raft/random/make_regression.cuh>
namespace raft::random
-
template<typename DataT, typename IdxT>
void make_regression(raft::resources const &handle, raft::device_matrix_view<DataT, IdxT, raft::row_major> out, raft::device_matrix_view<DataT, IdxT, raft::row_major> values, IdxT n_informative, std::optional<raft::device_matrix_view<DataT, IdxT, raft::row_major>> coef, DataT bias = DataT{}, IdxT effective_rank = static_cast<IdxT>(-1), DataT tail_strength = DataT{0.5}, DataT noise = DataT{}, bool shuffle = true, uint64_t seed = 0ULL, GeneratorType type = GenPC)# sklearn.datasets.make_regression 的 GPU 等效实现,文档参见:https://scikit-learn.cn/stable/modules/generated/sklearn.datasets.make_regression.html。
- 模板参数:
DataT – 标量类型
IdxT – 索引类型
- 参数:
handle – [in] RAFT 句柄
out – [out] 行主序 (样本, 特征) 矩阵,用于存储问题数据
values – [out] 行主序 (样本, 目标) 矩阵,用于存储回归问题的数值
n_informative – [in] 有信息特征的数量(非零系数)
coef – [out] 如果存在,一个行主序 (特征, 目标) 矩阵,用于存储生成回归问题数值所使用的系数
bias – [in] 将添加到数值中的标量
effective_rank – [in] 数据矩阵的近似秩(用于创建数据中的相关性)。-1 表示使用条件良好的数据。
tail_strength – [in] 如果 effective_rank 不是 -1,则奇异值曲线的胖噪声尾部的相对重要性
noise – [in] 应用于输出的高斯噪声的标准差
shuffle – [in] 打乱样本和特征
seed – [in] 随机数生成器的种子
type – [in] 随机生成器类型
R-MAT 生成#
#include <raft/random/rmat_rectangular_generator.cuh>
namespace raft::random
-
template<typename IdxT, typename ProbT>
void rmat_rectangular_gen(raft::resources const &handle, raft::random::RngState &r, raft::device_vector_view<const ProbT, IdxT> theta, raft::device_mdspan<IdxT, raft::extents<IdxT, raft::dynamic_extent, 2>, raft::row_major> out, raft::device_vector_view<IdxT, IdxT> out_src, raft::device_vector_view<IdxT, IdxT> out_dst, IdxT r_scale, IdxT c_scale)# 生成用于矩形邻接矩阵的二分 R-MAT 图。
此函数生成一个由(稀疏)邻接矩阵表示的随机图。如文献 [1] 中所述,为了生成连接,我们将邻接矩阵递归细分为四个大小相等的分区,并以不相等的概率在这些分区内分配边。概率由数字 [a, b, c, d] 描述。我们以概率
a
选择左上分区。选择的分区再次被细分为四个更小的分区,并重复此过程,直到我们达到单个元素(1 x 1 分区)。我们可以在每次迭代中指定不同的概率分布。
theta
数组存储了每个级别的概率值。[1] “R-MAT: A Recursive Model for Graph Mining” Deepayan Chakrabarti, Yiping Zhan, Christos Faloutsos (2004) https://doi.org/10.1137/1.9781611972740.43
我们将
r_scale != c_scale
的情况称为“矩形邻接矩阵”情况(换句话说,生成二分图)。在这种情况下,当depth >= r_scale
时,分布假定为[theta[4 * depth] + theta[4 * depth + 2], theta[4 * depth + 1] + theta[4 * depth + 3]; 0, 0]
.然后当
depth >= c_scale
时,分布假定为[theta[4 * depth] + theta[4 * depth + 1], 0; theta[4 * depth + 2] + theta[4 * depth + 3], 0]
.注意
这可能会生成重复的边和自环。调用者有责任相应地清理它们。
注意
这也只生成有向图。如果需要无向图,则预期调用者会执行单独的后处理步骤。
- 模板参数:
IdxT – 每个节点索引的类型
ProbT – 用于概率分布的数据类型(fp32 或 fp64)
- 参数:
handle – [in] RAFT 句柄,包含用于调度工作的 CUDA 流
r – [in] 随机生成器的底层状态。当需要多次调用此 API 以生成更大的图时,这尤其有用。在这种情况下,只需使用初始种子创建此对象一次,并在每次调用后继续传递相同的对象进行后续调用。
out – [out] 生成的边列表 [在设备上],以结构体数组 (array-of-structs) 形式打包。在每一行中,第一个元素是源节点 ID,第二个元素是目标节点 ID。
out_src – [out] 源节点 ID 列表 [在设备上]。
out_dst – [out] 目标节点 ID 列表 [在设备上]。
out_src
和out_dst
一起构成了与out
相同的输出数据的结构体数组 (struct-of-arrays) 表示。theta – [in] 数组 [在设备上],包含每个分辨率级别上每个象限的分布。theta = [a0, b0, c0, d0, a1, b1, c1, d1, …],其中 [a0, b0, c0, d0] 定义了最精细级别 (2x2) 的概率。数组中的最后四个元素描述了最粗略级别(矩阵大小 = [2^r_scale, 2^c_scale])的概率。由于这些是概率,每个 RMAT 级别的四个 [a_i, b_i, c_i, d_i] 值必须总和为一。[维度 = max(r_scale, c_scale) x 2 x 2]。
r_scale – [in] 2^r_scale 表示源节点的数量
c_scale – [in] 2^c_scale 表示目标节点的数量
- 前置条件:
out.extent(0) == 2 *
out_src.extent(0)is
true@pre
out_src.extent(0) == out_dst.extent(0)is
true`
-
template<typename IdxT, typename ProbT>
void rmat_rectangular_gen(raft::resources const &handle, raft::random::RngState &r, raft::device_vector_view<const ProbT, IdxT> theta, raft::device_vector_view<IdxT, IdxT> out_src, raft::device_vector_view<IdxT, IdxT> out_dst, IdxT r_scale, IdxT c_scale)# rmat_rectangular_gen
的重载,仅生成结构体数组 (struct-of-arrays)(两个向量)输出表示。此重载仅生成结构体数组 (struct-of-arrays)(两个向量)输出表示:包含源节点 ID 的输出向量
out_src
和包含目标节点 ID 的输出向量out_dst
。- 前置条件:
out_src.extent(0) == out_dst.extent(0)
为true
-
template<typename IdxT, typename ProbT>
void rmat_rectangular_gen(raft::resources const &handle, raft::random::RngState &r, raft::device_mdspan<IdxT, raft::extents<IdxT, raft::dynamic_extent, 2>, raft::row_major> out, IdxT r_scale, IdxT c_scale)# rmat_rectangular_gen
的重载,仅生成结构体数组 (array-of-structs)(一个向量)输出表示。此重载仅生成结构体数组 (array-of-structs)(一个向量)输出表示:一个单独的输出向量
out
,其中每行的第一个元素是源节点 ID,第二个元素是目标节点 ID。
-
template<typename IdxT, typename ProbT>
void rmat_rectangular_gen(raft::resources const &handle, raft::random::RngState &r, raft::device_mdspan<IdxT, raft::extents<IdxT, raft::dynamic_extent, 2>, raft::row_major> out, raft::device_vector_view<IdxT, IdxT> out_src, raft::device_vector_view<IdxT, IdxT> out_dst, ProbT a, ProbT b, ProbT c, IdxT r_scale, IdxT c_scale)# rmat_rectangular_gen
的重载,假定所有尺度上具有相同的 a, b, c, d 概率分布,并接受所有三个输出向量(out
采用结构体数组 (array-of-structs) 输出表示,out_src
和out_dst
采用结构体数组 (struct-of-arrays) 输出表示)。a
,b, and
c 有效地取代了上述重载的theta
参数。- 前置条件:
out.extent(0) == 2 *
out_src.extent(0)is
true@pre
out_src.extent(0) == out_dst.extent(0)is
true`
-
template<typename IdxT, typename ProbT>
void rmat_rectangular_gen(raft::resources const &handle, raft::random::RngState &r, raft::device_vector_view<IdxT, IdxT> out_src, raft::device_vector_view<IdxT, IdxT> out_dst, ProbT a, ProbT b, ProbT c, IdxT r_scale, IdxT c_scale)# rmat_rectangular_gen
的重载,假定所有尺度上具有相同的 a, b, c, d 概率分布,并且只接受两个输出向量(结构体数组 (struct-of-arrays) 输出表示)。a
,b, and
c 有效地取代了上述重载的theta
参数。- 前置条件:
out_src.extent(0) == out_dst.extent(0)
为true
-
template<typename IdxT, typename ProbT>
void rmat_rectangular_gen(raft::resources const &handle, raft::random::RngState &r, raft::device_mdspan<IdxT, raft::extents<IdxT, raft::dynamic_extent, 2>, raft::row_major> out, ProbT a, ProbT b, ProbT c, IdxT r_scale, IdxT c_scale)# rmat_rectangular_gen
的重载,假定所有尺度上具有相同的 a, b, c, d 概率分布,并且只接受一个输出向量(结构体数组 (array-of-structs) 输出表示)。a
,b, and
c 有效地取代了上述重载的theta
参数。
-
template<typename IdxT, typename ProbT>
void rmat_rectangular_gen(IdxT *out, IdxT *out_src, IdxT *out_dst, const ProbT *theta, IdxT r_scale, IdxT c_scale, IdxT n_edges, cudaStream_t stream, raft::random::RngState &r)# rmat_rectangular_gen
的遗留重载,接受原始数组而不是 mdspan。- 模板参数:
IdxT – 每个节点索引的类型
ProbT – 用于概率分布的数据类型(fp32 或 fp64)
- 参数:
out – [out] 生成的边列表 [在设备上] [维度 = n_edges x 2]。在每一行中,第一个元素是源节点 ID,第二个元素是目标节点 ID。如果不需要此输出,请传入
nullptr
。out_src – [out] 源节点 ID 列表 [在设备上] [长度 = n_edges]。如果不需要此输出,请传入
nullptr
。out_dst – [输出] 目标节点ID列表 [在设备上] [长度 = n_edges]。如果不需要此输出,则在其位置传递一个
nullptr
。theta – [输入] 在每个分辨率级别上每个象限的分布。由于这些是概率,RMAT 的每个级别对应的 2x2 矩阵之和必须为一。 [在设备上] [维度 = max(r_scale, c_scale) x 2 x 2]。当然,假定每组 2x2 数字的总和都为 1。
r_scale – [in] 2^r_scale 表示源节点的数量
c_scale – [in] 2^c_scale 表示目标节点的数量
n_edges – [输入] 要生成的边的数量
stream – [输入] 用于安排工作的 CUDA 流
r – [in] 随机生成器的底层状态。当需要多次调用此 API 以生成更大的图时,这尤其有用。在这种情况下,只需使用初始种子创建此对象一次,并在每次调用后继续传递相同的对象进行后续调用。
-
template<typename IdxT, typename ProbT>
void rmat_rectangular_gen(IdxT *out, IdxT *out_src, IdxT *out_dst, ProbT a, ProbT b, ProbT c, IdxT r_scale, IdxT c_scale, IdxT n_edges, cudaStream_t stream, raft::random::RngState &r)# rmat_rectangular_gen
的旧式重载,接受原始数组而非 mdspan。此重载假定在所有尺度上使用相同的 a, b, c, d 概率分布。