python 调用gpu算力_KMCUDA: GPU/CUDA 实现Kmeans

最近项目使用到Kmeans算法,考虑到CPU实现速度上的限制,需要使用GPU加速,因此查到libKMCUDA库。

记录安装使用过程中遇到的一些问题。

1、kmcuda简介

项目内容:Large scale K-means and K-nn implementation on NVIDIA GPU / CUDA

该项目具体的介绍可参照github上的说明。

性能如下:

从技术上来讲,该项目是一个共享库,可导出kmcuda.h中定义的两个函数:kmeasn_cuda和knn_cuda。它具有内置的Python3和R语言本机扩展支持,因此可以从libKMCUDA导入kmeans_cuda或dyn.load("libKMCUDA.so")。

2、安装

Github上给出的安装命令:

git clone https://github.com/src-d/kmcuda

cd src

cmake -DCMAKE_BUILD_TYPE=Release . && make

复制代码

有几个参数需要注意一下:

-D DISABLE_PYTHON: 如果不想编译Python支持模块,将该项值为y,即增加-D DISABLE_PYTHON=y

-D DISABLE_R: 如果不想编译R支持模块,增加-D DISABLE_R=y

-D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-10.0(修改为自己的路径):如果CUDA无法自动找到,则增加该项

-D CUDA_ARCH=52:指定当前机器的CUDA计算能力(GPU Compute Capability)

gcc:有文章提到,低版本的gcc编译器不支持,我当前版本是5.4,可满足需求。

1. 查询gcc版本

若版本过低,可安装gcc-5.4,具体安装参考如下博文:

2. 查询GPU算力

通过NVIDIA官网查询自己GPU服务器的GPU算力,地址如下:

我当前使用的服务器是GeForce RTX 2070,对应的算力是7.5。

因此,CUDA_ARCH设置为75, -D CUDA_ARCH=75

3. 配置GPU路径

为了能够自动查找相关库的路径,将cuda的路径配置到配置文件中。当前系统使用的shell为zsh:

在~/.zshrc中增加如下项:

export PATH=$PATH:/usr/local/cuda/bin

export LD_LIBRARAY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

export

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
K-means是一种常用的聚类算法,而K-means++是K-means算法的优化版本,它能够更好地初始化聚类中心,从而得到更好的聚类效果。下面是Python中K-means和K-means++的实现方法。 K-means实现: ```python import numpy as np def kmeans(X, k, max_iter=100): n_samples, n_features = X.shape centroids = X[np.random.choice(n_samples, k, replace=False)] for i in range(max_iter): clusters = [[] for _ in range(k)] for idx, x in enumerate(X): distances = [np.linalg.norm(x - c) for c in centroids] clusters[np.argmin(distances)].append(idx) new_centroids = np.zeros((k, n_features)) for idx, cluster in enumerate(clusters): new_centroids[idx] = np.mean(X[cluster], axis=0) if np.allclose(new_centroids, centroids): break centroids = new_centroids return centroids, clusters ``` K-means++实现: ```python import numpy as np def kmeans_pp(X, k, max_iter=100): n_samples, n_features = X.shape centroids = [] # choose first centroid randomly idx = np.random.choice(n_samples, 1, replace=False) centroids.append(X[idx]) # choose the rest of the centroids using k-means++ algorithm for i in range(1, k): distances = np.zeros(n_samples) for j, x in enumerate(X): distances[j] = np.min([np.linalg.norm(x - c) for c in centroids]) probabilities = distances / np.sum(distances) cumulative_probabilities = np.cumsum(probabilities) idx = np.searchsorted(cumulative_probabilities, np.random.rand()) centroids.append(X[idx]) centroids = np.array(centroids) # run k-means algorithm with the initial centroids for i in range(max_iter): clusters = [[] for _ in range(k)] for idx, x in enumerate(X): distances = [np.linalg.norm(x - c) for c in centroids] clusters[np.argmin(distances)].append(idx) new_centroids = np.zeros((k, n_features)) for idx, cluster in enumerate(clusters): new_centroids[idx] = np.mean(X[cluster], axis=0) if np.allclose(new_centroids, centroids): break centroids = new_centroids return centroids, clusters ``` 这两个函数的输入参数相同,其中X是数据集,k是聚类数量,max_iter是最大迭代次数。函数返回聚类中心和每个数据点所属的聚类编号。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值