EC2 Windows GPU 实例:安装 NVIDIA GRID 驱动并接入 CloudWatch
EC2 Windows GPU 实例:安装 NVIDIA GRID 驱动并接入 CloudWatch
标准 Windows Server AMI 启动在 g4dn 或 g5 后,设备管理器可能只显示 Microsoft 基本显示适配器,nvidia-smi 也不可用。安装驱动后,Windows 版 CloudWatch Agent 又不能像 Linux 那样直接启用 nvidia_gpu 接收器。
本文把两部分串成一条完整部署链:从 AWS 公共 S3 桶安装 GRID 驱动,再由 PowerShell 调用 nvidia-smi,批量推送自定义 CloudWatch 指标。
选择驱动
- GRID 驱动适合图形、远程桌面、视频编码和 WDDM 场景。
- Data Center/Tesla 驱动通常面向纯计算与 TCC 场景。
先列出 AWS 公共桶中的当前文件,不要把博客中的某个版本号永久写进自动化:
aws s3 ls s3://ec2-windows-nvidia-drivers/latest/ `
--no-sign-request --region us-east-1根据系统版本选择驱动,然后下载:
$ErrorActionPreference = 'Stop'
$driver = 'C:\ProgramData\Amazon\NVIDIA\grid-driver.exe'
New-Item (Split-Path $driver) -ItemType Directory -Force | Out-Null
aws s3 cp `
's3://ec2-windows-nvidia-drivers/latest/<selected-driver>.exe' `
$driver --no-sign-request --region us-east-1静默安装并检查退出码:
$p = Start-Process $driver `
-ArgumentList '-s -noreboot -noeula' `
-Wait -PassThru
if ($p.ExitCode -ne 0) { throw "Driver installer exit code $($p.ExitCode)" }
& "$env:ProgramFiles\NVIDIA Corporation\NVSMI\nvidia-smi.exe"部分版本需要重启后设备和 nvidia-smi 才完全正常。远程操作前应确认 EC2Launch、SSM 或其他恢复通道可用。
最小 IAM 权限
实例角色至少需要向 CloudWatch 写指标:
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": "cloudwatch:PutMetricData",
"Resource": "*",
"Condition": {
"StringEquals": {
"cloudwatch:namespace": "Custom/GPU"
}
}
}]
}采集脚本
脚本使用 IMDSv2 获取区域、实例 ID 和类型,再解析 nvidia-smi CSV。一次请求批量提交多个指标,避免为每个值单独调用 API。
$ErrorActionPreference = 'Stop'
$smi = "$env:ProgramFiles\NVIDIA Corporation\NVSMI\nvidia-smi.exe"
$token = Invoke-RestMethod -Method Put `
-Uri 'http://169.254.169.254/latest/api/token' `
-Headers @{'X-aws-ec2-metadata-token-ttl-seconds'='21600'}
$h = @{'X-aws-ec2-metadata-token'=$token}
$region = Invoke-RestMethod -Headers $h `
-Uri 'http://169.254.169.254/latest/meta-data/placement/region'
$instanceId = Invoke-RestMethod -Headers $h `
-Uri 'http://169.254.169.254/latest/meta-data/instance-id'
$instanceType = Invoke-RestMethod -Headers $h `
-Uri 'http://169.254.169.254/latest/meta-data/instance-type'
$rows = & $smi `
'--query-gpu=index,utilization.gpu,utilization.memory,memory.total,memory.used,temperature.gpu,power.draw' `
'--format=csv,noheader,nounits'
foreach ($row in $rows) {
$v = $row.Split(',') | ForEach-Object { $_.Trim() }
$dims = @(
@{Name='InstanceId';Value=$instanceId},
@{Name='InstanceType';Value=$instanceType},
@{Name='GPUIndex';Value=$v[0]}
)
$metrics = @(
@{MetricName='GPUUtilization';Value=[double]$v[1];Unit='Percent';Dimensions=$dims},
@{MetricName='MemoryUtilization';Value=[double]$v[2];Unit='Percent';Dimensions=$dims},
@{MetricName='MemoryTotal';Value=[double]$v[3];Unit='Megabytes';Dimensions=$dims},
@{MetricName='MemoryUsed';Value=[double]$v[4];Unit='Megabytes';Dimensions=$dims},
@{MetricName='Temperature';Value=[double]$v[5];Unit='None';Dimensions=$dims},
@{MetricName='PowerDraw';Value=[double]$v[6];Unit='None';Dimensions=$dims}
)
$json = $metrics | ConvertTo-Json -Depth 5 -Compress
aws cloudwatch put-metric-data --namespace 'Custom/GPU' `
--metric-data $json --region $region
}将脚本保存为:
C:\ProgramData\Amazon\GPUMetrics\collect.ps1用计划任务每分钟运行
相比在脚本内部无限循环,“每分钟启动一次”的任务更容易监控失败、升级脚本和避免僵尸进程:
$action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument `
'-NoProfile -ExecutionPolicy Bypass -File "C:\ProgramData\Amazon\GPUMetrics\collect.ps1"'
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date).AddMinutes(1) `
-RepetitionInterval (New-TimeSpan -Minutes 1)
$principal = New-ScheduledTaskPrincipal -UserId 'SYSTEM' `
-LogonType ServiceAccount -RunLevel Highest
Register-ScheduledTask -TaskName 'GPU-Metrics-Collector' `
-Action $action -Trigger $trigger -Principal $principal -Force
Start-ScheduledTask 'GPU-Metrics-Collector'验证:
Get-ScheduledTaskInfo 'GPU-Metrics-Collector'
aws cloudwatch list-metrics --namespace 'Custom/GPU' --region $region告警与常见问题
建议针对每块 GPU 建立以下告警:持续高温、长时间满负载、显存接近耗尽、功耗异常归零。告警阈值应根据实例型号和应用基线确定,不能把某个 T4 阈值直接套到 A10G。
排查要点:
nvidia-smi不存在:驱动未安装完成或需要重启。- S3 下载失败:确认
--no-sign-request和出站访问。 - 没有指标:确认实例角色、命名空间条件以及任务的 LastTaskResult。
- 多 GPU:必须逐行解析并增加
GPUIndex维度。 - 系统代理:应绕过
169.254.169.254,否则 IMDS 和 SSM 都可能异常。 - 自定义指标和 API 调用会产生费用,应以当前区域价格页为准。
卸载任务:
Unregister-ScheduledTask 'GPU-Metrics-Collector' -Confirm:$false总结
Windows GPU 实例需要把“驱动可用”和“监控可见”作为两个独立验收项。先从公开桶选择与系统匹配的 GRID 驱动,确认 nvidia-smi,再用批量 PutMetricData 接入 CloudWatch。这样既能通过 SSM 自动部署,也能在 Dashboard 和告警中统一观察多台实例。
