我无法使用Azure Batch Python API将软件包加载到我的计算池节点上的R中。我使用的代码类似于Azure Batch Python SDK Tutorial中提供的代码,但任务更复杂 - 我希望作业池中的每个节点都执行一个需要某些包依赖的R脚本。
因此,在我的启动任务命令下面,我有每个节点(Canonical UbuntuServer SKU:16)通过apt安装R并安装R包依赖项(我之所以添加R包安装到启动任务的原因是,即使之后创建具有通用权限的lib目录~/Rpkgs
,在任务脚本中运行install.packages(list_of_packages, lib="~/Rpkgs/", repos="http://cran.r-project.org")
会导致“不可写”错误。)
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
任务成功添加到作业池时,它以非零退出代码终止,因为它无法加载任何包(例如foreach
,{{1已经安装在启动任务中的。},iterators
等。
更具体地说,optparse
包含以下R代码并返回以下输出:
R代码:
_R_TASK_SCRIPT
Azure批处理节点上的R stderr,lapply( c("iterators", "foreach", "optparse", "glmnet", "doMC"), require, character.only=TRUE, lib.loc="~/Rpkgs/")
...
:
stderr.txt
Azure批处理节点上的标准输出Loading required package: iterators
Loading required package: foreach
Loading required package: optparse
Loading required package: glmnet
Loading required package: doMC
:
stdout.txt
上面的 [[1]]
[1] FALSE
[[2]]
[1] FALSE
[[3]]
[1] FALSE
[[4]]
[1] FALSE
[[5]]
[1] FALSE
表示它无法加载R包。这是我面临的问题,我想弄明白为什么。
值得注意的是,当我启动类似的VM(Canonical UbuntuServer SKU:16)并手动运行相同的安装时,它会成功加载所有软件包。
FALSE
提前感谢您的帮助和建议。
答案 0 :(得分:0)
每个任务都在自己的工作目录上运行,该目录由环境变量$AZ_BATCH_TASK_WORKING_DIR
引用。当R会话运行时,当前的R工作目录[getwd()]将是$AZ_BATCH_TASK_WORKING_DIR
,而不是pkgs所在的$AZ_BATCH_NODE_STARTUP_DIR
。
要在R代码中获取确切的包裹位置(&#34; startup/wd/pkgs
&#34;),
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包支持包安装。 这是一个链接:https://github.com/Azure/doAzureParallel(免责声明:我创建了doAzureParallel R包)
答案 1 :(得分:0)
这似乎是由于已安装的软件包不存在R的默认库路径。尝试通过在加载软件包之前添加代码.libPath("~\Rpkgs")
来设置查找软件包的库树的路径。
作为参考,您可以参考SO线程Changing R default library path using .libPaths in Rprofile.site fails to work。
与此同时,官方博客介绍了如何在Azure Batch上使用R工作负载,但适用于Windows环境。希望它有所帮助。