0

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

因此,在下面的启动任务命令中,我让每个节点(Canonical UbuntuServer SKU:16)通过 apt 安装 R 并安装 R 包依赖项(我将 R 包安装添加到启动任务的原因是,即使在创建了一个库之后~/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/aka ~/Rpkgs/)。但是,当_R_TASK_SCRIPT任务成功添加到作业池时,它以非零退出代码终止,因为它无法加载已安装在启动任务中的任何包(例如foreach,,,iterators等) optparse.

更具体地说,它_R_TASK_SCRIPT包含以下 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 包。这是我面临的问题,我想弄清楚原因。

值得注意的是,当我启动一个类似的虚拟机(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

提前感谢您的帮助和建议。

4

2 回答 2

0

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

作为参考,有一个 SO 线程使用 Rprofile.site 中的 .libPaths 更改 R 默认库路径无法正常工作,您可以参考。

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

于 2017-05-11T07:19:48.947 回答
0

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

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

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 包)

于 2017-05-11T06:37:35.590 回答