Skip to content

Commit 770afbf

Browse files
authored
[UR][CI] add manually triggered benchmark action (#17088)
This is a first step towards reenabling UR performance testing CI. This introduces the reusable yml workflow and a way to trigger it manually. Here's an example how it looks: pbalcer#2 (comment)
1 parent e4d65e0 commit 770afbf

File tree

6 files changed

+258
-5
lines changed

6 files changed

+258
-5
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
name: Benchmarks Reusable
2+
3+
on:
4+
workflow_call:
5+
inputs:
6+
str_name:
7+
required: true
8+
type: string
9+
pr_no:
10+
required: true
11+
# even though this is a number, this is a workaround for issues with
12+
# reusable workflow calls that result in "Unexpected value '0'" error.
13+
type: string
14+
bench_script_params:
15+
required: false
16+
type: string
17+
default: ''
18+
sycl_config_params:
19+
required: false
20+
type: string
21+
default: ''
22+
upload_report:
23+
required: false
24+
type: boolean
25+
default: false
26+
compute_runtime_commit:
27+
required: false
28+
type: string
29+
default: ''
30+
31+
permissions:
32+
contents: read
33+
pull-requests: write
34+
35+
jobs:
36+
bench-run:
37+
name: Build SYCL, Run Benchmarks
38+
strategy:
39+
matrix:
40+
adapter: [
41+
{str_name: "${{ inputs.str_name }}",
42+
sycl_config: "${{ inputs.sycl_config_params }}"
43+
}
44+
]
45+
build_type: [Release]
46+
compiler: [{c: clang, cxx: clang++}]
47+
48+
runs-on: "PVC_PERF"
49+
50+
steps:
51+
- name: Add comment to PR
52+
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
53+
if: ${{ always() && inputs.pr_no != 0 }}
54+
with:
55+
script: |
56+
const pr_no = '${{ inputs.pr_no }}';
57+
const adapter = '${{ matrix.adapter.str_name }}';
58+
const url = '${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}';
59+
const params = '${{ inputs.bench_script_params }}';
60+
const body = `Compute Benchmarks ${adapter} run (with params: ${params}):\n${url}`;
61+
62+
github.rest.issues.createComment({
63+
issue_number: pr_no,
64+
owner: context.repo.owner,
65+
repo: context.repo.repo,
66+
body: body
67+
})
68+
69+
- name: Checkout SYCL
70+
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
71+
with:
72+
path: sycl-repo
73+
74+
# We need to fetch special ref for proper PR's merge commit. Note, this ref may be absent if the PR is already merged.
75+
- name: Fetch PR's merge commit
76+
if: ${{ inputs.pr_no != 0 }}
77+
working-directory: ${{github.workspace}}/sycl-repo
78+
run: |
79+
git fetch -- https://github.com/${{github.repository}} +refs/pull/${{ inputs.pr_no }}/*:refs/remotes/origin/pr/${{ inputs.pr_no }}/*
80+
git checkout origin/pr/${{ inputs.pr_no }}/merge
81+
git rev-parse origin/pr/${{ inputs.pr_no }}/merge
82+
83+
- name: Install pip packages
84+
run: |
85+
pip install --force-reinstall -r ${{github.workspace}}/sycl-repo/unified-runtime/scripts/benchmarks/requirements.txt
86+
87+
- name: Configure SYCL
88+
run: >
89+
python3 sycl-repo/buildbot/configure.py
90+
-t ${{matrix.build_type}}
91+
-o ${{github.workspace}}/sycl_build
92+
--cmake-gen "Ninja"
93+
--cmake-opt="-DLLVM_INSTALL_UTILS=ON"
94+
--cmake-opt="-DSYCL_PI_TESTS=OFF"
95+
--cmake-opt=-DCMAKE_C_COMPILER_LAUNCHER=ccache
96+
--cmake-opt=-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
97+
${{matrix.adapter.sycl_config}}
98+
99+
- name: Build SYCL
100+
run: cmake --build ${{github.workspace}}/sycl_build -j $(nproc)
101+
102+
# We need a complete installed UR for compute-benchmarks.
103+
- name: Configure UR
104+
run: >
105+
cmake -DCMAKE_BUILD_TYPE=${{matrix.build_type}}
106+
-S${{github.workspace}}/sycl-repo/unified-runtime
107+
-B${{github.workspace}}/ur_build
108+
-DCMAKE_INSTALL_PREFIX=${{github.workspace}}/ur_install
109+
-DUR_BUILD_TESTS=OFF
110+
-DUR_BUILD_ADAPTER_L0=ON
111+
-DUR_BUILD_ADAPTER_L0_V2=ON
112+
-DUMF_DISABLE_HWLOC=ON
113+
114+
- name: Build UR
115+
run: cmake --build ${{github.workspace}}/ur_build -j $(nproc)
116+
117+
- name: Install UR
118+
run: cmake --install ${{github.workspace}}/ur_build
119+
120+
- name: Compute core range
121+
run: |
122+
# Compute the core range for the first NUMA node; second node is for UMF jobs.
123+
# Skip the first 4 cores - the kernel is likely to schedule more work on these.
124+
CORES="$(lscpu | awk '
125+
/NUMA node0 CPU|On-line CPU/ {line=$0}
126+
END {
127+
split(line, a, " ")
128+
split(a[4], b, ",")
129+
sub(/^0/, "4", b[1])
130+
print b[1]
131+
}')"
132+
echo "Selected core: $CORES"
133+
echo "CORES=$CORES" >> $GITHUB_ENV
134+
135+
ZE_AFFINITY_MASK=0
136+
echo "ZE_AFFINITY_MASK=$ZE_AFFINITY_MASK" >> $GITHUB_ENV
137+
138+
- name: Run benchmarks
139+
working-directory: ${{ github.workspace }}
140+
id: benchmarks
141+
run: >
142+
taskset -c "${{ env.CORES }}" ${{ github.workspace }}/sycl-repo/unified-runtime/scripts/benchmarks/main.py
143+
~/llvm_bench_workdir
144+
--sycl ${{ github.workspace }}/sycl_build
145+
--ur ${{ github.workspace }}/ur_install
146+
--adapter ${{ matrix.adapter.str_name }}
147+
--compare baseline
148+
--compute-runtime ${{ inputs.compute_runtime_commit }}
149+
--build-igc
150+
${{ inputs.upload_report && '--output-html' || '' }}
151+
${{ inputs.pr_no != 0 && '--output-markdown' || '' }}
152+
${{ inputs.bench_script_params }}
153+
154+
- name: Print benchmark results
155+
run: |
156+
cat ${{ github.workspace }}/benchmark_results.md || true
157+
158+
- name: Add comment to PR
159+
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
160+
if: ${{ always() && inputs.pr_no != 0 }}
161+
with:
162+
script: |
163+
let markdown = ""
164+
try {
165+
const fs = require('fs');
166+
markdown = fs.readFileSync('benchmark_results.md', 'utf8');
167+
} catch(err) {
168+
}
169+
170+
const pr_no = '${{ inputs.pr_no }}';
171+
const adapter = '${{ matrix.adapter.str_name }}';
172+
const url = '${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}';
173+
const test_status = '${{ steps.benchmarks.outcome }}';
174+
const job_status = '${{ job.status }}';
175+
const params = '${{ inputs.bench_script_params }}';
176+
const body = `Benchmarks ${adapter} run (${params}):\n${url}\nJob status: ${job_status}. Test status: ${test_status}.\n ${markdown}`;
177+
178+
github.rest.issues.createComment({
179+
issue_number: pr_no,
180+
owner: context.repo.owner,
181+
repo: context.repo.repo,
182+
body: body
183+
})
184+
185+
- name: Rename benchmark results file
186+
if: ${{ always() && inputs.upload_report }}
187+
run: mv benchmark_results.html benchmark_results_${{ inputs.pr_no }}.html
188+
189+
- name: Upload HTML report
190+
if: ${{ always() && inputs.upload_report }}
191+
uses: actions/cache/save@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0
192+
with:
193+
path: benchmark_results_${{ inputs.pr_no }}.html
194+
key: benchmark-results-${{ inputs.pr_no }}-${{ matrix.adapter.str_name }}-${{ github.run_id }}
195+
196+
- name: Get information about platform
197+
if: ${{ always() }}
198+
run: ${{github.workspace}}/sycl-repo/unified-runtime/.github/scripts/get_system_info.sh

.github/workflows/ur-benchmarks.yml

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
name: Benchmarks
2+
3+
on:
4+
workflow_dispatch:
5+
inputs:
6+
str_name:
7+
description: Adapter
8+
type: choice
9+
required: true
10+
default: 'level_zero'
11+
options:
12+
- level_zero
13+
- level_zero_v2
14+
pr_no:
15+
description: PR number (0 is sycl main branch)
16+
type: number
17+
required: true
18+
bench_script_params:
19+
description: Benchmark script arguments
20+
type: string
21+
required: false
22+
default: ''
23+
sycl_config_params:
24+
description: Extra params for SYCL configuration
25+
type: string
26+
required: false
27+
default: ''
28+
compute_runtime_commit:
29+
description: 'Compute Runtime commit'
30+
type: string
31+
required: false
32+
default: ''
33+
upload_report:
34+
description: 'Upload HTML report'
35+
type: boolean
36+
required: false
37+
default: false
38+
39+
permissions:
40+
contents: read
41+
pull-requests: write
42+
43+
jobs:
44+
manual:
45+
name: Compute Benchmarks
46+
uses: ./.github/workflows/ur-benchmarks-reusable.yml
47+
with:
48+
str_name: ${{ inputs.str_name }}
49+
pr_no: ${{ inputs.pr_no }}
50+
bench_script_params: ${{ inputs.bench_script_params }}
51+
sycl_config_params: ${{ inputs.sycl_config_params }}
52+
compute_runtime_commit: ${{ inputs.compute_runtime_commit }}
53+
upload_report: ${{ inputs.upload_report }}

unified-runtime/scripts/benchmarks/benches/oneapi.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
class OneAPI:
1313
# random unique number for benchmark oneAPI installation
14-
ONEAPI_BENCHMARK_INSTANCE_ID = 98765
14+
ONEAPI_BENCHMARK_INSTANCE_ID = 987654
1515

1616
def __init__(self):
1717
self.oneapi_dir = os.path.join(options.workdir, "oneapi")

unified-runtime/scripts/benchmarks/main.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -262,9 +262,7 @@ def main(directory, additional_env_vars, save_name, compare_names, filter):
262262
compare_names.append(saved_name)
263263

264264
if options.output_html:
265-
html_content = generate_html(
266-
history.runs, "oneapi-src/unified-runtime", compare_names
267-
)
265+
html_content = generate_html(history.runs, "intel/llvm", compare_names)
268266

269267
with open("benchmark_results.html", "w") as file:
270268
file.write(html_content)

unified-runtime/scripts/benchmarks/options.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class Options:
3737
build_compute_runtime: bool = False
3838
extra_ld_libraries: list[str] = field(default_factory=list)
3939
extra_env_vars: dict = field(default_factory=dict)
40-
compute_runtime_tag: str = "24.52.32224.10"
40+
compute_runtime_tag: str = "25.05.32567.12"
4141
build_igc: bool = False
4242
current_run_name: str = "This PR"
4343

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
matplotlib==3.9.2
2+
mpld3==0.5.10
3+
dataclasses-json==0.6.7
4+
PyYAML==6.0.1

0 commit comments

Comments
 (0)