【发布时间】:2011-12-08 03:25:09
【问题描述】:
我使用 kernlab 包在 R 中创建了一个 SVM,但是它的运行速度非常慢(在 win64 R 发行版上,20,000 个预测需要大约 45 秒)。 CPU 以 25% 的速度运行,RAM 利用率仅为 17%……这不是硬件瓶颈。在 SQL Server 分析服务中使用数据挖掘算法进行的类似计算的运行速度提高了大约 40 倍。
通过反复试验,我们发现 laplacedot 内核在很大程度上为我们提供了最好的结果。 Rbfdot 的准确率降低了约 15%,但速度提高了两倍(但仍然太慢)。最好的表现是vanilladot。它或多或少地立即运行,但准确度太低而无法使用。
理想情况下,我们希望使用 laplacedot 内核,但为此我们需要大幅加速。有人对如何做到这一点有任何想法吗?
这是我使用 rprof 生成的一些分析信息。看起来大部分时间都花在了低级数学调用上(配置文件的其余部分由与第 16-40 行类似的数据组成)。这应该运行得很快,但看起来代码没有优化(而且我不知道从哪里开始)。
编辑:要重现的示例代码:
dummy.length = 20000;
source.data = as.matrix(cbind(sample(1:dummy.length)/1300, sample(1:dummy.length)/1900))
colnames(source.data) <- c("column1", "column2")
y.value = as.matrix((sample(1:dummy.length) + 9) / 923)
model <- ksvm(source.data[,], y.value, type="eps-svr", kernel="laplacedot",C=1, kpar=list(sigma=3));
源数据有 7 个数字列(浮点)和 20,000 行。这需要大约 2-3 分钟来训练。下一个调用会生成预测,并且始终需要 40 秒才能运行:
predictions <- predict(model, source.data)
编辑 2: Laplacedot 内核使用以下公式计算两个向量的点积。这与 profr 输出相当接近。奇怪的是,负号(就在轮函数之前)似乎消耗了大约 50% 的运行时间。
return(exp(-sigma * sqrt(-(round(2 * crossprod(x, y) - crossprod(x,x) - crossprod(y,y), 9)))))
编辑 3:添加了用于重现的示例代码 - 这给了我与我的实际数据大致相同的运行时间。
【问题讨论】:
-
请注意,如果您有一台 4 核机器,那么 25% 的 CPU 将意味着 R 正在最大化一个核心。它是单线程的,所以这就是它的全部设计用途。
-
实际情况并非如此。我本地的三个核心和我们服务器上的 7 个核心有大量活动。不知道为什么第四个核心没有做太多。顺便说一句,我正在使用 Revolution R 发行版。
-
如果你提供一个人们可以在他们自己的机器上运行的可重现的例子会有所帮助。
-
不幸的是,这需要我向您提供我们数据库的绝密许可。不会发生 ;-) 但这就是我包含 rprof 结果的原因。
-
我的猜测是你还没有矢量化你的代码。我们可以提供帮助的唯一方法是您制作一个可重复的示例。不,这不需要访问您的绝密数据库。组成一些样本数据。
标签: r