2017-05-11 55 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