You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 01:05:54