2017-05-11 37 views
0

我在使用Azure批处理Python API将软件包加载到计算池节点上的R时遇到困难。我使用的代码与Azure Batch Python SDK Tutorial中提供的代码类似,只是任务更复杂 - 我希望作业池中的每个节点都执行需要某些程序包依赖关系的R脚本。因此,在我的启动任务命令下面,我有每个节点(Canonical Ubuntu Server SKU:16)通过apt安装R程序包并安装R包依赖项(之所以我将R包安装到启动任务中的原因是,即使与通用权限创建一个lib目录~/Rpkgs,在任务的脚本来运行install.packages(list_of_packages, lib="~/Rpkgs/", repos="http://cran.r-project.org")后导致“不可写”错误。)无法在Azure批处理节点上加载R软件包

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代码里面:

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

ř标准错误,stderr.txt天青批次节点上:

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

R标准输出,stdout.txt在Azure批处理节点上:

[[1]] 
[1] FALSE 

[[2]] 
[1] FALSE 

[[3]] 
[1] FALSE 

[[4]] 
[1] FALSE 

[[5]] 
[1] FALSE 

FALSE上面表示它无法加载R包。这是我面临的问题,我想弄清楚为什么。

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

[email protected]:~$ pwd 
/home/myusername 
[email protected]:~$ mkdir ~/Rpkgs/ 
[email protected]:~$ printf "install.packages(c(\"foreach\", \"iterators\", \"optparse\", \"glmnet\", \"doMC\"), lib=\"~/Rpkgs/\", repos=\"http://cran.r-project.org\")\n" > ~/startTask.txt 
[email protected]:~$ R < startTask.txt --no-save 
[email protected]:~$ 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 

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

回答

0

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

要在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软件包支持软件包安装。 这里有一个链接:https://github.com/Azure/doAzureParallel(声明:我创建了doAzureParallel R包)

+0

第一个'lapply'解决方案是一个修复,谢谢! – ncemami

0

它似乎是由安装的包引起的,不存在R的默认库路径。尝试设置包内的库树的路径在加载包之前通过添加代码.libPath("~\Rpkgs")寻找。

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

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

+0

感谢您的建议 - 对于记录,我在发布问题之前尝试将'.libPath(“〜\ Rpkgs”)'写入'〜/ .Rprofile'并且无法以这种方式解决问题。 – ncemami