Skip to main content

Accera - An optimizing cross-compiler for compute-intensive code

Project description

Accera logo

PyPI package version Python versions MIT License

Problem at Hand

Writing 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 Solution

Accera 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 of processor 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.

Install

To install for Linux, macOS, or Windows (requires Python 3.7-3.10):

pip install accera

See the Install Instructions for more details on installing pre-built Python 3 packages and how to build Accera from the source.

Quickstart

In 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 browser

Binder

No installation is required. This will launch a Jupyter notebook with the quickstart example running in the cloud.

Run on your machine

  1. Create a Python 3 script called quickstart.py:

    import accera as acc
    
    # define placeholder inputs/output
    A = acc.Array(role=acc.Array.Role.INPUT, shape=(512, 512))
    B = acc.Array(role=acc.Array.Role.INPUT, shape=(512, 512))
    C = acc.Array(role=acc.Array.Role.INPUT_OUTPUT, shape=(512, 512))
    
    # implement the logic for matmul and relu
    matmul = acc.Nest(shape=(512, 512, 512))
    i1, j1, k1 = matmul.get_indices()
    @matmul.iteration_logic
    def _():
        C[i1, j1] += A[i1, k1] * B[k1, j1]
    
    relu = acc.Nest(shape=(512, 512))
    i2, j2 = relu.get_indices()
    @relu.iteration_logic
    def _():
        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 package
    schedule = 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 package
    f, i, j, k = schedule.get_indices()
    ii, jj = schedule.tile({
        i: 16,
        j: 16
    }) # loop tiling
    schedule.reorder(j, i, f, k, jj, ii) # loop reordering
    plan = schedule.create_plan()
    plan.unroll(ii) # loop unrolling
    package.add(plan, args=(A, B, C), base_name="matmul_relu_fusion_transformed")
    
    # build a dynamically-linked package (a .dll or .so) that exports both functions
    print(package.build(name="hello_accera", format=acc.Package.Format.HAT_DYNAMIC))
    
  2. Ensure that you have a compiler in your PATH:

    • Windows: Install Microsoft Visual Studio and run vcvars64.bat to setup the command prompt.
    • Linux/macOS: Install gcc

    Don't have a compiler handy? We recommend trying Accera in your browser instead Binder

  3. Install Accera:

    pip install accera
    
  4. Generate the library that implements two versions of matmul + ReLU:

    python quickstart.py
    
  5. To consume and compare the library functions, create a file called benchmark.py in the same location:

    import hatlib as hat
    import numpy as np
    
    # load the package
    _, functions = hat.load("hello_accera.hat")
    
    # call one of the functions with test inputs
    A_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 correctness
    np.testing.assert_allclose(C_test, C_numpy, atol=1e-3)
    
    # benchmark all functions
    hat.run_benchmark("hello_accera.hat", batch_size=5, min_time_in_sec=5)
    
  6. Run the benchmark to get the execution time results:

    python benchmark.py
    

Next Steps

The Manual is the best introductory resource for the Accera Python programming model.

In particular, the schedule transformations describe how you can experiment with different loop transformations with just a few lines of Python code.

Finally, the .hat format is just a C header file containing the metadata. Learn more about the HAT format and benchmarking.

How it works

In a nutshell, Accera takes the Python code that defines the loop schedule and algorithm while converting it into MLIR intermediate 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 replacing format=acc.Package.Format.HAT_DYNAMIC with format=acc.Package.Format.MLIR_DYNAMIC in quickstart.py, re-run the script, and search the _tmp subfolder for the intermediate *.mlir files. We plan to document these IR constructs in the future.

Documentation

Get familiar with Accera's concepts and Python constructs in the Documentation page.

Tutorials

Step-by-step examples are available on the Tutorials page. We're working on adding more complementary examples and tutorials.

Contributions

Accera 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 a Github issue or send us a pull request. Please review the Microsoft Code of Conduct to learn more.

Credits

Accera is built using several open source libraries, including: LLVM, pybind11, toml++, tomlkit, vcpkg, pyyaml, and HAT. For testing, we used numpy and catch2.

License

This project is released under the MIT License.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

accera-1.2.19-cp310-cp310-win_amd64.whl (24.2 MB view details)

Uploaded CPython 3.10 Windows x86-64

accera-1.2.19-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (30.9 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

accera-1.2.19-cp310-cp310-macosx_11_0_x86_64.whl (33.5 MB view details)

Uploaded CPython 3.10 macOS 11.0+ x86-64

accera-1.2.19-cp39-cp39-win_amd64.whl (24.2 MB view details)

Uploaded CPython 3.9 Windows x86-64

accera-1.2.19-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (30.9 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

accera-1.2.19-cp39-cp39-macosx_11_0_x86_64.whl (33.5 MB view details)

Uploaded CPython 3.9 macOS 11.0+ x86-64

accera-1.2.19-cp38-cp38-win_amd64.whl (24.2 MB view details)

Uploaded CPython 3.8 Windows x86-64

accera-1.2.19-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (30.9 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

accera-1.2.19-cp38-cp38-macosx_10_15_x86_64.whl (33.5 MB view details)

Uploaded CPython 3.8 macOS 10.15+ x86-64

accera-1.2.19-cp37-cp37m-win_amd64.whl (24.2 MB view details)

Uploaded CPython 3.7m Windows x86-64

accera-1.2.19-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (30.9 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

accera-1.2.19-cp37-cp37m-macosx_10_15_x86_64.whl (33.5 MB view details)

Uploaded CPython 3.7m macOS 10.15+ x86-64

File details

Details for the file accera-1.2.19-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: accera-1.2.19-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 24.2 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.9

File hashes

Hashes for accera-1.2.19-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 8c465af6933a391ee5d625ae2eca008a691377d3e621d2e14651d029bc4f17e4
MD5 d477603651279323bf71cd1b46d1888c
BLAKE2b-256 3c6dffa97a2ec06052a9624ff5ec7a512de0f763d19ce15d3273514e1de29ba5

See more details on using hashes here.

File details

Details for the file accera-1.2.19-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for accera-1.2.19-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7707c0a269f3b1ef0cc5d3c82cb2f9a5e98d763139c49dc8a0eb06a36dbb2457
MD5 f59daae5b8158c1d69942ac36a6ec109
BLAKE2b-256 58adccb790487d2b02addc70016f21d4b2a4680eab79df14b2de7a55860e695a

See more details on using hashes here.

File details

Details for the file accera-1.2.19-cp310-cp310-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for accera-1.2.19-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 50d81d3b0815cb0cd50ce265dfd7ca7f70e8eae8a483f6cf9ffca84c407b67ca
MD5 36c2e6e860c721d01e236cfee9eaed54
BLAKE2b-256 3985acf90521cece68683056969b22d9feef6066e43aba20811a5c77031c3f02

See more details on using hashes here.

File details

Details for the file accera-1.2.19-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: accera-1.2.19-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 24.2 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.13

File hashes

Hashes for accera-1.2.19-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 ef674bb5095cde524ca9c5d21b6dd520ee76a234b66731875db4948ace6fded5
MD5 224b56d70f641f2b588d1d8f9c484c93
BLAKE2b-256 a900e333fca4a0f3d9d2646cfbbc5c6cd8a1fa4a272464c55f5238bad00abc8d

See more details on using hashes here.

File details

Details for the file accera-1.2.19-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for accera-1.2.19-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9d2752f79cc0ef0e2edb6d2f5dad13bdc833691de575bee09c2870d4fd64ac76
MD5 4ab93b91ec7665d4f6d21bb09544228a
BLAKE2b-256 ccf9ef7797368ff5380975f16bccb80e8ca526b6d10f6dbe0bb4bb82f2e32faa

See more details on using hashes here.

File details

Details for the file accera-1.2.19-cp39-cp39-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for accera-1.2.19-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 d3a6a23ab56eb88e504ca1abce4a8b18ddd04ab1cf2e9bfb93586f036c6ca155
MD5 32e0ff5dbebc35b368bb9bf285936266
BLAKE2b-256 c31cd34c78c4eb4db2ce38f8edc097eab52709d2ffd48e9e924d462fbcfdc4d5

See more details on using hashes here.

File details

Details for the file accera-1.2.19-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: accera-1.2.19-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 24.2 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.8.10

File hashes

Hashes for accera-1.2.19-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 bbc0421cd1dc4165c8cb2da8b2ec1cbf3c0a047ad89414067140e28e6c2b5af5
MD5 c5f86a47b59ee61a5122486d1dae484e
BLAKE2b-256 06d1b79450986c8d9a79f705f8b013e128ce99e74a7e2d31f9ae3fa9baf0e390

See more details on using hashes here.

File details

Details for the file accera-1.2.19-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for accera-1.2.19-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 59a0ac7bf3a92092f4955baf8c3c587981582bd781e55ee122f57edbd3219a34
MD5 be881f15e7c76454be6abb7f91176928
BLAKE2b-256 9be1bcebb906959d987b726e3cf18aae6941215f82aa0f43a358c2f07d85dd85

See more details on using hashes here.

File details

Details for the file accera-1.2.19-cp38-cp38-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for accera-1.2.19-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 3f105b092ba070862daa2613223cbce1f7d94765f06a18b11bb3e7d438f68a3e
MD5 3cb1ae0d0268b81d420f97e3362fadf3
BLAKE2b-256 48cf9536163388f1301767f04f29dc0857969153215632e5fe9ef7ef07d191bc

See more details on using hashes here.

File details

Details for the file accera-1.2.19-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: accera-1.2.19-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 24.2 MB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.7.9

File hashes

Hashes for accera-1.2.19-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 ab595871221aa7229d7fc9581e2cc6cca618205cc759563ee0ff03351373d33e
MD5 25ac9fe9c2eb57597db53540bac389e8
BLAKE2b-256 921ce4a068b6041895e59b92e0a8752a0302e5c87e0b9f06b911e252ecce732c

See more details on using hashes here.

File details

Details for the file accera-1.2.19-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for accera-1.2.19-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 baa28f9a47db0f271c0b733fd6e00cf8d5f2a5afccbc9e97d7d8f090a7c9dc68
MD5 3e7fe0c19372a89a16bd191de5fbba9f
BLAKE2b-256 58a25bb74cd0090dd3646a6e80882d6cbc3762beb431a62095383098976d1ecb

See more details on using hashes here.

File details

Details for the file accera-1.2.19-cp37-cp37m-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for accera-1.2.19-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 d211f54f189cafb9226a8a5454633a8711af8dfa7609a19fca649326a1b1f4ae
MD5 af4fd0d678715fba2f38e597e5ec0538
BLAKE2b-256 bf18d4684ffe28e498a5325fe08a11029a80017e9c9e0a8a6f8cd8de851648af

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page