CARGO := cargo
PYTHON ?= python3.12
DOT ?= dot
GRAPH_FILE ?= examples/sample_graph.json
DOT_PATH ?= target/graph.dot
PNG_PATH ?= target/graph.png
ONNX_PATH ?= target/graph.onnx
COREML_PATH ?= target/graph.mlmodel
COREMLC_PATH ?= target/graph.mlmodelc
ORT_VERSION ?= 1.23.2
ORT_BASE ?= https://github.com/microsoft/onnxruntime/releases/download/v$(ORT_VERSION)
ORT_TARBALL ?= onnxruntime-osx-arm64-$(ORT_VERSION).tgz
ORT_DIR_NAME_TMP := $(ORT_TARBALL:.tgz=)
ORT_DIR_NAME_TMP := $(ORT_DIR_NAME_TMP:.tar.gz=)
ORT_DIR_NAME ?= $(ORT_DIR_NAME_TMP:.zip=)
ORT_DIR ?= target/onnxruntime
ORT_LIB_DIR ?= $(ORT_DIR)/$(ORT_DIR_NAME)/lib
ORT_LIB_LOCATION ?= $(ORT_LIB_DIR)
MATURIN_ARGS ?=
UNAME_S := $(shell uname)
ifeq ($(UNAME_S),Darwin)
ORT_SHARED_GLOB ?= $(ORT_LIB_DIR)/libonnxruntime*.dylib
else ifeq ($(OS),Windows_NT)
ORT_SHARED_GLOB ?= $(ORT_LIB_DIR)/onnxruntime.dll
else
ORT_SHARED_GLOB ?= $(ORT_LIB_DIR)/libonnxruntime*.so*
endif
.PHONY: build test fmt run viz onnx coreml coreml-validate onnx-validate validate-all-env \
python-dev python-build python-test python-test-fast python-test-wpt python-test-wpt-onnx python-test-wpt-coreml \
python-perf python-perf-full python-clean python-example \
mobilenet-demo mobilenet-serialize mobilenet-serialize-text mobilenet-convert-to-text mobilenet-demo-webnn mobilenet-demo-hub \
minilm-demo-hub \
text-gen-demo text-gen-train text-gen-trained text-gen-enhanced text-gen-train-simple \
docs-serve docs-build docs-clean ci-docs \
help clean-all
clean:
$(CARGO) clean
rm -f target/graph.dot target/graph.png target/graph.onnx target/graph.mlmodel
rm -rf target/graph.mlmodelc
rm -rf $(ORT_DIR)
build:
$(CARGO) build
test:
@echo "Running clippy..."
$(CARGO) clippy --all-targets -- -D warnings
@echo "Running tests..."
$(CARGO) test
fmt:
$(CARGO) fmt
run:
$(CARGO) run -- examples/sample_graph.json
viz:
$(CARGO) run -- $(GRAPH_FILE) --export-dot $(DOT_PATH)
$(DOT) -Tpng $(DOT_PATH) -o $(PNG_PATH)
open $(PNG_PATH)
onnxruntime-download:
@if [ -d "$(ORT_LIB_DIR)" ]; then \
echo "ONNX Runtime already downloaded at $(ORT_LIB_DIR)"; \
else \
echo "Downloading ONNX Runtime $(ORT_VERSION)..."; \
mkdir -p $(ORT_DIR); \
curl -L $(ORT_BASE)/$(ORT_TARBALL) -o $(ORT_DIR)/$(ORT_TARBALL); \
if echo "$(ORT_TARBALL)" | grep -q '\.zip$$'; then \
unzip -q $(ORT_DIR)/$(ORT_TARBALL) -d $(ORT_DIR); \
else \
tar -xzf $(ORT_DIR)/$(ORT_TARBALL) -C $(ORT_DIR); \
fi; \
echo "[OK] ONNX Runtime downloaded and extracted"; \
fi
onnx: onnxruntime-download
ORT_STRATEGY=system ORT_LIB_LOCATION=$(ORT_LIB_LOCATION) DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) RUSTFLAGS="-L $(ORT_LIB_DIR)" $(CARGO) run --features onnx-runtime -- $(GRAPH_FILE) --convert onnx --convert-output $(ONNX_PATH)
@echo "ONNX graph written to $(ONNX_PATH)"
onnx-validate: onnx
ORT_STRATEGY=system ORT_LIB_LOCATION=$(ORT_LIB_LOCATION) DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) RUSTFLAGS="-L $(ORT_LIB_DIR)" $(CARGO) run --features onnx-runtime -- $(GRAPH_FILE) --convert onnx --convert-output $(ONNX_PATH) --run-onnx
coreml:
$(CARGO) run -- $(GRAPH_FILE) --convert coreml --convert-output $(COREML_PATH)
@echo "CoreML graph written to $(COREML_PATH)"
coreml-validate: coreml
$(CARGO) run --features coreml-runtime -- $(GRAPH_FILE) --convert coreml --convert-output $(COREML_PATH) --run-coreml --coreml-compiled-output $(COREMLC_PATH)
webnn-venv:
python3 -m venv .venv-webnn
. .venv-webnn/bin/activate && pip install --upgrade pip && pip install git+https://github.com/huningxin/onnx2webnn.git
validate-all-env: build test onnx-validate coreml-validate
@echo "Full pipeline (build/test/convert/validate) completed."
python-dev: onnxruntime-download
@echo "Installing Python package in development mode with all backends..."
@if [ ! -d .venv-webnn ]; then \
$(PYTHON) -m venv .venv-webnn; \
.venv-webnn/bin/pip install --upgrade pip; \
.venv-webnn/bin/pip install pytest pytest-asyncio pytest-xdist numpy maturin; \
fi
VIRTUAL_ENV=$(PWD)/.venv-webnn \
PATH=$(PWD)/.venv-webnn/bin:$$PATH \
ORT_STRATEGY=system \
ORT_LIB_LOCATION=$(ORT_LIB_LOCATION) \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) \
RUSTFLAGS="-L $(ORT_LIB_DIR)" \
.venv-webnn/bin/maturin develop --features python,onnx-runtime,coreml-runtime
SKIP_ORT_STAGE ?= 0
python-build: onnxruntime-download
@echo "Building Python wheel with all backends..."
$(PYTHON) -m pip install --upgrade pip
$(PYTHON) -m pip install maturin
@if [ "$(SKIP_ORT_STAGE)" != "1" ]; then \
echo "Staging ONNX Runtime shared libs into python package..."; \
mkdir -p python/webnn; \
cp $(ORT_SHARED_GLOB) python/webnn/; \
fi
ORT_STRATEGY=system \
ORT_LIB_LOCATION=$(ORT_LIB_LOCATION) \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) \
RUSTFLAGS="-L $(ORT_LIB_DIR)" \
$(PYTHON) -m maturin build $(MATURIN_ARGS) --features python,onnx-runtime,coreml-runtime --release
@if [ "$(SKIP_ORT_STAGE)" != "1" ]; then \
echo "Cleaning staged ONNX Runtime shared libs..."; \
rm -f python/webnn/libonnxruntime*.dylib python/webnn/libonnxruntime*.so* python/webnn/onnxruntime.dll; \
fi
python-stage-ort: onnxruntime-download
@echo "Staging ONNX Runtime shared libs into python package..."
@mkdir -p python/webnn
cp $(ORT_SHARED_GLOB) python/webnn/
python-unstage-ort:
@echo "Cleaning staged ONNX Runtime shared libs..."
rm -f python/webnn/libonnxruntime*.dylib python/webnn/libonnxruntime*.so* python/webnn/onnxruntime.dll
python-test: python-dev
@echo "Running Python tests (includes WPT conformance tests)..."
@if [ -f .venv-webnn/bin/python ]; then \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) .venv-webnn/bin/python -m pytest tests/ -v; \
EXIT_CODE=$$?; \
if [ $$EXIT_CODE -eq 134 ] || [ $$EXIT_CODE -eq 139 ]; then \
echo "[WARNING] Note: Python crashed during cleanup"; \
echo "[OK] All tests passed successfully before the crash"; \
exit 0; \
else \
exit $$EXIT_CODE; \
fi; \
else \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) python -m pytest tests/ -v; \
EXIT_CODE=$$?; \
if [ $$EXIT_CODE -eq 134 ] || [ $$EXIT_CODE -eq 139 ]; then \
echo "[WARNING] Note: Python crashed during cleanup"; \
echo "[OK] All tests passed successfully before the crash"; \
exit 0; \
else \
exit $$EXIT_CODE; \
fi; \
fi
python-test-fast: python-dev
@echo "Running Python tests (excluding slow tests with large inputs)..."
@if [ -f .venv-webnn/bin/python ]; then \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) .venv-webnn/bin/python -m pytest tests/ -v -m "not slow"; \
EXIT_CODE=$$?; \
if [ $$EXIT_CODE -eq 134 ] || [ $$EXIT_CODE -eq 139 ]; then \
echo "[WARNING] Note: Python crashed during cleanup"; \
echo "[OK] All tests passed successfully before the crash"; \
exit 0; \
else \
exit $$EXIT_CODE; \
fi; \
else \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) python -m pytest tests/ -v -m "not slow"; \
EXIT_CODE=$$?; \
if [ $$EXIT_CODE -eq 134 ] || [ $$EXIT_CODE -eq 139 ]; then \
echo "[WARNING] Note: Python crashed during cleanup"; \
echo "[OK] All tests passed successfully before the crash"; \
exit 0; \
else \
exit $$EXIT_CODE; \
fi; \
fi
python-test-wpt: python-dev
@echo "Running WPT conformance tests only..."
@if [ -f .venv-webnn/bin/python ]; then \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) .venv-webnn/bin/python -m pytest tests/test_wpt_conformance.py -v; \
else \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) python -m pytest tests/test_wpt_conformance.py -v; \
fi
python-test-wpt-onnx: python-dev
@echo "Running WPT conformance tests - ONNX backend only..."
@if [ -f .venv-webnn/bin/python ]; then \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) .venv-webnn/bin/python -m pytest tests/test_wpt_conformance.py -k "onnx" -v; \
else \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) python -m pytest tests/test_wpt_conformance.py -k "onnx" -v; \
fi
python-test-wpt-coreml: python-dev
@echo "Running WPT conformance tests - CoreML backend only..."
@if [ -f .venv-webnn/bin/python ]; then \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) .venv-webnn/bin/python -m pytest tests/test_wpt_conformance.py -k "coreml" -v; \
else \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) python -m pytest tests/test_wpt_conformance.py -k "coreml" -v; \
fi
python-perf: python-dev
@echo "Running performance benchmarks (quick)..."
@if [ -f .venv-webnn/bin/python ]; then \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) .venv-webnn/bin/python -m pytest tests/test_performance.py -m "benchmark and not slow" -v -s; \
else \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) python -m pytest tests/test_performance.py -m "benchmark and not slow" -v -s; \
fi
python-perf-full: python-dev
@echo "Running full performance benchmark suite..."
@if [ -f .venv-webnn/bin/python ]; then \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) .venv-webnn/bin/python -m pytest tests/test_performance.py -m "benchmark" -v -s; \
else \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) python -m pytest tests/test_performance.py -m "benchmark" -v -s; \
fi
python-example: python-dev
@echo "Running Python examples..."
@if [ -f .venv-webnn/bin/python ]; then \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) .venv-webnn/bin/python examples/python_simple.py; \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) .venv-webnn/bin/python examples/python_matmul.py; \
else \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) python examples/python_simple.py; \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) python examples/python_matmul.py; \
fi
mobilenet-demo: python-dev
@echo "Installing demo dependencies..."
@if [ -f .venv-webnn/bin/python ]; then \
.venv-webnn/bin/pip install -q Pillow requests; \
else \
pip install -q Pillow requests; \
fi
@echo "========================================================================"
@echo "Running MobileNetV2 Image Classifier on All Backends"
@echo "========================================================================"
@echo ""
@echo "Backend 1/3: ONNX CPU"
@echo "------------------------------------------------------------------------"
@if [ -f .venv-webnn/bin/python ]; then \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) .venv-webnn/bin/python examples/mobilenetv2_complete.py examples/images/test.jpg --backend cpu; \
else \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) python examples/mobilenetv2_complete.py examples/images/test.jpg --backend cpu; \
fi
@echo ""
@echo "Backend 2/3: ONNX GPU"
@echo "------------------------------------------------------------------------"
@if [ -f .venv-webnn/bin/python ]; then \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) .venv-webnn/bin/python examples/mobilenetv2_complete.py examples/images/test.jpg --backend gpu; \
else \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) python examples/mobilenetv2_complete.py examples/images/test.jpg --backend gpu; \
fi
@echo ""
@echo "Backend 3/3: CoreML (Neural Engine)"
@echo "------------------------------------------------------------------------"
@if [ -f .venv-webnn/bin/python ]; then \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) .venv-webnn/bin/python examples/mobilenetv2_complete.py examples/images/test.jpg --backend coreml; \
else \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) python examples/mobilenetv2_complete.py examples/images/test.jpg --backend coreml; \
fi
@echo ""
@echo "========================================================================"
@echo "All three backends completed successfully!"
@echo "========================================================================"
mobilenet-serialize: python-dev
@echo "Installing demo dependencies..."
@if [ -f .venv-webnn/bin/python ]; then \
.venv-webnn/bin/pip install -q Pillow requests numpy; \
else \
pip install -q Pillow requests numpy; \
fi
@echo "========================================================================"
@echo "Serializing MobileNetV2 to WebNN Graph Format (JSON)"
@echo "========================================================================"
@if [ -f .venv-webnn/bin/python ]; then \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) .venv-webnn/bin/python scripts/serialize_mobilenet_to_webnn.py; \
else \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) python scripts/serialize_mobilenet_to_webnn.py; \
fi
mobilenet-serialize-text: python-dev
@echo "Installing demo dependencies..."
@if [ -f .venv-webnn/bin/python ]; then \
.venv-webnn/bin/pip install -q numpy; \
else \
pip install -q numpy; \
fi
@echo "========================================================================"
@echo "Serializing MobileNetV2 to WebNN Text Format + Binary Weights"
@echo "========================================================================"
@if [ -f .venv-webnn/bin/python ]; then \
.venv-webnn/bin/python scripts/serialize_mobilenet_to_webnn_text.py; \
else \
python scripts/serialize_mobilenet_to_webnn_text.py; \
fi
mobilenet-convert-to-text: python-dev
@echo "Installing dependencies..."
@if [ -f .venv-webnn/bin/python ]; then \
.venv-webnn/bin/pip install -q numpy; \
else \
pip install -q numpy; \
fi
@if [ ! -f examples/mobilenetv2_complete.webnn ]; then \
echo "Error: examples/mobilenetv2_complete.webnn not found"; \
echo "Please run 'make mobilenet-serialize' first to create the JSON file"; \
exit 1; \
fi
@echo "========================================================================"
@echo "Converting MobileNetV2 JSON to Text Format + Binary Weights"
@echo "========================================================================"
@if [ -f .venv-webnn/bin/python ]; then \
.venv-webnn/bin/python scripts/convert_json_to_text_format.py examples/mobilenetv2_complete.webnn; \
else \
python scripts/convert_json_to_text_format.py examples/mobilenetv2_complete.webnn; \
fi
@echo ""
@echo "Conversion complete! You can now delete the large JSON file:"
@echo " rm examples/mobilenetv2_complete.webnn"
mobilenet-demo-webnn: python-dev
@echo "Installing demo dependencies..."
@if [ -f .venv-webnn/bin/python ]; then \
.venv-webnn/bin/pip install -q Pillow requests; \
else \
pip install -q Pillow requests; \
fi
@if [ ! -f examples/mobilenetv2_complete.webnn ]; then \
echo "Serialized graph not found. Running serialization first..."; \
$(MAKE) mobilenet-serialize; \
fi
@echo "========================================================================"
@echo "Running MobileNetV2 (WebNN Graph Format) on All Backends"
@echo "========================================================================"
@echo ""
@echo "Backend 1/3: ONNX CPU"
@echo "------------------------------------------------------------------------"
@if [ -f .venv-webnn/bin/python ]; then \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) .venv-webnn/bin/python examples/mobilenetv2_from_webnn.py examples/images/test.jpg --backend cpu; \
else \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) python examples/mobilenetv2_from_webnn.py examples/images/test.jpg --backend cpu; \
fi
@echo ""
@echo "Backend 2/3: ONNX GPU"
@echo "------------------------------------------------------------------------"
@if [ -f .venv-webnn/bin/python ]; then \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) .venv-webnn/bin/python examples/mobilenetv2_from_webnn.py examples/images/test.jpg --backend gpu; \
else \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) python examples/mobilenetv2_from_webnn.py examples/images/test.jpg --backend gpu; \
fi
@echo ""
@echo "Backend 3/3: CoreML (Neural Engine)"
@echo "------------------------------------------------------------------------"
@if [ -f .venv-webnn/bin/python ]; then \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) .venv-webnn/bin/python examples/mobilenetv2_from_webnn.py examples/images/test.jpg --backend coreml; \
else \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) python examples/mobilenetv2_from_webnn.py examples/images/test.jpg --backend coreml; \
fi
@echo ""
@echo "========================================================================"
@echo "All three backends completed successfully!"
@echo "========================================================================"
mobilenet-demo-hub: python-dev
@echo "Installing demo dependencies..."
@if [ -f .venv-webnn/bin/python ]; then \
.venv-webnn/bin/pip install -q Pillow requests; \
else \
pip install -q Pillow requests; \
fi
@echo "========================================================================"
@echo "Running MobileNetV2 (Hugging Face Hub)"
@echo "========================================================================"
@echo ""
@echo "Downloading model from Hugging Face Hub: tarekziade/mobilenet-webnn"
@echo "------------------------------------------------------------------------"
@if [ -f .venv-webnn/bin/python ]; then \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) .venv-webnn/bin/python examples/mobilenetv2_from_hub.py examples/images/test.jpg --backend cpu; \
else \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) python examples/mobilenetv2_from_hub.py examples/images/test.jpg --backend cpu; \
fi
@echo ""
@echo "========================================================================"
@echo "Demo completed successfully!"
@echo "========================================================================"
minilm-demo-hub: python-dev
@echo "Installing demo dependencies..."
@if [ -f .venv-webnn/bin/python ]; then \
.venv-webnn/bin/pip install -q transformers torch --index-url https://download.pytorch.org/whl/cpu; \
else \
pip install -q transformers torch --index-url https://download.pytorch.org/whl/cpu; \
fi
@echo "========================================================================"
@echo "Running all-MiniLM-L6-v2 demo (Hugging Face Hub)"
@echo "========================================================================"
@echo ""
@echo "Downloading model from Hugging Face Hub: tarekziade/all-MiniLM-L6-v2-webnn"
@echo "------------------------------------------------------------------------"
@if [ -f .venv-webnn/bin/python ]; then \
MINILM_MODEL_ID=tarekziade/all-MiniLM-L6-v2-webnn DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) .venv-webnn/bin/python examples/minilm_embeddings.py; \
else \
MINILM_MODEL_ID=tarekziade/all-MiniLM-L6-v2-webnn DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) python examples/minilm_embeddings.py; \
fi
@echo ""
@echo "========================================================================"
@echo "Demo completed successfully!"
@echo "========================================================================"
text-gen-demo: python-dev
@echo "========================================================================"
@echo "Running Text Generation Demo on All Backends"
@echo "========================================================================"
@echo ""
@echo "Backend 1/3: ONNX CPU"
@echo "------------------------------------------------------------------------"
@if [ -f .venv-webnn/bin/python ]; then \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) .venv-webnn/bin/python examples/text_generation_gpt.py --prompt "Hello world" --tokens 30 --temperature 0.8 --backend cpu; \
else \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) python examples/text_generation_gpt.py --prompt "Hello world" --tokens 30 --temperature 0.8 --backend cpu; \
fi
@echo ""
@echo "Backend 2/3: ONNX GPU"
@echo "------------------------------------------------------------------------"
@if [ -f .venv-webnn/bin/python ]; then \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) .venv-webnn/bin/python examples/text_generation_gpt.py --prompt "Hello world" --tokens 30 --temperature 0.8 --backend gpu; \
else \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) python examples/text_generation_gpt.py --prompt "Hello world" --tokens 30 --temperature 0.8 --backend gpu; \
fi
@echo ""
@echo "Backend 3/3: CoreML (Neural Engine)"
@echo "------------------------------------------------------------------------"
@if [ -f .venv-webnn/bin/python ]; then \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) .venv-webnn/bin/python examples/text_generation_gpt.py --prompt "Hello world" --tokens 30 --temperature 0.8 --backend coreml; \
else \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) python examples/text_generation_gpt.py --prompt "Hello world" --tokens 30 --temperature 0.8 --backend coreml; \
fi
@echo ""
@echo "========================================================================"
@echo "All three backends completed successfully!"
@echo "========================================================================"
text-gen-train: python-dev
@echo "========================================================================"
@echo "Training Text Generation Model"
@echo "========================================================================"
@echo ""
@if [ -f .venv-webnn/bin/python ]; then \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) .venv-webnn/bin/python examples/train_text_model.py --data examples/sample_text.txt --epochs 10 --batch-size 32 --lr 0.05 --save trained_model.json; \
else \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) python examples/train_text_model.py --data examples/sample_text.txt --epochs 10 --batch-size 32 --lr 0.05 --save trained_model.json; \
fi
@echo ""
@echo "========================================================================"
@echo "Training completed! Model saved to trained_model.json"
@echo "========================================================================"
text-gen-trained: python-dev
@echo "========================================================================"
@echo "Text Generation with Trained Weights"
@echo "========================================================================"
@echo ""
@if [ ! -f trained_model.json ]; then \
echo "Error: trained_model.json not found. Run 'make text-gen-train' first."; \
exit 1; \
fi
@if [ -f .venv-webnn/bin/python ]; then \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) .venv-webnn/bin/python examples/text_generation_gpt.py --weights trained_model.json --prompt "The model" --tokens 50 --temperature 0.8 --backend cpu; \
else \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) python examples/text_generation_gpt.py --weights trained_model.json --prompt "The model" --tokens 50 --temperature 0.8 --backend cpu; \
fi
@echo ""
@echo "========================================================================"
@echo "Generation with trained weights completed!"
@echo "========================================================================"
text-gen-enhanced: python-dev
@echo "========================================================================"
@echo "Enhanced Text Generation with KV Cache"
@echo "========================================================================"
@echo ""
@if [ -f .venv-webnn/bin/python ]; then \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) .venv-webnn/bin/python examples/text_generation_enhanced.py --use-kv-cache --prompt "Hello world" --tokens 30 --temperature 0.8 --backend cpu; \
else \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) python examples/text_generation_enhanced.py --use-kv-cache --prompt "Hello world" --tokens 30 --temperature 0.8 --backend cpu; \
fi
@echo ""
@echo "========================================================================"
@echo "Enhanced generation with KV cache completed!"
@echo "========================================================================"
text-gen-train-simple: python-dev
@echo "========================================================================"
@echo "Simple Training Demo That Actually Works!"
@echo "========================================================================"
@echo ""
@if [ -f .venv-webnn/bin/python ]; then \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) .venv-webnn/bin/python examples/train_simple_demo.py --phrase "the quick brown fox" --epochs 100 --lr 0.15; \
else \
DYLD_LIBRARY_PATH=$(ORT_LIB_DIR) python examples/train_simple_demo.py --phrase "the quick brown fox" --epochs 100 --lr 0.15; \
fi
@echo ""
@echo "========================================================================"
@echo "Simple training completed - loss decreased!"
@echo "========================================================================"
python-clean:
@echo "Cleaning Python artifacts..."
rm -rf target/wheels
rm -rf python/webnn/__pycache__
rm -rf tests/__pycache__
rm -rf examples/__pycache__
find . -name "*.pyc" -delete
find . -name "*.so" -delete
find . -name "*.pyd" -delete
docs-serve:
@echo "Serving documentation with live reload..."
@command -v mkdocs >/dev/null 2>&1 || { echo "Installing mkdocs..."; pip install -r docs/requirements.txt; }
mkdocs serve
docs-build:
@echo "Building documentation..."
@command -v mkdocs >/dev/null 2>&1 || { echo "Installing mkdocs..."; pip install -r docs/requirements.txt; }
mkdocs build
@touch site/.nojekyll
@echo "Created .nojekyll file to prevent GitHub Pages Jekyll processing"
ci-docs:
@echo "Building documentation in strict mode (CI)..."
@command -v mkdocs >/dev/null 2>&1 || { echo "Installing mkdocs..."; pip install -r docs/requirements.txt; }
mkdocs build --strict
@touch site/.nojekyll
@echo "Created .nojekyll file to prevent GitHub Pages Jekyll processing"
docs-clean:
@echo "Cleaning documentation build artifacts..."
rm -rf site/
clean-all: clean python-clean docs-clean
@echo "All build artifacts cleaned."
help:
@echo "Rust WebNN Graph - Available Targets"
@echo "===================================="
@echo ""
@echo "Rust Targets:"
@echo " build - Build the Rust project"
@echo " test - Run Rust tests"
@echo " fmt - Format Rust code"
@echo " run - Run with sample graph"
@echo " clean - Clean Rust build artifacts"
@echo ""
@echo "Visualization:"
@echo " viz - Generate and open graph visualization"
@echo ""
@echo "ONNX Conversion:"
@echo " onnxruntime-download - Download ONNX Runtime"
@echo " onnx - Convert graph to ONNX format"
@echo " onnx-validate - Convert and validate ONNX graph"
@echo ""
@echo "CoreML Conversion:"
@echo " coreml - Convert graph to CoreML format"
@echo " coreml-validate - Convert and validate CoreML graph"
@echo ""
@echo "Python API:"
@echo " python-dev - Install Python package in development mode"
@echo " python-build - Build Python wheel"
@echo " python-test - Run all Python tests (includes WPT)"
@echo " python-test-fast - Run Python tests (excluding slow tests)"
@echo " python-test-wpt - Run WPT conformance tests only"
@echo " python-perf - Run quick performance benchmarks"
@echo " python-perf-full - Run full performance benchmark suite"
@echo " python-example - Run Python examples"
@echo " mobilenet-demo - Run MobileNetV2 classifier (builds graph)"
@echo " mobilenet-serialize - Serialize to JSON format (194 MB)"
@echo " mobilenet-serialize-text - Serialize to text + binary (13 MB)"
@echo " mobilenet-convert-to-text - Convert JSON to text format (194MB -> 13MB)"
@echo " mobilenet-demo-webnn - Run MobileNetV2 (loads from webnn-graph)"
@echo " mobilenet-demo-hub - Run MobileNetV2 (downloads from Hugging Face Hub)"
@echo " minilm-demo-hub - Run all-MiniLM-L6-v2 (downloads from Hugging Face Hub)"
@echo " text-gen-demo - Run basic text generation with attention"
@echo " text-gen-train - Train text generation model on sample data"
@echo " text-gen-trained - Generate text using trained model weights"
@echo " text-gen-enhanced - Run enhanced version with KV cache"
@echo " text-gen-train-simple - Simple training that actually works!"
@echo " python-clean - Clean Python artifacts"
@echo ""
@echo "Documentation:"
@echo " docs-serve - Serve documentation with live reload"
@echo " docs-build - Build static documentation site"
@echo " ci-docs - Build documentation in strict mode (CI)"
@echo " docs-clean - Clean documentation artifacts"
@echo ""
@echo "Comprehensive:"
@echo " validate-all-env - Run full pipeline (build/test/convert/validate)"
@echo " clean-all - Clean all artifacts (Rust + Python + docs)"
@echo " help - Show this help message"
@echo ""