Rcpp 可以用来加速对其他 R 函数的调用吗?

Tri*_*tio 0 algorithm optimization r rcpp

我正在编写一个用于统计分析和机器学习 (ML) 的 R 包,该包通常非常慢。它很慢,因为它涉及训练和预测模型,包括统计和机器学习。我的包与模型无关,我的意思是它与 R 中的任何其他模型训练和预测包接口,以重新训练他们的模型并使用他们的模型进行预测。经过广泛的分析和代码重构(主要是通过尽可能多地转换为向量化和矩阵运算),我发现无法通过重构进一步加快速度的慢点归结为以下代码:

  • 从其他 R 包调用预测函数。我的主程序可能会调用预测函数数千次,因此即使需要 0.1 秒的预测函数也可能导致我的函数需要花费几分钟甚至几个小时才能运行。
  • 从其他 R 包中调用训练模型。我的一些程序将输入模型重新训练 100 到 1000 次。因此,1 秒的模型训练时间大约需要 17 分钟才能运行。比这更慢的训练时间变得非常难以管理。

我想知道Rcpp是否可以帮助加快我的情况。请注意我在这里没有问什么:

  • 我并不是在问我是否真的需要多次运行和预测模型。我正在单独探讨这个重要问题;我确实在努力尽可能地减少这些需求。因此,我的提问是基于这样的假设:我确实需要经常运行模型和预测。
  • 我当然打算实现并行处理来帮助缓解问题,但这只是一个有限的解决方案。即使某些用户拥有多达 10 个物理计算机核心(很少有用户拥有),将我上面给出的示例速度除以 10 仍然会导致代码缓慢。我正在尝试走得更远。并行处理将是我能做的任何其他事情的额外解决方案。

我对Rcpp是否有帮助的主要疑问是,最慢的代码是当我调用其他包的 R 函数时。我已经阅读了大量有关 Rcpp 的文章,甚至正在参加有关该主题的 DataCamp 课程。然而,从我目前对 Rcpp 的探索来看,尽管许多资料解释了为什么我们要使用 Rcpp(以加速缓慢的 R 代码),但我无法找到任何资料来清楚地说明 Rcpp 无法帮助解决哪些问题。

据我所知,Rcpp 在调用 R 函数时无法提供任何加速。减慢我的代码速度的函数是由其他包编写的函数。例如,我有一篇文章演示了我的包功能,分别使用nnet::nnet()nnet::predict.nnet()来训练和预测神经网络,以及分别使用gbm::gbm()gbm::predict.gbm()来训练和预测梯度增强机。有没有办法使用Rcpp来优化这些函数的调用?

如果我可以Rcpp::cppFunction()实时调用来接收这些函数,将它们编译为 C++,然后继续用我的程序执行它们,那么这可能是一个可行的解决方案。但这对于 Rcpp 来说可能吗?我将不胜感激这里的任何指导。我愿意接受一个明确解释的答案:“不,Rcpp 无法帮助您解决问题,原因如下。”

rua*_*akh 6

根据Dirk Eddelbuettel(Rcpp 的创建者)的文章“从 C++ 调用 R 函数”

\n
\n

调用函数的速度 [\xe2\x80\xa6] 很慢,因为涉及到开销。从 C++ 代码内部重复调用它(可能隐藏在多个循环中)是非常愚蠢的。这必须比等效的 C++ 代码慢,甚至比 R 代码慢(因为数据编组)。

\n
\n

那篇文章已经有 11 年历史了,现在的开销比当时少得多(向用户Ada Lovelace指出这一点致敬),但核心点仍然正确:从 C++ 代码调用 R 函数仍然有比从 R 代码调用相同的 R 函数要慢。

\n