【问题标题】:Does using set.seed with Sparklyr work now?现在将 set.seed 与 Sparklyr 一起使用是否有效?
【发布时间】:2018-07-14 19:05:30
【问题描述】:

我上次使用 Sparklyr(2017 年 10 月)时,在使用 Sparklyr 时使用 set.seed 时出现问题。我不确定确切的问题是什么,我似乎在任何地方都找不到任何关于它的信息。 set.seed 现在是否可以与 Sparklyr 一起正常工作,还是仍然是一个悬而未决的问题?

【问题讨论】:

  • 设置种子是为了重现性。它用于预测建模。如果我没记错的话,即使我在使用 Scala,我仍然设置了种子。在数据科学中,设置种子通常位于创建模型的任何脚本的顶部。我希望 sparklyr 以同样的方式工作。

标签: r apache-spark sparklyr


【解决方案1】:

一般情况

set.seed 工作得很好,它假设在本地 R 会话中,也就是驱动程序(您调用 spark_connect 的地方)。

由于多种原因,它不起作用,并且无法跨执行器工作,包括不同的执行上下文(R、JVM)和/或不同的环境(使用 spark_apply 之类的方法)。

使用 Spark 包装器

使用ml_*ft_ 等方法,种子由Spark 设置,通常使用seed 参数公开。例如ml_kmeans:

> ml_kmeans
function (x, formula = NULL, k = 2L, max_iter = 20L, tol = 1e-04, 
    init_steps = 2L, init_mode = "k-means||", seed = NULL, features_col = "features", 
    prediction_col = "prediction", uid = random_string("kmeans_"), 
    ...) 
{
    UseMethod("ml_kmeans")
}
<environment: namespace:sparklyr>

还可以为 RNG SQL 函数设置种子:

> df %>% mutate(rand = rand(42L), randn = randn(42L)) %>% head(3)
# Source:   lazy query [?? x 3]
# Database: spark_connection
     id  rand  randn
  <int> <dbl>  <dbl>
1     1 0.666  0.409
2     2 0.858  0.881
3     3 0.914 -2.01 
> df %>% mutate(rand = rand(42L), randn = randn(42L)) %>% head(3)
# Source:   lazy query [?? x 3]
# Database: spark_connection
     id  rand  randn
  <int> <dbl>  <dbl>
1     1 0.666  0.409
2     2 0.858  0.881
3     3 0.914 -2.01 

带有执行器端的 R 代码

据我所知,目前还没有可用的选项。在多台机器上正确设置 RNG 种子需要 API 来访问低级任务信息,即使假设没有其他非确定性来源,在异构环境中也可能很脆弱。

但是

RNG 状态并不是分布式系统中非确定性行为的唯一来源。由于 Spark 通常不保证任何特定的执行顺序,因此即使 RNG 状态设置正确,不同运行的结果也会有所不同。

总体

如果你的目标是可重复的研究,你可能仍然可以使用 Spark,但它需要防御性编程,有意识地设置集群,而且这不是你可以使用内置工具做的事情,更不用说受限了,高级包装器,例如 sparklyr

【讨论】:

  • 不错!如果可以的话,我会不止一次地赞成这个。感谢您的全面回答。
猜你喜欢
  • 2016-07-06
  • 2020-04-04
  • 2020-01-27
  • 2017-06-14
  • 2016-01-03
  • 2017-10-09
  • 2019-05-02
  • 2017-11-26
  • 1970-01-01
相关资源
最近更新 更多