minhashcuda, 在 CUDA ( 多 gpu ) 上,加权MinHash实现

分享于 

9分钟阅读

GitHub

  繁體 雙語
Weighted MinHash implementation on CUDA (multi-gpu).
  • 源代码名称:minhashcuda
  • 源代码网址:http://www.github.com/src-d/minhashcuda
  • minhashcuda源代码文档
  • minhashcuda源代码下载
  • Git URL:
    git://www.github.com/src-d/minhashcuda.git
    Git Clone代码到本地:
    git clone http://www.github.com/src-d/minhashcuda
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/src-d/minhashcuda
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    MinHashCuda Build StatusPyPI10.5281/zenodo.286955

    这个项目是 NVIDIA reimplementation/datasketch的加权MinHash计算的,因此在使用 MKL的numpy上带来了 600 -1000x的加速。 它支持在多个gpu上运行甚至更快,比如 处理 10个稀疏矩阵,使用稀疏 0.001 4,使用两个泰坦x Xs。 生成的结果与引用实现的bit-to-bit相同。 阅读文章

    输入格式为 32位 浮点 CSR 矩阵。 代码针对低内存消耗和速度进行了优化。

    什么是加权 MinHash

    MinHash可以用于压缩未加权集或者二进制向量,并估计未加权的Jaccard相似性。 可以通过扩展每个项的权重来修改MinHash的加权 Jaccard ( )。 但是这种方法不支持实数权重,如果权重非常大,那么这样做可能非常昂贵。 只要有可能,就不依赖于权重- known 加权 MinHash,它的性能不依赖于权重- 只要所有可能的项都是已知的。 这使得不适合流处理,当无法假定未知项的知识时。

    建筑

    
    cmake -DCMAKE_BUILD_TYPE=Release. && make
    
    
    
    

    需要 cudart,curand> =8.0,OpenMP 4.0兼容编译器(。gcc <=4.8 ) 和,> = 3.2. 如果找不到 numpy 头,请指定包含 NUMPY_INCLUDES的包含路径。 如果不希望生成 python 本机 MODULE,请添加 -D DISABLE_PYTHON=y。 如果没有自动找到 CUDA,则添加 -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-8.0 ( 更改实际路径的路径)。 如果你在 Docker 容器中构建,可能会遇到以下错误: Could NOT find CUDA (missing: CUDA_TOOLKIT_ROOT_DIR CUDA_INCLUDE_DIRS CUDA_CUDART_LIBRARY) 这意味着你需要安装CUDA工具包,它可以像在 nvidia/cuda:8.0-devrelDockerfile 安装。 如果你还在 Could NOT find CUDA (missing: CUDA_INCLUDE_DIRS) 然后运行: ln -s/usr/local/cuda/targets/x86_64-linux/include/*/usr/local/cuda/include/

    python 用户:如果你使用的是 Linux x86-64和 CUDA 8.0,那么你可以轻松安装:

    
    pip install libMHCUDA
    
    
    
    

    否则,你必须从源代码安装它:

    
    pip install git+https://github.com/src-d/minhashcuda.git
    
    
    
    

    python virtual environment,比如 pyenv或者conda中的构建不受支持。 你仍然可以提交补丁来修复相关问题。

    测试

    test.py 包含基于测试单元的单元测试。 它们需要 datasketchscipy。

    捐赠

    。欢迎请参见贡献代码的执行代码。

    许可证

    Apache?

    python-示例

    import libMHCUDAimport numpyfrom scipy.sparse import csr_matrix# Prepare the rowsnumpy.random.seed(1)
    data = numpy.random.randint(0, 100, (6400, 130))
    mask = numpy.random.randint(0, 5, data.shape)
    data *= (mask >=4)del mask
    m = csr_matrix(data, dtype=numpy.float32)del data# We've got 80% sparse matrix 6400 x 130# Initialize the hasher aka"generator" with 128 hash samples for every rowgen = libMHCUDA.minhash_cuda_init(m.shape[-1], 128, seed=1, verbosity=1)# Calculate the hashes. Can be executed several times with different number of rowshashes = libMHCUDA.minhash_cuda_calc(gen, m)# Free the resourceslibMHCUDA.minhash_cuda_fini(gen)

    这些函数可以很容易地封装到类( 未包括) 中。

    python API

    导入"libmhcuda"。

    defminhash_cuda_init(dim, samples, seed=time(), deferred=False, devices=0, verbosity=0)

    创建 hasher。

    在输入中的维度数为 dim。 换句话说,每个权重向量的长度。

    样本整数,哈希样本的数目。 值越多,估计就越精确,但哈希大小越大,计算( 线性)的时间越长。

    种子整数,可以重复结果的随机发生器种子。

    如果 true的延迟为0,则会禁用随机数初始化WMH参数。 在这种情况下,用户将在以后调用 minhash_cuda_assign_random_vars()。

    设备整数,按位或者ed器件指数,比如 1表示第一个器件,2表示第二个器件,3意味着使用第一和第二设备。 特殊值 0启用所有可用设备。 默认值为 0.

    冗长的详细,0表示完全静音,1表示仅进度日志,2表示大量输出。

    返回整数,指向生成器结构( 不透明)的指针。

    defminhash_cuda_calc(gen, matrix, row_start=0, row_finish=0xffffffff)

    计算加权 MinHash。可以在GPU上重新分配内存,但是最好重用缓冲区。

    gen整数,从获取生成器结构的指针。

    矩阵scipy.sparse.csr_matrix 实例,列的数量必须为的dim。

    row_start 整数,切片起始偏移( 要处理的第一行的索引)。 实现高效零拷贝稀疏矩阵切片。

    row_finish 整数,切片结束偏移( 要处理的最后一个行之后的行的索引)。 生成的矩阵行切片是 [row-start:row_finish]。

    形状(。矩阵行数,样本,2 ) 和 dtype uint32的返回numpy.ndarray

    defminhash_cuda_fini(gen)

    释放由 init() 分配的所有资源和随后的calc ( ) -s。 生成器指针无效。

    gen整数,从获取生成器结构的指针。

    C API

    包含" minhashcuda.h"。

    MinhashCudaGenerator* mhcuda_init(
     uint32_t dim, uint16_t samples, uint32_t seed, int deferred,
     uint32_t devices, int verbosity, MHCUDAResult *status)

    初始化加权MinHash生成器。

    dim input输入中的维度数。 换句话说,每个权重向量的长度。

    样本 hash哈希样本数。 值越多,估计就越精确,但哈希大小越大,计算( 线性)的时间越长。 不一定是性能考虑的质数。

    随机生成种子的种子可以用于重现结果。

    如果设置为除 0以外的任何延迟,则使用随机数禁用WMH参数的初始化。 在这种情况下,用户将在以后调用 mhcuda_assign_random_vars()。

    设备位或者ed器件指数,比如 1表示第一个器件,2表示第二器件,3意味着使用第一和第二设备。 特殊值 0启用所有可用设备。

    收费详细 verbosity 0表示完全静音,1意味着只记录进度记录,2意味着大量输出。

    状态指针,指向报告的返回代码。 如果出现任何错误,则返回的结果为 arraylist,代码将存储在 *status ( 使用nullptr检查) 中。

    向分配生成器不透明结构的返回指针。

    MHCUDAResult mhcuda_calc(
     const MinhashCudaGenerator *gen, constfloat *weights,
     constuint32_t *cols, constuint32_t *rows, uint32_t length,
     uint32_t *output)

    计算指定CSR矩阵的加权 MinHash-es。

    从获得生成器不透明结构的 gen指针。 矩阵的加权加权。 矩阵指数的sparse sparse必须与重量相同。 行matrix矩阵索引。 第一个元素总是 0,最后一个元素有效的大小和权重的大小。 长度行数。 ""参数必须具有大小( 行+ 1 ) of因为前导 0. 输出结果行的array 大小x 示例x 2.

    返回状态码。

    MHCUDAResult mhcuda_fini(MinhashCudaGenerator *gen);

    释放由 mhcuda_init() 和 mhcuda_calc ( ) 分配的所有资源,包括设备缓冲区。 生成器指针无效。

    从获得生成器不透明结构的 gen指针。

    返回状态码。

    自述文件

    相关文章