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: