Skip to content
Merged
Show file tree
Hide file tree
Changes from 19 commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
bc7349b
Update
GregoryComer Sep 5, 2025
223d5d6
Update
GregoryComer Sep 5, 2025
ed8a859
Update
GregoryComer Sep 5, 2025
774f59f
Update
GregoryComer Sep 5, 2025
51137cd
Update
GregoryComer Sep 5, 2025
4410ca1
Update
GregoryComer Sep 5, 2025
d6d1c31
Update
GregoryComer Sep 5, 2025
bdad6bb
Update
GregoryComer Sep 5, 2025
5d3597e
Update
GregoryComer Sep 5, 2025
6443b44
Update
GregoryComer Sep 5, 2025
f30b0bf
Update
GregoryComer Sep 5, 2025
db1e176
Update
GregoryComer Sep 10, 2025
1d00f65
Update
GregoryComer Sep 10, 2025
311e536
Update
GregoryComer Sep 10, 2025
26e4aaf
Update
GregoryComer Sep 10, 2025
5a156c9
Update
GregoryComer Sep 11, 2025
4e35585
Update
GregoryComer Sep 11, 2025
cfadc8b
Update
GregoryComer Sep 11, 2025
d8bde7d
Update
GregoryComer Sep 11, 2025
3cd1021
Update
GregoryComer Sep 11, 2025
f4e54ae
Update
GregoryComer Sep 11, 2025
c152b3f
Update
GregoryComer Sep 11, 2025
e670dfc
Update
GregoryComer Sep 11, 2025
6a55adc
Update
GregoryComer Sep 11, 2025
9235cfd
Update
GregoryComer Sep 11, 2025
569446d
Update
GregoryComer Sep 11, 2025
1233680
Update
GregoryComer Sep 11, 2025
a6181ef
Update
GregoryComer Sep 11, 2025
274a9b4
Update
GregoryComer Sep 11, 2025
bd5faf0
Update
GregoryComer Sep 11, 2025
4a50cab
Update
GregoryComer Sep 11, 2025
a00566c
Update
GregoryComer Sep 11, 2025
70ee95b
Update
GregoryComer Sep 11, 2025
8f42f77
Update
GregoryComer Sep 11, 2025
e72370f
Update
GregoryComer Sep 13, 2025
9a8b717
Update
GregoryComer Sep 13, 2025
c2e85c0
Update
GregoryComer Sep 13, 2025
f3218ac
Update
GregoryComer Sep 13, 2025
e72553e
Update
GregoryComer Sep 13, 2025
7b79d5a
Update
GregoryComer Sep 13, 2025
48ee73d
Update
GregoryComer Sep 13, 2025
b5c85f7
Update
GregoryComer Sep 16, 2025
88dc7d0
Update
GregoryComer Sep 16, 2025
6b9c467
Update
GregoryComer Sep 16, 2025
e2e063c
Update
GregoryComer Sep 16, 2025
4834225
Update
GregoryComer Sep 16, 2025
8581f01
Update
GregoryComer Sep 16, 2025
d0afba5
Update
GregoryComer Sep 16, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion .ci/scripts/test_backend_linux.sh
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,17 @@ if [[ "$FLOW" == *qnn* ]]; then
fi

if [[ "$FLOW" == *vulkan* ]]; then
# Setup swiftshader and Vulkan SDK which are required to build the Vulkan delegate
# Setup swiftshader and Vulkan SDK which are required to build the Vulkan delegate.
source .ci/scripts/setup-vulkan-linux-deps.sh

EXTRA_BUILD_ARGS+=" -DEXECUTORCH_BUILD_VULKAN=ON"
fi

if [[ "$FLOW" == *arm* ]]; then
# Setup ARM deps.
.ci/scripts/setup-arm-baremetal-tools.sh
fi

# We need the runner to test the built library.
PYTHON_EXECUTABLE=python CMAKE_ARGS="$EXTRA_BUILD_ARGS" .ci/scripts/setup-linux.sh --build-tool cmake --build-mode Release --editable true

Expand Down
79 changes: 79 additions & 0 deletions .github/workflows/_test_backend.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
name: Test Backend

on:
workflow_call:
inputs:
backend:
description: 'Backend to test (xnnpack, coreml, vulkan, qnn)'
required: true
type: string
flows:
description: 'JSON array of flows to test'
required: true
type: string
ref:
description: 'Git ref to checkout'
required: false
type: string
default: ${{ github.sha }}
timeout:
description: 'Job timeout in minutes'
required: false
type: number
default: 120
run-linux:
description: 'Whether to run Linux tests'
required: false
type: boolean
default: false
run-macos:
description: 'Whether to run macOS tests'
required: false
type: boolean
default: false

jobs:
test-backend-linux:
if: ${{ inputs.run-linux }}
strategy:
fail-fast: false
matrix:
flow: ${{ fromJSON(inputs.flows) }}
suite: [models, operators]

uses: pytorch/test-infra/.github/workflows/linux_job_v2.yml@main
with:
ref: ${{ inputs.ref }}
runner: linux.4xlarge.memory
docker-image: ci-image:executorch-ubuntu-22.04-clang12
submodules: recursive
timeout: ${{ inputs.timeout }}
upload-artifact: test-report-${{ matrix.flow }}-${{ matrix.suite }}
script: |
set -eux

source .ci/scripts/test_backend_linux.sh "${{ matrix.suite }}" "${{ matrix.flow }}" "${RUNNER_ARTIFACT_DIR}"

test-backend-macos:
if: ${{ inputs.run-macos }}
strategy:
fail-fast: false
matrix:
flow: ${{ fromJSON(inputs.flows) }}
suite: [models, operators]

uses: pytorch/test-infra/.github/workflows/macos_job.yml@main
with:
ref: ${{ inputs.ref }}
runner: macos-m1-stable
python-version: "3.12"
submodules: recursive
timeout: ${{ inputs.timeout }}
upload-artifact: test-report-${{ matrix.flow }}-${{ matrix.suite }}
script: |
set -eux

# This is needed to get the prebuilt PyTorch wheel from S3
${CONDA_RUN} --no-capture-output pip install awscli==1.37.21

source .ci/scripts/test_backend_macos.sh "${{ matrix.suite }}" "${{ matrix.flow }}" "${RUNNER_ARTIFACT_DIR}"
48 changes: 0 additions & 48 deletions .github/workflows/nightly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,51 +36,3 @@ jobs:
uses: ./.github/workflows/_link_check.yml
with:
ref: ${{ github.sha }}

backend-test-linux:
uses: pytorch/test-infra/.github/workflows/linux_job_v2.yml@main
strategy:
fail-fast: false
matrix:
flow: [
qnn, qnn_16a16w, qnn_16a8w, qnn_16a4w, qnn_16a4w_block, qnn_8a8w,
vulkan, vulkan_static_int8_per_channel,
xnnpack, xnnpack_dynamic_int8_per_channel, xnnpack_static_int8_per_channel, xnnpack_static_int8_per_tensor
]
suite: [models, operators]
with:
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
runner: linux.4xlarge.memory
docker-image: ci-image:executorch-ubuntu-22.04-clang12
submodules: recursive
timeout: 120
upload-artifact: test-report-${{ matrix.flow }}-${{ matrix.suite }}
script: |
set -eux

source .ci/scripts/test_backend_linux.sh "${{ matrix.suite }}" "${{ matrix.flow }}" "${RUNNER_ARTIFACT_DIR}"

backend-test-macos:
uses: pytorch/test-infra/.github/workflows/macos_job.yml@main
permissions:
id-token: write
contents: read
strategy:
fail-fast: false
matrix:
flow: [coreml, coreml_static_int8]
suite: [models, operators]
with:
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
runner: macos-m1-stable
python-version: 3.12
submodules: recursive
timeout: 120
upload-artifact: test-report-${{ matrix.flow }}-${{ matrix.suite }}
script: |
set -eux

# This is needed to get the prebuilt PyTorch wheel from S3
${CONDA_RUN} --no-capture-output pip install awscli==1.37.21

source .ci/scripts/test_backend_macos.sh "${{ matrix.suite }}" "${{ matrix.flow }}" "${RUNNER_ARTIFACT_DIR}"
27 changes: 27 additions & 0 deletions .github/workflows/test-backend-arm.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
name: Test ARM Backend

on:
schedule:
- cron: 0 2 * * *
push:
tags:
- ciflow/nightly/*
pull_request:
paths:
- .github/workflows/test-backend-arm.yml
- .github/workflows/_test_backend.yml
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}--${{ github.event.pull_request.number || github.sha }}-${{ github.event_name == 'workflow_dispatch' }}
cancel-in-progress: true

jobs:
test-arm:
uses: ./.github/workflows/_test_backend.yml
with:
backend: arm
flows: '["arm_tosa"]'
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
timeout: 120
run-linux: true
27 changes: 27 additions & 0 deletions .github/workflows/test-backend-coreml.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
name: Test CoreML Backend

on:
schedule:
- cron: 0 2 * * *
push:
tags:
- ciflow/nightly/*
pull_request:
paths:
- .github/workflows/test-backend-coreml.yml
- .github/workflows/_test_backend.yml
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}--${{ github.event.pull_request.number || github.sha }}-${{ github.event_name == 'workflow_dispatch' }}
cancel-in-progress: true

jobs:
test-coreml:
uses: ./.github/workflows/_test_backend.yml
with:
backend: coreml
flows: '["coreml", "coreml_static_int8"]'
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
timeout: 120
run-macos: true
27 changes: 27 additions & 0 deletions .github/workflows/test-backend-qnn.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
name: Test QNN Backend

on:
schedule:
- cron: 0 2 * * *
push:
tags:
- ciflow/nightly/*
pull_request:
paths:
- .github/workflows/test-backend-qnn.yml
- .github/workflows/_test_backend.yml
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}--${{ github.event.pull_request.number || github.sha }}-${{ github.event_name == 'workflow_dispatch' }}
cancel-in-progress: true

jobs:
test-qnn:
uses: ./.github/workflows/_test_backend.yml
with:
backend: qnn
flows: '["qnn", "qnn_16a16w", "qnn_16a8w", "qnn_16a4w", "qnn_16a4w_block", "qnn_8a8w"]'
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
timeout: 120
run-linux: true
27 changes: 27 additions & 0 deletions .github/workflows/test-backend-vulkan.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
name: Test Vulkan Backend

on:
schedule:
- cron: 0 2 * * *
push:
tags:
- ciflow/nightly/*
pull_request:
paths:
- .github/workflows/test-backend-vulkan.yml
- .github/workflows/_test_backend.yml
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}--${{ github.event.pull_request.number || github.sha }}-${{ github.event_name == 'workflow_dispatch' }}
cancel-in-progress: true

jobs:
test-vulkan:
uses: ./.github/workflows/_test_backend.yml
with:
backend: vulkan
flows: '["vulkan", "vulkan_static_int8_per_channel"]'
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
timeout: 120
run-linux: true
27 changes: 27 additions & 0 deletions .github/workflows/test-backend-xnnpack.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
name: Test XNNPACK Backend

on:
schedule:
- cron: 0 2 * * *
push:
tags:
- ciflow/nightly/*
pull_request:
paths:
- .github/workflows/test-backend-xnnpack.yml
- .github/workflows/_test_backend.yml
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}--${{ github.event.pull_request.number || github.sha }}-${{ github.event_name == 'workflow_dispatch' }}
cancel-in-progress: true

jobs:
test-xnnpack:
uses: ./.github/workflows/_test_backend.yml
with:
backend: xnnpack
flows: '["xnnpack", "xnnpack_dynamic_int8_per_channel", "xnnpack_static_int8_per_channel", "xnnpack_static_int8_per_tensor"]'
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
timeout: 120
run-linux: true
16 changes: 14 additions & 2 deletions backends/arm/test/tester/arm_tester.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@

from executorch.backends.arm.vgf_partitioner import VgfPartitioner

from executorch.backends.test.harness.error_statistics import ErrorStatistics
from executorch.backends.test.harness.stages import Stage, StageType
from executorch.backends.xnnpack.test.tester import Tester
from executorch.devtools.backend_debug import get_delegation_info
Expand Down Expand Up @@ -379,6 +380,7 @@ def to_edge_transform_and_lower(
transform_passes: Optional[
Union[Sequence[PassType], Dict[str, Sequence[PassType]]]
] = None,
generate_etrecord: bool = False,
):
if to_edge_and_lower_stage is None:
if partitioners is None:
Expand Down Expand Up @@ -412,7 +414,9 @@ def to_edge_transform_and_lower(
to_edge_and_lower_stage.partitioners = partitioners
if edge_compile_config is not None:
to_edge_and_lower_stage.edge_compile_conf = edge_compile_config
return super().to_edge_transform_and_lower(to_edge_and_lower_stage)
return super().to_edge_transform_and_lower(
to_edge_and_lower_stage, generate_etrecord=generate_etrecord
)

def to_executorch(self, to_executorch_stage: Optional[ToExecutorch] | None = None):
if to_executorch_stage is None:
Expand Down Expand Up @@ -443,6 +447,7 @@ def run_method_and_compare_outputs(
qtol=0,
error_callbacks=None,
run_eager_mode=False,
statistics_callback: Callable[[ErrorStatistics], None] | None = None,
):
"""
Compares the run_artifact output of 'stage' with the output of a reference stage.
Expand Down Expand Up @@ -698,10 +703,17 @@ def _compare_outputs(
rtol=1e-03,
qtol=0,
error_callbacks=None,
statistics_callback: Callable[[ErrorStatistics], None] | None = None,
):
try:
super()._compare_outputs(
reference_output, stage_output, quantization_scale, atol, rtol, qtol
reference_output,
stage_output,
quantization_scale,
atol,
rtol,
qtol,
statistics_callback=statistics_callback,
)
except AssertionError as e:
if error_callbacks is None:
Expand Down
20 changes: 19 additions & 1 deletion backends/test/suite/flow.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import logging

from dataclasses import dataclass
from dataclasses import dataclass, field
from typing import Callable

from executorch.backends.test.harness import Tester
Expand Down Expand Up @@ -35,6 +35,15 @@ class TestFlow:
is_delegated: bool = True
""" Indicates whether the flow is expected to generate CALL_DELEGATE nodes. """

skip_patterns: list[str] = field(default_factory=lambda: [])
""" Tests with names containing any substrings in this list are skipped. """

supports_serialize: bool = True
""" True if the test flow supports the Serialize stage. """

def should_skip_test(self, test_name: str) -> bool:
return any(pattern in test_name for pattern in self.skip_patterns)


def all_flows() -> dict[str, TestFlow]:
flows = []
Expand Down Expand Up @@ -109,4 +118,13 @@ def all_flows() -> dict[str, TestFlow]:
except Exception as e:
logger.info(f"Skipping QNN flow registration: {e}")

try:
from executorch.backends.test.suite.flows.arm import ARM_TOSA_FLOW

flows += [
ARM_TOSA_FLOW,
]
except Exception as e:
logger.info(f"Skipping ARM flow registration: {e}")

return {f.name: f for f in flows if f is not None}
Loading
Loading