无法在 Azure Batch 节点上加载 R 包

Cannot load R packages on Azure Batch nodes

我在使用 Azure Batch Python API 将包加载到我的计算池节点上的 R 时遇到困难。我使用的代码类似于 Azure Batch Python SDK Tutorial 中提供的代码,只是任务更复杂——我希望作业池中的每个节点执行一个 R 脚本,该脚本需要特定的包依赖性。

因此,在我下面的启动任务命令中,我让每个节点(Canonical UbuntuServer SKU:16)通过 apt 安装 R 并安装 R 包依赖项(我将 R 包安装添加到启动任务的原因是,即使在创建具有通用权限的 lib 目录 ~/Rpkgs 之后,任务脚本中的 运行ning install.packages(list_of_packages, lib="~/Rpkgs/", repos="http://cran.r-project.org") 也会导致 "not writable" 错误。)

task_commands = [
    'cp -p {} $AZ_BATCH_NODE_SHARED_DIR'.format(_R_TASK_SCRIPT),
    # Install pip
    'curl -fSsL https://bootstrap.pypa.io/get-pip.py | python',
    # Install the azure-storage module so that the task script can access Azure Blob storage, pre-cryptography version
    'pip install azure-storage==0.32.0',
    # Install R
    'sudo apt -y install r-base-core',
    'mkdir ~/Rpkgs/',
    'sudo chown _azbatch:_azbatchgrp ~/Rpkgs/',
    'sudo chmod 777 ~/Rpkgs/',
    # Install R package dependencies
    # *NOTE*: the double escape below is necessary because Azure strips the forward slash
    'printf "install.packages( c(\"foreach\", \"iterators\", \"optparse\", \"glmnet\", \"doMC\"), lib=\"~/Rpkgs/\", repos=\"https://cran.cnr.berkeley.edu\")\n" > ~/startTask.txt',
    'R < startTask.txt --no-save'
    ]

无论如何,我在 Azure 门户中确认这些包按预期安装在计算池节点上(您可以看到它们位于 startup/wd/Rpkgs/、a.k.a。~/Rpkgs/,在节点文件系统)。但是,虽然 _R_TASK_SCRIPT 任务已成功添加到作业池中,但它以非零退出代码终止,因为它无法加载任何包(例如 foreachiterators, optparse, 等) 已安装在启动任务中。

更具体地说,_R_TASK_SCRIPT 包含以下 R 代码并返回以下输出:

R代码:

lapply( c("iterators", "foreach", "optparse", "glmnet", "doMC"), require, character.only=TRUE, lib.loc="~/Rpkgs/")
...

R stderr,stderr.txt 在 Azure Batch 节点上:

Loading required package: iterators
Loading required package: foreach
Loading required package: optparse
Loading required package: glmnet
Loading required package: doMC

R 标准输出,stdout.txt 在 Azure Batch 节点上:

[[1]]
[1] FALSE

[[2]]
[1] FALSE

[[3]]
[1] FALSE

[[4]]
[1] FALSE

[[5]]
[1] FALSE
上面的

FALSE表示无法加载R包。这是我面临的问题,我想弄清楚原因。

可能值得注意的是,当我启动一个类似的 VM(Canonical UbuntuServer SKU:16)并手动 运行 相同的安装时,它成功加载了所有包。

myusername@rnode:~$ pwd
/home/myusername
myusername@rnode:~$ mkdir ~/Rpkgs/
myusername@rnode:~$ printf "install.packages( c(\"foreach\", \"iterators\", \"optparse\", \"glmnet\", \"doMC\"), lib=\"~/Rpkgs/\", repos=\"http://cran.r-project.org\")\n" > ~/startTask.txt
myusername@rnode:~$ R < startTask.txt --no-save
myusername@rnode:~$ R

R version 3.2.3 (2015-12-10) -- "Wooden Christmas-Tree"
...
> lapply( c("iterators", "foreach", "optparse", "glmnet", "doMC"), require, character.only=TRUE, lib.loc="~/Rpkgs/")
Loading required package: iterators
Loading required package: foreach
...
Loading required package: optparse
Loading required package: glmnet
Loading required package: Matrix
Loaded glmnet 2.0-10

Loading required package: doMC
Loading required package: parallel
[[1]]
[1] TRUE

[[2]]
[1] TRUE

[[3]]
[1] TRUE

[[4]]
[1] TRUE

[[5]]
[1] TRUE

在此先感谢您的帮助和建议。

每个任务都在其自己的工作目录上运行,该目录由环境变量 $AZ_BATCH_TASK_WORKING_DIR 引用。当 R 会话运行时,当前 R 工作目录 [getwd()] 将是 $AZ_BATCH_TASK_WORKING_DIR,而不是 pkgs 所在的 $AZ_BATCH_NODE_STARTUP_DIR

要在 R 代码中获取确切的包位置(“startup/wd/pkgs”),

lapply( c("iterators", "foreach", "optparse", "glmnet", "doMC"), require, 
character.only=TRUE, lib.loc=paste0(Sys.getenv("AZ_BATCH_NODE_STARTUP_DIR"), 
 "/wd/", "Rpkgs") )

运行这个方法之前 lapply:

setwd(paste0(Sys.getenv("AZ_BATCH_NODE_STARTUP_DIR"), "/wd/"))

补充:您还可以创建一个已安装 R 的 Azure 数据科学家虚拟机批处理池,这样您就不必自己安装它了。

Azure Batch 有 doAzureParallel R 包支持包安装。 这是一个 link:https://github.com/Azure/doAzureParallel(免责声明:我创建了 doAzureParallel R 包)

这似乎是因为安装的包不存在 R 的默认库路径。尝试通过在加载包之前添加代码 .libPath("~\Rpkgs") 来设置在其中查找包的库树路径。

作为参考,有一个SO线程Changing R default library path using .libPaths in Rprofile.site fails to work可以参考。

同时,官方博客介绍了如何在 Azure Batch 上使用 R 工作负载,但适用于 Windows 环境。希望对你有帮助。