无法加载Azure批处理程序包

2024-09-27 21:33:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我在使用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任务成功添加到作业池中时,它以非零退出代码终止,因为它无法加载已安装在开始任务中的任何包(例如foreachiteratorsoptparse等)。在

更具体地说,_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

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


Tags: 代码txtfalsetruepackage节点requiredazure
2条回答

这似乎是由于安装的包不存在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( c("iterators", "foreach", "optparse", "glmnet", "doMC"), require, 
character.only=TRUE, lib.loc=paste0(Sys.getenv("AZ_BATCH_NODE_STARTUP_DIR"), 
 "/wd/", "Rpkgs") )

或者

在lapply之前运行此方法:

^{pr2}$

补充说:你也可以创建一个批处理池的azuredatascientist虚拟机已经安装了R,所以你不必自己安装它。在

Azure批处理具有doAzureParallel R包支持包安装。 这里有一个链接:https://github.com/Azure/doAzureParallel(免责声明:我创建了doazureparallelr包)

相关问题 更多 >

    热门问题