提交需要 GPU 資源的工作

使用 bsub -gpu 選項,在工作提交期間指定 GPU 資源需求,或將工作提交至 GPU_REQ 參數中已配置 GPU 資源需求的佇列或應用程式設定檔。 對於複雜的 GPU 資源需求 (包括替代或複合資源需求) ,請使用 bsub -R 選項。

程序

  • 使用 bsub -gpu 選項來提交具有 GPU 資源需求的工作。

    bsub -gpu - | "[num=num_gpus[/task | host]] [:mode=shared | exclusive_process] [:mps=yes[,shared][,nocvd] | no | per_socket[,shared][,nocvd] | per_gpu[,shared][,nocvd]] [:j_exclusive=yes | no] [:aff=yes | no] [:block=yes | no] [:gpack=yes | no] [:glink=yes] [:gvendor=amd | nvidia] [:gmodel=model_name[-mem_size]] [:gtile=tile_num|'!'] [:gmem=mem_value]"

    -
    指定工作不設定工作層次 GPU 需求。 使用不含字母的連字號來設定有效 GPU 需求,這些需求定義在叢集、佇列或應用程式設定檔層次。

    如果在叢集、佇列及應用程式設定檔層次指定 GPU 需求,則會個別合併 GPU 需求的每一個選項 (num模式mpsj_exclusivegmodelgtilegmemnvlink) 。 應用程式設定檔層次會置換佇列層次,這會置換叢集層次預設 GPU 需求。

    如果叢集、佇列或應用程式層次中未定義 GPU 需求,則預設值為 "num=1:mode=shared:mps=no:j_exclusive=no"

    num=num_gpus[/task | host]
    工作所需的實體 GPU 數目。 依預設,該數目是每個主機。 您也可以在數字之後指定 /task ,以指定每個作業的數字。

    如果 您指定了每個作業的數目, lsb.resources 檔中 ngpus_physical 資源的配置會設為 PER_TASKlsb.params 檔中設定 RESOURCE_RESERVE_PER_TASK=Y 參數,則這個數目是每個作業所要求的計數。

    mode=shared | exclusive_process
    工作執行時的 GPU 模式: 共用exclusive_process。 預設模式為 shared

    共用 模式對應於 Nvidia 或 AMD DEFAULT 計算模式。 exclusive_process 模式對應於 Nvidia EXCLUSIVE_PROCESS 計算模式。

    附註: 當您使用 AMD GPU 時 (亦即,當指定 gvendor=amd 時) ,請勿指定 exclusive_process
    mps=yes[, nocvd][, shared] | per_socket[, shared][, nocvd] | per_gpu[, shared][, nocvd] | no
    啟用或停用配置給工作之 GPU 的「Nvidia 多重程序服務 (MPS)」。 有效地使用 MPS 會導致 EXCLUSIVE_PROCESS 模式的行為類似於所有 MPS 用戶端的 DEFAULT 模式。 MPS 一律容許多個用戶端透過 MPS 伺服器使用 GPU。
    附註: 為了避免行為不一致,當您使用 AMD GPU 時 (亦即,當指定 gvendor=amd 時) ,請勿啟用 mps 。 如果在叢集、佇列、應用程式及工作層次合併 GPU 需求的結果是 gvendor=amd ,且已啟用 mps (例如,如果在工作層次指定 gvendor=amd 而未指定 mps=no,但在應用程式、佇列或叢集層次指定 mps=yes ) ,則 LSF 會忽略 mps 需求。

    MPS 適用於共用及專用處理程序 GPU ,並容許更有效率地共用 GPU 資源及更好的 GPU 使用率。 如需相關資訊及限制,請參閱 Nvidia 文件。

    使用 MPS 時,請使用 EXCLUSIVE_PROCESS 模式來確保只有單一 MPS 伺服器使用 GPU ,這提供額外的保證, MPS 伺服器是該 GPU 的所有 CUDA 處理程序之間的單一仲裁點。

    您也可以透過新增含逗點且不含空格的 share 關鍵字來啟用 MPS 常駐程式共用 (例如, mps=yes,shared 會在主機上啟用 MPS 常駐程式共用)。 如果已啟用共用,則由具有相同資源需求的相同使用者提交的所有工作都會在主機、Socket 或 GPU 上共用相同的 MPS 常駐程式。

    LSF 會根據 mps 關鍵字的值,以每個主機、每個 Socket 或每個 GPU 為基礎來啟動 MPS 常駐程式:

    • 如果設定 mps=yesLSF 會為每個工作的每個主機啟動一個 MPS 常駐程式。

      當啟用共用時 (亦即,如果設定 mps=yes,shared ) , LSF 會針對相同使用者所提交且具有相同資源需求的所有工作,為每一部主機啟動一個 MPS 常駐程式。 這些工作都在主機上使用相同的 MPS 常駐程式。

      當停用 CUDA_VISIBLE_DEVICES 環境變數 (亦即,如果設定 mps=yes,nocvd ) 時, LSF 不會為作業設定 CUDA_VISIBLE_DEVICES<number> 環境變數,因此 LSF MPI 不會為作業設定 CUDA_VISIBLE_DEVICESLSF 只會設定作業的 CUDA_VISIBLE_DEVICES<number> 環境變數,而不是 CUDA_VISIBLE_DEVICESLSF MPI 會將 CUDA_VISIBLE_DEVICES<number> 環境變數轉換為 CUDA_VISIBLE_DEVICES ,並為作業設定這些變數。

    • 如果設定 mps=per_socket ,則 LSF 會針對每個工作的每個 Socket 啟動一個 MPS 常駐程式。 啟用共用時 (亦即,如果設定 mps=per_socket,shared ) , LSF 會針對相同使用者提交且具有相同資源需求的所有工作,每個 Socket 啟動一個 MPS 常駐程式。 這些工作都對 Socket 使用相同的 MPS 常駐程式。
    • 如果設定 mps=per_gpu ,則 LSF 會為每個工作啟動每個 GPU 一個 MPS 常駐程式。 啟用共用 (亦即,如果已設定 mps=per_gpu,shared ) 時, LSF 會針對相同使用者提交且具有相同資源需求的所有工作,為每個 GPU 啟動一個 MPS 常駐程式。 這些工作都使用 GPU 的相同 MPS 常駐程式。
    重要事項: 不支援將 EXCLUSIVE_THREAD 模式與 MPS 搭配使用,可能會導致非預期的行為。
    j_exclusive=yes | no
    指定其他工作是否可以使用已配置的 GPU。 當模式設為 exclusive_process時,會自動設定 j_exclusive=yes 選項。
    aff=yes | no
    指定是否施行嚴格 GPU-CPU 親緣性連結。 如果設為 no,則 LSF 會在維護 CPU 親緣性時放寬 GPU 親緣性。 依預設, aff=yes 設為維護嚴格 GPU-CPU 親緣性連結。
    附註: aff=yes 設定與 block=yes 衝突 (當作業數大於所要求的 GPU 數目時,將已配置的 GPU 分散為區塊)。 這是因為嚴格 CPU-GPU 連結會根據 CPU NUMA ID 將 GPU 配置給作業,這與將已配置的 GPU 配送為區塊相衝突。 如果在 GPU 需求字串中同時指定 aff=yesblock=yes ,則會優先使用 block=yes 設定,並停用嚴格 CPU-GPU 親緣性連結 (亦即,自動設定 aff=no )。
    block=yes | no
    指定是否啟用區塊配送,即當作業數大於所要求的 GPU 數目時,將工作的已配置 GPU 配送為區塊。 如果設為 yes,當作業數目大於所要求的 GPU 數目時, LSF 會將工作的所有已配置 GPU 作為區塊進行配送。 依預設,會設定 block=no ,以便所配置的 GPU 不會配送為區塊。

    例如,如果 GPU 工作要求在具有 4 個 GPU 及 40 個作業的主機上執行,則區塊配送會指派 GPU0 (代表等級 0-9)、 GPU1 (代表等級 10-19)、 GPU2 (代表坦克 20-29) 及 GPU3 (代表等級 30-39)。

    附註: block=yes 設定與 aff=yes (嚴格 CPU-GPU 親緣性連結) 衝突。 這是因為嚴格 CPU-GPU 連結會根據 CPU NUMA ID 將 GPU 配置給作業,這與將已配置的 GPU 配送為區塊相衝突。 如果在 GPU 需求字串中同時指定 block=yesaff=yes ,則會優先使用 block=yes 設定,並停用嚴格 CPU-GPU 親緣性連結 (亦即,自動設定 aff=no )。
    gpack=yes | no
    僅適用於 共用 模式工作。 指定是否啟用套件排程。 如果設為 yes,則 LSF 會將多個共用模式 GPU 工作包裝至已配置的 GPU。 LSF 排程共用模式 GPU ,如下所示:
    1. LSF 會根據已具有執行中工作的共用 GPU 數目,然後依非專用 GPU 數目來排序候選主機 (從最大到最小)。

      如果在資源需求字串中定義 order [] 關鍵字,在排序 order []之後, LSF 會依 gpack 原則重新排序候選主機 (依已先具有執行中工作的共用 GPU ,然後依非專用的 GPU 數目)。 gpack 原則排序優先順序高於 order [] 排序。

    2. LSF 會根據執行中工作的數目來排序每一部主機上的候選 GPU (從最大到最小)。

    排程之後,共用模式 GPU 工作套件至先排序的已配置共用 GPU ,而不是新共用 GPU。

    如果已啟用 Docker 屬性親緣性,則候選主機的順序會先依 Docker 屬性親緣性排序,然後再依 GPU 排序。

    依預設,會設定 gpack=no ,以便停用套件排程。

    gvendor=amd | nvidia
    指定 GPU 供應商類型。 LSF 會配置具有指定供應商類型的 GPU。

    指定 amd 以要求 AMD GPU ,或指定 nvidia 以要求 Nvidia GPU。

    依預設, LSF 會要求 Nvidia GPU。

    gmodel=model_name[-mem_size]
    指定具有特定模型名稱的 GPU ,並選擇性地指定其 GPU 記憶體總計。 依預設, LSF 會配置具有相同模型的 GPU (如果有的話)。

    gmodel 關鍵字支援下列格式:

    gmodel=model_name
    要求具有指定品牌及型號名稱 (例如, TeslaK80) 的 GPU。
    gmodel=short_model_name
    要求具有特定品牌名稱的 GPU (例如, Tesla、Quadro、NVS、) 或模型類型名稱 (例如, K80、 P100)。
    gmodel=model_name-mem_size
    要求具有指定品牌名稱及 GPU 記憶體大小總計的 GPU。 GPU 記憶體大小由數字及其單位組成,其中包括 MGTMBGBTB (例如, 12G)。

    若要在每一部主機上尋找可用的 GPU 模型名稱,請執行 lsload –gpuloadlshosts –gpubhosts -gpu 指令。 模型名稱字串不包含空格字元。 此外,斜線 (/) 和連字號 (-) 字元會取代為底線字元 (_)。 例如, GPU 模型名稱 "Tesla C2050 / C2070" 在 LSF中轉換為 "TeslaC2050_C2070"。

    gmem=mem_value

    指定工作所需之每一個 GPU 上的 GPU 記憶體。 mem_value 的格式與其他資源值相同 (例如,memswap) 在工作資源需求的 rusage 區段中 (-R)。

    gtile=! | tile_num
    指定每個 Socket 的 GPU 數目。 指定數字以明確定義主機上每個 Socket 的 GPU 數目,或指定驚嘆號 (!) 以讓 LSF 自動計算數目,這會將 GPU 沿著主機上所有 Socket 平均劃分。 LSF 可保證 gtile 需求,即使親緣性工作也一樣。 這表示當無法滿足 gtile 需求時, LSF 可能不會將 GPU 的親緣性配置給已配置的 CPU。

    如果未針對親緣性工作指定 gtile 關鍵字,則 LSF 會嘗試在已配置 GPU 的 Socket 上配置足夠的 GPU。 如果最佳 Socket 上沒有足夠的 GPU ,則工作無法移至這個主機。

    如果未針對非親緣性工作指定 gtile 關鍵字,則 LSF 會嘗試在相同的 Socket 上配置足夠的 GPU。 如果無法使用, LSF 可能會在個別 GPU 上配置 GPU。

    nvlink=yes
    LSF 10.1 Fix Pack 11 中已作廢。 請改用 glink 關鍵字。 啟用 GPU 之間 NVLink 連線的工作強制執行。 LSF 會配置具有有效 NVLink 連線的 GPU。
    glink=yes
    針對 GPU 之間的特殊連線啟用工作強制執行。 LSF 必須使用 GPU 供應商特有的特殊連線來配置 GPU。

    如果工作要求 AMD GPU ,則 LSF 必須使用 xGMI 連線來配置 GPU。 如果工作要求 Nvidia GPU , LSF 必須使用 NVLink 連線來配置 GPU。

    請勿將 glink 與已作廢的 nvlink 關鍵字一起使用。

    依預設,當沒有足夠的 GPU 具有這些連線時, LSF 可以在沒有特殊連線的情況下配置 GPU。

    mig=GI_size[/CI_size]
    指定 Nvidia Multi-Instance GPU (MIG) 裝置需求。

    指定 MIG 工作所要求的 GPU 實例數目。 有效的 GPU 實例大小為 1、2、3、4、7。

    選擇性地在指定的 GPU 實例大小及斜線字元 (/) 之後指定所要求的計算實例數目。 所要求的計算實例大小必須小於或等於所要求的 GPU 實例大小。 此外, Nvidia MIG 不支援下列 GPU/計算實例大小組合: 4/3、7/5、7/6。 如果未指定此項,則預設計算實例大小為 1。

    如果 GPU_REQ_MERGE 參數在 lsb.params 檔案中定義為 Yy ,並且在多個層次指定 GPU 需求 (至少有兩個預設叢集、佇列、應用程式設定檔或工作層次需求) ,則 GPU 需求的每一個選項會個別合併。 工作層次會置換應用程式層次,其會置換佇列層次,其會置換預設叢集 GPU 需求。 例如,如果在 -gpu 選項上定義 GPU 需求的 mode 選項,並在佇列中定義 mps 選項,則會使用工作層次的模式及佇列的 mps 值。

    如果 GPU_REQ_MERGE 參數在 lsb.params 檔案中未定義為 Yy ,並且 在多個層次指定 GPU 需求 (至少兩個預設叢集、佇列、應用程式設定檔或工作層次需求) ,則會取代整個 GPU 需求字串。 整個工作層次 GPU 需求字串會置換應用程式層次,這會置換佇列層次,這會置換預設 GPU 需求。

    esub 參數 LSB_SUB4_GPU_REQ 會修改 -gpu 選項的值。

    GPU 需求會轉換為工作的 rusage 資源需求。 例如, num=2 轉換為rusage[ngpus_physical=2]. 使用 bjobsbhistbacct 指令來查看合併的資源需求。

    如需使用 bsub -gpu 指令選項的詳細資料,請參閱 bsub -gpu

    例如,下列指令會要求 2 個 Tesla GPU ,每個 GPU 總大小為 12 GB ,在每個 GPU 上保留 8 GB GPU 記憶體,並將 GPU 平均分散到主機上的所有 Socket。 工作提交會在 GPU 上啟用 NVIDIA MPS ,且任何已配置的 GPU 都必須具有 NVLink 連線:

    bsub -gpu "num=2:gmodel=Tesla-12G:gmem=8G:gtile='!':mps=yes:glink=nvlink ./myjob

  • 如果您在應用程式設定檔或佇列中指定 GPU 資源需求,請將工作提交至具有 GPU 資源需求的應用程式設定檔或佇列。

    bsub -app gpu_app ./myjob

    bsub -q "gpu_queue" ./myjob

  • 使用 bsub -R 指令選項來提交具有複雜 GPU 資源需求的工作。

    bsub -gpu 選項及 GPU_REQ 參數語法可能無法涵蓋複雜的 GPU 資源需求,包括複合 GPU 需求 (針對不同主機上工作的不同 GPU 需求,或針對平行工作的不同部分) 及替代 GPU 需求 (如果工作執行可能可接受多組 GPU 需求)。

    下列 bsub -R 選項特定於 GPU 資源需求:

    bsub -R " span[gtile=tile_num | '!'] rusage[ngpus_physical=num_gpus:gmodel=model_name[-mem_size]:gmem=mem_value:glink=yes]"

    • span [] 區段中,使用 gtile 關鍵字來指定每一個 Socket 所要求的 GPU 數目。
    • rusage [] 區段中,使用 ngpus_physical 資源來要求實體 GPU 數目,以及使用 gmodel 選項來指定 GPU 模型 (以及選用的總記憶體大小)、使用 gmem 選項來指定保留 GPU 記憶體數量,以及使用 glink 選項來僅要求具有特殊連線的 GPU (針對 AMD GPU 的xGMI 連線或針對 Nvidia GPU 的 NVLink 連線)。

    如果您需要使用 模式j_exclusivemps 選項,則必須使用簡式 GPU 需求。 對於複雜的 GPU 資源需求,您無法在 rusage [] 區段中使用這些選項。

    重要事項: 如果您在工作層次使用 bsub -R 指令選項指定複式 GPU 資源需求,在 lsb.queues 檔案中使用 RES_REQ 參數指定佇列層次,或在 lsb.applications 檔案中使用 RES_REQ 參數指定應用程式設定檔層次,則 LSF 會忽略所有層次的簡式 GPU 需求 (亦即, LSF 會忽略 bsub -gpu 指令選項,在 lsf.conf 檔案中使用 LSB_GPU_REQ 參數, 及 GPU_REQ 參數 (在 lsb.queueslsb.applications 檔案中)。

    如需指定資源需求 (包括複式 GPU 資源需求) 的詳細資料,請參閱 指定資源需求

    例如,下列替代資源需求字串指定具有 2 個作業的平行工作,每一個作業在具有 4 個 K80 GPU 或每一個 Socket 平均劃分 2 個 P100 GPU 的個別主機上執行:

    bsub -n 2 -R "span[ptile=1,gtile=!] rusage[ngpus_physical=4:gmodel=K80 || ngpus_physical=2:gmodel=P100]" ./myjob

結果

配置 GPU 時 GPU 條件的順序如下:

  1. 最大 GPU 計算功能 (gpu_factor 值)。
  2. 具有直接 NVLink 連線的 GPU。
  3. 具有相同模型的 GPU ,包括 GPU 總記憶體大小。
  4. 最大可用的 GPU 記憶體。
  5. 相同 GPU 上的並行工作數目。
  6. 現行 GPU 模式。