如何用PowerShell获取最高显存的活跃显卡适配Whisper模型?
解决Whisper自动化项目中PowerShell获取显卡显存的问题
问题背景
开发私人OpenAI Whisper自动化项目时,需要通过PowerShell根据电脑性能自动选择适配的Whisper模型,核心需求包括:
- 获取显存(VRAM)最高的活跃显卡
- 无独立显卡时自动切换使用核显
- 原脚本通过
Win32_VideoController和注册表关联时,存在DriverDesc不匹配、注册表残留旧数据导致显存获取不准确的问题
替代解决方案
方法1:使用Windows自带DirectX诊断工具(dxdiag)
dxdiag能精准获取当前活跃显卡的硬件信息,无需依赖注册表匹配,适合全场景使用:
# 导出dxdiag报告到临时文件 $tempFile = "$env:TEMP\dxdiag.txt" dxdiag /t $tempFile # 解析报告提取显卡显存信息 $gpuSections = Get-Content $tempFile | Select-String -Pattern "Card name:" -Context 0,10 $maxVRAM = 0 $selectedGPUName = "None" foreach ($section in $gpuSections) { $gpuName = ($section.Line -split ":")[1].Trim() # 跳过远程显示适配器 if ($gpuName -match "Microsoft Remote Display Adapter") { continue } $vramLine = $section.Context.PostContext | Where-Object { $_ -match "Display Memory:" } if ($vramLine) { $vramValue = ($vramLine -split ":")[1].Trim() # 处理MB/GB单位转换为GB if ($vramValue -match "(\d+) MB") { $vramGB = [math]::round([int]$matches[1] / 1024) } elseif ($vramValue -match "(\d+\.?\d+) GB") { $vramGB = [math]::round([double]$matches[1]) } if ($vramGB -gt $maxVRAM) { $maxVRAM = $vramGB $selectedGPUName = $gpuName } } } # 清理临时文件 Remove-Item $tempFile -Force # 匹配Whisper模型 switch ($maxVRAM) { { $_ -lt 2 } { $model = "base" } { $_ -lt 5 } { $model = "small" } { $_ -lt 10 } { $model = "medium" } default { $model = "large-v3" } } # 输出结果 $result = [PSCustomObject] @{ "显卡名称" = $selectedGPUName "显存(GB)" = $maxVRAM "推荐Whisper模型" = $model } $result | Format-Table -AutoSize Write-Host "为Whisper项目选择模型:$model,对应显存:$maxVRAM GB"
方法2:针对NVIDIA显卡使用官方工具nvidia-smi
如果目标设备以NVIDIA显卡为主,nvidia-smi是最精准的显存获取工具:
# 检查nvidia-smi是否存在 $nvidiaSmiPath = "${env:ProgramFiles}\NVIDIA Corporation\NVSMI\nvidia-smi.exe" if (Test-Path $nvidiaSmiPath) { $gpuInfo = & $nvidiaSmiPath --query-gpu=name,memory.total --format=csv,noheader,nounits $maxVRAM = 0 $selectedGPUName = "None" foreach ($line in $gpuInfo) { $parts = $line -split "," | ForEach-Object { $_.Trim() } $gpuName = $parts[0] $vramGB = [math]::round([int]$parts[1] / 1024) if ($vramGB -gt $maxVRAM) { $maxVRAM = $vramGB $selectedGPUName = $gpuName } } } else { # 无NVIDIA显卡时自动 fallback 到dxdiag方法(可插入方法1的核心代码) } # 后续模型选择逻辑同方法1
方法3:使用可打包的轻量第三方工具
如果需要将工具打包进安装包,推荐使用GPU-Z CLI(免费便携版,无需安装):
# 假设GPUZ.exe放在项目根目录 $gpuData = .\GPUZ.exe -dumpjson -log temp.json $gpuInfo = Get-Content temp.json | ConvertFrom-Json $maxVRAM = 0 $selectedGPUName = "None" foreach ($gpu in $gpuInfo.gpus) { if ($gpu.name -notmatch "Microsoft Remote Display Adapter") { $vramGB = [math]::round($gpu.memory.total / 1GB) if ($vramGB -gt $maxVRAM) { $maxVRAM = $vramGB $selectedGPUName = $gpu.name } } } # 清理临时文件 Remove-Item temp.json -Force # 模型选择逻辑同前
方法4:优化原注册表匹配逻辑
如果坚持使用原思路,可通过唯一标识符PNPDeviceID关联显卡与注册表项,避免DriverDesc匹配错误:
function ConvertTo-GB { param ([double]$bytes) return [math]::round($bytes / 1GB) } $gpus = Get-CimInstance Win32_VideoController | Where-Object { $_.Name -notmatch "Microsoft Remote Display Adapter" -and $_.Status -eq "OK" } $maxVRAM = 0 $selectedGPU = $null # 遍历注册表显卡项,提取PNPDeviceID和显存 $regPaths = Get-ChildItem "HKLM:\SYSTEM\ControlSet001\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}" | Where-Object { $_.PSChildName -match "^0" } $regData = @() foreach ($path in $regPaths) { $props = Get-ItemProperty $path.PSPath -ErrorAction SilentlyContinue if ($props.PNPDeviceID -and $props.HardwareInformation.qwMemorySize) { $regData += [PSCustomObject]@{ PNPDeviceID = $props.PNPDeviceID VRAMBytes = $props.HardwareInformation.qwMemorySize[0] } } } # 通过PNPDeviceID精准匹配显卡与显存 foreach ($gpu in $gpus) { $match = $regData | Where-Object { $_.PNPDeviceID -eq $gpu.PNPDeviceID } if ($match) { $vram = ConvertTo-GB $match.VRAMBytes if ($vram -gt $maxVRAM) { $maxVRAM = $vram $selectedGPU = $gpu } } else { Write-Warning "无法匹配显卡:$($gpu.Name)的注册表数据" } } # 模型选择与结果输出 if ($selectedGPU) { switch ($maxVRAM) { { $_ -lt 2 } { $model = "base" } { $_ -lt 5 } { $model = "small" } { $_ -lt 10 } { $model = "medium" } default { $model = "large-v3" } } $result = [PSCustomObject]@{ "显卡名称" = $selectedGPU.Caption "显存(GB)" = $maxVRAM "推荐Whisper模型" = $model } } else { $result = [PSCustomObject]@{ "显卡名称" = "无可用显卡" "显存(GB)" = 0 "推荐Whisper模型" = "base" } } $result | Format-Table -AutoSize
内容的提问来源于stack exchange,提问作者SkayDev
相关产品推荐
相关产品推荐

