-
Notifications
You must be signed in to change notification settings - Fork 299
268 lines (246 loc) · 11.4 KB
/
Copy pathtest_component.yml
File metadata and controls
268 lines (246 loc) · 11.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
# Copyright Advanced Micro Devices, Inc.
# SPDX-License-Identifier: MIT
name: Test component
on:
workflow_call:
inputs:
artifact_run_id:
type: string
default: ""
artifact_group:
type: string
amdgpu_families:
type: string
amdgpu_targets:
type: string
default: ""
test_runs_on:
type: string
platform:
type: string
component:
type: string
release_type:
type: string
default: ci
repository:
description: "Repository to checkout. Defaults to github.repository."
type: string
ref:
description: "Branch, tag, or SHA to checkout. Defaults to the triggering ref."
type: string
build_variant:
description: "Build variant (e.g., release, asan). Used to skip tests incompatible with certain builds."
type: string
default: "release"
default_container_image:
type: string
default: "ghcr.io/rocm/no_rocm_image_ubuntu24_04@sha256:4150afe4759d14822f0e3f8930e1124f26e11f68b5c7b91ec9a02b20b1ebbb98"
permissions:
contents: read
jobs:
notify_quartz_start:
if: ${{ vars.NOTIFY_QUARTZ_ENABLED == 'true' }}
name: "Quartz - started - test ROCm component"
runs-on: ubuntu-24.04
timeout-minutes: 10
continue-on-error: true
steps:
- name: "Quartz - started - test ROCm component"
uses: ROCm/Quartz/.github/actions/notify_quartz@b47e20b7539b407072a0c2249ab5e8d9983fac4e # notify_quartz/v1.1.0
with:
run_phase: started
reporting_workflow: test_component.yml
workflow_inputs: ${{ toJSON(inputs) }}
gh_app_client_id: ${{ secrets.GH_APP_HAULY_CID }}
gh_app_private_key: ${{ secrets.GH_APP_HAULY_PRIVATE_KEY }}
test_component:
name: >-
Test ${{ fromJSON(inputs.component).job_name }}
(shard ${{ matrix.shard }}/${{ fromJSON(inputs.component).total_shards }})
(${{ inputs.amdgpu_families }})
${{ fromJSON(inputs.component).expect_failure == true && '(xfail)' || '' }}
runs-on: ${{ inputs.test_runs_on }}
continue-on-error: ${{ fromJSON(inputs.component).expect_failure == true }}
timeout-minutes: 210
outputs:
summary: ${{ steps.summary.outputs.summary }}
container:
# If the component has specified an alternate image, honor that option.
# Otherwise use the default image.
image: >-
${{ inputs.platform == 'linux' &&
(fromJSON(inputs.component).container_image || inputs.default_container_image)
|| null
}}
# Container options are configured in build_tools/github_actions/fetch_test_configurations.py
# and include base options (ipc, user, ulimit, seccomp), GPU options (devices, groups),
# and any job-specific options
options: ${{ fromJSON(inputs.component).container_options }}
strategy:
fail-fast: false
matrix:
# The shard array is based on "total_shards" from "fetch_test_configurations.py"
# The test executable will shard based on the array. (ex: [1, 2, 3, 4] = four test shards)
shard: ${{ fromJSON(inputs.component).shard_arr }}
defaults:
run:
shell: bash
env:
VENV_DIR: ${{ github.workspace }}/.venv
ARTIFACT_RUN_ID: "${{ inputs.artifact_run_id != '' && inputs.artifact_run_id || github.run_id }}"
OUTPUT_ARTIFACTS_DIR: "./build"
THEROCK_BIN_DIR: "./build/bin"
AMDGPU_FAMILIES: ${{ inputs.amdgpu_families }}
AMDGPU_TARGETS: ${{ inputs.amdgpu_targets }}
ARTIFACT_GROUP: ${{ inputs.artifact_group }}
BUILD_VARIANT: ${{ inputs.build_variant }}
# Benchmark results database API endpoints for performance metrics collection
# NOTE: These secrets are only required for benchmark results submission in nightly CI runs.
# For PR/push workflows, secret retrieval will fail gracefully and benchmarks will skip API submission.
BENCHMARK_DB_URL: ${{ secrets.BENCHMARK_DB_URL }}
BENCHMARK_DB_FALLBACK_URL: ${{ secrets.BENCHMARK_DB_FALLBACK_URL }}
steps:
- name: "Fetch 'build_tools' from repository"
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: ${{ inputs.repository || github.repository }}
ref: ${{ inputs.ref }}
sparse-checkout: build_tools
path: "prejob"
- name: Pre-job cleanup processes on Windows
if: ${{ runner.os == 'Windows' }}
timeout-minutes: 5
shell: powershell
run: . '${{ github.workspace }}\prejob\build_tools\github_actions\cleanup_processes.ps1'
- name: Pre-job cleanup GPU processes on Linux
if: ${{ runner.os == 'Linux' }}
timeout-minutes: 5
run: bash ./prejob/build_tools/github_actions/cleanup_processes.sh
- name: Checking repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: ${{ inputs.repository || github.repository }}
ref: ${{ inputs.ref }}
- name: Run setup test environment workflow
timeout-minutes: 15
env:
RETRY_THIS_STEP: "true"
STEP_TIMEOUT_MINUTES: "15" # should match timeout-minutes specified above at this step
uses: './.github/actions/setup_test_environment'
with:
ARTIFACT_RUN_ID: ${{ env.ARTIFACT_RUN_ID }}
# TODO(#3381): revert back to `inputs.artifact_group` once issue is resolved
ARTIFACT_GROUP: ${{ inputs.amdgpu_families }}
AMDGPU_TARGETS: ${{ inputs.amdgpu_targets }}
OUTPUT_ARTIFACTS_DIR: ${{ env.OUTPUT_ARTIFACTS_DIR }}
VENV_DIR: ${{ env.VENV_DIR }}
FETCH_ARTIFACT_ARGS: ${{ fromJSON(inputs.component).fetch_artifact_args }}
RELEASE_TYPE: ${{ inputs.release_type }}
# safe.directory must be set before Runner Health Status
- name: Adjust git config
run: |
git config --global --add safe.directory $PWD
git config fetch.parallel 10
- name: Runner health status
run: |
python ./build_tools/health_status.py
- name: Driver / GPU sanity check
timeout-minutes: 3
run: |
python ./build_tools/print_driver_gpu_info.py
- name: Setup Additional Requirements
if: ${{ fromJSON(inputs.component).additional_requirements_files != '' }}
run: |
python ./build_tools/install_additional_requirements.py \
--requirements-files ${{ join(fromJSON(inputs.component).additional_requirements_files, ',') }}
# TODO(#3755): Clean this up after final sanitizer environment variable flags are determined
- name: Enable sanitizer-specific test flags
if: ${{ contains(inputs.artifact_group, 'asan') }}
run: |
echo "ASAN_OPTIONS=detect_odr_violation=0:quarantine_size_mb=600" >> $GITHUB_ENV
echo "HSA_XNACK=1" >> $GITHUB_ENV
echo "ASAN_SYMBOLIZER_PATH=${{ env.OUTPUT_ARTIFACTS_DIR }}/llvm/bin/llvm-symbolizer" >> $GITHUB_ENV
# Set thread limits from KUBE_CPU_REQUEST (Kubernetes-injected) to avoid oversubscription.
# Must be done at runtime since container env vars aren't in GitHub's env context.
- name: Set thread limits
run: |
if [[ -n "${KUBE_CPU_REQUEST:-}" ]]; then
CPU_COUNT="${KUBE_CPU_REQUEST%.*}"
echo "OPENBLAS_NUM_THREADS=${CPU_COUNT}" >> $GITHUB_ENV
echo "OMP_NUM_THREADS=${CPU_COUNT}" >> $GITHUB_ENV
echo "Thread limits set: OPENBLAS_NUM_THREADS=${CPU_COUNT}, OMP_NUM_THREADS=${CPU_COUNT} (from KUBE_CPU_REQUEST=${KUBE_CPU_REQUEST})"
else
echo "KUBE_CPU_REQUEST not set, thread limits not configured"
fi
- name: Test
id: test
timeout-minutes: ${{ fromJSON(inputs.component).timeout_minutes }}
env:
SHARD_INDEX: ${{ matrix.shard }}
TOTAL_SHARDS: ${{ fromJSON(inputs.component).total_shards }}
TEST_TYPE: ${{ fromJSON(inputs.component).test_type }}
TEST_COMPONENT: ${{ fromJSON(inputs.component).job_name }}
ROCM_KPACK_DEBUG: "1"
# Windows hip-tests (PAL=1, ROCR=0) set this via matrix; other components
# leave it empty. #3587
# An empty GPU_ENABLE_PAL is misread as ROCr on Windows (atoi("")==0),
# whose Windows memory path OOMs some tests (e.g. rocsparse bsr*0 graph_test).
# Default unset components to the platform backend, mirroring the runtime fix
# in ROCm/rocm-systems#8050 (Windows -> PAL, Linux -> ROCr).
GPU_ENABLE_PAL: ${{ fromJSON(inputs.component).gpu_enable_pal || (inputs.platform == 'windows' && '1' || '0') }}
RETRY_THIS_STEP: "true"
RETRY_COUNT: "1"
RETRY_DELAY: "7"
STEP_TIMEOUT_MINUTES: ${{ fromJSON(inputs.component).timeout_minutes }}
STEP_NAME: >-
Test ${{ fromJSON(inputs.component).job_name }}
(shard ${{ matrix.shard }}/${{ fromJSON(inputs.component).total_shards }})
(${{ inputs.amdgpu_families }})
${{ fromJSON(inputs.component).expect_failure == true && '(xfail)' || '' }}
run: |
${{ fromJSON(inputs.component).test_script }}
- name: Print test reproduction command
if: ${{ failure() && steps.test.outcome == 'failure' }}
run: |
python ./build_tools/github_actions/reproduce_test_failure.py \
--run-id "${{ env.ARTIFACT_RUN_ID }}" \
--repository "${{ github.repository }}" \
--amdgpu-family "${{ inputs.amdgpu_families }}" \
--amdgpu-targets "${{ inputs.amdgpu_targets }}" \
--test-script "${{ fromJSON(inputs.component).test_script }}" \
--shard-index "${{ matrix.shard }}" \
--total-shards "${{ fromJSON(inputs.component).total_shards }}" \
--test-type "${{ fromJSON(inputs.component).test_type }}" \
--print-cmd \
${{ fromJSON(inputs.component).fetch_artifact_args && format('--fetch-artifact-args="{0}"', fromJSON(inputs.component).fetch_artifact_args) || '' }}
- name: Post-job cleanup GPU processes on Linux
if: ${{ always() && runner.os == 'Linux' }}
timeout-minutes: 5
run: bash ./build_tools/github_actions/cleanup_processes.sh
- name: Post-job cleanup processes on Windows
if: ${{ always() && runner.os == 'Windows' }}
timeout-minutes: 5
shell: powershell
run: . '${{ github.workspace }}\build_tools\github_actions\cleanup_processes.ps1'
- name: Capture job summary
id: summary
if: always()
run: python build_tools/github_actions/capture_job_summary.py
notify_quartz_completed:
if: ${{ always() && vars.NOTIFY_QUARTZ_ENABLED == 'true' }}
needs: [test_component]
name: "Quartz - completed - test ROCm component"
runs-on: ubuntu-24.04
timeout-minutes: 10
continue-on-error: true
steps:
- name: "Quartz - completed - test ROCm component"
uses: ROCm/Quartz/.github/actions/notify_quartz@b47e20b7539b407072a0c2249ab5e8d9983fac4e # notify_quartz/v1.1.0
with:
run_phase: completed
reporting_workflow: test_component.yml
workflow_inputs: ${{ toJSON(inputs) }}
workflow_captured_outputs: ${{ toJSON(needs) }}
gh_app_client_id: ${{ secrets.GH_APP_HAULY_CID }}
gh_app_private_key: ${{ secrets.GH_APP_HAULY_PRIVATE_KEY }}