如何批量获取多台EC2实例的GPU空闲状态信息?
多EC2实例GPU空闲状态批量核查方案
你不用手动逐台SSH登录拉信息,从易到难有两个成熟的落地方案,不需要复杂开发经验就能搭:
方案1:零实例端部署,本地并行SSH脚本(10分钟就能搭完)
这个方案不需要在任何GPU实例上装额外软件,只要你本地能SSH免密连所有实例就行,比手动逐台登效率高10倍以上。
- 先整理所有需要核查的实例SSH连接地址,存到本地
gpu_instances.txt文件里,每行一个,比如ubuntu@ec2-1-2-3-4.cn-north-1.compute.amazonaws.com.cn,提前配置好SSH免密登录,避免每次输密码。 - 新建本地执行脚本
check_gpu.sh,内容如下,脚本会并发向所有实例发起SSH连接,远程执行nvidia-smi拉取指标,自动判断空闲GPU后汇总输出:
#!/bin/bash INSTANCE_LIST="./gpu_instances.txt" # 空闲判定规则:显存占用<100MiB、GPU利用率<5%即判定为空闲,可根据团队习惯调整阈值 MEM_THRESHOLD=100 UTIL_THRESHOLD=5 echo "===== GPU实例空闲状态核查 =====" echo "核查时间: $(date '+%Y-%m-%d %H:%M:%S')" echo "------------------------------" while read -r conn_str; do # 后台并发执行单台实例的查询,避免串行等待 ( # 连接超时设3秒,不通直接跳过,不卡整体流程 gpu_raw=$(ssh -o ConnectTimeout=3 -o StrictHostKeyChecking=no "$conn_str" \ "nvidia-smi --query-gpu=index,memory.used,utilization.gpu,name --format=csv,noheader,nounits" 2>/dev/null) if [ -z "$gpu_raw" ]; then echo "[异常] $conn_str : 连接失败或nvidia-smi执行异常" exit fi total=0 idle=0 detail="" while IFS=',' read -r idx mem util name; do total=$((total+1)) mem=$(echo $mem | xargs) util=$(echo $util | xargs) name=$(echo $name | xargs) if [ $mem -lt $MEM_THRESHOLD ] && [ $util -lt $UTIL_THRESHOLD ]; then idle=$((idle+1)) detail+=" GPU$idx($name): 空闲 | 显存已用${mem}MiB | 利用率${util}%\n" else detail+=" GPU$idx($name): 占用 | 显存已用${mem}MiB | 利用率${util}%\n" fi done <<< "$gpu_raw" echo -e "[$conn_str] 总GPU数:$total | 空闲GPU数:$idle" echo -e "$detail" ) & done < "$INSTANCE_LIST" # 等待所有并发查询执行完成 wait echo "===== 核查结束 ====="
- 给脚本加执行权限
chmod +x check_gpu.sh,直接运行就能出结果,10台左右的实例3-5秒就能跑完所有查询。
注意判断GPU空闲必须同时看显存占用和利用率:很多场景下用户占了显存但没跑计算任务,GPU利用率显示0,实际是没法用的,只看利用率会误判。
方案2:轻量集中上报方案(适合多人团队长期用)
如果团队所有人都有查空闲GPU的需求,不用每个人都在本地配脚本,可以搭个极简的状态上报服务,打开网页就能看到所有实例的实时状态:
- 选一台团队内所有人都能访问的机器(哪怕是其中一台GPU实例也行),跑个极简的HTTP服务,两个核心功能:一是接收各实例上报的GPU状态,把最近2分钟的上报数据存在内存里(不用搭数据库);二是提供一个web页面,把所有实例的GPU状态渲染成表格,空闲GPU标绿、占用标红,一眼就能定位可用资源。
- 在每台GPU实例上配一条crontab定时任务,每分钟执行一次
nvidia-smi提取指标,POST给服务端的上报接口,带上本机IP、主机名信息就行,定时任务配置参考:
* * * * * /usr/bin/nvidia-smi --query-gpu=index,memory.used,utilization.gpu,name --format=csv,noheader,nounits | curl -X POST -d @- http://<服务端地址>/report?host=$(hostname)
这个方案搭完之后,所有人查GPU不用连任何实例,打开浏览器访问对应页面就行,维护成本极低。
如果团队已经搭了Prometheus这类监控体系,直接在GPU实例上装nvidia-smi exporter配个Grafana看板也能实现,就是部署成本比上面两个方案高一点,适合已经有现成监控的团队用。
内容的提问来源于stack exchange,提问作者Idioteche_fish
相关产品推荐
相关产品推荐

