Skip to content

Commit eaeb483

Browse files
Merge branch 'pytorch:main' into win_build
2 parents c8beaf3 + 97b58bb commit eaeb483

File tree

82 files changed

+8594
-1027
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

82 files changed

+8594
-1027
lines changed

.ci/scripts/test_llama.sh

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,41 @@ set -exu
99
# shellcheck source=/dev/null
1010
source "$(dirname "${BASH_SOURCE[0]}")/utils.sh"
1111

12-
MODEL_NAME=$1 # stories110M
13-
BUILD_TOOL=$2 # buck2 or cmake
14-
DTYPE=$3 # fp16, bf16, or fp32
15-
MODE=${4:-"xnnpack+custom"} # portable or xnnpack+custom or xnnpack+custom+qe
16-
UPLOAD_DIR=${5:-}
12+
while [[ $# -gt 0 ]]; do
13+
case "$1" in
14+
-model)
15+
MODEL_NAME="$2" # stories110M
16+
shift 2
17+
;;
18+
-build_tool)
19+
BUILD_TOOL="$2" # buck2 or cmake
20+
shift 2
21+
;;
22+
-dtype)
23+
DTYPE="$2" # fp16, bf16, or fp32
24+
shift 2
25+
;;
26+
-mode)
27+
MODE="$2" # portable or xnnpack+custom or xnnpack+custom+qe
28+
shift 2
29+
;;
30+
-upload)
31+
UPLOAD_DIR="$2"
32+
shift 2
33+
;;
34+
*)
35+
echo "Unknown option: $1"
36+
usage
37+
;;
38+
esac
39+
done
40+
41+
# Default mode to xnnpack+custom if not set
42+
MODE=${MODE:-"xnnpack+custom"}
43+
44+
# Default UPLOAD_DIR to empty string if not set
45+
UPLOAD_DIR="${UPLOAD_DIR:-}"
46+
1747
if [[ $# -lt 4 ]]; then # Assuming 4 mandatory args
1848
echo "Expecting atleast 4 positional arguments"
1949
echo "Usage: [...]"
@@ -150,7 +180,7 @@ cleanup_files() {
150180
}
151181

152182
prepare_artifacts_upload() {
153-
if [ -n "$UPLOAD_DIR" ]; then
183+
if [ -n "${UPLOAD_DIR}" ]; then
154184
echo "Preparing for uploading generated artifacs"
155185
zip -j model.zip "${EXPORTED_MODEL_NAME}" tokenizer.bin
156186
mkdir -p "${UPLOAD_DIR}"

.github/workflows/pull.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ jobs:
117117
# Install requirements for export_llama
118118
PYTHON_EXECUTABLE=python bash examples/models/llama/install_requirements.sh
119119
# Test llama2
120-
PYTHON_EXECUTABLE=python bash .ci/scripts/test_llama.sh stories110M "${BUILD_TOOL}" "${DTYPE}" "${MODE}" "${ARTIFACTS_DIR_NAME}"
120+
PYTHON_EXECUTABLE=python bash .ci/scripts/test_llama.sh -model stories110M -build_tool "${BUILD_TOOL}" -dtype "${DTYPE}" -mode "${MODE}" -upload "${ARTIFACTS_DIR_NAME}"
121121
122122
test-llama-runner-linux-android:
123123
name: test-llama-runner-linux-android
@@ -393,7 +393,7 @@ jobs:
393393
# Install requirements for export_llama
394394
PYTHON_EXECUTABLE=python bash examples/models/llama/install_requirements.sh
395395
# Test llama2
396-
PYTHON_EXECUTABLE=python bash .ci/scripts/test_llama.sh stories110M "${BUILD_TOOL}" "${DTYPE}" "${MODE}"
396+
PYTHON_EXECUTABLE=python bash .ci/scripts/test_llama.sh -model stories110M -build_tool "${BUILD_TOOL}" -dtype "${DTYPE}" -mode "${MODE}"
397397
398398
test-phi-3-mini-runner-linux:
399399
name: test-phi-3-mini-runner-linux

.github/workflows/trunk.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ jobs:
261261
# Install requirements for export_llama
262262
PYTHON_EXECUTABLE=python ${CONDA_RUN} bash examples/models/llama/install_requirements.sh
263263
# Test llama2
264-
PYTHON_EXECUTABLE=python ${CONDA_RUN} bash .ci/scripts/test_llama.sh stories110M cmake "${DTYPE}" "${MODE}"
264+
PYTHON_EXECUTABLE=python ${CONDA_RUN} bash .ci/scripts/test_llama.sh -model stories110M -build_tool cmake -dtype "${DTYPE}" -mode "${MODE}"
265265
266266
# # TODO(jackzhxng): Runner consistently runs out of memory before test finishes. Try to find a more powerful runner.
267267
# test-llava-runner-macos:

CONTRIBUTING.md

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -283,10 +283,15 @@ for basics.
283283
- If the reviewers have requests or questions, follow up with them.
284284
- The goal of the reviewer is to ensure that the code in the `main` branch of
285285
the repo is consistent, maintainable, and of high quality.
286-
1. Once approved, your reviewer will import the PR into Meta's internal system
287-
and merge it from there.
288-
- If the PR is approved and not merged within a few business days, please
289-
comment on the PR to ask about its status.
286+
1. Once the PR has been approved,
287+
- If you have the "write permission" in this repo, you can merge it yourself
288+
by clicking the "Squash and merge" button once it is green and all CI
289+
signals are passing.
290+
- If you don't have "write permission" in this repo, the reviewer will take
291+
care of the PR. The reviewer may import the PR into Meta's internal system
292+
to validate it against internal CI.
293+
- If the PR is approved but not merged within 5 business days, please comment
294+
on the PR to ask about its status.
290295
- Note that if the `main` [CI](#continuous-integration) jobs are broken, we
291296
will only merge PRs that fix the broken jobs until all critical jobs are
292297
fixed.

backends/arm/test/common.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class arm_test_options(Enum):
2929
corstone300 = auto()
3030
dump_path = auto()
3131
date_format = auto()
32+
fast_fvp = auto()
3233

3334

3435
_test_options: dict[arm_test_options, Any] = {}
@@ -41,6 +42,7 @@ def pytest_addoption(parser):
4142
parser.addoption("--arm_run_corstone300", action="store_true")
4243
parser.addoption("--default_dump_path", default=None)
4344
parser.addoption("--date_format", default="%d-%b-%H:%M:%S")
45+
parser.addoption("--fast_fvp", action="store_true")
4446

4547

4648
def pytest_configure(config):
@@ -63,6 +65,7 @@ def pytest_configure(config):
6365
f"Supplied argument 'default_dump_path={dump_path}' that does not exist or is not a directory."
6466
)
6567
_test_options[arm_test_options.date_format] = config.option.date_format
68+
_test_options[arm_test_options.fast_fvp] = config.option.fast_fvp
6669
logging.basicConfig(level=logging.INFO, stream=sys.stdout)
6770

6871

backends/arm/test/runner_utils.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import numpy as np
1818
import torch
1919

20+
from executorch.backends.arm.test.common import arm_test_options, is_option_enabled
21+
2022
from torch.export import ExportedProgram
2123
from torch.fx.node import Node
2224

@@ -249,6 +251,10 @@ def run_corstone(
249251
for input_path in input_paths:
250252
cmd_line += f" -i {input_path}"
251253

254+
ethos_u_extra_args = ""
255+
if is_option_enabled(arm_test_options.fast_fvp):
256+
ethos_u_extra_args = ethos_u_extra_args + "--fast"
257+
252258
command_args = {
253259
"corstone-300": [
254260
"FVP_Corstone_SSE-300_Ethos-U55",
@@ -267,6 +273,8 @@ def run_corstone(
267273
"-C",
268274
"cpu0.semihosting-stack_base=0",
269275
"-C",
276+
f"ethosu.extra_args='{ethos_u_extra_args}'",
277+
"-C",
270278
"cpu0.semihosting-heap_limit=0",
271279
"-C",
272280
f"cpu0.semihosting-cmd_line='{cmd_line}'",
@@ -282,6 +290,8 @@ def run_corstone(
282290
"-C",
283291
"mps4_board.visualisation.disable-visualisation=1",
284292
"-C",
293+
"vis_hdlcd.disable_visualisation=1",
294+
"-C",
285295
"mps4_board.telnetterminal0.start_telnet=0",
286296
"-C",
287297
"mps4_board.uart0.out_file='-'",
@@ -296,6 +306,8 @@ def run_corstone(
296306
"-C",
297307
"mps4_board.subsystem.cpu0.semihosting-heap_limit=0",
298308
"-C",
309+
f"mps4_board.subsystem.ethosu.extra_args='{ethos_u_extra_args}'",
310+
"-C",
299311
f"mps4_board.subsystem.cpu0.semihosting-cmd_line='{cmd_line}'",
300312
"-a",
301313
elf_path,

backends/cadence/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## Supported DSPs (in progress)
44
- HiFi Audio
5-
- ...
5+
- Fusion G3
66

77
## Tutorial
88

backends/cadence/aot/TARGETS

Lines changed: 159 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ python_library(
3939
":passes",
4040
":utils",
4141
":ops_registrations",
42+
":replace_ops",
4243
"//caffe2:torch",
4344
"//executorch/backends/cadence/aot/quantizer:fusion_pass",
4445
"//executorch/backends/cadence/aot/quantizer:quantizer",
@@ -74,12 +75,14 @@ python_library(
7475
":utils",
7576
":fuse_ops",
7677
":simplify_ops",
78+
":replace_ops",
79+
":reorder_ops",
80+
":remove_ops",
7781
"//caffe2:torch",
7882
"//executorch/exir:pass_base",
7983
"//executorch/exir/dialects:lib",
8084
"//executorch/exir/passes:lib",
8185
"//executorch/exir/passes:spec_prop_pass",
82-
"//executorch/backends/transforms:remove_clone_ops"
8386
],
8487
)
8588

@@ -180,6 +183,63 @@ python_library(
180183
],
181184
)
182185

186+
python_library(
187+
name = "remove_ops",
188+
srcs = [
189+
"remove_ops.py",
190+
],
191+
typing = True,
192+
deps = [
193+
"//caffe2:torch",
194+
"//executorch/backends/cadence/aot:pass_utils",
195+
"//executorch/backends/cadence/aot:simplify_ops",
196+
"//executorch/exir:pass_base",
197+
"//executorch/exir/dialects:lib",
198+
"//executorch/exir/dialects/edge:lib",
199+
"//executorch/exir/passes:spec_prop_pass",
200+
"//executorch/backends/transforms:remove_clone_ops"
201+
],
202+
)
203+
204+
python_library(
205+
name = "reorder_ops",
206+
srcs = [
207+
"reorder_ops.py",
208+
],
209+
typing = True,
210+
deps = [
211+
"//caffe2:torch",
212+
"//executorch/backends/cadence/aot:compiler_utils",
213+
"//executorch/backends/cadence/aot:pass_utils",
214+
"//executorch/backends/cadence/aot:utils",
215+
"//executorch/exir:pass_base",
216+
"//executorch/exir:tensor",
217+
"//executorch/exir/dialects:lib",
218+
"//executorch/exir/dialects/edge:lib",
219+
],
220+
)
221+
222+
python_library(
223+
name = "replace_ops",
224+
srcs = [
225+
"replace_ops.py",
226+
],
227+
typing = True,
228+
deps = [
229+
":pass_utils",
230+
"//caffe2:torch",
231+
"//executorch/backends/cadence/aot:compiler_utils",
232+
"//executorch/backends/cadence/aot:fuse_ops",
233+
"//executorch/backends/cadence/aot:pass_utils",
234+
"//executorch/backends/cadence/aot:remove_ops",
235+
"//executorch/backends/cadence/aot:utils",
236+
"//executorch/exir:pass_base",
237+
"//executorch/exir/dialects:lib",
238+
"//executorch/exir/dialects/edge:lib",
239+
"//executorch/exir/passes:spec_prop_pass",
240+
],
241+
)
242+
183243
python_unittest(
184244
name = "test_graph_builder",
185245
srcs = [
@@ -196,3 +256,101 @@ python_unittest(
196256
":ops_registrations"
197257
],
198258
)
259+
260+
python_unittest(
261+
name = "test_replace_ops_passes",
262+
srcs = [
263+
"tests/test_replace_ops_passes.py",
264+
],
265+
supports_static_listing = False,
266+
typing = True,
267+
deps = [
268+
"fbsource//third-party/pypi/parameterized:parameterized",
269+
":compiler",
270+
":replace_ops",
271+
"//caffe2:torch",
272+
"//executorch/backends/cadence/aot:compiler",
273+
"//executorch/backends/cadence/aot:graph_builder",
274+
"//executorch/backends/cadence/aot:pass_utils",
275+
"//executorch/exir:pass_base",
276+
"//executorch/exir/dialects:lib",
277+
"//executorch/exir/passes:lib",
278+
],
279+
)
280+
281+
python_unittest(
282+
name = "test_fusion_ops_passes",
283+
srcs = [
284+
"tests/test_fusion_ops_passes.py",
285+
],
286+
typing = True,
287+
deps = [
288+
":compiler",
289+
"//caffe2:torch",
290+
"//executorch/backends/cadence/aot:compiler",
291+
"//executorch/backends/cadence/aot:fuse_ops",
292+
"//executorch/backends/cadence/aot:graph_builder",
293+
"//executorch/backends/cadence/aot:ops_registrations",
294+
"//executorch/backends/cadence/aot:pass_utils",
295+
"//executorch/exir/dialects:lib",
296+
"//executorch/exir/dialects/edge:lib",
297+
],
298+
)
299+
300+
python_unittest(
301+
name = "test_remove_ops_passes",
302+
srcs = [
303+
"tests/test_remove_ops_passes.py",
304+
],
305+
supports_static_listing = False,
306+
typing = True,
307+
deps = [
308+
"fbsource//third-party/pypi/parameterized:parameterized",
309+
"fbsource//third-party/pypi/pyre-extensions:pyre-extensions",
310+
":compiler",
311+
"//caffe2:torch",
312+
"//executorch/backends/cadence/aot:compiler",
313+
"//executorch/backends/cadence/aot:ops_registrations",
314+
"//executorch/backends/cadence/aot:pass_utils",
315+
"//executorch/backends/cadence/aot:remove_ops",
316+
"//executorch/backends/cadence/aot/quantizer:quantizer",
317+
"//executorch/exir/dialects:lib",
318+
],
319+
)
320+
321+
python_unittest(
322+
name = "test_simplify_ops_passes",
323+
srcs = [
324+
"tests/test_simplify_ops_passes.py",
325+
],
326+
supports_static_listing = False,
327+
typing = True,
328+
deps = [
329+
"fbsource//third-party/pypi/parameterized:parameterized",
330+
"//caffe2:torch",
331+
"//executorch/backends/cadence/aot:compiler",
332+
"//executorch/backends/cadence/aot:ops_registrations",
333+
"//executorch/backends/cadence/aot:pass_utils",
334+
"//executorch/backends/cadence/aot:simplify_ops",
335+
"//executorch/exir/dialects:lib",
336+
],
337+
)
338+
339+
python_unittest(
340+
name = "test_reorder_ops_passes",
341+
srcs = [
342+
"tests/test_reorder_ops_passes.py",
343+
],
344+
typing = True,
345+
deps = [
346+
":compiler",
347+
":pass_utils",
348+
"//caffe2:torch",
349+
"//executorch/backends/cadence/aot:compiler",
350+
"//executorch/backends/cadence/aot:fuse_ops",
351+
"//executorch/backends/cadence/aot:ops_registrations",
352+
"//executorch/backends/cadence/aot:pass_utils",
353+
"//executorch/backends/cadence/aot:reorder_ops",
354+
"//executorch/exir/dialects:lib",
355+
],
356+
)

0 commit comments

Comments
 (0)