Package: accera
Problem at HandWriting highly optimized compute-intensive code in a traditional programming language is strenuous and time-consuming. Not only does it require advanced engineering skills such as fluency in Assembly language, but a deep understanding of computer architecture is also indispensable. Manual optimization of even the simplest numerical algorithms demands a significant engineering effort. Needless to say, a highly optimized numerical code is often prone to bugs, lacks readability, and offers little to no usability. Code maintenance becomes a nightmare resulting in the reimplementation of the same logic every time an architecture level change is introduced.Accera: An Optimized SolutionAccera is a compiler that enables you to experiment with loop optimizations without hand-writing Assembly code. With Accera, these problems and impediments can be addressed in an optimized way. It is available as a Python library and supports cross-compiling to a wide range ofprocessor targets.Accera has THREE primary goals:Performance: To guarantee the fastest implementation for any compute-intensive algorithm.Readability: To ensure effective implementation of algorithms without sacrificing the readability of code.Writability: To provide a user-friendly programming model, designed for agility and maintainability.InstallTo install for Linux, macOS, or Windows (requires Python 3.7-3.10):pipinstallacceraSee theInstall Instructionsfor more details on installing pre-built Python 3 packages and how to build Accera from the source.QuickstartIn this example, we will:Implement matrix multiplication with a ReLU activation (matmul + ReLU), commonly used in machine learning algorithms.Generate two implementations: a naive algorithm and loop-based transformations.Compare the execution time of both implementations.Run in your browserNo installation is required. This will launch a Jupyter notebook with the quickstart example running in the cloud.Run on your machineCreate a Python 3 script calledquickstart.py:importacceraasacc# define placeholder inputs/outputA=acc.Array(role=acc.Role.INPUT,shape=(512,512))B=acc.Array(role=acc.Role.INPUT,shape=(512,512))C=acc.Array(role=acc.Role.INPUT_OUTPUT,shape=(512,512))# implement the logic for matmul and relumatmul=acc.Nest(shape=(512,512,512))i1,j1,k1=matmul.get_indices()@matmul.iteration_logicdef_():C[i1,j1]+=A[i1,k1]*B[k1,j1]relu=acc.Nest(shape=(512,512))i2,j2=relu.get_indices()@relu.iteration_logicdef_():C[i2,j2]=acc.max(C[i2,j2],0.0)package=acc.Package()# fuse the i and j indices of matmul and relu, add to the packageschedule=acc.fuse(matmul.create_schedule(),relu.create_schedule(),partial=2)package.add(schedule,args=(A,B,C),base_name="matmul_relu_fusion_naive")# transform the schedule, add to the packagei,j,f,k=schedule.get_indices()ii,jj=schedule.tile({i:16,j:16})# loop tilingschedule.reorder(j,i,f,k,jj,ii)# loop reorderingplan=schedule.create_plan()plan.unroll(ii)# loop unrollingpackage.add(plan,args=(A,B,C),base_name="matmul_relu_fusion_transformed")# build a dynamically-linked package (a .dll or .so) that exports both functionsprint(package.build(name="hello_accera",format=acc.Package.Format.HAT_DYNAMIC))Ensure that you have a compiler in your PATH:Windows: Install Microsoft Visual Studio and runvcvars64.batto setup the command prompt.Linux/macOS: Install gccDon't have a compiler handy? We recommend trying Accera in your browser insteadInstall Accera:pipinstallacceraGenerate the library that implements two versions of matmul + ReLU:pythonquickstart.pyTo consume and compare the library functions, create a file calledbenchmark.pyin the same location:importhatlibashatimportnumpyasnp# load the package_,functions=hat.load("hello_accera.hat")# call one of the functions with test inputsA_test=np.random.rand(512,512).astype(np.float32)B_test=np.random.rand(512,512).astype(np.float32)C_test=np.zeros((512,512)).astype(np.float32)C_numpy=np.maximum(C_test+A_test@B_test,0.0)matmul_relu=functions["matmul_relu_fusion_transformed"]matmul_relu(A_test,B_test,C_test)# check correctnessnp.testing.assert_allclose(C_test,C_numpy,atol=1e-3)# benchmark all functionshat.run_benchmark("hello_accera.hat",batch_size=5,min_time_in_sec=5)Run the benchmark to get the execution time results:pythonbenchmark.pyNext StepsTheManualis the best introductory resource for the Accera Python programming model.In particular, theschedule transformationsdescribe how you can experiment with different loop transformations with just a few lines of Python code.Finally, the.hatformat is just a C header file containing the metadata. Learn more about theHAT formatandbenchmarking.How it worksIn a nutshell, Accera takes the Python code that defines the loop schedule and algorithm while converting it intoMLIRintermediate representation (IR). Accera's compiler then takes this IR through a series of MLIR pipelines to perform transformations. The result is a binary library with a C header file. The library implements the algorithms that are defined in Python and it is compatible with the target.To peek into the stages of IR transformation that Accera does, try replacingformat=acc.Package.Format.HAT_DYNAMICwithformat=acc.Package.Format.MLIR_DYNAMICinquickstart.py, re-run the script, and search the_tmpsubfolder for the intermediate*.mlirfiles. We plan to document these IR constructs in the future.DocumentationGet familiar with Accera's concepts and Python constructs in theDocumentationpage.TutorialsStep-by-step examples are available on theTutorialspage. We're working on adding more complementary examples and tutorials.ContributionsAccera is a research platform-in-progress that can certainly benefit from your contributions. We would love your feedback, recommendations, and feature requests. Not to mention that we are excited to answer your questions. Let’s collaborate! Please file aGithub issueor send us a pull request. Please review theMicrosoft Code of Conductto learn more.CreditsAccera is built using several open source libraries, including:LLVM,pybind11,toml++,tomlkit,vcpkg,pyyaml, andHAT. For testing, we usednumpyandcatch2.LicenseThis project is released under theMIT License.