Skip to content

Commit 17d7fb3

Browse files
authored
Merge branch 'main' into marlin-move-rescales
2 parents 463ed4a + c1d0d3e commit 17d7fb3

File tree

81 files changed

+5091
-2076
lines changed

Some content is hidden

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

81 files changed

+5091
-2076
lines changed

.ci/docker/requirements-ci.txt

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,21 @@ hypothesis==6.84.2
1616
parameterized==0.9.0
1717

1818
# Doc build requirements, same as https://github.com/pytorch/pytorch/blob/main/.ci/docker/requirements-docs.txt
19-
sphinx==5.3.0
19+
sphinx==7.2.6
20+
sphinxcontrib.katex==0.9.10
21+
breathe==4.36.0 # only if generating C++
22+
exhale==0.3.7 # only if generating C++ docs
23+
docutils==0.18.1,<0.21
24+
sphinx-design==0.6.1
25+
sphinxcontrib-mermaid==1.0.0
26+
myst-parser==3.0.1 # if want to contribute in markdown
27+
sphinx-gallery==0.14.0 # only if hosting interactive tutorials
28+
sphinx-sitemap==2.7.1
2029
sphinx-reredirects==0.1.4
21-
sphinx-gallery==0.14.0
22-
breathe==4.34.0
23-
exhale==0.2.3
24-
docutils==0.16
2530
matplotlib>=3.9.4
31+
sphinx-copybutton==0.5.2
2632
# PyTorch Theme
27-
-e git+https://github.com/pytorch/pytorch_sphinx_theme.git#egg=pytorch_sphinx_theme
28-
myst-parser==0.18.1
29-
sphinx_design==0.4.1
30-
sphinx-copybutton==0.5.0
33+
-e git+https://github.com/pytorch/pytorch_sphinx_theme.git@pytorch_sphinx_theme2#egg=pytorch_sphinx_theme2
3134

3235
# script unit test requirements
3336
yaspin==3.1.0

.ci/scripts/test_torchao_huggingface_checkpoints.sh

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ set -euxo pipefail
55
# Args / flags
66
# -------------------------
77
TEST_WITH_RUNNER=0
8+
USE_TORCHAO_KERNELS=0
89
MODEL_NAME=""
910

1011
# Parse args
@@ -22,10 +23,14 @@ while [[ $# -gt 0 ]]; do
2223
--test_with_runner)
2324
TEST_WITH_RUNNER=1
2425
;;
26+
--use_torchao_kernels)
27+
USE_TORCHAO_KERNELS=1
28+
;;
2529
-h|--help)
26-
echo "Usage: $0 <model_name> [--test_with_runner]"
30+
echo "Usage: $0 <model_name> [--test_with_runner] [--use_torchao_kernels]"
2731
echo " model_name: qwen3_4b | phi_4_mini"
2832
echo " --test_with_runner: build ET + run llama_main to sanity-check the export"
33+
echo " --use_torchao_kernels: use torchao kernels for linear and tied embedding"
2934
exit 0
3035
;;
3136
*)
@@ -42,6 +47,13 @@ fi
4247

4348
MODEL_OUT=model.pte
4449

50+
51+
# Default to XNNPACK
52+
BACKEND_ARGS="-X --xnnpack-extended-ops"
53+
if [[ "$USE_TORCHAO_KERNELS" -eq 1 ]]; then
54+
BACKEND_ARGS="--use-torchao-kernels"
55+
fi
56+
4557
case "$MODEL_NAME" in
4658
qwen3_4b)
4759
echo "Running Qwen3-4B export..."
@@ -58,12 +70,12 @@ case "$MODEL_NAME" in
5870
--output_name $MODEL_OUT \
5971
-kv \
6072
--use_sdpa_with_kv_cache \
61-
-X \
62-
--xnnpack-extended-ops \
6373
--max_context_length 1024 \
6474
--max_seq_length 1024 \
75+
--metadata '{"get_bos_id":199999, "get_eos_ids":[200020,199999]}' \
76+
--verbose \
6577
--dtype fp32 \
66-
--metadata '{"get_bos_id":199999, "get_eos_ids":[200020,199999]}'
78+
${BACKEND_ARGS}
6779
;;
6880

6981
phi_4_mini)
@@ -81,12 +93,12 @@ case "$MODEL_NAME" in
8193
--output_name $MODEL_OUT \
8294
-kv \
8395
--use_sdpa_with_kv_cache \
84-
-X \
85-
--xnnpack-extended-ops \
8696
--max_context_length 1024 \
8797
--max_seq_length 1024 \
98+
--metadata '{"get_bos_id":199999, "get_eos_ids":[200020,199999]}' \
99+
--verbose \
88100
--dtype fp32 \
89-
--metadata '{"get_bos_id":199999, "get_eos_ids":[200020,199999]}'
101+
${BACKEND_ARGS}
90102
;;
91103

92104
*)
@@ -104,6 +116,10 @@ if [[ $MODEL_SIZE -gt $EXPECTED_MODEL_SIZE_UPPER_BOUND ]]; then
104116
fi
105117

106118
# Install ET with CMake
119+
EXECUTORCH_BUILD_KERNELS_TORCHAO="OFF"
120+
if [[ "$USE_TORCHAO_KERNELS" -eq 1 ]]; then
121+
EXECUTORCH_BUILD_KERNELS_TORCHAO="ON"
122+
fi
107123
if [[ "$TEST_WITH_RUNNER" -eq 1 ]]; then
108124
echo "[runner] Building and testing llama_main ..."
109125
cmake -DPYTHON_EXECUTABLE=python \
@@ -120,6 +136,7 @@ if [[ "$TEST_WITH_RUNNER" -eq 1 ]]; then
120136
-DEXECUTORCH_BUILD_EXTENSION_LLM_RUNNER=ON \
121137
-DEXECUTORCH_BUILD_EXTENSION_LLM=ON \
122138
-DEXECUTORCH_BUILD_KERNELS_LLM=ON \
139+
-DEXECUTORCH_BUILD_KERNELS_TORCHAO=${EXECUTORCH_BUILD_KERNELS_TORCHAO} \
123140
-Bcmake-out .
124141
cmake --build cmake-out -j16 --config Release --target install
125142

.github/workflows/add-unanswered-to-project.yml

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,31 @@ jobs:
2020
2121
// List of authors to exclude
2222
const excludedAuthors = new Set([
23-
"nil-is-all", "cbilgin", "KimishPatel", "psiddh", "digantdesai", "SS-JIA", "ahmtox", "mcr229", "shoumikhin",
23+
"nil-is-all", "cbilgin", "kimishpatel", "psiddh", "digantdesai", "SS-JIA", "ahmtox", "mcr229", "shoumikhin",
2424
"manuelcandales", "metascroy", "cccclai", "rohansjoshi", "kirklandsign", "abhinaykukkadapu", "JacobSzwejbka",
2525
"Conarnar", "lucylq", "larryliu0820", "BujSet", "Gasoonjia", "Juntian777", "guangy10", "jackzhxng",
2626
"GregoryComer", "leafs1", "swolchok", "mergennachin", "tarun292", "byjlw", "jathu", "Jack-Khuu", "georgehong",
27-
"zhenyan-zhang-meta", "silverguo", "dbort", "jorgep31415", "huydhn", "mcremon-meta", "trivedivivek", "angelayi",
28-
"helunwencser", "hsharma35", "zhxchen17", "iseeyuan", "svekars", "nathanaelsee", "dulinriley", "jerryzh168",
27+
"zhenyan-zhang-meta", "silverguo", "harishs88ss", "AlannaBurke", "dbort", "huydhn", "mcremon-meta", "trivedivivek",
28+
"angelayi", "helunwencser", "hsharma35", "zhxchen17", "iseeyuan", "svekars", "nathanaelsee", "dulinriley", "jerryzh168",
2929
"cmodi-meta", "bigfootjon", "sxu", "ydwu4", "Riandy", "tugsbayasgalan", "bsoyluoglu", "yangw-dev", "YIWENX14",
3030
"namanahuja", "yushangdi", "limintang", "pianpwk", "viveknayakatmeta", "andreanicastro", "JakeStevens",
31-
"gmagogsfm", "zonglinpeng", "eigen-k", "derekxu", "salilsdesai", "skrtskrtfb", "pssrawat", "r-barnes", "pytorchbot",
32-
"pytorchmergebot", "pytorchupdatebot", "facebook-github-bot", "Erik-Lundell", "zingo", "AdrianLundell",
33-
"oscarandersson8218", "per", "Sebastian-Larsson", "SaoirseARM", "robell", "mansnils", "martinlsm", "freddan80",
34-
"YufengShi-dudu", "tom-arm", "perheld", "Jerry-Ge", "gggekov", "fumchin", "wwwind", "haowhsu-quic", "shewu-quic",
35-
"winskuo-quic", "chunit-quic", "DannyYuyang-quic", "chuntl", "cymbalrush", "DenisVieriu97", "billmguo",
36-
"StrycekSimon", "jirioc", "robert-kalmar", "skywall", "neuropilot-captain"
31+
"gmagogsfm", "zonglinpeng", "eigen-k", "derekxu", "salilsdesai", "skrtskrtfb", "pssrawat", "r-barnes",
32+
"kalpit-meta-1", "Will-MingLun-Li", "KapJI", "piyengar", "j-bahr", "BoyuanFeng", "fgasperij", "DariusHolmgren",
33+
"sammarden-meta", "kushrast", "meta-emilian", "Rittzz", "jeanschmidt", "copyrightly", "mikekgfb", "vmpuri",
34+
"zonglinpengmeta", "maggiemoss", "aorenste", "hoangminhle98", "Solumin", "meyering", "rchen152",
35+
"AishwaryaSivaraman", "migeed-z", "ebgraham", "Esteb37", "nausicaasnow", "Camyll", "ezyang", "huiyujie",
36+
"dltn", "cjhopman", "blackm00n", "agunapal", "SamGondelman", "Ninja91", "ivayloen", "DrJessop", "rodrigos01meta",
37+
"akrieger", "cmt0", "yiming0416", "ethansfng", "ThomasJannaud", "nirvanagth", "marcinkwiatkowski", "3l1",
38+
"omerjerk", "nitish2112", "yipjustin", "ejnguyen", "andrewor14", "phaiting", "mgiordy", "LeeOHzzZ", "adicatana",
39+
"Polyomino", "ezrilow", "navsud", "YifanShenSZ", "RdoubleA", "Olivia-liu", "Abhi-hpp", "Vysarat", "azad-meta",
40+
"pytorchbot", "pytorchmergebot", "pytorchupdatebot", "facebook-github-bot", "app/dependabot", "Erik-Lundell",
41+
"zingo", "AdrianLundell", "oscarandersson8218", "per", "Sebastian-Larsson", "SaoirseARM", "robell", "mansnils",
42+
"martinlsm", "freddan80", "YufengShi-dudu", "tom-arm", "perheld", "Jerry-Ge", "gggekov", "fumchin", "wwwind",
43+
"benkli01", "Tessil", "maddun01", "Michiel-Olieslagers", "armwaheed", "agrima1304", "emmakujala", "annietllnd",
44+
"haowhsu-quic", "shewu-quic", "winskuo-quic", "chunit-quic", "DannyYuyang-quic", "chuntl", "thchenqti",
45+
"jethroqti", "cymbalrush", "DenisVieriu97", "billmguo", "StrycekSimon", "jirioc", "robert-kalmar", "skywall",
46+
"MartinPavella", "roman-janik-nxp", "novak-vaclav ", "neuropilot-captain", "dijopaul", "cad-rlc", "cad-audio",
47+
"ynimmaga", "daniil-lyakhov", "emmanuel-ferdman", "cavusmustafa", "Jiseong-oh", "alexdean08"
3748
]);
3849
3950
async function addItem(contentId, type, number) {
@@ -80,11 +91,10 @@ jobs:
8091
owner,
8192
repo,
8293
state: 'open',
83-
draft: false,
8494
}
8595
);
8696
for (const pr of prs) {
87-
if (!excludedAuthors.has(pr.user.login)) {
97+
if (!pr.draft && !excludedAuthors.has(pr.user.login)) {
8898
await addItem(pr.node_id, 'pr', pr.number);
8999
}
90100
}

.github/workflows/docker-builds.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ jobs:
3131
strategy:
3232
fail-fast: false
3333
matrix:
34-
runner: [linux.2xlarge]
34+
runner: [linux.4xlarge]
3535
docker-image-name: [
3636
executorch-ubuntu-22.04-gcc9,
3737
executorch-ubuntu-22.04-clang12,

.github/workflows/trunk.yml

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -594,15 +594,22 @@ jobs:
594594
strategy:
595595
matrix:
596596
model: [qwen3_4b, phi_4_mini]
597+
runner: [linux.2xlarge]
598+
docker-image: [executorch-ubuntu-22.04-clang12]
599+
backend: [xnnpack]
597600
include:
598601
- model: qwen3_4b
599-
test_with_runner: true
602+
runner: linux.arm64.2xlarge
603+
docker-image: executorch-ubuntu-22.04-gcc11-aarch64
604+
backend: torchao
600605
- model: phi_4_mini
601-
test_with_runner: false
606+
runner: linux.arm64.2xlarge
607+
docker-image: executorch-ubuntu-22.04-gcc11-aarch64
608+
backend: torchao
602609
fail-fast: false
603610
with:
604-
runner: linux.2xlarge
605-
docker-image: ci-image:executorch-ubuntu-22.04-clang12
611+
runner: ${{ matrix.runner }}
612+
docker-image: ci-image:${{ matrix.docker-image }}
606613
submodules: 'recursive'
607614
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
608615
timeout: 900
@@ -612,9 +619,14 @@ jobs:
612619
conda activate "${CONDA_ENV}"
613620
614621
PYTHON_EXECUTABLE=python bash .ci/scripts/setup-linux.sh --build-tool cmake
622+
623+
if [[ "${{ matrix.backend }}" == "torchao" ]]; then
624+
BUILD_TORCHAO_EXPERIMENTAL=1 TORCHAO_BUILD_CPU_AARCH64=1 TORCHAO_BUILD_KLEIDIAI=1 TORCHAO_ENABLE_ARM_NEON_DOT=1 TORCHAO_PARALLEL_BACKEND=OPENMP pip install third-party/ao
625+
fi
626+
615627
pip install -U "huggingface_hub[cli]"
616628
617-
bash .ci/scripts/test_torchao_huggingface_checkpoints.sh ${{ matrix.model }} ${{ matrix.test_with_runner && '--test_with_runner' || '' }}
629+
bash .ci/scripts/test_torchao_huggingface_checkpoints.sh ${{ matrix.model }} ${{ matrix.model != 'phi_4_mini' && '--test_with_runner' || '' }} ${{ matrix.backend == 'torchao' && '--use_torchao_kernels' || '' }}
618630
619631
test-multimodal-macos:
620632
if: ${{ !github.event.pull_request.head.repo.fork }}

backends/aoti/utils.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,23 @@ inline AOTITorchError validate_storage_offset(int64_t storage_offset) {
7373
return Error::Ok;
7474
}
7575

76+
// Check if tensor is in contiguous memory format (NCHW for 4D tensors)
77+
// Contiguous format means strides decrease from left to right:
78+
// For NCHW: strides = [C*H*W, H*W, W, 1]
79+
inline bool is_tensor_contiguous(
80+
int64_t ndim,
81+
const int64_t* sizes,
82+
const int64_t* strides) {
83+
int64_t expected_stride = 1;
84+
for (int64_t i = ndim - 1; i >= 0; i--) {
85+
if (strides[i] != expected_stride) {
86+
return false;
87+
}
88+
expected_stride *= sizes[i];
89+
}
90+
return true;
91+
}
92+
7693
} // extern "C"
7794

7895
} // namespace aoti

backends/arm/operators/op_add.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,18 @@ def define_node(
6464
rescaled_inputs, scale_back = tqutils.insert_rescale_ops_to_int32_maxscale(
6565
tosa_graph, inputs, node, self.tosa_spec
6666
)
67+
elif inputs[0].dtype == ts.DType.INT16:
68+
rescaled_inputs, scale_back = (
69+
tqutils.insert_rescale_ops_int16_to_int32_maxscale(
70+
tosa_graph, inputs, node, self.tosa_spec
71+
)
72+
)
6773
else:
6874
# input[0].dtype == ts.DType.INT16 or ts.DType.INT32
6975
# Non quantized input, natively support by TOSA.ADD
7076
rescaled_inputs = inputs
7177

72-
if output.dtype == ts.DType.INT8:
78+
if output.dtype in [ts.DType.INT8, ts.DType.INT16]:
7379
broadcasted_shape = tutils.tosa_shape(output.shape, output.dim_order)
7480
add_output = tosa_graph.addIntermediate(broadcasted_shape, ts.DType.INT32)
7581
else:
@@ -99,6 +105,15 @@ def define_node(
99105
compute_rescale=False,
100106
tosa_spec=self.tosa_spec,
101107
) # type: ignore[possibly-undefined]
108+
elif output.dtype == ts.DType.INT16:
109+
tqutils.insert_rescale_op_to_int16(
110+
tosa_graph,
111+
add_output,
112+
scale_back,
113+
node,
114+
compute_rescale=False,
115+
tosa_spec=self.tosa_spec,
116+
) # type: ignore[possibly-undefined]
102117

103118

104119
@register_node_visitor

backends/arm/operators/op_sub.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def define_node(
5050
validate_valid_dtype(
5151
self.target,
5252
[*inputs, output],
53-
[ts.DType.INT8, ts.DType.INT32],
53+
[ts.DType.INT8, ts.DType.INT16, ts.DType.INT32],
5454
output.tosa_spec,
5555
)
5656

@@ -59,12 +59,18 @@ def define_node(
5959
rescaled_inputs, scale_back = tqutils.insert_rescale_ops_to_int32_maxscale(
6060
tosa_graph, inputs, node, self.tosa_spec
6161
)
62+
elif inputs[0].dtype == ts.DType.INT16:
63+
rescaled_inputs, scale_back = (
64+
tqutils.insert_rescale_ops_int16_to_int32_maxscale(
65+
tosa_graph, inputs, node, self.tosa_spec
66+
)
67+
)
6268
else:
6369
# input[0].dtype == ts.DType.INT32
6470
# Non quantized input, natively support by TOSA.SUB
6571
rescaled_inputs = inputs
6672

67-
if output.dtype == ts.DType.INT8:
73+
if output.dtype in [ts.DType.INT8, ts.DType.INT16]:
6874
broadcasted_shape = tutils.tosa_shape(output.shape, output.dim_order)
6975
sub_output = tosa_graph.addIntermediate(broadcasted_shape, ts.DType.INT32)
7076
else:
@@ -95,6 +101,15 @@ def define_node(
95101
compute_rescale=False,
96102
tosa_spec=self.tosa_spec,
97103
) # type: ignore[possibly-undefined]
104+
elif output.dtype == ts.DType.INT16:
105+
tqutils.insert_rescale_op_to_int16(
106+
tosa_graph,
107+
sub_output,
108+
scale_back,
109+
node,
110+
compute_rescale=False,
111+
tosa_spec=self.tosa_spec,
112+
) # type: ignore[possibly-undefined]
98113

99114

100115
@register_node_visitor

backends/arm/test/ops/test_add.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -276,9 +276,6 @@ def test_add_tensor_16a8w_tosa_INT(test_data: input_t1):
276276

277277
@common.parametrize("test_data", Add.test_data)
278278
@common.XfailIfNoCorstone300
279-
@pytest.mark.xfail(
280-
reason="Vela compilation fails with 'Invalid arguments' for int16 add operations. See: https://github.com/pytorch/executorch/issues/13730"
281-
)
282279
def test_add_tensor_16a8w_u55_INT16(test_data: input_t1):
283280
"""Test add operation with 16A8W quantization on U55 (16-bit activations, 8-bit weights)"""
284281
per_channel_quantization = False
@@ -304,9 +301,6 @@ def test_add_tensor_16a8w_u55_INT16(test_data: input_t1):
304301

305302
@common.parametrize("test_data", Add.test_data)
306303
@common.XfailIfNoCorstone320
307-
@pytest.mark.xfail(
308-
reason="Vela compilation fails with 'Invalid arguments' for int16 add operations. See: https://github.com/pytorch/executorch/issues/13730"
309-
)
310304
def test_add_tensor_16a8w_u85_INT16(test_data: input_t1):
311305
"""Test add operation with 16A8W quantization on U85 (16-bit activations, 8-bit weights)"""
312306
per_channel_quantization = False

0 commit comments

Comments
 (0)