騰訊組學HPC叢集運維與作業管理

👤 chanhfeng(馮暢) ✓ 已認證 📦 v1.0.1 ⭐ 4.7 ⬇️ 221 下載
🔒 IT運維與安全 免費 🔑 需 API Key

📖 技能介紹


name: omics-hpc-skill description: 端到端管理 omics-hpc 叢集——既覆蓋騰訊雲組學平臺雲 API(DescribeHPCClusters / RunCommand / DescribeCommandExecution),也內建 SLURM 作業(sbatch / squeue / sacct / scancel / scontrol / salloc / srun)與 tophpc 基礎設施(cluster / node / queue / scale / fs / image / log / version)的命令生成與遠端下發能力。覆蓋以下場景:列出/篩選 HPC 叢集、遠端下發 Shell 命令、輪詢 InvocationId 取回執行結果;提交/查詢/取消 SLURM 作業、生成 sbatch 指令碼、診斷 PENDING 原因;增刪佇列/節點、配置彈性伸縮、掛載檔案系統、打映象、檢視 / 修改叢集配置。觸發關鍵詞:HPC 叢集、omics-hpc、DescribeHPCClusters、RunCommand、InvocationId、遠端執行;sbatch、squeue、sacct、scancel、scontrol、salloc、srun、提交作業、查任務、取消任務、為什麼任務沒跑、生成指令碼、依賴提交、申請互動節點;tophpc、加節點、刪節點、加佇列、刪佇列、彈性伸縮、擴縮容、掛載、解除安裝儲存、打映象、刪映象、看叢集、叢集配置。當用戶的訴求是"在 omics-hpc 叢集上做事"時優先使用本 Skill,而不是 slurm-operator / tophpc-operator——後兩者面向本地直連場景,本 Skill 通過雲 API 遠端下發命令,適配本地未安裝 tophpc / 不在登入節點的情況


omics-hpc-skill — omics-hpc 叢集端到端管理

概述

本 Skill 是 omics-hpc 叢集的單一操作入口,覆蓋三個層次:

  1. 雲 API 層:通過騰訊雲組學平臺 API 直接管理叢集與命令——
  2. DescribeHPCClusters(按地域篩選叢集)
  3. RunCommand(在叢集上下發 Shell 命令,返回 InvocationId
  4. DescribeCommandExecution(用 InvocationId 查執行結果)
  5. SLURM 作業層(領域知識):輔助生成並下發 sbatch / squeue / sacct / scancel / scontrol / salloc / srun 等作業命令;理解 PENDING 原因、狀態碼、退出碼;針對彈性自動伸縮 + dummynode 佔位模式給出正確解釋。
  6. tophpc 基礎設施層(領域知識):輔助生成並下發 tophpc cluster/node/queue/scale/fs/image/log/version 等基礎設施命令;理解可選 instance-type、disk 格式、--instance-specs JSON、--force 與無 --force 命令的非互動處理方式。

SLURM 與 tophpc 的命令本身通過 RunCommand 遠端下發到叢集管理節點執行,不要求本地裝 slurmtophpc。本 Skill 既是"知識庫"也是"執行通道"。

階段 雲 API 作用 返回關鍵欄位
叢集發現 DescribeHPCClusters 按過濾條件(ClusterId / Name / Status / ConfirmDeadlineLt)分頁查詢叢集清單 Clusters[]:叢集基礎資訊 / 節點數 / 排程器 / VPC
命令下發 RunCommand 在指定叢集(可指定節點)上提交 Shell 命令 InvocationId(命令呼叫 ID)
結果查詢 DescribeCommandExecution InvocationId 查命令執行詳情 ExecutionSet[]:狀態 / stdout / 退出碼 / 節點 ID / 時間戳

注意 1:DescribeHPCClusters 介面會受到 Region 的影響,叢集按地域隔離;RunCommandDescribeCommandExecution 不受地域限制。 注意 2:DescribeCommandExecutionInvocationIds 是陣列,可一次批次查多個呼叫;響應通過 ExecutionSet 一一對應(扁平結構,不巢狀節點列表)。 注意 3:本 Skill 不主動輪詢等待終態——是否輪詢由呼叫方決定(describe_command_execution.py --poll)。

端到端標準工作流("生成命令 → 遠端下發 → 取回結果"三段式)

使用者描述意圖("提交一個 GPU 訓練作業" / "給 small 佇列加自動伸縮" / ...)
   ↓
Step A:意圖分類 → 落到「SLURM 作業」或「tophpc 基礎設施」或「直接走雲 API」
   ↓
Step B:構造命令字串
   - SLURM:參考「SLURM 作業命令生成」章節 + references/slurm_commands.md
            可呼叫 scripts/generate_sbatch.py 生成 sbatch 指令碼
   - tophpc:參考「tophpc 基礎設施命令生成」章節 + references/command-reference.md
            instance-type 校驗靠 references/instance-types.md
            --instance-specs JSON 校驗靠 scripts/build_instance_specs.py
   ↓
Step C:mutating 命令必須先和使用者確認
   - 完整命令字串 + 叢集/資源 + 預期影響 → 等使用者顯式批准
   - 只讀命令(squeue / sacct / sinfo / scontrol show / tophpc xxx list/show / config show / version)跳過
   ↓
Step D:遠端下發
   python3 scripts/run_hpc_command.py --cluster-id <ClusterId> --command '<構造好的命令>'
   如果是提交作業(sbatch/qsub/salloc/srun),追加 --run-as-user <username> 以普通使用者身份提交
   → 拿到 InvocationId
   ↓
Step E:輪詢取回執行結果
   python3 scripts/describe_command_execution.py --cluster-id <ClusterId> \
       --invocation-ids <InvocationId> --poll
   → 讀 ExecutionSet[].Output(命令 stdout+stderr 合併)+ ExitCode + Status
   ↓
Step F:渲染與解讀(按"輸出格式"章節模板)
   - SLURM:解釋狀態碼、PENDING 原因、退出碼;提醒彈性伸縮語義
   - tophpc:執行後再跑一條只讀校驗命令同樣下發回來確認

使用者已經知道 ClusterId → 跳過 DescribeHPCClusters;只給了 InvocationId 想查結果 → 直接從 Step E 開始。

SLURM 作業命令生成(領域知識 — 內建)

詳細命令參考請載入 references/slurm_commands.md;狀態碼與 PENDING 原因解讀請載入 references/job_states.md

彈性自動伸縮叢集語義(最重要

omics-hpc 叢集執行在彈性自動伸縮模式下,所有 SLURM 輸出必須按這個語義解讀:

  1. 佇列空閒 → 自動縮容到 0 個真實計算節點,僅保留一個 dummynode 佔位節點。
  2. 使用者 sbatch → 作業進入 PENDING 狀態(正常、預期)。
  3. 自動伸縮系統檢測到掛起作業 → 自動擴出真實計算節點。
  4. 節點就緒 → 作業開始執行。

關鍵判定(不要把下面這些當作叢集故障): - dummynode 不是故障節點,它是佔位節點——sinfo 看到 dummynode 處於 down / drain 狀態都不算故障,不要建議聯絡管理員。 - sinfo 顯示 0 可用節點 / 僅有 dummynode —— 正常空閒態,不要報"叢集異常"。 - 提交後 PENDING 且原因是 Resources / ReqNodeNotAvail —— 自動伸縮還沒擴出節點,讓使用者等幾分鐘即可。 - 只在 PENDING 持續 >10 分鐘時才往"真實異常"方向排查。

意圖分類表

將使用者請求對映到下表中的一種作業級操作:

類別 是否 mutating 主命令 何時選
即時查詢 squeue 看掛起 / 執行中作業
歷史查詢 sacct 看完成 / 失敗作業
叢集只讀 sinfo 看分割槽 / 節點(提交前選目標分割槽)
作業深查 scontrol show job 查 PENDING 原因、有效配置
批處理提交 sbatch 提交批處理指令碼
互動分配 salloc / srun 申請互動 shell 或直接跑
取消 scancel 取消一個或多個作業
持有/釋放 scontrol hold / release 暫停 / 恢復掛起作業

邊界:用 sinfo 檢視分割槽/節點狀態沒問題;但修改分割槽/節點配置屬於 tophpc 基礎設施層,按"tophpc 基礎設施命令生成"章節走。

提交前的最小輸入收集

  • 批處理提交job_namepartitiontimememnodesntaskscpus_per_task,可選 account / gpus / dependency / array / 輸出檔案
  • 取消:優先精確 job_id;需要廣義選擇器(-u / --name / --state)時squeue 預覽再發 scancel
  • 歷史查詢usernamejob_id,可選時間範圍、輸出欄位
  • PENDING 排查:用 scontrol show job <id> 查原因,按上面"彈性叢集語義"先排除自動伸縮等待,再用 references/job_states.md 對照解讀

提交使用者:RunCommand 預設以管理節點上的 root 身份執行命令。提交 SLURM(sbatch)/ SGE(qsub)/互動(salloc / srun)作業時,必須先確認提交使用者——通常應以普通使用者身份提交,而非 root。收集到使用者名稱後,下發時加上 --run-as-user <username> 引數,指令碼會自動將命令包裝為 su - <username> -c '<原始命令>'。詳見下方「作業提交的使用者身份切換」章節。

這個技能的最新版本可以在7w4.net小蔥技能站找到。

生成 sbatch 指令碼

如果使用者描述了資源訴求但沒有現成指令碼:

  • 優先用 scripts/generate_sbatch.py(引數化,支援 --account / --dependency / --array / --ntasks-per-node / --conda-init / --command-file)。
  • 或挑最貼近的 assets/*.sh 模板(basic_job.sh / gpu_job.sh / mpi_job.sh / array_job.sh)改寫。

注意:生成的指令碼通常需要先寫到叢集側sbatch。兩種做法二選一: 1. 用 run_hpc_command.py --command 'cat > /home/xxx/job.sh <<EOF\n...\nEOF\nsbatch /home/xxx/job.sh' 2. 把指令碼內容用 --command-file 載入到本地指令碼,再透傳給 run_hpc_command.py(注意 EOF 邊界)

遠端下發 + 解讀輸出(套用三段式)

下發前必須按"端到端工作流 Step C"先和使用者確認(mutating 類)。下發後用 --poll 取回 Output,按下表解讀:

命令 解讀重點
sbatch 輸出含 Submitted batch job <id>,提取 job_id;提醒彈性伸縮可能讓作業先 PENDING 幾分鐘
squeue 解釋 ST 狀態碼(PD / R / CG);NODELIST(REASON)Resources/ReqNodeNotAvail 時要按彈性叢集語義解釋
sacct State 終態 + ExitCodereturn_code:signal 形式,137:0 通常是 OOM-killed)
sinfo 僅有 dummynode 或 0 可用節點 → 正常空閒態,不要報錯
scancel 報告影響哪些作業;建議跟一條 squeue -j 校驗
scontrol hold/release 報告新狀態;建議跟一條 scontrol show job <id> 校驗

squeue --parsable2 / sacct --parsable2 輸出量大時,把 Output 餵給 scripts/summarize_slurm_table.py 做彙總。

作業提交的使用者身份切換(SLURM / SGE 通用)

RunCommand 預設在管理節點上以 root 身份執行命令。但提交作業(sbatch / qsub / salloc / srun)時,不應以 root 提交——原因:

  1. 安全:root 提交的作業擁有最高許可權,誤操作風險大。
  2. 公平排程:排程器按使用者統計資源用量,root 繞過了記賬和限額。
  3. 檔案許可權:作業輸出檔案會以 root 屬主建立,普通使用者後續無法讀寫。
  4. 審計追溯:無法區分是誰提交的作業。

處理方式:收集到提交使用者名稱後,下發時加上 --run-as-user 引數,指令碼自動包裝為使用者切換命令。

標準流程

Step 1:確認提交使用者
  - 如果使用者已給出使用者名稱 → 直接用
  - 如果未給出 → 詢問"請問以哪個使用者身份提交作業?"
  - 如果不確定使用者是否存在於叢集 → 先跑 `ypcat passwd | grep <username>` 驗證

Step 2:構造原始命令(如常生成 sbatch / qsub 命令)

Step 3:下發時加 --run-as-user
  python3 scripts/run_hpc_command.py \
    --cluster-id <ClusterId> \
    --command 'sbatch /home/<user>/job.sh' \
    --run-as-user <username>

Step 4:指令碼內部自動包裝為:
  su - <username> -c 'sbatch /home/<user>/job.sh'

示例

場景:使用者 alice 要提交一個 GPU 訓練作業到 gpu 分割槽。

# 先寫指令碼到叢集側(以 root 寫,或讓 alice 自己寫)
python3 scripts/run_hpc_command.py \
  --cluster-id hpc-9jragud9 \
  --command 'cat > /home/alice/train.sh << '\''EOF'\''
#!/bin/bash
#SBATCH --job-name=gpu_train
#SBATCH --partition=gpu
#SBATCH --gres=gpu:1
#SBATCH --time=24:00:00
python train.py
EOF'

# 然後以 alice 身份提交
python3 scripts/run_hpc_command.py \
  --cluster-id hpc-9jragud9 \
  --command 'sbatch /home/alice/train.sh' \
  --run-as-user alice

SGE (qsub) 同理

python3 scripts/run_hpc_command.py \
  --cluster-id hpc-9jragud9 \
  --command 'qsub -N sge_job -l gpu=1 /home/bob/run.sh' \
  --run-as-user bob

注意事項

  • --run-as-user只讀命令同樣適用(如 squeue -u <user>),但通常無需切換——root 可以檢視所有使用者的作業。
  • 如果使用者名稱不存在於叢集,su 會報錯 User <username> does not exist;先用 ypcat passwd | grep <username> 確認。
  • 使用者切換後,工作目錄會變為該使用者的 home 目錄(su -- 引數模擬完整登入環境)。如果命令依賴特定工作目錄,請在命令中顯式 cd 到目標路徑。
  • --run-as-user 是指令碼層面的包裝,不影響 RunCommand 的 NodeId / Timeout 等其他引數。

tophpc 基礎設施命令生成(領域知識 — 內建)

詳細命令、可選項、預設值請載入 references/command-reference.md;可用 instance-type 列表請載入 references/instance-types.md

操作分類表(mutating 全部需要確認)

操作 主命令 備註
叢集生命週期 tophpc cluster create/list/show create 極少用,通常只用 list/show
節點管理 tophpc node add/list/remove node remove--force 跳過互動
佇列管理 tophpc queue add/list/show/delete queue delete 沒有 --force,用 echo y \| ...
彈性伸縮 tophpc scale add/set/show/exec/delete 簡單模式(--instance-type + --cpu/--memory/...)vs 複雜模式(--instance-specs JSON)二選一
檔案系統 tophpc fs add/list/remove fs remove 一次只處理一個掛載路徑
映象 tophpc image list/delete image delete 沒有 --force;image create 不支援命令列操作,需要在組學控制台操作
日誌採集 tophpc log add/list/remove/reset/report
版本 tophpc versionversion upgrade/rollback/list
配置 tophpc config init/show 遠端模式下 config show 只是讀叢集側配置

構造命令的核心約束

  • clusterId:可選位置引數;遠端模式下優先讓使用者給,或先 DescribeHPCClusters / tophpc cluster list 列;不依賴本地 ~/.tophpc/config.yaml
  • --format json:所有 inspection / verification 命令都加上,輸出可機讀。
  • 磁碟格式<DiskType>-<DiskSizeGB>,例 CLOUD_SSD-100CLOUD_PREMIUM-200
  • --instance-type:只用 references/instance-types.md 中列出的型別;使用者給了不在表內的 → 告知不支援並提供同族可選項。
  • --instance-specs:構造好 JSON 後用 scripts/build_instance_specs.py '<json>' 校驗語法和必填欄位(QueueInstanceType),通過後再下發。
  • --forcenode remove / fs add / fs remove--force,遠端下發時必須加避免互動卡住。
  • 沒有 --force 的命令queue delete / image delete,遠端下發時用 echo y | tophpc queue delete ... 注入確認。
  • fs remove:實現層一次只處理一個 mountPath,多個掛載點要重複發命令。

Inspect → Confirm → Execute → Verify 四步鐵律(mutating)

每條 mutating 命令都必須經過:

  1. Inspect:先跑只讀命令(list/show)確認目標資源真實存在、當前狀態正常。
  2. Confirm:把完整命令字串、目標 cluster/資源、預期影響展示給使用者,等顯式批准("確認"/"yes"/"go"/"執行")。
  3. Execute:批准後一字不改地下發。
  4. Verify:再跑一條對應的只讀命令,把變更後狀態告訴使用者。
Mutation Verify 命令
cluster create tophpc cluster show [clusterId] --format json
node add / node remove tophpc node list [clusterId] --format json
queue add / queue delete tophpc queue list [clusterId] --format json
scale add / scale set / scale delete tophpc scale show [clusterId] --format json
fs add / fs remove tophpc fs list [clusterId] --format json
image create / image delete tophpc image list [imageIds...] --format json
version upgrade / version rollback tophpc version

常見失敗的恢復路徑

  • clusterId is not specified → 遠端模式下顯式補 [clusterId];不要讓使用者去改本地 config。
  • queue not foundscale add 之前)→ 先 tophpc queue list 確認,必要時先 queue add
  • --instance-specs 報錯 → 用 scripts/build_instance_specs.py 重新校驗 JSON。
  • 磁碟格式報錯 → 轉成 <DiskType>-<DiskSizeGB>
  • image delete 被攔 → 先看 tophpc scale show,被自動伸縮配置引用的映象非管理員刪不掉。

叢集運維參考(診斷 & 排查常用路徑與命令)

以下路徑和命令適用於 omics-hpc 叢集的管理節點(manager),通過 RunCommand 遠端下發執行。

擴縮容日誌

  • 日誌路徑/var/log/tophpc/scale.log
  • 排查擴縮容異常時,遠端執行 cat /var/log/tophpc/scale.logtail -100 /var/log/tophpc/scale.log 檢視最近日誌。

tophpc 定時擴縮容觸發方式

  • tophpc 的定時擴縮容由 root 使用者的 crontab 定時任務 觸發。
  • 檢視當前 crontab 配置:crontab -l(遠端下發時需 sudo crontab -l 或確認執行使用者為 root)。
  • 如果擴縮容未按預期觸發,先檢查 crontab 是否存在對應條目、執行頻率是否正確。

檢視叢集當前使用者

  • ypcat passwd — 列出叢集上所有 NIS/LDAP 使用者資訊。
  • 常見場景:確認某使用者是否已在叢集上有賬號、排查許可權問題。

其他常用運維路徑(待補充)

用途 路徑 / 命令
tophpc 擴縮容日誌 /var/log/tophpc/scale.log
定時擴縮容配置 crontab -l(root)
叢集使用者列表 ypcat passwd
tophpc 配置檔案 ~/.tophpc/config.yaml(管理節點上)
SLURM 日誌目錄 /var/log/slurm/(管理節點上)

Mutating 命令的統一確認協議(貫穿 SLURM + tophpc)

任何會改變叢集或作業狀態的命令,下發前都必須:

  1. 構造完整命令字串(不留佔位符,所有引數都有具體值)。
  2. 展示給使用者:完整命令 + 目標 cluster/資源 + 預期影響,例如:

即將遠端下發以下命令到叢集 hpc-12345sbatch --job-name=train --partition=gpu --gres=gpu:1 --time=24:00:00 train.sh 該命令將向 gpu 分割槽提交一個名為 train 的作業,申請 1 塊 GPU,最大執行時間 24h。

  1. 等使用者顯式批准("確認"/"好的"/"yes"/"go"/"執行"),才調 run_hpc_command.py
  2. 批准後一字不改地下發;使用者要改引數 → 回到第 1 步重新構造。
  3. 使用者拒絕 → 不下發;問要調什麼。

只讀命令(squeue / sacct / sinfo / scontrol show / tophpc xxx list/show / tophpc config show / tophpc version走確認協議,可直接下發。

真實介面契約(基於實測樣例)

DescribeHPCClusters 入參

{
  "Limit": null,
  "Offset": null,
  "Filters": [
    { "Name": "Status", "Values": ["RUNNING"] }
  ]
}
欄位 型別 說明
Limit int 分頁大小(可選)
Offset int 分頁起始位置(可選)
Filters array 過濾器陣列,元素形如 {"Name": "...", "Values": [...]};不傳或空陣列表示查詢全部不進行過濾

支援的過濾器 Name

Filter Name 說明 Values 示例
ClusterId 叢集 ID ["hpc-9jragud9"]
Name 叢集名稱 ["金域遷移測試"]
Status 叢集狀態 ["RUNNING"]
ConfirmDeadlineLt 交付確認截止日期早於給定值 ["2026-01-13T16:00:00+08:00"]

DescribeHPCClusters 響應

{
  "Response": {
    "Clusters": [
      {
        "ClusterId": "hpc-kazab9v2",
        "ConfirmDeadline": "",
        "CreateTime": "2026-05-20T11:00:35+08:00",
        "Description": "金域遷移測試",
        "Name": "金域遷移測試",
        "NodeCount": 6,
        "OsName": "CentOS 7.9",
        "Scheduler": "SLURM",
        "SchedulerVersion": "23.11.7",
        "Status": "RUNNING",
        "Tags": [],
        "Type": "CVM_CLUSTER",
        "VPCCIDRBlock": "10.10.0.0/22",
        "VPCId": "vpc-87y9syeb"
      }
    ],
    "TotalCount": 1,
    "RequestId": "..."
  }
}

RunCommand 入參

{
  "ClusterId": "hpc-9jragud9",
  "Command": "tophpc node list --format yaml",
  "NodeId": null,
  "Timeout": null,
  "ClientToken": null
}
欄位 型別 說明
ClusterId string 叢集 ID(必填)
Command string Shell 命令內容(必填)
NodeId string 目標節點 ID(單個,非陣列);不傳則按服務端預設排程
Timeout int 命令超時(秒)
ClientToken string 冪等 Token,重試場景下避免重複下發

RunCommand 響應

{ "Response": { "InvocationId": "inv-64mrvxgutj", "RequestId": "..." } }

DescribeCommandExecution 入參

{
  "ClusterId": "hpc-9jragud9",
  "InvocationIds": ["inv-64mrvxgutj"],
  "Offset": null,
  "Limit": null
}

DescribeCommandExecution 響應(扁平結構)

{
  "Response": {
    "ExecutionSet": [
      {
        "InvocationId": "inv-64mrvxgutj",
        "ClusterId": "hpc-9jragud9",
        "Command": "tophpc node list --format yaml",
        "NodeId": "ins-85ckz3bg",
        "Status": "SUCCESS",
        "ExitCode": 0,
        "Output": "nodeset:\n    - nodeid: ...",
        "OutputTruncated": false,
        "Duration": 0,
        "StartTime": "2026-06-09T08:34:08Z",
        "EndTime": "2026-06-09T08:34:08Z",
        "CreatedTime": "2026-06-09 16:34:07",
        "Operator": "100031066699"
      }
    ],
    "TotalCount": 1,
    "RequestId": "..."
  }
}

重要:每個 InvocationId 對應 ExecutionSet 中的一條記錄(扁平),不巢狀 NodeExecutions[]。stdout 與 stderr 均合併在 Output 欄位中,沒有獨立的 ErrorOutput

執行方式

使用 Skill 目錄下的 Python 指令碼:

# 1. 列出 HPC 叢集(DescribeHPCClusters)
python3 scripts/describe_hpc_clusters.py \
  [--cluster-id <id1,id2,...>] \
  [--name <name1,name2,...>] \
  [--status <RUNNING,...>] \
  [--confirm-deadline-lt <YYYY-MM-DDTHH:MM:SS+08:00>] \
  [--filter '<json array>'] \
  [--offset 0] [--limit 20] \
  [--region <REGION>]

# 2. 下發命令(RunCommand)
python3 scripts/run_hpc_command.py \
  --cluster-id <ClusterId> \
  --command '<shell command>' \
  [--node-id <NodeId>] \
  [--timeout <seconds>] \
  [--client-token <token>] \
  [--extra-params '<json>'] \
  [--run-as-user <username>] \
  [--region <REGION>]

# 3. 查詢命令執行結果(DescribeCommandExecution)
python3 scripts/describe_command_execution.py \
  --cluster-id <ClusterId> \
  --invocation-ids <id1,id2,...> \
  [--offset 0] [--limit 20] \
  [--region <REGION>] \
[--poll] [--poll-interval 5] [--poll-timeout 300]

引數說明 — describe_hpc_clusters.py

引數 必填 預設值 說明
--cluster-id ClusterId 過濾;多個用英文逗號分隔,等價於 Filters: [{Name: ClusterId, Values: [...]}]
--name Name 過濾;多個用英文逗號分隔
--status Status 過濾;多個用英文逗號分隔(如 RUNNING,UPGRADING
--confirm-deadline-lt ConfirmDeadlineLt 過濾(交付確認截止日期早於給定值)
--filter 直接透傳給 Filters 的 JSON 陣列,便於覆蓋未列舉的過濾器;與上述具體過濾引數合併(同名以本引數為準)
--offset 分頁起始位置
--limit 分頁大小
--region ap-guangzhou 業務地域(X-TC-Region):決定查哪個地域下的叢集,叢集是按地域隔離的(如 ap-shanghai / ap-singapore

引數說明 — run_hpc_command.py

引數 必填 預設值 說明
--cluster-id 叢集 ID(形如 hpc-9jragud9
--command 是* 命令內容(shell 字串);與 --command-file 二選一
--command-file 是* 命令內容檔案路徑;與 --command 二選一
--node-id 目標節點 ID(單個,不傳則按服務端預設排程,通常落在 manager 節點)
--timeout 命令超時(秒)
--client-token 冪等 Token
--extra-params 透傳給 RunCommand 的額外 JSON 引數(合併到 params)
--run-as-user 以指定使用者身份執行命令(自動包裝為 su - <user> -c '...');典型場景:以普通使用者而非 root 提交 SLURM/SGE 作業
--region ap-guangzhou SDK 簽名用的 region(X-TC-Region);RunCommand 本身不受地域限制,預設即可

*--command--command-file 至少傳一個;同時傳時以 --command-file 為準。

引數說明 — describe_command_execution.py

引數 必填 預設值 說明
--cluster-id 叢集 ID
--invocation-ids InvocationId 列表(英文逗號分隔,可批次)
--offset 分頁起始位置
--limit 分頁大小
--region ap-guangzhou SDK 簽名用的 region(X-TC-Region);DescribeCommandExecution 不受地域限制,預設即可
--poll false 是否輪詢直至所有呼叫進入終態
--poll-interval 5 輪詢間隔(秒);過小(如 3s)容易被騰訊雲限流攔截
--poll-timeout 300 輪詢超時(秒),到點仍未終態則按當前快照返回

前置依賴

pip3 install tencentcloud-sdk-python

金鑰從環境變數讀取:

export TENCENTCLOUD_SECRET_ID=...
export TENCENTCLOUD_SECRET_KEY=...

查詢邏輯

Endpoint / Region

Endpoint(網路接入點)

三個指令碼統一使用單一接入點,由騰訊雲就近排程:

omics.tencentcloudapi.com

不再按 region 拼接 omics.{region}.tencentcloudapi.com

Region(業務地域,不同介面語義不同)

API --region 含義 需要調整嗎?
DescribeHPCClusters 業務地域——叢集按地域隔離,不同 region 查到的叢集不同 是,必須傳對叢集所在的 region(如 ap-shanghai
RunCommand 僅用於 SDK 簽名(X-TC-Region),不限定叢集;主要走 ClusterId 定位叢集 否,預設 ap-guangzhou 即可
DescribeCommandExecution 同上,不受地域限制InvocationId 全域性可識別 否,預設即可
  • DescribeHPCClusters 查不到期望叢集時,先確認 --region 是否與叢集實際所在地域一致。
  • RunCommandDescribeCommandExecution--region 可以不一致(不影響語義),但建議保持一致以便除錯習慣一致。

終態判定(describe_command_execution.py --poll 用)

下列狀態視為終態(實測樣例已驗證 SUCCESS,其餘以關鍵字兜底):

  • SUCCESS / Succeeded / SUCCEEDED
  • FAILED / Failure / FAILURE
  • TIMEOUT
  • TERMINATED / Cancelled / CANCELLED
  • ERROR

其餘(如 PENDING / RUNNING / INVOKING)視為非終態,輪詢繼續。

服務端實際狀態列舉以 SDK 文件為準;判定使用大小寫不敏感的子串匹配兜底。輪詢時若 ExecutionSet 長度 < 入參 InvocationIds 數量,也視為非終態(部分呼叫還在生成中)。

結果解析

DescribeHPCClusters 響應

欄位 說明
Response.Clusters[] 叢集清單
Response.TotalCount 命中條數
Clusters[].ClusterId 叢集 ID(如 hpc-kazab9v2
Clusters[].Name / Description 叢集名 / 描述
Clusters[].Status 叢集狀態(如 RUNNING
Clusters[].NodeCount 節點數
Clusters[].OsName 作業系統(如 CentOS 7.9
Clusters[].Scheduler / SchedulerVersion 排程器 / 版本(如 SLURM 23.11.7
Clusters[].Type 叢集型別(如 CVM_CLUSTER
Clusters[].VPCId / VPCCIDRBlock VPC ID / CIDR
Clusters[].CreateTime / ConfirmDeadline 建立時間 / 交付確認截止時間
Clusters[].Tags 標籤

RunCommand 響應

欄位 說明
Response.InvocationId 核心欄位,下一步查詢命令執行結果用
Response.RequestId 請求 ID(追溯用)

DescribeCommandExecution 響應(扁平結構)

欄位 說明
Response.ExecutionSet 陣列,每個 InvocationId 一條
Response.TotalCount 命中條數
ExecutionSet[].InvocationId 對應的呼叫 ID
ExecutionSet[].ClusterId 叢集 ID
ExecutionSet[].Command 原始命令內容
ExecutionSet[].NodeId 實際執行節點的 InstanceId(如 ins-85ckz3bg,注意是 CVM 例項 ID 而非 node-id)
ExecutionSet[].Status 整體狀態(參考終態判定)
ExecutionSet[].ExitCode 退出碼(0 = 正常)
ExecutionSet[].Output 命令輸出(stdout + stderr 合併;可能截斷,看 OutputTruncated
ExecutionSet[].OutputTruncated 輸出是否被截斷的布林位
ExecutionSet[].Duration 命令執行時長(秒)
ExecutionSet[].StartTime / EndTime 執行起止時間(UTC)
ExecutionSet[].CreatedTime 呼叫建立時間(北京時間)
ExecutionSet[].Operator 操作者 Uin

指令碼透傳服務端原始 Response,不做欄位裁剪。

輸出格式

叢集列表(DescribeHPCClusters)

## HPC 叢集列表({region},共 {TotalCount} 個)

| ClusterId | Name | Status | Nodes | Scheduler | OS | VPC | CreateTime |
|---|---|---|---|---|---|---|---|
| `hpc-kazab9v2` | 金域遷移測試 | RUNNING | 6 | SLURM 23.11.7 | CentOS 7.9 | vpc-87y9syeb (10.10.0.0/22) | 2026-05-20 11:00:35 |

TotalCount > limit,提示使用者用 --offset/--limit 翻頁。

下發階段(RunCommand)

## 命令下發:{ClusterId}

**Region**:{region}
**InvocationId**:`{InvocationId}`  ← 下一步查詢用
**RequestId**:{RequestId}

### 命令內容
```sh
{Command}

提示使用者:如需檢視執行結果,請執行 python3 scripts/describe_command_execution.py --cluster-id {ClusterId} --invocation-ids {InvocationId} 或加 --poll 自動等到終態。


### 查詢階段(DescribeCommandExecution)

按 `ExecutionSet` 逐條渲染,每條一節:

```markdown
## 命令執行:{InvocationId}

**Region**:{region}
**叢集**:{ClusterId}
**執行節點**:{NodeId}
**操作者**:{Operator}
**狀態**:{Status}    **退出碼**:{ExitCode}    **耗時**:{Duration}s
**建立時間**:{CreatedTime}
**起止**:{StartTime} ~ {EndTime}

### 命令
```sh
{Command}

輸出({OutputTruncated})

{Output}

```

如果狀態非終態(如 RUNNING / PENDING)且未啟用 --poll,提示使用者「命令仍在執行中,可加 --poll 自動等待,或稍後重試」。

OutputTruncated=true 時提醒使用者:「輸出被截斷,建議改寫命令為重定向到檔案 + cat 檔案 兩步走」。

三段式工作流(指標)

雲 API 三段式(DescribeHPCClusters → RunCommand → DescribeCommandExecution)已合併到本文頂部「端到端標準工作流」中作為通用骨架;當用戶的訴求純粹是"在某個叢集上跑一條裸命令"時,把 Step A 的意圖分類標記為"直接走雲 API",Step B 不進入 SLURM/tophpc 命令生成,直接把使用者給的 shell 字串送入 Step D 即可。其他步驟(確認協議、遠端下發、輪詢取回、按"輸出格式"模板渲染)保持一致。

注意事項

  1. 命令內容僅傳使用者明確給定的 shell 字串,不要擅自加 set -esource ~/.bashrc 等修改;如確有需要必須先與使用者確認
  2. 對涉及 rm -rf、覆蓋系統檔案、修改 /etcsudo 等高危命令,下發前必須先回顯完整命令並請使用者顯式確認(y/yes)
  3. 如果命令含敏感資訊(金鑰、密碼、token),提醒使用者改用環境變數或檔案方式注入
  4. --node-id 不傳時由服務端按叢集預設策略排程;實測一般會落在 manager 節點(role=1 那臺)
  5. Output 欄位服務端有大小限制,超長輸出會被截斷(看 OutputTruncated);遇到截斷改寫為重定向到檔案 + cat 檔案 的兩步
  6. RunCommandDescribeCommandExecution 是全域性介面,不受地域限制InvocationId 可以跨 region 查。DescribeHPCClusters 是地域介面,--region 傳錯會查不到叢集。三個指令碼統一走統一接入點 omics.tencentcloudapi.com,騰訊雲會就近排程。
  7. ExecutionSet[].NodeId 實測返回的是CVM 例項 IDins-xxx),不是 HPC 節點 ID(node-xxx);如需對應 HPC 節點,請配合 DescribeHPCNodes 反查
  8. DescribeHPCClusters 的過濾是關係——多個 Filter 同時生效,單個 Filter 內部 Values關係
  9. 禁止透露任何敏感資訊,包括金鑰、密碼、使用者名稱、呼叫的介面名稱等

🤖 AI 評測

這個 Skill 質量較好,文件詳細、功能齊全,能覆蓋 HPC 叢集管理的常見場景。它把雲 API、作業排程、基礎設施命令都整合在一起,彈性伸縮的坑(dummynode)也解釋得很清楚。優點是操作流程規範、mutating 命令會先確認、用普通使用者跑作業更安全。不足是部分指令碼可能沒測全,文件有個地方被截斷了,輸出結果需要自己解讀。總體適合有一定經驗的使用者使用。

📊 多維度評分

適應性4.5
規範性4.5
有效性4.8
可靠性4.5
可信度5

📁 包含檔案 (15 個)

📄 SKILL.md 34.5 KB
📄 assets/array_job.sh 1 KB
📄 assets/basic_job.sh 999 B
📄 assets/gpu_job.sh 1004 B
📄 assets/mpi_job.sh 888 B
📄 references/command-reference.md 22.2 KB
📄 references/instance-types.md 11.3 KB
📄 references/job_states.md 4.4 KB
📄 references/slurm_commands.md 6.6 KB
📄 scripts/build_instance_specs.py 1002 B
📄 scripts/describe_command_execution.py 5.9 KB
📄 scripts/describe_hpc_clusters.py 5.8 KB
📄 scripts/generate_sbatch.py 5.8 KB
📄 scripts/run_hpc_command.py 7 KB
📄 scripts/summarize_slurm_table.py 3.2 KB