diff --git a/.pipelines/mac-cpu-arm64-build.yml b/.pipelines/mac-cpu-arm64-build.yml index 4c6c59e544..ccaf40e813 100644 --- a/.pipelines/mac-cpu-arm64-build.yml +++ b/.pipelines/mac-cpu-arm64-build.yml @@ -190,12 +190,6 @@ jobs: displayName: 'Run the Java tests' workingDirectory: '$(Build.SourcesDirectory)' - - bash: | - set -e -x - rm -rf ort - displayName: 'Remove the ort lib and header files' - workingDirectory: '$(Build.SourcesDirectory)' - - bash: | ls -l $(Build.SourcesDirectory)/build/cpu/osx-arm64 ls -l $(Build.SourcesDirectory)/build/cpu/osx-arm64/wheel @@ -216,7 +210,7 @@ jobs: set -e -x export ORTGENAI_LOG_ORT_LIB=1 cd test/csharp - dotnet test /p:Configuration=Release /p:NativeBuildOutputDir="../../build/cpu/osx-arm64" --verbosity normal + dotnet test /p:Configuration=Release /p:NativeBuildOutputDir="../../build/cpu/osx-arm64" /p:OrtLibDir="../../ort/lib" --verbosity normal displayName: 'Build the C# API and run the C# tests' workingDirectory: '$(Build.SourcesDirectory)' diff --git a/.pipelines/nuget-publishing.yml b/.pipelines/nuget-publishing.yml index 4c493aedaf..08672549c4 100644 --- a/.pipelines/nuget-publishing.yml +++ b/.pipelines/nuget-publishing.yml @@ -83,7 +83,7 @@ parameters: type: string values: - '12.8' - - '13.0' + - '13.1' default: '12.8' - name: build_config diff --git a/.pipelines/pypl-publishing.yml b/.pipelines/pypl-publishing.yml index ae0e5634ad..d87c9ec1cc 100644 --- a/.pipelines/pypl-publishing.yml +++ b/.pipelines/pypl-publishing.yml @@ -19,8 +19,8 @@ parameters: type: boolean default: true - - name: enable_win_arm64_cpu - displayName: 'Whether Windows ARM64 CPU package is built.' + - name: enable_win_arm64 + displayName: 'Whether Windows ARM64 package is built.' type: boolean default: true @@ -54,6 +54,11 @@ parameters: type: string default: '2.1.1' + - name: ort_cuda_version + displayName: 'OnnxRuntime GPU version' + type: string + default: '1.23.0' + - name: cuda_versions displayName: 'CUDA versions' type: string @@ -115,11 +120,12 @@ extends: enable_win_x64_cpu: ${{ parameters.enable_win_x64_cpu }} enable_win_cuda: ${{ parameters.enable_win_cuda }} enable_win_dml: ${{ parameters.enable_win_dml }} - enable_win_arm64_cpu: ${{ parameters.enable_win_arm64_cpu }} + enable_win_arm64: ${{ parameters.enable_win_arm64 }} enable_macos_cpu: ${{ parameters.enable_macos_cpu }} cuda_versions: ${{ parameters.cuda_versions }} build_config: ${{ parameters.build_config }} enable_winml: ${{ parameters.enable_winml }} + ort_cuda_version: ${{ parameters.ort_cuda_version }} ${{ if eq(parameters.enable_winml, true) }}: ort_version: ${{ parameters.ort_winml_version }} ${{ else }}: @@ -136,7 +142,7 @@ extends: enable_win_x64_cpu: ${{ parameters.enable_win_x64_cpu }} enable_win_cuda: ${{ parameters.enable_win_cuda }} enable_win_dml: ${{ parameters.enable_win_dml }} - enable_win_arm64_cpu: ${{ parameters.enable_win_arm64_cpu }} + enable_win_arm64: ${{ parameters.enable_win_arm64 }} enable_macos_cpu: ${{ parameters.enable_macos_cpu }} cuda_versions: ${{ parameters.cuda_versions }} SpecificArtifact: false diff --git a/.pipelines/stages/capi-packaging-stage.yml b/.pipelines/stages/capi-packaging-stage.yml index 9ea8c777e4..e02d6b1a4f 100644 --- a/.pipelines/stages/capi-packaging-stage.yml +++ b/.pipelines/stages/capi-packaging-stage.yml @@ -67,6 +67,7 @@ stages: enable_winml: ${{ parameters.enable_winml }} ort_version: ${{ parameters.ort_winml_version }} build_config: ${{ parameters.build_config }} + cuda_version: ${{ parameters.cuda_version }} - ${{ if eq(parameters.enable_win_x64_cpu, true) }}: - template: jobs/capi-packaging-job.yml @@ -129,6 +130,19 @@ stages: ort_build_version: ${{ parameters.ort_build_version }} ort_build_source: ${{ parameters.ort_build_source }} + - ${{ if and(eq(parameters.enable_win_arm64, true), eq(parameters.enable_win_cuda, true)) }}: + - template: jobs/capi-packaging-job.yml + parameters: + arch: 'arm64' + cuda_version: ${{ parameters.cuda_version }} + ep: 'cuda' + ort_version: ${{ parameters.ort_cuda_version }} + os: 'win' + build_config: ${{ parameters.build_config }} + enable_winml: ${{ parameters.enable_winml }} + ort_build_version: ${{ parameters.ort_build_version }} + ort_build_source: ${{ parameters.ort_build_source }} + - ${{ if eq(parameters.enable_linux_x64_cpu, true) }}: - template: jobs/capi-packaging-job.yml parameters: diff --git a/.pipelines/stages/jobs/custom-nuget-packaging-job.yml b/.pipelines/stages/jobs/custom-nuget-packaging-job.yml index a32d80f3ed..e2f545396c 100644 --- a/.pipelines/stages/jobs/custom-nuget-packaging-job.yml +++ b/.pipelines/stages/jobs/custom-nuget-packaging-job.yml @@ -22,8 +22,8 @@ jobs: - template: steps/utils/flex-download-pipeline-artifact.yml parameters: - StepName: 'Download win-cpu-arm64 capi Artifacts' - ArtifactName: onnxruntime-genai-win-cpu-arm64-capi + StepName: 'Download win-cuda-arm64 capi Artifacts' + ArtifactName: onnxruntime-genai-win-cuda-arm64-capi TargetPath: '$(Build.BinariesDirectory)/artifact-downloads' - template: steps/utils/flex-download-pipeline-artifact.yml diff --git a/.pipelines/stages/jobs/nuget-packaging-job.yml b/.pipelines/stages/jobs/nuget-packaging-job.yml index afd3cb08dd..2c73f8155c 100644 --- a/.pipelines/stages/jobs/nuget-packaging-job.yml +++ b/.pipelines/stages/jobs/nuget-packaging-job.yml @@ -144,6 +144,13 @@ jobs: ArtifactName: onnxruntime-genai-win-cuda-x64-capi TargetPath: '$(Build.BinariesDirectory)/artifact-downloads' + - ${{ if and(eq(parameters.enable_win_arm64, true), eq(parameters.enable_win_cuda, true), eq(parameters.ep, 'cuda')) }}: + - template: steps/utils/flex-download-pipeline-artifact.yml + parameters: + StepName: 'Download win-cuda-arm64 capi Artifacts' + ArtifactName: onnxruntime-genai-win-cuda-arm64-capi + TargetPath: '$(Build.BinariesDirectory)/artifact-downloads' + - ${{ if and(eq(parameters.enable_win_dml, true), eq(parameters.ep, 'directml')) }}: - template: steps/utils/flex-download-pipeline-artifact.yml parameters: @@ -317,6 +324,19 @@ jobs: } } + if ('${{ parameters.ep }}' -eq 'cuda') { + $cudaExpected = @{} + if ('${{ parameters.enable_win_cuda }}' -eq 'True') { $cudaExpected['win-x64'] = 'onnxruntime-genai-cuda.dll' } + if ('${{ parameters.enable_win_arm64 }}' -eq 'True') { $cudaExpected['win-arm64'] = 'onnxruntime-genai-cuda.dll' } + if ('${{ parameters.enable_linux_cuda }}' -eq 'True') { $cudaExpected['linux-x64'] = 'libonnxruntime-genai-cuda.so' } + foreach ($rid in $cudaExpected.Keys) { + $lib = "$outputDir/$rid/$(buildConfig)/$($cudaExpected[$rid])" + if (-not (Test-Path $lib)) { + throw "Expected CUDA native library missing for enabled RID '$rid': $lib" + } + } + } + displayName: 'Extract Artifacts & Prepare Native Libraries' workingDirectory: '$(Build.BinariesDirectory)/artifact-downloads' diff --git a/.pipelines/stages/jobs/nuget-validation-job.yml b/.pipelines/stages/jobs/nuget-validation-job.yml index 651874addb..42f1ca6625 100644 --- a/.pipelines/stages/jobs/nuget-validation-job.yml +++ b/.pipelines/stages/jobs/nuget-validation-job.yml @@ -111,7 +111,7 @@ jobs: value: 'cpu_and_mobile/cpu-int4-rtn-block-32-acc-level-4' - name: cuda_docker_image - ${{ if eq(parameters.cuda_version, '13.0') }}: + ${{ if eq(parameters.cuda_version, '13.1') }}: value: onnxruntimebuildcache.azurecr.io/internal/azureml/onnxruntime/build/cuda13_x64_almalinux8_gcc14:20251107.1 ${{ else }}: value: onnxruntimebuildcache.azurecr.io/internal/azureml/onnxruntime/build/cuda12_x64_almalinux8_gcc12:20250714.2 diff --git a/.pipelines/stages/jobs/py-validation-job.yml b/.pipelines/stages/jobs/py-validation-job.yml index 82840a2a20..549f9f37d1 100644 --- a/.pipelines/stages/jobs/py-validation-job.yml +++ b/.pipelines/stages/jobs/py-validation-job.yml @@ -124,7 +124,7 @@ jobs: value: 'cpu_and_mobile/cpu-int4-rtn-block-32-acc-level-4' - name: cuda_docker_image - ${{ if eq(parameters.cuda_version, '13.0') }}: + ${{ if eq(parameters.cuda_version, '13.1') }}: value: onnxruntimebuildcache.azurecr.io/internal/azureml/onnxruntime/build/cuda13_x64_almalinux8_gcc14:20251107.1 ${{ else }}: value: onnxruntimebuildcache.azurecr.io/internal/azureml/onnxruntime/build/cuda12_x64_almalinux8_gcc12:20250714.2 diff --git a/.pipelines/stages/jobs/steps/capi-linux-step.yml b/.pipelines/stages/jobs/steps/capi-linux-step.yml index b5091e54c9..ce7113979a 100644 --- a/.pipelines/stages/jobs/steps/capi-linux-step.yml +++ b/.pipelines/stages/jobs/steps/capi-linux-step.yml @@ -52,7 +52,11 @@ steps: - bash: | set -e -x python3 -m pip install requests - python3 tools/ci_build/get_docker_image.py --dockerfile tools/ci_build/github/linux/docker/manylinux/Dockerfile.manylinux2_28_$(ep)_$(cuda_version) \ + cuda_dockerfile_version="$(cuda_version)" + if [[ "$(cuda_version)" == 13.* ]]; then + cuda_dockerfile_version="13" + fi + python3 tools/ci_build/get_docker_image.py --dockerfile tools/ci_build/github/linux/docker/manylinux/Dockerfile.manylinux2_28_$(ep)_$cuda_dockerfile_version \ --context tools/ci_build/github/linux/docker/manylinux \ --docker-build-args "--build-arg BUILD_UID=$( id -u )" \ --container-registry onnxruntimebuildcache \ @@ -161,15 +165,28 @@ steps: - ${{ if eq(parameters.target, 'onnxruntime-genai') }}: - script: | set -e -x + docker_env_args=() + if [ "$(ep)" = "cuda" ]; then + docker_env_args=(-e CMAKE_EXTRA_ARGS="$(CMAKE_EXTRA_ARGS)") + fi docker run \ --rm \ --volume $(Build.Repository.LocalPath):/ort_genai_src \ - -w /ort_genai_src/ ortgenai$(ep)build$(arch) \ - bash -c " \ - /usr/bin/cmake --preset linux_gcc_$(ep)_$(build_config) \ - -DENABLE_TESTS=OFF -DENABLE_PYTHON=OFF $(CMAKE_EXTRA_ARGS) $(ORT_HOME_CMAKE_ARG) && \ + -w /ort_genai_src/ \ + "${docker_env_args[@]}" \ + ortgenai$(ep)build$(arch) \ + bash -c ' + set -e -x + cmake_args=(-DENABLE_TESTS=OFF -DENABLE_PYTHON=OFF) + if [ -n "$CMAKE_EXTRA_ARGS" ]; then + eval "cmake_args+=($CMAKE_EXTRA_ARGS)" + fi + if [ "${{ parameters.ort_build_version }}" != "default" ]; then + cmake_args+=("-DORT_HOME=/ort_genai_src/ort_build") + fi + /usr/bin/cmake --preset linux_gcc_$(ep)_$(build_config) "${cmake_args[@]}" /usr/bin/cmake --build --preset linux_gcc_$(ep)_$(build_config) \ - --target onnxruntime-genai" + --target onnxruntime-genai' displayName: 'Build GenAi' workingDirectory: '$(Build.Repository.LocalPath)' @@ -252,4 +269,3 @@ steps: - script: | ls $(Build.Repository.LocalPath) -R displayName: 'List files from SourceDirectory' - diff --git a/.pipelines/stages/jobs/steps/capi-win-step.yml b/.pipelines/stages/jobs/steps/capi-win-step.yml index 7f10590842..b2aba89de6 100644 --- a/.pipelines/stages/jobs/steps/capi-win-step.yml +++ b/.pipelines/stages/jobs/steps/capi-win-step.yml @@ -64,10 +64,62 @@ steps: - powershell: | azcopy.exe cp --recursive "https://lotusscus.blob.core.windows.net/models/cuda_sdk/v$(cuda_version)" 'cuda_sdk' displayName: 'Download CUDA $(cuda_version)' - condition: or(eq(variables['ep'], 'cuda'), and(eq(variables['ep'], 'winml'), eq(variables['arch'], 'x64'))) + condition: and(eq(variables['arch'], 'x64'), or(eq(variables['ep'], 'cuda'), eq(variables['ep'], 'winml'))) workingDirectory: '$(Build.Repository.LocalPath)' -- ${{ if or(eq(parameters.ep, 'cuda'), and(eq(parameters.ep, 'winml'), eq(parameters.arch, 'x64'))) }}: +- powershell: | + Write-Host "Downloading Azure CLI..." + $azCliUrl = "https://aka.ms/installazurecliwindows" + $installerPath = "$(Agent.TempDirectory)\AzureCLI.msi" + Invoke-WebRequest -Uri $azCliUrl -OutFile $installerPath + Write-Host "Installing Azure CLI..." + Start-Process -FilePath "msiexec.exe" -ArgumentList "/i", $installerPath, "/quiet", "/norestart" -Wait + Write-Host "Azure CLI installed successfully" + # Add Azure CLI to PATH + $azCliBin = "C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin" + if (!(Test-Path $azCliBin)) { + Write-Error "Azure CLI install failed or path not found: $azCliBin" + exit 1 + } + $env:PATH = "$azCliBin;$env:PATH" + + Write-Host "Downloading AzCopy..." + $azcopyUrl = "https://aka.ms/downloadazcopy-v10-windows" + $azcopyZip = "$(Agent.TempDirectory)\azcopy.zip" + Invoke-WebRequest -Uri $azcopyUrl -OutFile $azcopyZip + $azcopyExtractPath = "$(Agent.TempDirectory)\azcopy" + Expand-Archive -Path $azcopyZip -DestinationPath $azcopyExtractPath -Force + # Find the actual azcopy.exe (it's in a versioned subfolder) + $azcopyExeFile = Get-ChildItem -Path $azcopyExtractPath -Name "azcopy.exe" -Recurse | Select-Object -First 1 + if (-not $azcopyExeFile) { + Write-Error "AzCopy executable not found after extraction" + exit 1 + } + $azcopyFullPath = Get-ChildItem -Path $azcopyExtractPath -Filter "azcopy.exe" -Recurse | Select-Object -First 1 + $azcopyDir = $azcopyFullPath.Directory.FullName + Write-Host "AzCopy found at: $azcopyDir" + $env:PATH = "$azcopyDir;$env:PATH" + + Write-Host "##vso[task.setvariable variable=PATH]$env:PATH" + # Verify installations + az --version + azcopy --version + displayName: 'Install Azure CLI and AzCopy' + condition: and(eq(variables['arch'], 'arm64'), or(eq(variables['ep'], 'winml'), eq(variables['ep'], 'cuda'))) + workingDirectory: '$(Build.Repository.LocalPath)' + +- ${{ if and(or(eq(parameters.ep, 'cuda'), eq(parameters.ep, 'winml')), eq(parameters.arch, 'arm64')) }}: + - task: AzureCLI@2 + displayName: 'Download CUDA $(cuda_version)' + inputs: + azureSubscription: 'ortcibuild_readonly_mi2-ONNX Runtime' + scriptType: batch + scriptLocation: inlineScript + inlineScript: | + set AZCOPY_AUTO_LOGIN_TYPE=AZCLI + azcopy cp --recursive "https://lotusscus.blob.core.windows.net/models/cuda_sdk/win-arm64/v$(cuda_version)" "cuda_sdk" + +- ${{ if or(eq(parameters.ep, 'cuda'), eq(parameters.ep, 'winml')) }}: - powershell: | if ('$(cuda_version)' -like '13.*') { $cuda_archs = "75-real;80-real;86-real;89-real;90-real;100-real;120-real;120-virtual" @@ -108,13 +160,13 @@ steps: condition: eq(variables['arch'], 'arm64') workingDirectory: '$(Build.Repository.LocalPath)' -- ${{ if ne(parameters.ort_build_version, 'default') }}: +- ${{ if or(ne(parameters.ort_build_version, 'default'), and(eq(parameters.ep, 'cuda'), eq(parameters.arch, 'arm64'))) }}: - powershell: | $ep = "$(ep)" $arch = "$(arch)" switch ($ep) { - "cuda" { $packageName = "Microsoft.ML.OnnxRuntime.Gpu.Windows" } + "cuda" { $packageName = if ($arch -eq "arm64") { "Microsoft.ML.OnnxRuntime" } else { "Microsoft.ML.OnnxRuntime.Gpu.Windows" } } "directml" { $packageName = "Microsoft.ML.OnnxRuntime.DirectML" } default { $packageName = "Microsoft.ML.OnnxRuntime" } } @@ -123,6 +175,13 @@ steps: $feedProject = "2692857e-05ef-43b4-ba9c-ccf1c22c437c" $feedId = "7982ae20-ed19-4a35-a362-a96ac99897b7" $version = "${{ parameters.ort_build_version }}" + if ($version -eq "default") { + $version = "$(ort_version)" + } + if ([string]::IsNullOrWhiteSpace($version)) { + Write-Error "ORT build version is empty. Set ort_build_version or pass the appropriate ORT version parameter for $ep/$arch." + exit 1 + } $source = "${{ parameters.ort_build_source }}" if ($source -eq "Ort-Nightly") { @@ -148,7 +207,8 @@ steps: # Copy headers # CUDA packages store headers in buildTransitive/native/include, while other # ORT packages (CPU, DML) use build/native/include per NuGet package layout. - if ($ep -eq "cuda") { + # CUDA arm64 currently builds against the CPU ORT package, which uses build/native/include. + if ($ep -eq "cuda" -and $arch -ne "arm64") { $headerSrc = "$extractPath\buildTransitive\native\include" } else { $headerSrc = "$extractPath\build\native\include" @@ -162,13 +222,13 @@ steps: Write-Host "ORT_HOME: $ortHome" Get-ChildItem "$ortHome" -Recurse | Select-Object FullName Write-Host "##vso[task.setvariable variable=ORT_HOME_CMAKE_ARG]-DORT_HOME=$ortHome" - displayName: 'Download ORT build package ${{ parameters.ort_build_version }}' + displayName: 'Download ORT build package' condition: ne(variables['ep'], 'winml') workingDirectory: '$(Build.Repository.LocalPath)' - powershell: | - cmake --preset windows_$(arch)_$(ep)_$(build_config) -DWINML_SDK_VERSION='$(ort_version)' - displayName: 'Configure CMake C API with WinML (arm64, NO CUDA) - $(ort_version)' + cmake --preset windows_$(arch)_$(ep)_$(build_config) -T cuda='$(Build.Repository.LocalPath)\cuda_sdk\v$(cuda_version)' -DWINML_SDK_VERSION='$(ort_version)' -DCMAKE_CUDA_ARCHITECTURES='$(cuda_archs)' + displayName: 'Configure CMake C API with WinML (arm64, WITH CUDA) - $(ort_version)' condition: and(eq(variables['ep'], 'winml'), eq(variables['arch'], 'arm64')) workingDirectory: '$(Build.Repository.LocalPath)' diff --git a/.pipelines/stages/nuget-packaging-stage.yml b/.pipelines/stages/nuget-packaging-stage.yml index c44f32243e..eb770a5c4b 100644 --- a/.pipelines/stages/nuget-packaging-stage.yml +++ b/.pipelines/stages/nuget-packaging-stage.yml @@ -105,6 +105,7 @@ stages: build_config: ${{ parameters.build_config }} enable_linux_cuda: ${{ parameters.enable_linux_cuda }} enable_win_cuda: ${{ parameters.enable_win_cuda }} + enable_win_arm64: ${{ parameters.enable_win_arm64 }} nuget_version_type: ${{ parameters.nuget_version_type }} - ${{ if eq(parameters.enable_win_dml, true) }}: - template: jobs/nuget-packaging-job.yml diff --git a/.pipelines/stages/py-packaging-stage.yml b/.pipelines/stages/py-packaging-stage.yml index 3d011667c6..c1090708aa 100644 --- a/.pipelines/stages/py-packaging-stage.yml +++ b/.pipelines/stages/py-packaging-stage.yml @@ -5,7 +5,7 @@ parameters: type: boolean - name: enable_win_dml type: boolean -- name: enable_win_arm64_cpu +- name: enable_win_arm64 type: boolean - name: enable_linux_x64_cpu type: boolean @@ -26,6 +26,9 @@ parameters: type: boolean - name: ort_version type: string +- name: ort_cuda_version + type: string + default: '' - name: ort_build_version type: string default: 'default' @@ -36,15 +39,15 @@ parameters: stages: - stage: python_packaging jobs: - - ${{ if and(eq(parameters.enable_winml, true), contains(parameters.cuda_versions, '13.0')) }}: + - ${{ if and(eq(parameters.enable_winml, true), contains(parameters.cuda_versions, '13.1')) }}: - template: jobs/py-packaging-job.yml parameters: enable_winml: true os: 'win' arch: 'x64' ep: 'winml' - cuda_version: '13.0' - cuda_display_version: '130' + cuda_version: '13.1' + cuda_display_version: '131' build_config: ${{ parameters.build_config }} ort_version: ${{ parameters.ort_version }} @@ -60,12 +63,14 @@ stages: build_config: ${{ parameters.build_config }} ort_version: ${{ parameters.ort_version }} - - ${{ if eq(parameters.enable_winml, true) }}: + - ${{ if and(eq(parameters.enable_winml, true), contains(parameters.cuda_versions, '13.1')) }}: - template: jobs/py-packaging-job.yml parameters: os: 'win' arch: 'arm64' ep: 'winml' + cuda_version: '13.1' + cuda_display_version: '131' build_config: ${{ parameters.build_config }} ort_version: ${{ parameters.ort_version }} @@ -80,7 +85,7 @@ stages: ort_build_version: ${{ parameters.ort_build_version }} ort_build_source: ${{ parameters.ort_build_source }} - - ${{ if eq(parameters.enable_win_arm64_cpu, true) }}: + - ${{ if eq(parameters.enable_win_arm64, true) }}: - template: jobs/py-packaging-job.yml parameters: arch: 'arm64' @@ -102,16 +107,29 @@ stages: ort_build_version: ${{ parameters.ort_build_version }} ort_build_source: ${{ parameters.ort_build_source }} - - ${{ if and(eq(parameters.enable_win_cuda, true), contains(parameters.cuda_versions, '13.0')) }}: + - ${{ if and(eq(parameters.enable_win_cuda, true), contains(parameters.cuda_versions, '13.1')) }}: - template: jobs/py-packaging-job.yml parameters: arch: 'x64' - cuda_version: '13.0' - cuda_display_version: '130' + cuda_version: '13.1' + cuda_display_version: '131' ep: 'cuda' os: 'win' build_config: ${{ parameters.build_config }} - ort_version: ${{ parameters.ort_version }} + ort_version: ${{ parameters.ort_cuda_version }} + ort_build_version: ${{ parameters.ort_build_version }} + ort_build_source: ${{ parameters.ort_build_source }} + + - ${{ if and(and(eq(parameters.enable_win_arm64, true), eq(parameters.enable_win_cuda, true)), contains(parameters.cuda_versions, '13.1')) }}: + - template: jobs/py-packaging-job.yml + parameters: + arch: 'arm64' + cuda_version: '13.1' + cuda_display_version: '131' + ep: 'cuda' + os: 'win' + build_config: ${{ parameters.build_config }} + ort_version: ${{ parameters.ort_cuda_version }} ort_build_version: ${{ parameters.ort_build_version }} ort_build_source: ${{ parameters.ort_build_source }} @@ -124,7 +142,20 @@ stages: ep: 'cuda' os: 'win' build_config: ${{ parameters.build_config }} - ort_version: ${{ parameters.ort_version }} + ort_version: ${{ parameters.ort_cuda_version }} + ort_build_version: ${{ parameters.ort_build_version }} + ort_build_source: ${{ parameters.ort_build_source }} + + - ${{ if and(and(eq(parameters.enable_win_arm64, true), eq(parameters.enable_win_cuda, true)), contains(parameters.cuda_versions, '12.8')) }}: + - template: jobs/py-packaging-job.yml + parameters: + arch: 'arm64' + cuda_version: '12.8' + cuda_display_version: '128' + ep: 'cuda' + os: 'win' + build_config: ${{ parameters.build_config }} + ort_version: ${{ parameters.ort_cuda_version }} ort_build_version: ${{ parameters.ort_build_version }} ort_build_source: ${{ parameters.ort_build_source }} @@ -150,12 +181,12 @@ stages: ort_build_version: ${{ parameters.ort_build_version }} ort_build_source: ${{ parameters.ort_build_source }} - - ${{ if and(eq(parameters.enable_linux_cuda, true), contains(parameters.cuda_versions, '13.0')) }}: + - ${{ if and(eq(parameters.enable_linux_cuda, true), contains(parameters.cuda_versions, '13.1')) }}: - template: jobs/py-packaging-job.yml parameters: arch: 'x64' - cuda_version: '13.0' - cuda_display_version: '130' + cuda_version: '13.1' + cuda_display_version: '131' ep: 'cuda' os: 'linux' build_config: ${{ parameters.build_config }} diff --git a/.pipelines/stages/py-validation-stage.yml b/.pipelines/stages/py-validation-stage.yml index 86ebed1dd8..79f9dd765d 100644 --- a/.pipelines/stages/py-validation-stage.yml +++ b/.pipelines/stages/py-validation-stage.yml @@ -13,7 +13,7 @@ parameters: type: boolean - name: enable_win_dml type: boolean -- name: enable_win_arm64_cpu +- name: enable_win_arm64 type: boolean - name: enable_linux_x64_cpu type: boolean @@ -41,7 +41,7 @@ stages: SpecificArtifact: ${{ parameters.SpecificArtifact }} BuildId: ${{ parameters.BuildId }} - - ${{ if eq(parameters.enable_win_arm64_cpu, true) }}: + - ${{ if eq(parameters.enable_win_arm64, true) }}: - template: jobs/py-validation-job.yml parameters: arch: 'arm64' @@ -59,12 +59,12 @@ stages: SpecificArtifact: ${{ parameters.SpecificArtifact }} BuildId: ${{ parameters.BuildId }} - - ${{ if and(eq(parameters.enable_win_cuda, true), contains(parameters.cuda_versions, '13.0')) }}: + - ${{ if and(eq(parameters.enable_win_cuda, true), contains(parameters.cuda_versions, '13.1')) }}: - template: jobs/py-validation-job.yml parameters: arch: 'x64' - cuda_version: '13.0' - cuda_display_version: '130' + cuda_version: '13.1' + cuda_display_version: '131' ep: 'cuda' os: 'win' SpecificArtifact: ${{ parameters.SpecificArtifact }} @@ -99,12 +99,12 @@ stages: SpecificArtifact: ${{ parameters.SpecificArtifact }} BuildId: ${{ parameters.BuildId }} - - ${{ if and(eq(parameters.enable_linux_cuda, true), contains(parameters.cuda_versions, '13.0')) }}: + - ${{ if and(eq(parameters.enable_linux_cuda, true), contains(parameters.cuda_versions, '13.1')) }}: - template: jobs/py-validation-job.yml parameters: arch: 'x64' - cuda_version: '13.0' - cuda_display_version: '130' + cuda_version: '13.1' + cuda_display_version: '131' ep: 'cuda' os: 'linux' SpecificArtifact: ${{ parameters.SpecificArtifact }} diff --git a/cmake/ortlib.cmake b/cmake/ortlib.cmake index 13d35cab78..1c471647e5 100644 --- a/cmake/ortlib.cmake +++ b/cmake/ortlib.cmake @@ -92,7 +92,11 @@ else() if(CMAKE_SYSTEM_NAME STREQUAL "Linux") set(ORT_PACKAGE_NAME "Microsoft.ML.OnnxRuntime.Gpu.Linux") elseif(WIN32) - set(ORT_PACKAGE_NAME "Microsoft.ML.OnnxRuntime.Gpu.Windows") + if (CMAKE_GENERATOR_PLATFORM STREQUAL "ARM64" OR CMAKE_GENERATOR_PLATFORM STREQUAL "arm64" OR CMAKE_GENERATOR_PLATFORM STREQUAL "ARM64EC") + set(ORT_PACKAGE_NAME "Microsoft.ML.OnnxRuntime") + else() + set(ORT_PACKAGE_NAME "Microsoft.ML.OnnxRuntime.Gpu.Windows") + endif() else() message(FATAL_ERROR "Unsupported platform for CUDA") endif() @@ -113,7 +117,11 @@ else() if(USE_DML) set(ORT_HEADER_DIR ${ortlib_SOURCE_DIR}/build/native/include) elseif(USE_CUDA) - set(ORT_HEADER_DIR ${ortlib_SOURCE_DIR}/buildTransitive/native/include) + if (WIN32 AND (CMAKE_GENERATOR_PLATFORM STREQUAL "ARM64" OR CMAKE_GENERATOR_PLATFORM STREQUAL "arm64" OR CMAKE_GENERATOR_PLATFORM STREQUAL "ARM64EC")) + set(ORT_HEADER_DIR ${ortlib_SOURCE_DIR}/build/native/include) + else() + set(ORT_HEADER_DIR ${ortlib_SOURCE_DIR}/buildTransitive/native/include) + endif() else() set(ORT_HEADER_DIR ${ortlib_SOURCE_DIR}/build/native/include) endif() diff --git a/cmake/presets/CMakeWinBuildPresets.json b/cmake/presets/CMakeWinBuildPresets.json index 0bccdbb539..a1e4f082fd 100644 --- a/cmake/presets/CMakeWinBuildPresets.json +++ b/cmake/presets/CMakeWinBuildPresets.json @@ -163,6 +163,26 @@ "name": "windows_arm64_directml_release", "configuration": "Release", "configurePreset": "windows_arm64_directml_release" + }, + { + "name": "windows_arm64_cuda_release", + "configuration": "Release", + "configurePreset": "windows_arm64_cuda_release" + }, + { + "name": "windows_arm64_cuda_debug", + "configuration": "Debug", + "configurePreset": "windows_arm64_cuda_debug" + }, + { + "name": "windows_arm64_cuda_relwithdebinfo", + "configuration": "RelWithDebInfo", + "configurePreset": "windows_arm64_cuda_relwithdebinfo" + }, + { + "name": "windows_arm64_cuda_minsizerel", + "configuration": "MinSizeRel", + "configurePreset": "windows_arm64_cuda_minsizerel" } ] } \ No newline at end of file diff --git a/cmake/presets/CMakeWinConfigPresets.json b/cmake/presets/CMakeWinConfigPresets.json index ba738ecd92..b7160ac64e 100644 --- a/cmake/presets/CMakeWinConfigPresets.json +++ b/cmake/presets/CMakeWinConfigPresets.json @@ -417,6 +417,7 @@ { "name": "windows_arm64_winml_relwithdebinfo", "inherits": [ + "windows_arm64_cuda_relwithdebinfo", "windows_arm64_directml_relwithdebinfo" ], "displayName": "windows arm64 winml relwithdebinfo", @@ -434,6 +435,58 @@ "displayName": "windows arm64 directml release", "binaryDir": "${sourceDir}/build/directml/win-arm64", "architecture": "arm64" + }, + { + "name": "windows_arm64_cuda_release", + "inherits": [ + "windows_release_default", + "windows_cuda_default" + ], + "displayName": "windows arm64 cuda release", + "binaryDir": "${sourceDir}/build/cuda/win-arm64", + "architecture": "arm64", + "cacheVariables": { + "USE_CUDA": "ON" + } + }, + { + "name": "windows_arm64_cuda_debug", + "inherits": [ + "windows_debug_default", + "windows_cuda_default" + ], + "displayName": "windows arm64 cuda debug", + "binaryDir": "${sourceDir}/build/cuda/win-arm64", + "architecture": "arm64", + "cacheVariables": { + "USE_CUDA": "ON" + } + }, + { + "name": "windows_arm64_cuda_relwithdebinfo", + "inherits": [ + "windows_relwithdebinfo_default", + "windows_cuda_default" + ], + "displayName": "windows arm64 cuda relwithdebinfo", + "binaryDir": "${sourceDir}/build/cuda/win-arm64", + "architecture": "arm64", + "cacheVariables": { + "USE_CUDA": "ON" + } + }, + { + "name": "windows_arm64_cuda_minsizerel", + "inherits": [ + "windows_minsizerel_default", + "windows_cuda_default" + ], + "displayName": "windows arm64 cuda minsizerel", + "binaryDir": "${sourceDir}/build/cuda/win-arm64", + "architecture": "arm64", + "cacheVariables": { + "USE_CUDA": "ON" + } } ] } \ No newline at end of file diff --git a/nuget/targets/netstandard/Microsoft.ML.OnnxRuntimeGenAI.props b/nuget/targets/netstandard/Microsoft.ML.OnnxRuntimeGenAI.props index 6a04ea5142..e88037608e 100644 --- a/nuget/targets/netstandard/Microsoft.ML.OnnxRuntimeGenAI.props +++ b/nuget/targets/netstandard/Microsoft.ML.OnnxRuntimeGenAI.props @@ -28,5 +28,12 @@ PreserveNewest false + + + onnxruntime-genai-cuda.dll + PreserveNewest + false + \ No newline at end of file diff --git a/test/python/macos/ort/requirements.txt b/test/python/macos/ort/requirements.txt index 83d2882e0f..fab84a1fc4 100644 --- a/test/python/macos/ort/requirements.txt +++ b/test/python/macos/ort/requirements.txt @@ -1,2 +1 @@ --i https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/ORT-Nightly/pypi/simple/ -onnxruntime==1.25.0.dev20260126001 \ No newline at end of file +onnxruntime==1.27.0 \ No newline at end of file diff --git a/tools/ci_build/github/linux/docker/manylinux/Dockerfile.manylinux2_28_cuda_13.0 b/tools/ci_build/github/linux/docker/manylinux/Dockerfile.manylinux2_28_cuda_13 similarity index 100% rename from tools/ci_build/github/linux/docker/manylinux/Dockerfile.manylinux2_28_cuda_13.0 rename to tools/ci_build/github/linux/docker/manylinux/Dockerfile.manylinux2_28_cuda_13 diff --git a/tools/nuget/generate_nuspec_for_custom_nuget.py b/tools/nuget/generate_nuspec_for_custom_nuget.py index bf2267969e..8dadb3de26 100644 --- a/tools/nuget/generate_nuspec_for_custom_nuget.py +++ b/tools/nuget/generate_nuspec_for_custom_nuget.py @@ -18,7 +18,11 @@ def generate_files(lines, args): "linux-arm64": args.linux_arm64, } - avoid_keywords = {"pdb", "onnxruntime-genai-cuda.dll", "onnxruntime-genai-cuda.lib"} + avoid_keywords = {"pdb"} + # The onnxruntime-genai-cuda.dll is shipped through a separate mechanism, so it is + # historically excluded from this package. On win-arm64 we currently include it. + # TODO: Remove the win-arm64 exception once the CUDA dll is shipped separately for win-arm64. + cuda_keyword = "onnxruntime-genai-cuda" processed_includes = set() for platform, platform_dir in platform_map.items(): for file in glob.glob(os.path.join(platform_dir, "lib", "*")): @@ -27,6 +31,8 @@ def generate_files(lines, args): file_name = os.path.basename(file) if any(keyword in file_name for keyword in avoid_keywords): continue + if cuda_keyword in file_name and platform != "win-arm64": + continue files_list.append(f'') diff --git a/tools/python/util/dependency_resolver.py b/tools/python/util/dependency_resolver.py index ffdc65a93c..2d4aef9241 100644 --- a/tools/python/util/dependency_resolver.py +++ b/tools/python/util/dependency_resolver.py @@ -39,7 +39,10 @@ def _lib_path(): if is_linux(): package_name = "Microsoft.ML.OnnxRuntime.Gpu.Linux" elif is_windows(): - package_name = "Microsoft.ML.OnnxRuntime.Gpu.Windows" + if is_windows_arm(): + package_name = "Microsoft.ML.OnnxRuntime" + else: + package_name = "Microsoft.ML.OnnxRuntime.Gpu.Windows" else: raise NotImplementedError("ORT with CUDA is not supported on this platform") elif use_dml: