??本文介紹在Linux服務器中,通過PBS(Portable Batch System)作業(yè)管理系統(tǒng)腳本的方式,提交任務到服務器隊列,并執(zhí)行任務的方法。
??最近,需要在學校公用的超算中執(zhí)行代碼任務;而和多數(shù)超算設(shè)備一樣,其也是需要通過作業(yè)隊列的方式,來提交、管理、排序不同用戶的任務,從而使得不同用戶都可以較為公平地使用超算設(shè)備的資源。由于學校的這個超算是基于PBS來提交任務的,所以這里就介紹一下撰寫PBS腳本,從而將自己的代碼執(zhí)行需求提交給服務器(也就是提交任務)的方法。
??其中,PBS(Portable Batch System)是一個用于管理、調(diào)度計算任務的開源軟件;其是一個常用的作業(yè)調(diào)度系統(tǒng),用于在大規(guī)模計算集群或超級計算機上管理并分配計算資源。在使用時,我們需要首先提交作業(yè)到計算集群,PBS將會根據(jù)資源可用性、作業(yè)優(yōu)先級等因素進行作業(yè)調(diào)度和分配。其基本工作流程如下:
- 用戶編寫PBS腳本,描述任務的資源需求、執(zhí)行命令和其他相關(guān)信息。
- 用戶使用PBS命令,將上述編寫好的腳本提交到PBS系統(tǒng)。
- PBS系統(tǒng)根據(jù)腳本中作業(yè)的資源需求和集群的可用資源情況,將作業(yè)放入作業(yè)隊列中等待執(zhí)行。
- 當有可用的計算資源時,PBS系統(tǒng)會選擇一個作業(yè)并將其分配給相應的計算節(jié)點。
- 作業(yè)在計算節(jié)點上執(zhí)行,直到完成,或達到預設(shè)的運行時間限制,或任務執(zhí)行時出錯等。
??那么接下來,就介紹一下撰寫PBS腳本,并基于其提交自己的任務到服務器中的方法。
??首先明確一下本文的需求。已知當前在服務器的某個路徑下,我們有一個.exe
格式的可執(zhí)行文件(或者是有1
個Python代碼文件);我們希望后續(xù)在超算中,對這個可執(zhí)行文件(或者Python代碼文件)加以運行。
??明確了需求,接下來就可以開始操作。首先,如果有需要,我們可以cd
進入自己的工作目錄。我這里就直接進入存放有.exe
格式的可執(zhí)行文件的目錄中;具體代碼如下。
cd Data_Reflectance_Rec
??隨后,基于如下代碼查看一下當前路徑中的文件。ls
用于列出目錄中的文件和子目錄。
ls
??接下來,基于如下代碼創(chuàng)建PBS腳本,我在這里將其命名為py_task.pbs
;其中,.pbs
就是PBS腳本文件的固定拓展名。后續(xù)我們向PBS系統(tǒng)提交任務時所用的腳本,就是這個文件。
touch py_task.pbs
??其中,touch
是一個常用的命令,用于創(chuàng)建空白文件或更新已存在文件的訪問和修改時間戳。創(chuàng)建完畢后,可以基于如下代碼再次看一下當前路徑下的文件。
ls
??執(zhí)行上述代碼,如下圖所示。可以看到,py_task.pbs
這個PBS腳本文件已經(jīng)創(chuàng)建完畢了。
??創(chuàng)建腳本文件完畢后,我們即可開始編輯這個文件。在這里,我選擇基于Vim來編輯,所以執(zhí)行如下的代碼即可。
vim py_task.pbs
??其中,Vim是一個強大的文本編輯器,廣泛用于命令行環(huán)境下代碼的編寫和文本的編輯。執(zhí)行上述代碼,如下圖所示??梢钥吹剑?code>py_task.pbs這個PBS腳本文件已經(jīng)被Vim打開了。
??接下來,按下i
鍵,進入文本編輯狀態(tài);如下圖所示。
??隨后,即可在Vim中編輯PBS腳本文件。在這里,我們給出2
個PBS腳本文件的模板;其中,第1
個模板如下所示。
#!/bin/bash
#PBS -N py_task
#PBS -q rtlab1_4
#PBS -l nodes=1:ppn=4
#PBS -l walltime=00:30:00
#PBS -o /data1/home/LiliAircas/Data_Reflectance_Rec/task/py_task.out
#PBS -e /data1/home/LiliAircas/Data_Reflectance_Rec/task/py_task.err
hostname
date "+%Y/%m/%d %H:%M:%S"
python /data1/home/LiliAircas/Data_Reflectance_Rec/code/Alignment.py
date "+%Y/%m/%d %H:%M:%S"
最后注意記得留一個空行
??其中,第1
行是一個shebang(也稱為hashbang)行,指定了用于解釋該腳本的解釋器。在這里,/bin/bash
表示該腳本將由Bash解釋器執(zhí)行。
??接下來,從第2
行開始的這些#
開頭的語句,不是注釋,而是PBS作業(yè)調(diào)度系統(tǒng)的作業(yè)指令。這些指令以#PBS
開頭,指定了不同的選項:-N py_task
表示作業(yè)的名稱為py_task
,-q rtlab1_4
表示將作業(yè)提交到rtlab1_4
隊列中;-l nodes=1:ppn=4
表示指定使用1
個節(jié)點(node)和4
個處理器(processor)來運行作業(yè);-l walltime=00:30:00
表示作業(yè)的最長運行時間為30
分鐘。隨后的2
行代碼,分別指定了作業(yè)的標準輸出、錯誤輸出所在的文件。
??緊接著,隨后的2
行分別輸出當前執(zhí)行腳本的主機名和當前的日期時間;隨后,就開始調(diào)用Python解釋器執(zhí)行Alignment.py
這個Python代碼文件了。最后,再次輸出當前的日期時間,從而使得我們可以基于其大概了解到任務的執(zhí)行時長。
??最后的空行,有的教程說是為了符合腳本文件的規(guī)范,提供可讀性和結(jié)構(gòu)上的清晰性;也有教程說,有些版本的服務器上如果不加這個空行,會導致無法識別腳本命令。所以為了確保萬一,我就加上了1
行空行。
??上述腳本文件編輯完畢后,如下圖所示。這里需要注意:以下截圖中有些錯誤,例如hostname
寫成了Hostname
,且最后一行沒有空行。所以對于圖片,大家僅僅參考就好;主要還是按照前述文字版代碼中的格式,來修改自己的PBS腳本文件。
??此外,我們再給出1
個PBS腳本執(zhí)行.exe
格式的可執(zhí)行文件的模板,具體如下。
#!/bin/bash
#PBS -N py_task
#PBS -q rtlab1_4
#PBS -l nodes=1:ppn=1
#PBS -l walltime=12:00:00
#PBS -o /data1/home/LiliAircas/Data_Reflectance_Rec/code/py_task.out
#PBS -e /data1/home/LiliAircas/Data_Reflectance_Rec/code/py_task.err
hostname
date "+%Y/%m/%d %H:%M:%S"
cd /data1/home/LiliAircas/Data_Reflectance_Rec/code
./Alignment_Server.exe
date "+%Y/%m/%d %H:%M:%S"
??其中,腳本文件的含義前面已經(jīng)介紹過,這里我們就不再逐一介紹了。
??在Vim中編輯完畢自己的腳本文件后,即可保存并退出Vim。首先,我們需要按下Esc
鍵,退出編輯模式;隨后,依次輸入:wq
這3
個按鍵,即可保存并退出VIm。
??隨后,我們即可提交自己的PBS腳本文件到系統(tǒng)中;通過如下的代碼即可實現(xiàn)這一功能。
qsub py_task.pbs
??上述代碼會將我們前述編輯好的PBS腳本文件py_task.pbs
提交到PBS作業(yè)調(diào)度系統(tǒng)中,并開始等待系統(tǒng)分配資源,從而執(zhí)行作業(yè)。執(zhí)行上述代碼,如下圖所示。
??如果沒有問題的話,會出如上圖所示的一個編號;這個就是我們剛剛提交的任務的ID。
??當然,有的時候執(zhí)行上述代碼,會出現(xiàn)如下圖所示的錯誤,即qsub: submit error (Unauthorized Request...)
字樣的報錯。
??這種多數(shù)是因為將作業(yè)提交到了沒有權(quán)限的隊列中導致的;這種情況,需要和服務器的管理人員聯(lián)系,從而獲取權(quán)限。
??接下來,再介紹幾個PBS系統(tǒng)的常用命令。
??首先,我們可以通過如下代碼,獲取當前超算的所有節(jié)點的情況。
pbsnodes
??執(zhí)行上述代碼,如下圖所示;可以看到,不同節(jié)點的信息都列出來了。
??還可以在上述命令的后面,加上具體節(jié)點的名稱,從而只獲取指定節(jié)點的信息;如以下代碼。
pbsnodes cu02
??執(zhí)行上述代碼,如下圖所示;其中,和上圖一樣,每一個當前正在該節(jié)點上運行的任務的ID,都會被顯示出來,例如下圖中紫色框內(nèi)就是某個任務的ID。
??其次,我們可以通過如下代碼,獲取當前隊列中所有任務的情況。
qstat
??執(zhí)行上述代碼,如下圖所示;可以看到有一個任務,這個任務是我自己提交的。在我這里,執(zhí)行上述代碼后只能看到自己提交的任務,而看不到隊列中同時存在的、其他人提交的任務——感覺這個可能是我們學校服務器管理人員自行設(shè)置的,使得每一個用戶僅僅只能看到自己賬戶中提交的任務。
??再次,還可以通過如下的代碼,查看隊列中任務的詳細信息。
qstat -f
??執(zhí)行上述代碼,如下圖所示。
??此外,可以通過qdel
命令加上任務的ID,刪除隊列中的指定任務;例如以下代碼。
qdel 1250752
??執(zhí)行上述代碼,并在執(zhí)行前后通過qstat
命令查看隊列中的任務,可以看到指定的任務已經(jīng)被刪除了——但是有延遲:執(zhí)行完qdel
后立刻執(zhí)行qstat
的話,可以看到1250752
這個任務還是在的;稍后再執(zhí)行qstat
,才可以看到1250752
任務消失。
??任務執(zhí)行完畢后,我們就可以依次執(zhí)行下面的2
句代碼,打開并查看作業(yè)的標準輸出、錯誤輸出文件。cat
是一個常用的命令,用于連接指定的文件,并打印它們的內(nèi)容。
cat py_task.out
cat py_task.err
??執(zhí)行上述代碼,如下圖所示。當然,我這里因為待執(zhí)行的任務存有一些權(quán)限上的錯誤,所以在py_task.err
文件中,給出了任務執(zhí)行過程中的報錯內(nèi)容。
??如果沒有錯誤的話,那么大家就可以結(jié)合自己任務的實際情況,查看任務執(zhí)行的結(jié)果文件了。
??至此,大功告成。文章來源:http://www.zghlxwxcb.cn/news/detail-848549.html
歡迎關(guān)注:瘋狂學習GIS文章來源地址http://www.zghlxwxcb.cn/news/detail-848549.html
到了這里,關(guān)于基于PBS向超算服務器隊列提交任務的腳本模板與常用命令的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!