-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathvalidate-npu-workaround.ps1
More file actions
111 lines (87 loc) · 4.46 KB
/
validate-npu-workaround.ps1
File metadata and controls
111 lines (87 loc) · 4.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
$logFile = "c:\Users\leestott\Foundry-Local-Lab\foundry-validation.log"
$csproj = "c:\Users\leestott\Foundry-Local-Lab\csharp\csharp.csproj"
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
# Write header
@"
==============================================================================
Foundry Local - WinML / QNN EP Validation Log
Date: $timestamp
Hardware: Snapdragon X Elite (ARM64) - X1E78100
OS: Windows 11 ARM64
SDK: Microsoft.AI.Foundry.Local v0.9.0
WinML: Microsoft.AI.Foundry.Local.WinML v0.9.0
CLI: Foundry Local v0.8.117
.NET SDK: 9.0.312
==============================================================================
CONTEXT: QNN is a plugin execution provider delivered through the WinML
package. Adding Microsoft.AI.Foundry.Local.WinML to the .csproj enables
the QNN EP, allowing NPU model variants to load directly on ARM devices.
FILES WITH WinML PACKAGE REFERENCE (3 .csproj files):
- csharp/csharp.csproj
- zava-creative-writer-local/src/csharp/ZavaCreativeWriter.csproj
- zava-creative-writer-local/src/csharp-web/ZavaCreativeWriterWeb.csproj
==============================================================================
VALIDATION RESULTS
==============================================================================
"@ | Set-Content $logFile -Encoding UTF8
$samples = @("chat", "agent", "rag", "multi", "eval")
$summaryData = @()
foreach ($sample in $samples) {
Write-Host "`nRunning sample: $sample ..." -ForegroundColor Cyan
"`n--- Sample: $sample ---" | Add-Content $logFile
"Started: $(Get-Date -Format 'HH:mm:ss')" | Add-Content $logFile
"" | Add-Content $logFile
$output = & dotnet run --project $csproj -- $sample 2>&1 | Out-String
$exitCode = $LASTEXITCODE
$output | Add-Content $logFile
"" | Add-Content $logFile
"Exit code: $exitCode" | Add-Content $logFile
"Ended: $(Get-Date -Format 'HH:mm:ss')" | Add-Content $logFile
$modelMatch = [regex]::Match($output, "Loaded model: (.+)")
$modelName = if ($modelMatch.Success) { $modelMatch.Groups[1].Value.Trim() } else { "(unknown)" }
$qnnLoaded = $output -match "qnn-npu" -or $output -match "QNNExecutionProvider"
if ($qnnLoaded) {
"QNN EP: LOADED (NPU variant selected via WinML)" | Add-Content $logFile
} elseif ($output -match "QNN execution provider is not supported") {
"QNN EP: FAILED (WinML package may be missing)" | Add-Content $logFile
} else {
"QNN EP: NOT APPLICABLE (model loaded without NPU variant)" | Add-Content $logFile
}
$status = if ($exitCode -eq 0) { "PASS" } else { "FAIL" }
$summaryData += [PSCustomObject]@{
Sample = $sample
QNN = if ($qnnLoaded) { "YES" } else { "NO" }
Model = $modelName
ExitCode = $exitCode
Status = $status
}
Write-Host " $sample => Exit: $exitCode | QNN via WinML: $(if ($qnnLoaded) {'YES'} else {'NO'}) | $status" -ForegroundColor $(if ($exitCode -eq 0) { "Green" } else { "Red" })
}
# Write summary table
@"
==============================================================================
SUMMARY TABLE
==============================================================================
Sample QNN via WinML Model Loaded Exit Status
--------------- --------------- --------------------------------------- ------ ------
"@ | Add-Content $logFile
foreach ($row in $summaryData) {
"{0,-15} {1,-15} {2,-39} {3,-6} {4}" -f $row.Sample, $row.QNN, $row.Model, $row.ExitCode, $row.Status | Add-Content $logFile
}
$allPass = ($summaryData | Where-Object { $_.Status -ne "PASS" }).Count -eq 0
$qnnCount = ($summaryData | Where-Object { $_.QNN -eq "YES" }).Count
@"
==============================================================================
CONCLUSION
==============================================================================
Samples run: $($summaryData.Count)
QNN EP loaded via WinML: $qnnCount / $($summaryData.Count)
Overall result: $(if ($allPass) { 'ALL PASSED' } else { 'SOME FAILED' })
The Microsoft.AI.Foundry.Local.WinML package provides the QNN execution
provider as a plugin EP. On this ARM64 device, the NPU variant loads
directly without requiring a CPU fallback workaround.
==============================================================================
"@ | Add-Content $logFile
Write-Host "`n==========================================" -ForegroundColor Green
Write-Host "Validation complete. Log: $logFile" -ForegroundColor Green
Write-Host "==========================================" -ForegroundColor Green