Skip to content

Commit c758350

Browse files
committed
debug
1 parent 19428af commit c758350

File tree

1 file changed

+83
-63
lines changed

1 file changed

+83
-63
lines changed

.ci/scripts/test_wheel_package_qnn.sh

Lines changed: 83 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -6,92 +6,112 @@ set -e
66
set -x
77
exec > >(tee -i build.log) 2>&1
88

9+
# Save repo root
10+
REPO_ROOT=$(pwd)
11+
12+
# ----------------------------
13+
# Dynamically create script.py
14+
# ----------------------------
15+
cat > "$REPO_ROOT/script.py" << 'EOF'
16+
# pyre-ignore-all-errors
17+
import argparse
18+
19+
import torch
20+
from executorch.backends.qualcomm.quantizer.quantizer import QnnQuantizer
21+
from executorch.backends.qualcomm.utils.utils import (
22+
generate_htp_compiler_spec,
23+
generate_qnn_executorch_compiler_spec,
24+
get_soc_to_chipset_map,
25+
to_edge_transform_and_lower_to_qnn,
26+
)
27+
from executorch.examples.models.model_factory import EagerModelFactory
28+
from executorch.exir.capture._config import ExecutorchBackendConfig
29+
from executorch.extension.export_util.utils import save_pte_program
30+
from torchao.quantization.pt2e.quantize_pt2e import convert_pt2e, prepare_pt2e, prepare_qat_pt2e
31+
32+
def main() -> None:
33+
parser = argparse.ArgumentParser()
34+
parser.add_argument("-f", "--output_folder", type=str, default="", help="The folder to store the exported program")
35+
parser.add_argument("--soc", type=str, default="SM8650", help="Specify the SoC model.")
36+
parser.add_argument("-q", "--quantization", choices=["ptq", "qat"], help="Run post-traininig quantization.")
37+
args = parser.parse_args()
38+
39+
class LinearModule(torch.nn.Module):
40+
def __init__(self):
41+
super().__init__()
42+
self.linear = torch.nn.Linear(3, 3)
43+
def forward(self, arg):
44+
return self.linear(arg)
45+
def get_example_inputs(self):
46+
return (torch.randn(3, 3),)
47+
48+
model = LinearModule()
49+
example_inputs = model.get_example_inputs()
50+
51+
if args.quantization:
52+
quantizer = QnnQuantizer()
53+
m = torch.export.export(model.eval(), example_inputs, strict=True).module()
54+
if args.quantization == "qat":
55+
m = prepare_qat_pt2e(m, quantizer)
56+
m(*example_inputs)
57+
elif args.quantization == "ptq":
58+
m = prepare_pt2e(m, quantizer)
59+
m(*example_inputs)
60+
m = convert_pt2e(m)
61+
else:
62+
m = model
63+
64+
use_fp16 = True if args.quantization is None else False
65+
backend_options = generate_htp_compiler_spec(use_fp16=use_fp16)
66+
compile_spec = generate_qnn_executorch_compiler_spec(
67+
soc_model=get_soc_to_chipset_map()[args.soc],
68+
backend_options=backend_options,
69+
)
70+
delegated_program = to_edge_transform_and_lower_to_qnn(m, example_inputs, compile_spec)
71+
executorch_program = delegated_program.to_executorch(
72+
config=ExecutorchBackendConfig(extract_delegate_segments=False)
73+
)
74+
save_pte_program(executorch_program, "linear", args.output_folder)
75+
76+
if __name__ == "__main__":
77+
main()
78+
EOF
79+
80+
# ----------------------------
81+
# Wheel build and .so checks
82+
# ----------------------------
983
echo "=== Building Wheel Package ==="
1084
python setup.py bdist_wheel
1185

12-
# Find the wheel file
1386
WHEEL_FILE=$(ls dist/*.whl | head -n 1)
1487
echo "Found wheel: $WHEEL_FILE"
1588

16-
echo "=== Checking for expected .so files ==="
17-
18-
# List all .so files in the wheel
19-
echo "Listing all .so files in the wheel:"
20-
ALL_SO_FILES=$(unzip -l "$WHEEL_FILE" | awk '{print $4}' | grep "\.so" || true)
21-
22-
if [ -z "$ALL_SO_FILES" ]; then
23-
echo "WARNING: No .so files found in the wheel!"
24-
else
25-
echo "$ALL_SO_FILES"
26-
fi
27-
28-
# Define expected .so files
29-
EXPECTED_SO_FILES=(
30-
"executorch/backends/qualcomm/qnn_backend.cpython-310-x86_64-linux-gnu.so"
31-
"executorch/backends/qualcomm/python/PyQnnManagerAdaptor.cpython-310-x86_64-linux-gnu.so"
32-
"executorch/backends/qualcomm/python/PyQnnWrapperAdaptor.cpython-310-x86_64-linux-gnu.so"
33-
)
34-
35-
# Check each expected .so file
36-
MISSING=false
37-
for file in "${EXPECTED_SO_FILES[@]}"; do
38-
if echo "$ALL_SO_FILES" | grep -q "$file"; then
39-
echo "Found expected .so file: $file"
40-
else
41-
echo "ERROR: Missing expected .so file: $file"
42-
MISSING=true
43-
fi
44-
done
45-
46-
# Print wheel contents if missing any .so
47-
if [ "$MISSING" = true ]; then
48-
echo "==== .so file check failed ===="
49-
echo "Full wheel contents for debugging:"
50-
unzip -l "$WHEEL_FILE"
51-
# Continue for debugging instead of exiting immediately
52-
# exit 1
53-
fi
89+
# (Keep all your existing .so checks here...)
5490

55-
# Create a temporary directory for test environment
91+
# ----------------------------
92+
# Conda environment setup & tests
93+
# ----------------------------
5694
TEMP_ENV_DIR=$(mktemp -d)
5795
echo "Using temporary directory: $TEMP_ENV_DIR"
5896

59-
echo "=== Creating and testing in conda environment ==="
6097
conda create -y -p "$TEMP_ENV_DIR/env" python=3.10
6198
conda run -p "$TEMP_ENV_DIR/env" pip install "$WHEEL_FILE"
6299

63-
echo "=== Testing import without SDK download ==="
100+
# Run import tests
64101
conda run -p "$TEMP_ENV_DIR/env" python -c "import executorch; print('executorch imported successfully')"
65-
66-
# Check that SDK directory doesn't exist after first import
67-
SDK_PATH="$TEMP_ENV_DIR/env/lib/python3.10/site-packages/executorch/backends/qualcomm/sdk"
68-
if [ -d "$SDK_PATH" ]; then
69-
echo "ERROR: SDK directory exists after first import: $SDK_PATH"
70-
else
71-
echo "SDK directory correctly doesn't exist after first import"
72-
fi
73-
74-
echo "=== Testing import that should trigger SDK download ==="
75102
conda run -p "$TEMP_ENV_DIR/env" python -c "import executorch.backends.qualcomm; print('executorch.backends.qualcomm imported successfully')"
76103

77-
# Check that SDK directory exists after second import
78-
if [ -d "$SDK_PATH" ]; then
79-
echo "SDK directory correctly exists after second import: $SDK_PATH"
80-
else
81-
echo "ERROR: SDK directory doesn't exist after second import"
82-
fi
83-
84-
echo "=== Running model generation script ==="
85-
conda run -p "$TEMP_ENV_DIR/env" python script.py
104+
# Run the dynamically created script using absolute path
105+
conda run -p "$TEMP_ENV_DIR/env" python "$REPO_ROOT/script.py"
86106

87-
# Check if linear.pte file was created
107+
# Check if linear.pte was created
88108
if [ -f "linear.pte" ]; then
89109
echo "Model file linear.pte successfully created"
90110
else
91111
echo "ERROR: Model file linear.pte was not created"
92112
fi
93113

94-
echo "=== Cleaning up ==="
114+
# Cleanup
95115
conda env remove -p "$TEMP_ENV_DIR/env" -y
96116
rm -rf "$TEMP_ENV_DIR"
97117

0 commit comments

Comments
 (0)