Skip to content

Commit 386bb5e

Browse files
Merge branch 'main' into contributing
2 parents f2a0f11 + 80250f8 commit 386bb5e

File tree

342 files changed

+15492
-5050
lines changed

Some content is hidden

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

342 files changed

+15492
-5050
lines changed

.Package.swift/kernels_torchao/dummy.swift

Whitespace-only changes.

.Package.swift/kernels_torchao_debug/dummy.swift

Whitespace-only changes.

.ci/scripts/setup-conda.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ set -ex
99

1010
install_conda() {
1111
pushd .ci/docker || return
12-
${CONDA_INSTALL} -y --file conda-env-ci.txt
12+
${CONDA_INSTALL} -c conda-forge -y --file conda-env-ci.txt
1313
popd || return
1414
}
1515

.ci/scripts/test_huggingface_optimum_model.py

Lines changed: 108 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
import argparse
2+
import gc
3+
import logging
4+
import math
25
import subprocess
36
import tempfile
47
from pathlib import Path
8+
from typing import List
59

610
import torch
711
from datasets import load_dataset
@@ -15,6 +19,7 @@
1519
)
1620
from transformers import (
1721
AutoConfig,
22+
AutoModelForCausalLM,
1823
AutoModelForImageClassification,
1924
AutoProcessor,
2025
AutoTokenizer,
@@ -37,6 +42,56 @@ def cli_export(command, model_dir):
3742
print(f"Export failed with error: {e}")
3843

3944

45+
def check_causal_lm_output_quality(
46+
model_id: str, generated_tokens: List[int], max_perplexity_threshold: float = 100.0
47+
):
48+
"""
49+
Evaluates the quality of text generated by a causal language model by calculating its perplexity.
50+
51+
Args:
52+
model_id: HuggingFace model identifier (e.g., "google/gemma2-2b")
53+
generated_tokens: The tokens generated by the exported model to evaluate
54+
max_perplexity_threshold: Maximum acceptable perplexity (lower is better)
55+
56+
Returns:
57+
tuple: (is_quality_ok, reason) with boolean result and explanation
58+
"""
59+
logging.info(f"Starting perplexity check with model '{model_id}' ...")
60+
# Load model
61+
model = AutoModelForCausalLM.from_pretrained(
62+
model_id,
63+
low_cpu_mem_usage=True,
64+
use_cache=False,
65+
torch_dtype=torch.bfloat16,
66+
)
67+
68+
with torch.no_grad():
69+
outputs = model(input_ids=generated_tokens, labels=generated_tokens)
70+
71+
# Get the loss (negative log-likelihood)
72+
loss = outputs.loss.item()
73+
74+
# Calculate perplexity (exp of the average negative log-likelihood)
75+
perplexity = math.exp(loss)
76+
77+
is_quality_ok = perplexity <= max_perplexity_threshold
78+
if is_quality_ok:
79+
logging.info(
80+
f"✓ Perplexity check passed: {perplexity:.2f} <= {max_perplexity_threshold}"
81+
)
82+
else:
83+
logging.warning(
84+
f"✗ Perplexity check failed: {perplexity:.2f} > {max_perplexity_threshold}"
85+
)
86+
87+
# Clean up immediately
88+
del model
89+
del outputs
90+
gc.collect()
91+
92+
return is_quality_ok
93+
94+
4095
def test_text_generation(model_id, model_dir, recipe, *, quantize=True, run_only=False):
4196
command = [
4297
"optimum-cli",
@@ -51,7 +106,19 @@ def test_text_generation(model_id, model_dir, recipe, *, quantize=True, run_only
51106
"--output_dir",
52107
model_dir,
53108
]
54-
if "coreml" in recipe:
109+
if "xnnpack" in recipe:
110+
command += [
111+
"--use_custom_sdpa",
112+
"--use_custom_kv_cache",
113+
]
114+
if quantize:
115+
command += [
116+
"--qlinear",
117+
"8da4w",
118+
"--qembedding",
119+
"8w",
120+
]
121+
elif "coreml" in recipe:
55122
command += [
56123
"--disable_dynamic_shapes",
57124
]
@@ -63,7 +130,9 @@ def test_text_generation(model_id, model_dir, recipe, *, quantize=True, run_only
63130
"8w",
64131
]
65132
else:
66-
assert not quantize, "Quantization is not supported for non-CoreML recipes yet"
133+
assert (
134+
not quantize
135+
), "Quantization is only supported for XnnPack and CoreML recipes at the moment."
67136

68137
if not run_only:
69138
cli_export(command, model_dir)
@@ -77,6 +146,14 @@ def test_text_generation(model_id, model_dir, recipe, *, quantize=True, run_only
77146
max_seq_len=64,
78147
)
79148
print(f"\nGenerated text:\n\t{generated_text}")
149+
generated_tokens = tokenizer(generated_text, return_tensors="pt").input_ids
150+
151+
# Free memory before loading eager for quality check
152+
del model
153+
del tokenizer
154+
gc.collect()
155+
156+
assert check_causal_lm_output_quality(model_id, generated_tokens) is True
80157

81158

82159
def test_fill_mask(model_id, model_dir, recipe, *, quantize=True, run_only=False):
@@ -278,23 +355,39 @@ def test_vit(model_id, model_dir, recipe, *, quantize=False, run_only=False):
278355
)
279356
args = parser.parse_args()
280357

281-
model_to_model_id_and_test_function = {
282-
"smollm": ("HuggingFaceTB/SmolLM2-135M", test_text_generation), # works
283-
"qwen3": ("Qwen/Qwen3-0.6B", test_text_generation), # works
284-
"olmo": ("allenai/OLMo-1B-hf", test_text_generation), # works
285-
"gemma3": ("unsloth/gemma-3-1b-it", test_text_generation), # does not export
286-
"phi4": (
358+
_text_generation_mapping = {
359+
"llama3.2-1b": ("NousResearch/Llama-3.2-1B", test_text_generation),
360+
"qwen3-0.6b": ("Qwen/Qwen3-0.6B", test_text_generation),
361+
"qwen3-1.7b": ("Qwen/Qwen3-1.7B", test_text_generation),
362+
"gemma3-1b": (
363+
"unsloth/gemma-3-1b-it",
364+
test_text_generation,
365+
), # does not export for CoreML
366+
"phi4-mini": (
287367
"microsoft/Phi-4-mini-instruct",
288368
test_text_generation,
289-
), # fails to lower
290-
"llama3": ("NousResearch/Llama-3.2-1B", test_text_generation), # works
291-
"bert": ("google-bert/bert-base-uncased", test_fill_mask), # works
292-
"roberta": ("FacebookAI/xlmcl-roberta-base", test_fill_mask), # works
293-
"distilbert": ("distilbert/distilbert-base-uncased", test_fill_mask), # works
294-
"whisper": ("openai/whisper-tiny", test_whisper), # works
369+
), # fails to lower for CoreML
370+
"smollm2-135m": ("HuggingFaceTB/SmolLM2-135M", test_text_generation),
371+
"smollm3-3b": ("HuggingFaceTB/SmolLM3-3B", test_text_generation),
372+
"olmo": ("allenai/OLMo-1B-hf", test_text_generation),
373+
}
374+
375+
_mask_fill_mapping = {
376+
"bert": ("google-bert/bert-base-uncased", test_fill_mask),
377+
"roberta": ("FacebookAI/xlmcl-roberta-base", test_fill_mask),
378+
"distilbert": ("distilbert/distilbert-base-uncased", test_fill_mask),
379+
}
380+
381+
_misc_model_mapping = {
382+
"whisper": ("openai/whisper-tiny", test_whisper),
295383
"t5": ("google-t5/t5-small", test_t5), # CoreML runime failure
296-
"vit": ("google/vit-base-patch16-224", test_vit), # works
384+
"vit": ("google/vit-base-patch16-224", test_vit),
297385
}
386+
387+
model_to_model_id_and_test_function = (
388+
_text_generation_mapping | _mask_fill_mapping | _misc_model_mapping
389+
)
390+
298391
if args.model not in model_to_model_id_and_test_function:
299392
raise ValueError(
300393
f"Unknown model name: {args.model}. Available models: {model_to_model_id_and_test_function.keys()}"

.ci/scripts/test_ios_ci.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ say() {
3636

3737
say "Cloning the Demo App"
3838

39-
git clone --depth 1 https://github.com/pytorch-labs/executorch-examples.git
39+
git clone --depth 1 https://github.com/meta-pytorch/executorch-examples.git
4040

4141
say "Installing CoreML Backend Requirements"
4242

.ci/scripts/test_llama_torchao_lowbit.sh

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,27 +29,22 @@ cmake -DPYTHON_EXECUTABLE=python \
2929
-DEXECUTORCH_ENABLE_LOGGING=1 \
3030
-DCMAKE_BUILD_TYPE=Release \
3131
-DEXECUTORCH_BUILD_EXTENSION_DATA_LOADER=ON \
32-
-DEXECUTORCH_BUILD_EXTENSION_LLM=ON \
33-
-DEXECUTORCH_BUILD_EXTENSION_LLM_RUNNER=ON \
34-
-DEXECUTORCH_BUILD_EXTENSION_MODULE=ON \
3532
-DEXECUTORCH_BUILD_EXTENSION_FLAT_TENSOR=ON \
33+
-DEXECUTORCH_BUILD_EXTENSION_MODULE=ON \
3634
-DEXECUTORCH_BUILD_EXTENSION_TENSOR=ON \
3735
-DEXECUTORCH_BUILD_XNNPACK=OFF \
3836
-DEXECUTORCH_BUILD_KERNELS_QUANTIZED=ON \
3937
-DEXECUTORCH_BUILD_KERNELS_OPTIMIZED=ON \
38+
-DEXECUTORCH_BUILD_KERNELS_TORCHAO=ON \
39+
-DEXECUTORCH_BUILD_EXTENSION_LLM_RUNNER=ON \
40+
-DEXECUTORCH_BUILD_EXTENSION_LLM=ON \
4041
-DEXECUTORCH_BUILD_KERNELS_LLM=ON \
4142
-Bcmake-out .
42-
cmake --build cmake-out -j16 --target install --config Release
43+
cmake --build cmake-out -j16 --config Release --target install
4344

4445
# Install llama runner with torchao
4546
cmake -DPYTHON_EXECUTABLE=python \
46-
-DBUILD_TESTING=OFF \
4747
-DCMAKE_BUILD_TYPE=Release \
48-
-DEXECUTORCH_BUILD_KERNELS_LLM=ON \
49-
-DEXECUTORCH_BUILD_KERNELS_OPTIMIZED=ON \
50-
-DEXECUTORCH_BUILD_XNNPACK=OFF \
51-
-DEXECUTORCH_BUILD_KERNELS_QUANTIZED=ON \
52-
-DEXECUTORCH_BUILD_TORCHAO=ON \
5348
-Bcmake-out/examples/models/llama \
5449
examples/models/llama
5550
cmake --build cmake-out/examples/models/llama -j16 --config Release

.ci/scripts/zephyr-utils.sh

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
# LICENSE file in the root directory of this source tree.
77

88
download_arm_zephyr_sdk () {
9-
wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.16.0/zephyr-sdk-0.16.0_linux-x86_64.tar.xz
10-
tar -xf zephyr-sdk-0.16.0_linux-x86_64.tar.xz
11-
rm -f zephyr-sdk-0.16.0_linux-x86_64.tar.xz
9+
wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.17.2/zephyr-sdk-0.17.2_linux-x86_64.tar.xz
10+
tar -xf zephyr-sdk-0.17.2_linux-x86_64.tar.xz
11+
rm -f zephyr-sdk-0.17.2_linux-x86_64.tar.xz
1212
}
1313

1414
setup_zephyr_et_module () {

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
name: Add Open External Contributor PRs and Issues to PyTorch Org Project 136
22

33
on:
4-
schedule:
5-
- cron: '0 * * * *'
4+
# schedule:
5+
# - cron: '0 * * * *'
66
workflow_dispatch:
77

88
jobs:
@@ -12,7 +12,7 @@ jobs:
1212
- name: Add open issues and open, non-draft PRs to org project (excluding certain authors)
1313
uses: actions/github-script@v7
1414
with:
15-
github-token: ${{ secrets.PYTORCH_PROJECT_PAT }}
15+
github-token: ${{ secrets.GITHUB_TOKEN }}
1616
script: |
1717
const projectId = "PVT_kwDOAUB9vs4A_PUL"; // PyTorch org project 136
1818
const owner = 'pytorch';

.github/workflows/android-release-artifacts.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ jobs:
9090
fi
9191
9292
FLAVOR="${{ inputs.flavor }}"
93-
if [[ "$FLAVOR" == "vulkan+xnnpack" ]]; then
93+
if [[ "$FLAVOR" == "vulkan+xnnpack" || -z "$FLAVOR" ]]; then
9494
export EXECUTORCH_BUILD_VULKAN=ON
9595
fi
9696

0 commit comments

Comments
 (0)