77# Example script for exporting simple models to flatbuffer
88
99import logging
10+ import tempfile
1011
1112from executorch .backends .cadence .aot .ops_registrations import * # noqa
12-
1313import os
1414from typing import Any , Tuple
1515
1616from executorch .backends .cadence .aot .compiler import (
17+ convert_pt2 ,
1718 export_to_cadence ,
1819 export_to_edge ,
1920 quantize_pt2 ,
2021)
22+ from executorch .backends .cadence .aot .quantizer .quantizer import CadenceQuantizer
23+ from executorch .backends .cadence .runtime import runtime
24+ from executorch .backends .cadence .runtime .executor import BundledProgramManager
2125from executorch .exir import ExecutorchProgramManager
2226from torch import nn
2327
@@ -44,23 +48,50 @@ def _save_pte_program(
4448 logging .error (f"Error while saving to { filename } : { e } " )
4549
4650
51+ def _save_bpte_program (
52+ buffer : bytes ,
53+ model_name : str ,
54+ output_dir : str = "" ,
55+ ) -> None :
56+ if model_name .endswith (".bpte" ):
57+ filename = model_name
58+ else :
59+ filename = os .path .join (output_dir , f"{ model_name } .bpte" )
60+ try :
61+ with open (filename , "wb" ) as f :
62+ f .write (buffer )
63+ logging .info (f"Saved exported program to { filename } " )
64+ except Exception as e :
65+ logging .error (f"Error while saving to { output_dir } : { e } " )
66+
67+
4768def export_model (
4869 model : nn .Module ,
4970 example_inputs : Tuple [Any , ...],
5071 file_name : str = "CadenceDemoModel" ,
5172):
73+ # create work directory for outputs and model binary
74+ working_dir = tempfile .mkdtemp (dir = "/tmp" )
75+ logging .debug (f"Created work directory { working_dir } " )
76+
77+ # convert the model (also called in quantize_pt2)
78+ converted_model = convert_pt2 (model , example_inputs , CadenceQuantizer ())
79+
80+ # Get reference outputs from quantized_model
81+ ref_outputs = converted_model (* example_inputs )
82+
5283 # Quantize the model
5384 quantized_model = quantize_pt2 (model , example_inputs )
5485
55- # Get edge program
86+ # Get edge program (also called in export_to_cadence)
5687 edge_prog_manager = export_to_edge (quantized_model , example_inputs )
5788
5889 # Get edge program after Cadence specific passes
5990 cadence_prog_manager = export_to_cadence (quantized_model , example_inputs )
6091
61- exec_prog = cadence_prog_manager .to_executorch ()
92+ exec_prog : ExecutorchProgramManager = cadence_prog_manager .to_executorch ()
6293
63- logging .info ("Final exported graph:" )
94+ logging .info ("Final exported graph:\n " )
6495 exec_prog .exported_program ().graph_module .graph .print_tabular ()
6596
6697 # Print some information to terminal
@@ -69,5 +100,28 @@ def export_model(
69100 cadence_prog_manager .exported_program ().graph_module ,
70101 )
71102
72- # Save the program as (default name is CadenceDemoModel.pte)
73- _save_pte_program (exec_prog , file_name )
103+ forward_test_data = BundledProgramManager .bundled_program_test_data_gen (
104+ method = "forward" , inputs = example_inputs , expected_outputs = ref_outputs
105+ )
106+ bundled_program_manager = BundledProgramManager ([forward_test_data ])
107+ buffer = bundled_program_manager ._serialize (
108+ exec_prog ,
109+ bundled_program_manager .get_method_test_suites (),
110+ forward_test_data ,
111+ )
112+ # Save the program as pte (default name is CadenceDemoModel.pte)
113+ _save_pte_program (exec_prog , file_name , working_dir )
114+ # Save the program as btpe (default name is CadenceDemoModel.bpte)
115+ _save_bpte_program (buffer , file_name , working_dir )
116+
117+ logging .debug (
118+ f"Executorch bundled program buffer saved to { file_name } is { len (buffer )} total bytes"
119+ )
120+
121+ # TODO: move to test infra
122+ runtime .run_and_compare (
123+ executorch_prog = exec_prog ,
124+ inputs = example_inputs ,
125+ ref_outputs = ref_outputs ,
126+ working_dir = working_dir ,
127+ )
0 commit comments