From 0e11d0c4f81d430b9e2d882ae6a8f33a10c3c0c6 Mon Sep 17 00:00:00 2001 From: Hector Li Date: Mon, 13 May 2024 21:28:43 -0700 Subject: [PATCH] Enable Qnn nuget nightly (#20662) ### Description Enable Qnn nuget nightly --- cmake/onnxruntime_unittests.cmake | 4 +- .../c-api-noopenmp-packaging-pipelines.yml | 98 ++++- .../github/azure-pipelines/publish-nuget.yml | 5 + .../qnn-ep-nuget-packaging-pipeline.yml | 349 +++++------------- .../azure-pipelines/templates/qnn-ep-win.yml | 155 ++++++++ 5 files changed, 349 insertions(+), 262 deletions(-) create mode 100644 tools/ci_build/github/azure-pipelines/templates/qnn-ep-win.yml diff --git a/cmake/onnxruntime_unittests.cmake b/cmake/onnxruntime_unittests.cmake index 66df1158ec98e..45615b299ad91 100644 --- a/cmake/onnxruntime_unittests.cmake +++ b/cmake/onnxruntime_unittests.cmake @@ -876,9 +876,9 @@ if (MSVC) "$<$>:/wd26451>") target_compile_options(onnxruntime_test_all PRIVATE "$<$:SHELL:--compiler-options /wd4244>" "$<$>:/wd4244>") - # Avoid the error for Win arm64 Release build. error C1128: number of sections exceeded object file format limit: compile with /bigobj + # Avoid the error for Win arm64 build. error C1128: number of sections exceeded object file format limit: compile with /bigobj string(TOLOWER ${onnxruntime_target_platform} GEN_PLATFORM) - if (${GEN_PLATFORM} STREQUAL "arm64" AND "${CMAKE_BUILD_TYPE}" STREQUAL "Release") + if (${GEN_PLATFORM} STREQUAL "arm64") target_compile_options(onnxruntime_test_all PRIVATE "/bigobj") endif() else() diff --git a/tools/ci_build/github/azure-pipelines/c-api-noopenmp-packaging-pipelines.yml b/tools/ci_build/github/azure-pipelines/c-api-noopenmp-packaging-pipelines.yml index 4f645085c2906..1b7475311a1ce 100644 --- a/tools/ci_build/github/azure-pipelines/c-api-noopenmp-packaging-pipelines.yml +++ b/tools/ci_build/github/azure-pipelines/c-api-noopenmp-packaging-pipelines.yml @@ -68,6 +68,11 @@ parameters: - 11.8 - 12.2 +- name: QnnSdk + displayName: QNN SDK Version + type: string + default: 2.21.0.240401 + resources: repositories: - repository: onnxruntime-inference-examples # The name used to reference this repository in the checkout step @@ -768,4 +773,95 @@ stages: targetPath: '$(Build.ArtifactStagingDirectory)' - template: templates/component-governance-component-detection-steps.yml parameters: - condition: 'succeeded' \ No newline at end of file + condition: 'succeeded' + +- template: templates/qnn-ep-win.yml + parameters: + qnn_ep_build_pool_name: 'Onnxruntime-QNNEP-Windows-2022-CPU' + QnnSdk: ${{ parameters.QnnSdk }} + IsReleaseBuild: ${{ parameters.IsReleaseBuild }} + DoEsrp: ${{ parameters.DoEsrp }} + ArtifactName: 'drop-nuget-qnn-x64' + StageName: 'OnnxRuntime_QNN_Nuget_Win_x64' + build_config: 'RelWithDebInfo' +- template: templates/qnn-ep-win.yml + parameters: + qnn_ep_build_pool_name: 'Onnxruntime-QNNEP-Windows-2022-CPU' + QnnSdk: ${{ parameters.QnnSdk }} + IsReleaseBuild: ${{ parameters.IsReleaseBuild }} + DoEsrp: ${{ parameters.DoEsrp }} + ArtifactName: 'drop-nuget-qnn-arm64' + buildParameter: '--arm64' + buildPlatform: 'ARM64' + buildArch: 'ARM64' + StageName: 'OnnxRuntime_QNN_Nuget_Win_Arm64' + build_config: 'RelWithDebInfo' + +- stage: NuGet_Packaging_QNN + pool: 'Onnxruntime-QNNEP-Windows-2022-CPU' + dependsOn: + - OnnxRuntime_QNN_Nuget_Win_x64 + - OnnxRuntime_QNN_Nuget_Win_Arm64 + condition: succeeded() + jobs: + - job: + workspace: + clean: all + steps: + - task: DownloadPipelineArtifact@0 + displayName: 'Download Pipeline Artifact - QNN NuGet x64' + inputs: + artifactName: 'drop-nuget-qnn-x64' + targetPath: '$(Build.BinariesDirectory)/nuget-artifact-x64' + + - task: DownloadPipelineArtifact@0 + displayName: 'Download Pipeline Artifact - QNN NuGet arm64' + inputs: + artifactName: 'drop-nuget-qnn-arm64' + targetPath: '$(Build.BinariesDirectory)/nuget-artifact-arm64' + + - task: PowerShell@2 + displayName: 'Bundle NuGet' + inputs: + targetType: 'inline' + script: | + + $x64_nupkgs = (Get-ChildItem $(Build.BinariesDirectory)/nuget-artifact-x64 -Filter Microsoft.ML.OnnxRuntime.QNN*.nupkg -Recurse) + $nuget_package_name = $x64_nupkgs[0].Name + $x64_nuget_package = $x64_nupkgs[0].FullName + + $nupkg_unzipped_directory = [System.IO.Path]::Combine($Env:BUILD_ARTIFACTSTAGINGDIRECTORY, 'nuget_unzip_merged', [System.IO.Path]::GetFileNameWithoutExtension($nuget_package_name)) + + $x64_unzip_cmd = "7z.exe x $x64_nuget_package -y -o$nupkg_unzipped_directory" + Invoke-Expression -Command $x64_unzip_cmd + + $arm64_nupkgs = (Get-ChildItem $(Build.BinariesDirectory)/nuget-artifact-arm64 -Filter Microsoft.ML.OnnxRuntime.QNN*.nupkg -Recurse) + $arm64_nuget_package = $arm64_nupkgs[0].FullName + + $arm64_unzip_cmd = "7z.exe x $arm64_nuget_package -y -o$nupkg_unzipped_directory" + Invoke-Expression -Command $arm64_unzip_cmd + + $merged_nuget_path = [System.IO.Path]::Combine($Env:BUILD_ARTIFACTSTAGINGDIRECTORY, 'nuget-artifact-merged') + if (!(Test-Path $merged_nuget_path)) { + New-Item -Path $merged_nuget_path -ItemType Directory + } + + $merged_zip = [System.IO.Path]::Combine($merged_nuget_path, 'qnn_nuget.zip') + $zip_cmd = "7z.exe a -r $merged_zip $nupkg_unzipped_directory/*" + Invoke-Expression -Command $zip_cmd + + $merged_nuget = [System.IO.Path]::Combine($merged_nuget_path, $nuget_package_name) + move $merged_zip $merged_nuget + workingDirectory: $(Build.BinariesDirectory) + + - template: templates/esrp_nuget.yml + parameters: + DisplayName: 'ESRP - sign NuGet package' + FolderPath: '$(Build.ArtifactStagingDirectory)/nuget-artifact-merged' + DoEsrp: ${{ parameters.DoEsrp }} + + - task: PublishPipelineArtifact@0 + displayName: 'Publish Pipeline NuGet Artifact' + inputs: + artifactName: 'drop-signed-nuget-qnn' + targetPath: '$(Build.ArtifactStagingDirectory)/nuget-artifact-merged' \ No newline at end of file diff --git a/tools/ci_build/github/azure-pipelines/publish-nuget.yml b/tools/ci_build/github/azure-pipelines/publish-nuget.yml index 9f2797abc7377..e333bf363a263 100644 --- a/tools/ci_build/github/azure-pipelines/publish-nuget.yml +++ b/tools/ci_build/github/azure-pipelines/publish-nuget.yml @@ -101,6 +101,11 @@ stages: artifact: 'drop-signed-nuget-ROCm' - script: move "$(Pipeline.Workspace)\build\drop-signed-nuget-ROCm\*" $(Build.BinariesDirectory)\nuget-artifact\final-package + - download: build + displayName: 'Download Pipeline Artifact - Signed NuGet Qnn Package' + artifact: 'drop-signed-nuget-qnn' + - script: move "$(Pipeline.Workspace)\build\drop-signed-nuget-qnn\*" $(Build.BinariesDirectory)\nuget-artifact\final-package + - script: | dir $(Build.BinariesDirectory)\nuget-artifact\final-package cd $(Build.BinariesDirectory)\nuget-artifact\final-package diff --git a/tools/ci_build/github/azure-pipelines/qnn-ep-nuget-packaging-pipeline.yml b/tools/ci_build/github/azure-pipelines/qnn-ep-nuget-packaging-pipeline.yml index 18c3bb783e92d..22169ea5463f5 100644 --- a/tools/ci_build/github/azure-pipelines/qnn-ep-nuget-packaging-pipeline.yml +++ b/tools/ci_build/github/azure-pipelines/qnn-ep-nuget-packaging-pipeline.yml @@ -7,7 +7,7 @@ parameters: - name: build_config displayName: Build Configuration type: string - default: 'Release' + default: 'RelWithDebInfo' - name: IsReleaseBuild displayName: Is a release build? Set it to true if you are doing an Onnx Runtime release. @@ -19,266 +19,97 @@ parameters: type: boolean default: false -- name: runTests - displayName: Run ONNX Runtime unit tests? - type: boolean - default: true - -jobs: - - - job: OnnxRuntime_QNNNuget_Win_x64 - timeoutInMinutes: 120 - - pool: 'Onnxruntime-QNNEP-Windows-2022-CPU' - variables: - MsbuildArguments: '-detailedsummary -maxcpucount -consoleloggerparameters:PerformanceSummary' - OnnxRuntimeBuildDirectory: '$(Build.BinariesDirectory)' - DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true - buildArch: x64 - setVcvars: true - ALLOW_RELEASED_ONNX_OPSET_ONLY: '1' - commonBuildArgs: '--compile_no_warning_as_error --build_dir $(Build.BinariesDirectory)\Windows --skip_submodule_sync --build_shared_lib --cmake_generator "Visual Studio 17 2022" --config ${{ parameters.build_config }} --parallel --use_binskim_compliant_compile_flags ' - - steps: - - template: templates/set-version-number-variables-step.yml - - - task: NuGetAuthenticate@0 - inputs: - forceReinstallCredentialProvider: true - - - task: UsePythonVersion@0 - inputs: - versionSpec: '3.8' - addToPath: true - - - template: templates/jobs/download_win_qnn_sdk.yml - parameters: - QnnSDKVersion: ${{ parameters.QnnSdk }} - - - task: PythonScript@0 - displayName: 'Build onnxruntime for x64' - inputs: - scriptPath: '$(Build.SourcesDirectory)\tools\ci_build\build.py' - arguments: '--skip_tests --use_qnn --qnn_home $(QnnSDKRootDir) $(commonBuildArgs)' - - - task: PythonScript@0 - displayName: 'Run unit tests' - condition: and(succeeded(), eq('${{ parameters.runTests}}', true)) - inputs: - scriptPath: '$(Build.SourcesDirectory)\tools\ci_build\build.py' - arguments: '--test --use_qnn --qnn_home $(QnnSDKRootDir) $(commonBuildArgs)' - - - template: templates/win-esrp-dll.yml - parameters: - FolderPath: '$(Build.BinariesDirectory)\Windows\${{ parameters.build_config }}\${{ parameters.build_config }}' - DisplayName: 'ESRP - Sign dlls' - DoEsrp: ${{ parameters.DoEsrp }} - Pattern: 'onnxruntime.dll' - - - task: CmdLine@2 - displayName: 'Generating nuspec for the native Nuget package x64' - inputs: - script: | - python "$(Build.SourcesDirectory)\tools\nuget\generate_nuspec_for_native_nuget.py" --package_version $(OnnxRuntimeVersion) --package_name Microsoft.ML.OnnxRuntime.QNN --target_architecture x64 --build_config ${{ parameters.build_config }} --native_build_path=$(Build.BinariesDirectory)\Windows\${{ parameters.build_config }}\${{ parameters.build_config }} --packages_path $(Build.BinariesDirectory)\Windows\packages --ort_build_path $(Build.BinariesDirectory)\Windows --sources_path $(Build.SourcesDirectory) --commit_id $(OnnxRuntimeGitCommitHash) --is_release_build ${{ parameters.IsReleaseBuild }} --sdk_info qnn-v${{ parameters.QnnSdk }} - cd $(Build.BinariesDirectory)\Windows\${{ parameters.build_config }}\${{ parameters.build_config }} - nuget pack NativeNuget.nuspec - mkdir $(Build.ArtifactStagingDirectory)\x64 - copy $(Build.BinariesDirectory)\Windows\${{ parameters.build_config }}\${{ parameters.build_config }}\*.nupkg $(Build.ArtifactStagingDirectory)\x64 - - - task: PublishPipelineArtifact@0 - displayName: 'Publish Pipeline x64 NuGet Artifact' - inputs: - artifactName: 'drop-winnuget-x64' - targetPath: '$(Build.ArtifactStagingDirectory)/x64' - - - job: OnnxRuntime_QNNNuget_Win_Arm64 - timeoutInMinutes: 120 - - pool: 'Onnxruntime-QNNEP-Windows-2022-CPU' - variables: - MsbuildArguments: '-detailedsummary -maxcpucount -consoleloggerparameters:PerformanceSummary' - OnnxRuntimeBuildDirectory: '$(Build.BinariesDirectory)' - DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true - buildArch: x64 - setVcvars: true - ALLOW_RELEASED_ONNX_OPSET_ONLY: '1' - - steps: - - template: templates/set-version-number-variables-step.yml - - - task: NuGetAuthenticate@0 - inputs: - forceReinstallCredentialProvider: true - - - template: templates/jobs/download_win_qnn_sdk.yml - parameters: - QnnSDKVersion: ${{ parameters.QnnSdk }} - - - task: UsePythonVersion@0 - inputs: - versionSpec: '3.8' - addToPath: true - - - task: PythonScript@0 - displayName: 'Generate CMake Configuration for arm64' - inputs: - scriptPath: '$(Build.SourcesDirectory)\tools\ci_build\build.py' - arguments: '--update --arm64 --build_dir $(Build.BinariesDirectory)\Win_arm64 --skip_submodule_sync --skip_tests --build_shared_lib --cmake_generator "Visual Studio 17 2022" --config ${{ parameters.build_config }} --use_qnn --qnn_home $(QnnSDKRootDir) --parallel' - - - task: VSBuild@1 - displayName: 'Build onnxruntime arm64' - inputs: - solution: '$(Build.BinariesDirectory)\Win_arm64\${{ parameters.build_config }}\onnxruntime.vcxproj' - platform: ARM64 - configuration: ${{ parameters.build_config }} - msbuildArchitecture: ARM64 - maximumCpuCount: true - logProjectEvents: true - workingFolder: '$(Build.BinariesDirectory)\Win_arm64\${{ parameters.build_config }}' - createLogFile: true - - - task: VSBuild@1 - displayName: 'Build onnx_test_runner arm64' - inputs: - solution: '$(Build.BinariesDirectory)\Win_arm64\${{ parameters.build_config }}\onnx_test_runner.vcxproj' - platform: ARM64 - configuration: ${{ parameters.build_config }} - msbuildArchitecture: ARM64 - maximumCpuCount: true - logProjectEvents: true - workingFolder: '$(Build.BinariesDirectory)\Win_arm64\${{ parameters.build_config }}' - createLogFile: true - - - task: VSBuild@1 - displayName: 'Build onnxruntime_perf_test arm64' - inputs: - solution: '$(Build.BinariesDirectory)\Win_arm64\${{ parameters.build_config }}\onnxruntime_perf_test.vcxproj' - platform: ARM64 - configuration: ${{ parameters.build_config }} - msbuildArchitecture: ARM64 - maximumCpuCount: true - logProjectEvents: true - workingFolder: '$(Build.BinariesDirectory)\Win_arm64\${{ parameters.build_config }}' - createLogFile: true - - - - task: VSBuild@1 - displayName: 'Build onnxruntime_test_all arm64 (to copy Qnn libs)' - inputs: - solution: '$(Build.BinariesDirectory)\Win_arm64\${{ parameters.build_config }}\onnxruntime_test_all.vcxproj' - platform: ARM64 - configuration: ${{ parameters.build_config }} - msbuildArchitecture: ARM64 - maximumCpuCount: true - logProjectEvents: true - workingFolder: '$(Build.BinariesDirectory)\Win_arm64\${{ parameters.build_config }}' - createLogFile: true - - - template: templates/win-esrp-dll.yml - parameters: - FolderPath: '$(Build.BinariesDirectory)\Win_arm64\${{ parameters.build_config }}\${{ parameters.build_config }}' - DisplayName: 'ESRP - Sign dlls' - DoEsrp: ${{ parameters.DoEsrp }} - Pattern: 'onnxruntime.dll' - - - task: CmdLine@2 - displayName: 'Generating nuspec for the native Nuget package arm64' - inputs: - script: | - python "$(Build.SourcesDirectory)\tools\nuget\generate_nuspec_for_native_nuget.py" --package_version $(OnnxRuntimeVersion) --package_name Microsoft.ML.OnnxRuntime.QNN --target_architecture arm64 --build_config ${{ parameters.build_config }} --native_build_path=$(Build.BinariesDirectory)\Win_arm64\${{ parameters.build_config }}\${{ parameters.build_config }} --packages_path $(Build.BinariesDirectory)\Win_arm64\packages --ort_build_path $(Build.BinariesDirectory)\Win_arm64 --sources_path $(Build.SourcesDirectory) --commit_id $(OnnxRuntimeGitCommitHash) --is_release_build ${{ parameters.IsReleaseBuild }} --sdk_info qnn-v${{ parameters.QnnSdk }} - cd $(Build.BinariesDirectory)\Win_arm64\${{ parameters.build_config }}\${{ parameters.build_config }} - nuget pack NativeNuget.nuspec - mkdir $(Build.ArtifactStagingDirectory)\arm64 - copy $(Build.BinariesDirectory)\Win_arm64\${{ parameters.build_config }}\${{ parameters.build_config }}\*.nupkg $(Build.ArtifactStagingDirectory)\arm64 - - - task: PublishPipelineArtifact@0 - displayName: 'Publish Pipeline arm64 NuGet Artifact' - inputs: - artifactName: 'drop-winnuget-arm64' - targetPath: '$(Build.ArtifactStagingDirectory)/arm64' - - - job: NuGet_Packaging_QNN +stages: + +- template: templates/qnn-ep-win.yml + parameters: + qnn_ep_build_pool_name: 'Onnxruntime-QNNEP-Windows-2022-CPU' + QnnSdk: ${{ parameters.QnnSdk }} + IsReleaseBuild: ${{ parameters.IsReleaseBuild }} + DoEsrp: ${{ parameters.DoEsrp }} + ArtifactName: 'drop-nuget-qnn-x64' + StageName: 'OnnxRuntime_QNN_Nuget_Win_x64' + build_config: ${{ parameters.build_config }} + +- template: templates/qnn-ep-win.yml + parameters: + qnn_ep_build_pool_name: 'Onnxruntime-QNNEP-Windows-2022-CPU' + QnnSdk: ${{ parameters.QnnSdk }} + IsReleaseBuild: ${{ parameters.IsReleaseBuild }} + DoEsrp: ${{ parameters.DoEsrp }} + ArtifactName: 'drop-nuget-qnn-arm64' + buildParameter: '--arm64' + buildPlatform: 'ARM64' + buildArch: 'ARM64' + StageName: 'OnnxRuntime_QNN_Nuget_Win_Arm64' + build_config: ${{ parameters.build_config }} + +- stage: NuGet_Packaging_QNN + pool: 'Onnxruntime-QNNEP-Windows-2022-CPU' + dependsOn: + - OnnxRuntime_QNN_Nuget_Win_x64 + - OnnxRuntime_QNN_Nuget_Win_Arm64 + condition: succeeded() + jobs: + - job: workspace: clean: all - pool: 'Onnxruntime-QNNEP-Windows-2022-CPU' - dependsOn: - - OnnxRuntime_QNNNuget_Win_x64 - - OnnxRuntime_QNNNuget_Win_Arm64 - condition: succeeded() steps: - - - task: DownloadPipelineArtifact@0 - displayName: 'Download Pipeline Artifact - QNN NuGet x64' - inputs: - artifactName: 'drop-winnuget-x64' - targetPath: '$(Build.BinariesDirectory)/nuget-artifact-x64' + - task: DownloadPipelineArtifact@0 + displayName: 'Download Pipeline Artifact - QNN NuGet x64' + inputs: + artifactName: 'drop-nuget-qnn-x64' + targetPath: '$(Build.BinariesDirectory)/nuget-artifact-x64' + + - task: DownloadPipelineArtifact@0 + displayName: 'Download Pipeline Artifact - QNN NuGet arm64' + inputs: + artifactName: 'drop-nuget-qnn-arm64' + targetPath: '$(Build.BinariesDirectory)/nuget-artifact-arm64' + + - task: PowerShell@2 + displayName: 'Bundle NuGet' + inputs: + targetType: 'inline' + script: | + + $x64_nupkgs = (Get-ChildItem $(Build.BinariesDirectory)/nuget-artifact-x64 -Filter Microsoft.ML.OnnxRuntime.QNN*.nupkg -Recurse) + $nuget_package_name = $x64_nupkgs[0].Name + $x64_nuget_package = $x64_nupkgs[0].FullName + + $nupkg_unzipped_directory = [System.IO.Path]::Combine($Env:BUILD_ARTIFACTSTAGINGDIRECTORY, 'nuget_unzip_merged', [System.IO.Path]::GetFileNameWithoutExtension($nuget_package_name)) + + $x64_unzip_cmd = "7z.exe x $x64_nuget_package -y -o$nupkg_unzipped_directory" + Invoke-Expression -Command $x64_unzip_cmd + + $arm64_nupkgs = (Get-ChildItem $(Build.BinariesDirectory)/nuget-artifact-arm64 -Filter Microsoft.ML.OnnxRuntime.QNN*.nupkg -Recurse) + $arm64_nuget_package = $arm64_nupkgs[0].FullName + + $arm64_unzip_cmd = "7z.exe x $arm64_nuget_package -y -o$nupkg_unzipped_directory" + Invoke-Expression -Command $arm64_unzip_cmd + + $merged_nuget_path = [System.IO.Path]::Combine($Env:BUILD_ARTIFACTSTAGINGDIRECTORY, 'nuget-artifact-merged') + if (!(Test-Path $merged_nuget_path)) { + New-Item -Path $merged_nuget_path -ItemType Directory + } + + $merged_zip = [System.IO.Path]::Combine($merged_nuget_path, 'qnn_nuget.zip') + $zip_cmd = "7z.exe a -r $merged_zip $nupkg_unzipped_directory/*" + Invoke-Expression -Command $zip_cmd - - task: DownloadPipelineArtifact@0 - displayName: 'Download Pipeline Artifact - QNN NuGet arm64' - inputs: - artifactName: 'drop-winnuget-arm64' - targetPath: '$(Build.BinariesDirectory)/nuget-artifact-arm64' - - - task: PowerShell@2 - displayName: 'Bundle NuGet' - inputs: - targetType: 'inline' - script: | - Add-Type -AssemblyName "System.IO.Compression.FileSystem" - - $nupkgs = (Get-ChildItem $(Build.BinariesDirectory)/nuget-artifact-x64 -Filter Microsoft.ML.OnnxRuntime.QNN*.nupkg -Recurse) - $x64_nuget_package_name = $nupkgs[0].Name - $x64_nuget_package = $nupkgs[0].FullName - $x64_nupkg_unzipped_directory_root = $nupkgs[0].Directory.FullName - $x64_nupkg_unzipped_directory = [System.IO.Path]::Combine($x64_nupkg_unzipped_directory_root, 'binaries', [System.IO.Path]::GetFileNameWithoutExtension($x64_nuget_package)) - [System.IO.Compression.ZipFile]::ExtractToDirectory($x64_nuget_package, $x64_nupkg_unzipped_directory) - - $nupkgs = (Get-ChildItem $(Build.BinariesDirectory)/nuget-artifact-arm64 -Filter Microsoft.ML.OnnxRuntime.QNN*.nupkg -Recurse) - $arm64_nuget_package = $nupkgs[0].FullName - $arm64_nupkg_unzipped_directory_root = $nupkgs[0].Directory.FullName - $arm64_nupkg_unzipped_directory = [System.IO.Path]::Combine($arm64_nupkg_unzipped_directory_root, 'binaries', [System.IO.Path]::GetFileNameWithoutExtension($arm64_nuget_package)) - [System.IO.Compression.ZipFile]::ExtractToDirectory($arm64_nuget_package, $arm64_nupkg_unzipped_directory) - - $x64_runtime_path_old = [System.IO.Path]::Combine($x64_nupkg_unzipped_directory, 'runtimes', 'win-x64', 'native') - $x64_runtime_path_new = [System.IO.Path]::Combine($arm64_nupkg_unzipped_directory, 'runtimes', 'win-x64', 'native') - - New-Item -Path $x64_runtime_path_new -ItemType Directory - - Copy-Item ([System.IO.Path]::Combine($x64_runtime_path_old, 'onnxruntime.dll')) $x64_runtime_path_new - Copy-Item ([System.IO.Path]::Combine($x64_runtime_path_old, 'onnxruntime.lib')) $x64_runtime_path_new - Copy-Item ([System.IO.Path]::Combine($x64_runtime_path_old, 'onnx_test_runner.exe')) $x64_runtime_path_new - Copy-Item ([System.IO.Path]::Combine($x64_runtime_path_old, 'onnxruntime_perf_test.exe')) $x64_runtime_path_new - Copy-Item ([System.IO.Path]::Combine($x64_runtime_path_old, 'QnnCpu.dll')) $x64_runtime_path_new - Copy-Item ([System.IO.Path]::Combine($x64_runtime_path_old, 'QnnHtp.dll')) $x64_runtime_path_new - Copy-Item ([System.IO.Path]::Combine($x64_runtime_path_old, 'QnnSaver.dll')) $x64_runtime_path_new - - $merged_nuget_path = [System.IO.Path]::Combine($Env:BUILD_ARTIFACTSTAGINGDIRECTORY, 'merged') - if (!(Test-Path $merged_nuget_path)) { - New-Item -Path $merged_nuget_path -ItemType Directory - } - - $merged_nuget = [System.IO.Path]::Combine($merged_nuget_path, $x64_nuget_package_name) - - $zip_tool_directory = [System.IO.Path]::Combine($x64_nupkg_unzipped_directory_root, 'ziptool') - if (!(Test-Path $zip_tool_directory)) { - New-Item -Path $zip_tool_directory -ItemType Directory - } - - $zip_tool = [System.IO.Path]::Combine($zip_tool_directory, 'zip.exe') - - Invoke-WebRequest http://stahlworks.com/dev/zip.exe -OutFile $zip_tool - Start-Process -FilePath $zip_tool -ArgumentList "-r $merged_nuget ." -WorkingDirectory $arm64_nupkg_unzipped_directory -NoNewWindow -Wait - workingDirectory: $(Build.BinariesDirectory) - - - template: templates/esrp_nuget.yml - parameters: - DisplayName: 'ESRP - sign NuGet package' - FolderPath: '$(Build.ArtifactStagingDirectory)/merged' - DoEsrp: ${{ parameters.DoEsrp }} - - - task: PublishPipelineArtifact@0 - displayName: 'Publish Pipeline NuGet Artifact' - inputs: - artifactName: 'drop-winnuget' - targetPath: '$(Build.ArtifactStagingDirectory)/merged' + $merged_nuget = [System.IO.Path]::Combine($merged_nuget_path, $nuget_package_name) + move $merged_zip $merged_nuget + workingDirectory: $(Build.BinariesDirectory) + + - template: templates/esrp_nuget.yml + parameters: + DisplayName: 'ESRP - sign NuGet package' + FolderPath: '$(Build.ArtifactStagingDirectory)/nuget-artifact-merged' + DoEsrp: ${{ parameters.DoEsrp }} + + - task: PublishPipelineArtifact@0 + displayName: 'Publish Pipeline NuGet Artifact' + inputs: + artifactName: 'drop-signed-nuget-qnn' + targetPath: '$(Build.ArtifactStagingDirectory)/nuget-artifact-merged' diff --git a/tools/ci_build/github/azure-pipelines/templates/qnn-ep-win.yml b/tools/ci_build/github/azure-pipelines/templates/qnn-ep-win.yml new file mode 100644 index 0000000000000..e30a3f5ba2d8d --- /dev/null +++ b/tools/ci_build/github/azure-pipelines/templates/qnn-ep-win.yml @@ -0,0 +1,155 @@ +parameters: + QnnSdk: '2.21.0.240401' + build_config: 'RelWithDebInfo' + IsReleaseBuild: false + DoEsrp: false + qnn_ep_build_pool_name: 'Onnxruntime-QNNEP-Windows-2022-CPU' + ArtifactName: 'drop-nuget-qnn' + buildParameter: '' + OrtNugetPackageId: 'Microsoft.ML.OnnxRuntime.QNN' + buildPlatform: 'x64' + buildArch: 'x64' + StageName: 'OnnxRuntime_QNN_Nuget_Win_x64' + +stages: +- stage: ${{ parameters.StageName }} + dependsOn: [] + jobs: + - job: + timeoutInMinutes: 120 + + pool: ${{ parameters.qnn_ep_build_pool_name }} + variables: + ${{ if eq(parameters.buildArch, 'ARM64') }}: + targetArchitecture: 'arm64' + ${{ else }}: + targetArchitecture: ${{ parameters.buildArch }} + OrtPackageId: ${{ parameters.OrtNugetPackageId }} + commonBuildArgs: '--update --compile_no_warning_as_error --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --cmake_generator "Visual Studio 17 2022" --config ${{ parameters.build_config }} --parallel --use_binskim_compliant_compile_flags ${{ parameters.buildParameter }} ' + + steps: + - template: set-version-number-variables-step.yml + + - task: UsePythonVersion@0 + inputs: + versionSpec: '3.8' + addToPath: true + + - template: jobs/download_win_qnn_sdk.yml + parameters: + QnnSDKVersion: ${{ parameters.QnnSdk }} + + - task: PythonScript@0 + displayName: 'Generate project' + inputs: + scriptPath: '$(Build.SourcesDirectory)\tools\ci_build\build.py' + arguments: '--use_qnn --qnn_home $(QnnSDKRootDir) $(commonBuildArgs)' + + - task: VSBuild@1 + displayName: 'Build onnxruntime' + inputs: + solution: '$(Build.BinariesDirectory)\${{ parameters.build_config }}\onnxruntime.vcxproj' + platform: ${{ parameters.buildPlatform }} + configuration: ${{ parameters.build_config }} + msbuildArchitecture: ${{ parameters.buildArch }} + maximumCpuCount: true + logProjectEvents: true + workingFolder: '$(Build.BinariesDirectory)\${{ parameters.build_config }}' + createLogFile: true + + - task: VSBuild@1 + displayName: 'Build onnx_test_runner' + inputs: + solution: '$(Build.BinariesDirectory)\${{ parameters.build_config }}\onnx_test_runner.vcxproj' + platform: ${{ parameters.buildPlatform }} + configuration: ${{ parameters.build_config }} + msbuildArchitecture: ${{ parameters.buildArch }} + maximumCpuCount: true + logProjectEvents: true + workingFolder: '$(Build.BinariesDirectory)\${{ parameters.build_config }}' + createLogFile: true + + - task: VSBuild@1 + displayName: 'Build onnxruntime_perf_test' + inputs: + solution: '$(Build.BinariesDirectory)\${{ parameters.build_config }}\onnxruntime_perf_test.vcxproj' + platform: ${{ parameters.buildPlatform }} + configuration: ${{ parameters.build_config }} + msbuildArchitecture: ${{ parameters.buildArch }} + maximumCpuCount: true + logProjectEvents: true + workingFolder: '$(Build.BinariesDirectory)\${{ parameters.build_config }}' + createLogFile: true + + - task: VSBuild@1 + displayName: 'Build onnxruntime_test_all (to copy Qnn libs)' + inputs: + solution: '$(Build.BinariesDirectory)\${{ parameters.build_config }}\onnxruntime_test_all.vcxproj' + platform: ${{ parameters.buildPlatform }} + configuration: ${{ parameters.build_config }} + msbuildArchitecture: ${{ parameters.buildArch }} + maximumCpuCount: true + logProjectEvents: true + workingFolder: '$(Build.BinariesDirectory)\${{ parameters.build_config }}' + createLogFile: true + + - template: win-esrp-dll.yml + parameters: + FolderPath: '$(Build.BinariesDirectory)\${{ parameters.build_config }}\${{ parameters.build_config }}' + DisplayName: 'ESRP - Sign dlls' + DoEsrp: ${{ parameters.DoEsrp }} + Pattern: 'onnxruntime.dll' + + - task: MSBuild@1 + displayName: 'Restore NuGet Packages and create project.assets.json' + inputs: + solution: '$(Build.SourcesDirectory)\csharp\OnnxRuntime.CSharp.sln' + platform: 'Any CPU' + configuration: ${{ parameters.build_config }} + msbuildArguments: '-t:restore -p:OrtPackageId=$(OrtPackageId)' + workingDirectory: '$(Build.SourcesDirectory)\csharp' + + - task: MSBuild@1 + displayName: 'Build C# bindings' + inputs: + solution: '$(Build.SourcesDirectory)\csharp\OnnxRuntime.CSharp.sln' + platform: 'Any CPU' + configuration: ${{ parameters.build_config }} + msbuildArguments: '-p:OnnxRuntimeBuildDirectory="$(Build.BinariesDirectory)" -p:OrtPackageId=$(OrtPackageId) -p:IsReleaseBuild=${{ parameters.IsReleaseBuild }}' + workingDirectory: '$(Build.SourcesDirectory)\csharp' + + - ${{ if eq(parameters.DoEsrp, true) }}: + - template: win-esrp-dll.yml + parameters: + FolderPath: '$(Build.SourcesDirectory)\csharp\src\Microsoft.ML.OnnxRuntime\bin\${{ parameters.build_config }}' + DisplayName: 'ESRP - Sign C# dlls' + DoEsrp: ${{ parameters.DoEsrp }} + + - task: MSBuild@1 + displayName: 'Build Nuget Packages' + inputs: + solution: '$(Build.SourcesDirectory)\csharp\OnnxRuntime.CSharp.proj' + platform: 'Any CPU' + configuration: ${{ parameters.build_config }} + msbuildArguments: '-t:CreatePackage -p:OnnxRuntimeBuildDirectory="$(Build.BinariesDirectory)" -p:OrtPackageId=$(OrtPackageId) -p:IsReleaseBuild=${{ parameters.IsReleaseBuild }} -p:TargetArchitecture=${{ parameters.buildArch }}' + workingDirectory: '$(Build.SourcesDirectory)\csharp' + + - task: CopyFiles@2 + displayName: 'Copy native nuget package to: $(Build.ArtifactStagingDirectory)' + inputs: + SourceFolder: '$(Build.BinariesDirectory)\${{ parameters.build_config }}\${{ parameters.build_config }}' + Contents: '*.nupkg' + TargetFolder: '$(Build.ArtifactStagingDirectory)' + + - task: CopyFiles@2 + displayName: 'Copy native nuget symbols package to: $(Build.ArtifactStagingDirectory)' + inputs: + SourceFolder: '$(Build.BinariesDirectory)\${{ parameters.build_config }}\${{ parameters.build_config }}' + Contents: '*.snupkg' + TargetFolder: '$(Build.ArtifactStagingDirectory)' + + - task: PublishPipelineArtifact@0 + displayName: 'Publish Pipeline x64 NuGet Artifact' + inputs: + artifactName: ${{ parameters.ArtifactName }} + targetPath: '$(Build.ArtifactStagingDirectory)'