我在使用azurebatchpythonapi将包加载到计算池节点上的R时遇到了困难。我使用的代码与Azure Batch Python SDK Tutorial中提供的代码类似,只是任务更复杂——我希望作业池中的每个节点执行一个R脚本,该脚本需要特定的包依赖关系。在
因此,在下面的start task命令中,我让每个节点(Canonical UbuntuServer SKU:16)通过apt安装R并安装R包依赖项(我将R package installation添加到start任务的原因是,即使在创建具有通用权限的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/
,也就是~/Rpkgs/
)。但是,当_R_TASK_SCRIPT
任务成功添加到作业池中时,它以非零退出代码终止,因为它无法加载已安装在开始任务中的任何包(例如foreach
、iterators
、optparse
等)。在
更具体地说,_R_TASK_SCRIPT
包含以下R代码并返回以下输出:
R代码:
^{pr2}$Azure批处理节点上的R stderr,stderr.txt
:
Loading required package: iterators
Loading required package: foreach
Loading required package: optparse
Loading required package: glmnet
Loading required package: doMC
Azure批处理节点上的R stdout,stdout.txt
:
[[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
提前感谢您的帮助和建议。在
这似乎是由于安装的包不存在R的默认库路径造成的。请尝试在加载包之前通过添加代码^{} 来设置在其中查找包的库树的路径。在
作为引用,有一个SO线程Changing R default library path using .libPaths in Rprofile.site fails to work,您可以引用它。在
同时,一个官方博客介绍了如何在Azure批处理上使用R工作负载,但对于Windows环境。希望有帮助。在
每个任务运行在环境变量
$AZ_BATCH_TASK_WORKING_DIR
引用的自己的工作目录上。当R会话运行时,当前R工作目录[getwd()]将是$AZ_BATCH_TASK_WORKING_DIR
,而不是pkg所在的$AZ_BATCH_NODE_STARTUP_DIR
。在要获得R代码中的确切包位置(“
startup/wd/pkgs
”)或者
在lapply之前运行此方法:
^{pr2}$补充说:你也可以创建一个批处理池的azuredatascientist虚拟机已经安装了R,所以你不必自己安装它。在
Azure批处理具有doAzureParallel R包支持包安装。 这里有一个链接:https://github.com/Azure/doAzureParallel(免责声明:我创建了doazureparallelr包)
相关问题 更多 >
编程相关推荐