此软件包增强稀疏矩阵乘法,随后选择前n个乘法
项目描述
sparse_dot_topn
sparse_dot_topn 提供了一种快速执行稀疏矩阵乘法后选择前n个乘法结果的方法。
比较非常大的特征向量并选择最佳匹配,在实践中通常会导致执行稀疏矩阵乘法后选择前n个乘法结果。
sparse_dot_topn 提供了一个(并行化的)稀疏矩阵乘法实现,它集成了选择前n个值的功能,从而显著降低内存占用并提高性能。在 Apple M2 Pro 上,对于两个 20k x 193k 的 TF-IDF 矩阵,当保留每行前10个值并利用8个核心时,sparse_dot_topn 可以快6倍。详情请参阅基准目录。
用法
sp_matmul_topn
支持 {CSR, CSC, COO}
矩阵,具有 {32, 64}bit {int, float}
数据。请注意,COO
和 CSC
输入将被转换为 CSR
格式,因此速度较慢。有两个选项可以进一步减少内存需求:threshold
和 density
。可选地对值进行排序,以便给定行的第一列包含最大的值。请注意,sp_matmul_topn(A, B, top_n=B.shape[1])
等于 sp_matmul(A, B)
和 A.dot(B)
。
如果您正在从 v0.*
迁移,请参阅下面的迁移指南以获取详细信息。
import scipy.sparse as sparse
from sparse_dot_topn import sp_matmul, sp_matmul_topn
A = sparse.random(1000, 100, density=0.1, format="csr")
B = sparse.random(100, 2000, density=0.1, format="csr")
# Compute C and retain the top 10 values per row
C = sp_matmul_topn(A, B, top_n=10)
# or paralleslised matrix multiplication without top-n selection
C = sp_matmul(A, B, n_threads=2)
# or with top-n selection
C = sp_matmul_topn(A, B, top_n=10, n_threads=2)
# If you are only interested in values above a certain threshold
C = sp_matmul_topn(A, B, top_n=10, threshold=0.8)
# If you set the threshold we cannot easily determine the number of non-zero
# entries beforehand. Therefore, we allocate memory for `ceil(top_n * A.shap[0] * density)`
# non-zero entries. You can set the expected density to reduce the amount pre-allocated
# entries. Note that if we allocate too little an expensive copy(ies) will need to hapen.
C = sp_matmul_topn(A, B, top_n=10, threshold=0.8, density=0.1)
安装
sparse_dot_topn 为 CPython 3.8 至 3.12 提供了 wheels
- Windows (64位)
- Linux (64位)
- MacOS (x86 和 ARM)
pip install sparse_dot_topn
sparse_dot_topn 依赖于用于计算密集型乘法例程的 C++ 扩展。**请注意,wheels 供应商/提供的扩展与 OpenMP 一起使用,以提供开箱即用的并行化。**这可能在使用像 PyTorch 这样的也提供 OpenMP 的库时引起问题。如果您遇到任何与 OpenMP 相关的问题,请参阅 INSTALLATION.md 获取帮助或在不指定 n_threads
参数的情况下运行函数。
从源代码安装需要 C++17 兼容的编译器。如果您有可用的编译器,建议不使用 wheel 安装,因为这可以启用特定于架构的优化。
您可以使用以下方法从源代码安装:
pip install sparse_dot_topn --no-binary sparse_dot_topn
构建配置
sparse_dot_topn 在从源代码构建时提供了一些配置选项。从源代码构建可以启用特定于架构的优化,并建议那些已安装 C++ 编译器的人使用。有关详细信息,请参阅 INSTALLATION.md。
在集群上分配两个大型 O(10M+) 稀疏矩阵的前n个乘法
两个大型 O(10M+) 稀疏矩阵的前n个乘法可以分解为更小的块。例如,可以将稀疏矩阵分解为仅包含 1M 行的矩阵,然后对所有这些矩阵对执行(前n个)乘法。这样做的原因是为了减少每个对的内存占用,并利用可用的分布式计算能力。
可以将这些对分配到集群中(例如,我们使用 spark 集群)进行计算。然后对结果矩阵产品进行压缩并堆叠,以重现完整的矩阵乘积。
以下是一个示例,其中我们正在将稀疏矩阵 A 中的 1000 行与稀疏矩阵 B 中的 600 行进行匹配,并且 A 和 B 都被拆分为块。
import numpy as np
import scipy.sparse as sparse
from sparse_dot_topn import sp_matmul_topn, zip_sp_matmul_topn
# 1a. Example matching 1000 rows in sparse matrix A against 600 rows in sparse matrix B.
A = sparse.random(1000, 2000, density=0.1, format="csr", dtype=np.float32, random_state=rng)
B = sparse.random(600, 2000, density=0.1, format="csr", dtype=np.float32, random_state=rng)
# 1b. Reference full matrix product with top-n
C_ref = sp_matmul_topn(A, B.T, top_n=10, threshold=0.01, sort=True)
# 2a. Split the sparse matrices. Here A is split into three parts, and B into five parts.
As = [A[i*200:(i+1)*200] for i in range(5)]
Bs = [B[:100], B[100:300], B[300:]]
# 2b. Perform the top-n multiplication of all sub-matrix pairs, here in a double loop.
# E.g. all sub-matrix pairs could be distributed over a cluster and multiplied there.
Cs = [[sp_matmul_topn(Aj, Bi.T, top_n=10, threshold=0.01, sort=True) for Bi in Bs] for Aj in As]
# 2c. top-n zipping of the C-matrices, done over the index of the B sub-matrices.
Czip = [zip_sp_matmul_topn(top_n=10, C_mats=Cis) for Cis in Cs]
# 2d. stacking over zipped C-matrices, done over the index of the A sub-matrices
# The resulting matrix C equals C_ref.
C = sparse.vstack(Czip, dtype=np.float32)
迁移到 v1。
sparse_dot_topn v1 是从 v0.*
中的一个重大变化,具有新的绑定和 API。新版本支持 CPython 3.12,现在支持整数和浮点数。内部,我们切换到最大堆来收集前n个值,这显著减少了内存占用。前一个实现的前n个选择具有 O(n_columns)
的复杂度,而我们现在具有 O(top-n)
的复杂度。awesome_cossim_topn
已弃用,将在未来的版本中删除。
用户应切换到 sp_matmul_topn
,它大致兼容
例如
C = awesome_cossim_topn(A, B, ntop=10)
可以使用以下方法进行复制
C = sp_matmul_topn(A, B, top_n=10, threshold=0.0, sort=True)
API 更改
ntop
已重命名为topn
lower_bound
已重命名为threshold
use_threads
和n_jobs
已合并为n_threads
- 已删除
return_best_ntop
选项 test_nnz_max
选项已被移除- 当其形状不兼容但转置兼容时,
B
会自动转置。
return_best_ntop
的输出可以通过以下方式复制:
C = sp_matmul_topn(A, B, top_n=10)
best_ntop = np.diff(C.indptr).max()
默认更改
threshold
已不再是0.0
,而是默认禁用。
这使包含负值的矩阵能够正常工作。此外,在收集非零结果时,内部使用了一个不同的数据结构,其内存占用比以前低得多。这意味着 threshold
参数对性能和内存需求的影响可以忽略不计。如果 threshold
为 None
,则预先计算非零条目的数量,这可以显著减少所需的内存,同时性能损失轻微(约10%)。
sort = False
,结果矩阵不再默认排序。
返回的矩阵列顺序与未进行 top-n 结果过滤时相同。这意味着当您将 top_n
设置为 B
的列数时,您将获得与正常乘法相同的结果,即 sp_matmul_topn(A, B, top_n=B.shape[1])
等于 A.dot(B)
。
贡献
非常欢迎贡献,请参阅 CONTRIBUTING 以获取详细信息。
贡献者
此包是由(以前)与 ING Analytics Wholesale Banking Advanced Analytics 有关联的作者开发和维护的。原始实现基于 Scipy 的 CSR 乘法实现的修改版本。您可以在由 Zhe Sun 撰写的博客 https://medium.com/@ingwbaa/https-medium-com-ingwbaa-boosting-selection-of-the-most-similar-entities-in-large-scale-datasets-450b3242e618 中了解相关信息 (镜像)。
项目详情
sparse-dot-topn-1.1.4.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 40beca0897af566f03c1a9040171561a94065eb689b4a125a1261c09e572d4bd |
|
MD5 | 42eb0c9dd3a360d113226eb9aacffaa4 |
|
BLAKE2b-256 | cb19b43e3ba106cf35de6830040caeb09b85e71f0f7e7c05268e17a8378312c3 |
sparse_dot_topn-1.1.4-cp312-abi3-win_amd64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 6a70ef560c36ed9d3acbe0d05060a28f321cee4e5ac06d39088515de39502032 |
|
MD5 | 162bac8aeeedc5db1d8be89ffd99f919 |
|
BLAKE2b-256 | 5385c71144ac68c4f3cc6f785fb17bf6b6a7fec0a6c38f585c078a304eb54627 |
哈希值 for sparse_dot_topn-1.1.4-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | abff778fbe7ad1b14919b99e2efd5ba60b3c81889af1c2c901e8b8a6b55c33ba |
|
MD5 | 0711f7cd7931f3a04bf7b4e41f89f5d5 |
|
BLAKE2b-256 | 44475f16b6d4a02f7f0bcf9426cc2b0b527d740bce04a0123c2296e7f7d9d065 |
哈希值 for sparse_dot_topn-1.1.4-cp312-abi3-macosx_12_0_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 66628d4d9747713d13cf1d2651d3d260ad5c7c1e6f78ac4aed2bf34b39746497 |
|
MD5 | c64fa3943871f58c0a76247d81ca1890 |
|
BLAKE2b-256 | d273923cab47a5fb9db2f51663f0521c1cd3a76d9a2ce6241e80a30598c02b4f |
哈希值 for sparse_dot_topn-1.1.4-cp312-abi3-macosx_12_0_arm64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e2be7e7593af1f3dc4777383a2ce652c6f36778a02ad2412cfde329d53fe59fb |
|
MD5 | 9c7218d84407c1f996e56c3a7c83adad |
|
BLAKE2b-256 | 901dbb4ac3473eb66b534184a216461be315a62fb9f480abdad173c7ba93ab51 |
哈希值 for sparse_dot_topn-1.1.4-cp311-cp311-win_amd64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 10ed366eee4865454c3ef1db7446cf91aa00f22ca7e8e1b367fceae74380d336 |
|
MD5 | f3c63c0ce6c122a3e84c84f1a665453b |
|
BLAKE2b-256 | 03d47a53663a1124d45d705ce01f11864c19b1720ba529d059e316bc0aa31998 |
哈希值 for sparse_dot_topn-1.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d9b9f34a0e1074fba265ff94f60bd092bf64538d6c7846c2d7d5a659583e8f27 |
|
MD5 | fae33fda3d9e70ac0b22ce5d2645c4cf |
|
BLAKE2b-256 | 47eecdbd3d83b3b0de4f942474e0f0d5e72f4519199589f4665d746b9f335c84 |
哈希值 for sparse_dot_topn-1.1.4-cp311-cp311-macosx_12_0_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b19bd39c6663ab13e8cd5665f93c53c4ee511911f7bc5a25fbfaf4e8bb10d04f |
|
MD5 | 8cf8021222dbd38f60ec5d6ce2ef2cca |
|
BLAKE2b-256 | c2ab65af7754273e49b9be5ecb073f074905614a76584e3609dab0524f5dba13 |
哈希值 for sparse_dot_topn-1.1.4-cp311-cp311-macosx_12_0_arm64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 94b43ede1139aacb906fb1354fd3915339ba25652799143f426b7910f19416c8 |
|
MD5 | 925db52c6b8c7085514b9d349121bead |
|
BLAKE2b-256 | 9030094b2457bfefbfb39d1d6618b348d4c54552209293df77f4b91016ac2a91 |
哈希值 for sparse_dot_topn-1.1.4-cp310-cp310-win_amd64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 36e45d9150946a232d0416f7cbf16219132fc297febf96f0b192da7c8759b6fa |
|
MD5 | 059d6f7ca8e4eaaf07cfff6d54be52e1 |
|
BLAKE2b-256 | d426815bd7602a2aaba833823ac1c46465ed1ea3270d704eb881dccfe9e6e3f8 |
哈希值 for sparse_dot_topn-1.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ba1569bf4c1ea2d347dee4a07fe7e07ba3010bc58cf135dcb608f527c0b51802 |
|
MD5 | 91d8191396ba646ee64b030df5620882 |
|
BLAKE2b-256 | c9529d878f7d481c6c956e1ca7970381feb5299dfce63fe336e1dec14916e60a |
哈希值 for sparse_dot_topn-1.1.4-cp310-cp310-macosx_12_0_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 3a6e7150567178126a03ebdebff5026e47b12e951be8118af0401b69752a95ff |
|
MD5 | dcd32d64ab8050b0cd1402843b4fb103 |
|
BLAKE2b-256 | 6d91cc121f765782c23871f743f3bb980841db7f4b74c3f2fd030133aeb9e637 |
哈希值 for sparse_dot_topn-1.1.4-cp310-cp310-macosx_12_0_arm64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 3abd07c190b18a3934a6aaa591b41e02aa387def6c06f88163a3ab8cd040117d |
|
MD5 | 06616f87351d45064bfd96bb53b905ca |
|
BLAKE2b-256 | c71157d5c8df3ab5bd6b1454bbe7608c4cbb25ed9da33ac71c1e44e7f256eb2d |
哈希值 for sparse_dot_topn-1.1.4-cp39-cp39-win_amd64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 9d5b06ad1119739edd21f0eea1c905beaeaae29f2e9d057e569ce02cfd07959d |
|
MD5 | f18968c7caa691a077311236279ce229 |
|
BLAKE2b-256 | ea422509b68dd5dedf94cf7dfda0a2df4080d2f6d4f89068809a9e66218cfa34 |
哈希值 for sparse_dot_topn-1.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 037266f9efdb581275542a82129a6fc55981917441defe73d7e863441a28d52d |
|
MD5 | 1d0e8359c3ce54c8523feb7d905faf2b |
|
BLAKE2b-256 | a4bd400a8022e56f59fb7f7d60b3ffe69948e3a464e9aa70539ddf1f2f244da1 |
哈希值 用于 sparse_dot_topn-1.1.4-cp39-cp39-macosx_12_0_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1f13006379126b567b85f0055657af89cb7a4d6eaa0d3c070822fd822f4508d5 |
|
MD5 | e3eec577efc0197d3f1e94294f08446e |
|
BLAKE2b-256 | 95b9bf60a61821f23a9c2a9d5b8f9cd20cc0d50386ada18f91945beaf84f208e |
哈希值 用于 sparse_dot_topn-1.1.4-cp39-cp39-macosx_12_0_arm64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 845ee59baf0c05b2aef535e11d7101625fea10def004999f944d5ab47c44e454 |
|
MD5 | 4272ff7f9d2c01f09658dbf9db572f83 |
|
BLAKE2b-256 | 34f9a48c510aa195ffb79fcd9b252de319b8697245d32ad04a7ffb2bb7ad14db |
哈希值 用于 sparse_dot_topn-1.1.4-cp38-cp38-win_amd64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7b84e50e24617d608531462b51e9a57ee940ce1f90559e242307be48a78dce42 |
|
MD5 | 017388fc92d841937862323ba9a0de5a |
|
BLAKE2b-256 | a80139910f7e4fed8d5f292077d058892cc0050974cbab264bcb429029ad74d7 |
哈希值 用于 sparse_dot_topn-1.1.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a16c46ba855248223133053478a332c1a9de13d68129b7ea10b1a1d9033f08dc |
|
MD5 | 3dacbcf258003f4e24a317aa540ddc93 |
|
BLAKE2b-256 | 09287c219b81e5abc2711eed9cb03fe6d4f28d3fc690fd43f4615181e7701c7e |
哈希值 用于 sparse_dot_topn-1.1.4-cp38-cp38-macosx_12_0_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 23e286e52c50c9e3409bdea81732ec7f1d22279e7bf08b98c8073c5bebdba89e |
|
MD5 | 7329e2d0d052b4ad27e90d56fc925351 |
|
BLAKE2b-256 | c14ebdcd3a78ffe42faf1c7d910589d095c904fa2587c90b4e7e67c9dc6a04ca |
哈希值 用于 sparse_dot_topn-1.1.4-cp38-cp38-macosx_12_0_arm64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 72cb74037db65dae1bada0f00a71c72f915264d2ffe93776dd7a984b4c485213 |
|
MD5 | d1f6a4ea422531250af36b3cb80bd7cf |
|
BLAKE2b-256 | a8069754e83611bb0576cad29ded4670bd1e0b868390015901267ec3fcbf0a85 |