无法在 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
任务已成功添加到作业池中,但它以非零退出代码终止,因为它无法加载任何包(例如 foreach
、iterators
, 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 环境。希望对你有帮助。
我在使用 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
任务已成功添加到作业池中,但它以非零退出代码终止,因为它无法加载任何包(例如 foreach
、iterators
, 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 环境。希望对你有帮助。