-
Notifications
You must be signed in to change notification settings - Fork 12
228 lines (225 loc) · 8.58 KB
/
bench_ec2_reusable.yml
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
# SPDX-License-Identifier: Apache-2.0
name: bench-ec2-reusable
on:
workflow_call:
inputs:
name:
type: string
description: Alternative name of instance
default: Graviton2
ec2_instance_type:
type: string
description: Type if EC2 instance to benchmark on
default: t4g.small
ec2_ami:
type: string
description: Textual description of AMI
default: ubuntu-latest (aarch64)
ec2_ami_id:
type: string
description: AMI ID
default: ami-096ea6a12ea24a797
cflags:
type: string
description: Custom CFLAGS for compilation
default: ""
archflags:
type: string
description: Custom ARCH flags for compilation
default: -mcpu=neoverse-n1 -march=armv8.2-a
opt:
type: string
description: Runs with optimized code if enabled (opt, no_opt, all)
default: "opt"
perf:
type: string
description: Method by which clock cycles should be measured (PMU | PERF)
default: PERF
store_results:
type: boolean
description: Indicates if results should be pushed to github pages
default: false
verbose:
description: Determine for the log verbosity
type: boolean
default: false
bench_extra_args:
type: string
description: Additional command line to be appended to `bench` script
default: ''
compiler:
type: string
description: Compiler to use. When unset, default nix shell is used.
default: ''
additional_packages:
type: string
description: Additional packages to install when custom compiler is used.
default: ''
aws_region:
type: string
default: "us-east-1"
alert_threshold:
type: string
description: "Set alert threshold in percentage for benchmark result"
default: "103%"
env:
AWS_ROLE: arn:aws:iam::559050233797:role/mlkem-c-aarch64-gh-action
AMI_UBUNTU_LATEST_X86_64: ami-0e86e20dae9224db8
AMI_UBUNTU_LATEST_AARCH64: ami-096ea6a12ea24a797
permissions:
contents: read
pull-requests: read
jobs:
start-ec2-runner:
name: Start ${{ inputs.name }} (${{ inputs.ec2_instance_type }})
permissions:
contents: 'read'
id-token: 'write'
runs-on: ubuntu-latest
if: ${{ always() }} # The point is to make this step non-cancellable,
# avoiding race conditions where an instance is started,
# but isn't yet done registering as a runner and reporting back.
outputs:
label: ${{ steps.start-ec2-runner.outputs.label }}
ec2-instance-id: ${{ steps.start-ec2-runner.outputs.ec2-instance-id }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Determine AMI ID
id: det_ami_id
run: |
if [[ "${{ inputs.ec2_ami }}" == "ubuntu-latest (x86_64)" ]]; then
AMI_ID=${{ env.AMI_UBUNTU_LATEST_X86_64 }}
elif [[ "${{ inputs.ec2_ami }}" == "ubuntu-latest (aarch64)" ]]; then
AMI_ID=${{ env.AMI_UBUNTU_LATEST_AARCH64 }}
elif [[ "${{ inputs.ec2_ami }}" == "ubuntu-latest (custom AMI)" ]]; then
AMI_ID=${{ inputs.ec2_ami_id }}
fi
echo "Using AMI ID: $AMI_ID"
echo "AMI_ID=$AMI_ID" >> $GITHUB_OUTPUT
- name: Clear nix-installer action cache
uses: ./.github/actions/clear-cache
with:
key_prefix: determinatesystem-nix-installer-
repository: ${{ github.repository }}
gh_token: ${{ secrets.AWS_GITHUB_TOKEN }}
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2
with:
role-to-assume: ${{ env.AWS_ROLE }}
aws-region: ${{ inputs.aws_region }}
- name: Start EC2 runner
id: start-ec2-runner
uses: mkannwischer/ec2-github-runner@d15c8804522523d2bac7119a01ffff83b7795d87
with:
mode: start
github-token: ${{ secrets.AWS_GITHUB_TOKEN }}
ec2-image-id: ${{ steps.det_ami_id.outputs.AMI_ID }}
ec2-instance-type: ${{ inputs.ec2_instance_type }}
subnet-id: subnet-07b2729e5e065962f
security-group-id: sg-0ab2e297196c8c381
bench_nix:
name: Bench (nix)
permissions:
contents: write
pull-requests: write
runs-on: ${{ needs.start-ec2-runner.outputs.label }}
needs: start-ec2-runner # required to start the main job when the runner is ready
if: ${{ inputs.compiler == '' }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: ./.github/actions/bench
if: ${{ inputs.opt == 'all' || inputs.opt == 'opt' }}
with:
nix-verbose: ${{ inputs.verbose }}
name: ${{ inputs.name }}
cflags: ${{ inputs.cflags }}
archflags: ${{ inputs.archflags }}
opt: true
perf: ${{ inputs.perf }}
store_results: ${{ inputs.store_results }}
bench_extra_args: ${{ inputs.bench_extra_args }}
gh_token: ${{ secrets.AWS_GITHUB_TOKEN }}
- uses: ./.github/actions/bench
if: ${{ inputs.opt == 'all' || inputs.opt == 'no_opt' }}
with:
nix-verbose: ${{ inputs.verbose }}
name: ${{ inputs.name }} (no-opt)
cflags: ${{ inputs.cflags }}
archflags: ${{ inputs.archflags }}
opt: false
perf: ${{ inputs.perf }}
store_results: ${{ inputs.store_results }}
bench_extra_args: ${{ inputs.bench_extra_args }}
gh_token: ${{ secrets.AWS_GITHUB_TOKEN }}
alert_threshold: ${{ inputs.alert_threshold }}
bench_custom:
name: Bench (custom compiler)
permissions:
contents: write
pull-requests: write
runs-on: ${{ needs.start-ec2-runner.outputs.label }}
needs: start-ec2-runner # required to start the main job when the runner is ready
if: ${{ inputs.compiler != '' }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: ./.github/actions/setup-ubuntu
with:
packages: ${{ inputs.additional_packages }}
- name: Set compiler
run: |
echo "CC=${{ inputs.compiler }}" >> "$GITHUB_ENV"
- uses: ./.github/actions/bench
if: ${{ inputs.opt == 'all' || inputs.opt == 'opt' }}
with:
nix-shell: ''
custom-shell: 'bash'
nix-cache: false
nix-verbose: ${{ inputs.verbose }}
name: ${{ inputs.name }} (${{ inputs.compiler }})
cflags: ${{ inputs.cflags }}
archflags: ${{ inputs.archflags }}
opt: true
perf: ${{ inputs.perf }}
store_results: ${{ inputs.store_results }}
bench_extra_args: ${{ inputs.bench_extra_args }}
gh_token: ${{ secrets.AWS_GITHUB_TOKEN }}
- uses: ./.github/actions/bench
if: ${{ inputs.opt == 'all' || inputs.opt == 'no_opt' }}
with:
nix-shell: ''
custom-shell: 'bash'
nix-cache: false
nix-verbose: ${{ inputs.verbose }}
name: ${{ inputs.name }} (${{ inputs.compiler }}) (no-opt)
cflags: ${{ inputs.cflags }}
archflags: ${{ inputs.archflags }}
opt: false
perf: ${{ inputs.perf }}
store_results: ${{ inputs.store_results }}
bench_extra_args: ${{ inputs.bench_extra_args }}
gh_token: ${{ secrets.AWS_GITHUB_TOKEN }}
alert_threshold: ${{ inputs.alert_threshold }}
stop-ec2-runner:
name: Stop ${{ inputs.name }} (${{ inputs.ec2_instance_type }})
permissions:
contents: 'read'
id-token: 'write'
needs:
- start-ec2-runner
- bench_nix # required to wait when the main job is done
- bench_custom # required to wait when the main job is done
runs-on: ubuntu-latest
if: ${{ always() }} # required to stop the runner even if the error happened in the previous jobs
steps:
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2
with:
role-to-assume: ${{ env.AWS_ROLE }}
aws-region: ${{ inputs.aws_region }}
- name: Stop EC2 runner
uses: mkannwischer/ec2-github-runner@d15c8804522523d2bac7119a01ffff83b7795d87
with:
mode: stop
github-token: ${{ secrets.AWS_GITHUB_TOKEN }}
label: ${{ needs.start-ec2-runner.outputs.label }}
ec2-instance-id: ${{ needs.start-ec2-runner.outputs.ec2-instance-id }}