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.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 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.21-cp310-cp310-win_amd64.whl (24.2 MB view details)

Uploaded CPython 3.10 Windows x86-64

accera-1.2.21-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (31.0 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

accera-1.2.21-cp310-cp310-macosx_11_0_x86_64.whl (33.6 MB view details)

Uploaded CPython 3.10 macOS 11.0+ x86-64

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

Uploaded CPython 3.9 Windows x86-64

accera-1.2.21-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (31.0 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

accera-1.2.21-cp39-cp39-macosx_11_0_x86_64.whl (33.6 MB view details)

Uploaded CPython 3.9 macOS 11.0+ x86-64

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

Uploaded CPython 3.8 Windows x86-64

accera-1.2.21-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (31.0 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

accera-1.2.21-cp38-cp38-macosx_10_15_x86_64.whl (33.6 MB view details)

Uploaded CPython 3.8 macOS 10.15+ x86-64

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

Uploaded CPython 3.7m Windows x86-64

accera-1.2.21-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (31.0 MB view details)

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

accera-1.2.21-cp37-cp37m-macosx_10_15_x86_64.whl (33.6 MB view details)

Uploaded CPython 3.7m macOS 10.15+ x86-64

File details

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

File metadata

  • Download URL: accera-1.2.21-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.10

File hashes

Hashes for accera-1.2.21-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 1bf40da4b6cc64162299345ec6c479991217d996be6f78e2b493ca7d4ad8fc6f
MD5 524fafd1dfef1c827b0990e4b7f9ddad
BLAKE2b-256 bc075a4d6f56192fbdf27078817beccfaf4ed8552ce55e636c21d6139aa3f487

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.21-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b13cb6ab541468ae5f08957e8df505e04ade9663477557e868e4eed20cdcc508
MD5 7d5a176c98934534f5a61c752616dbed
BLAKE2b-256 0425dfe6c10c7a03a6844fc91397046840689bcb200e861ba5f73f9c17645db4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.21-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 f6fa0c5b3ec6148094047c3a2bdeb37c915c40d242cba201e177a2332aba2364
MD5 9fbf3310379ee14d04028851131bf974
BLAKE2b-256 ba9f6e823ade81a9ed14f6b2d25ce79d0b1fd8ea6963d50af6c28520889816d7

See more details on using hashes here.

File details

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

File metadata

  • Download URL: accera-1.2.21-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.21-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 b98d48bf28903be4bae34320a9a60326d8f2fba6326c51686e0ce2b7aa15b808
MD5 9f257a96710e23efe69a8c3e883a7899
BLAKE2b-256 0012486db14323d2fda7ebaf69da0973d85ad57c113cbd4fea5a0694917f24b9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.21-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9fc9190aae14f8b67e7e5295c85ed022619d3d227f9fd1ffb6a42fd750f51580
MD5 735b5fa29e01acb8b861199f14fb97d1
BLAKE2b-256 85b1d180d440b8c202893cab2d92f2e95c240a97e61a48241cd98c547a8d9001

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.21-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 85cbd2d6cc1d33f564d4ddbf5808ef2c911518f7a8e90b9f83c1378dca2acb59
MD5 e66b5ef3e63aa73a6e3fc061dcb2a22f
BLAKE2b-256 38cb7655efdffbcadcc330f1f6ff5731e31f9f71728d9ea78cf730278230b915

See more details on using hashes here.

File details

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

File metadata

  • Download URL: accera-1.2.21-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.21-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 848c80f9ebf6d603be0984970afdda967bb254b4dbab7ee0cc14f57c49d9e232
MD5 a62d203f5f3cad4f4dc75da5165930ef
BLAKE2b-256 a3d7ae0fa2f009f31117ac5f6fe6f28636fca59618b59a2fe23ab81239d12db9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.21-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8d3c5d3fb5be40a267d7b2b45a39db44d66a348ce099a573d2b5ecac8f4fa7e4
MD5 e73482806a4297a15ee6600a4d8c3611
BLAKE2b-256 63d298373522f483619405c5daf5206121fab99b453e1b2adf6b4e88f271cf94

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.21-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 51a07a88e3101dc7b83a4fec26e1753848f26835be665fa353c53304263fe899
MD5 a40235cb5e25ae232d704c65619d9b95
BLAKE2b-256 ed5b858b66ebd7d4d9904e7406a963cefc750bd90e2f6e282aef296b68610e2e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: accera-1.2.21-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.21-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 c9bd45a45f430e2796333477384e57b1d07d137f89eb5395dbf2437c37905fcc
MD5 9a6470511cff98351fbe76a1f6852e30
BLAKE2b-256 134e59754f3c2216d9192290c231d41e9521eda1e946ab5e0f8b2aa15fa394c8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.21-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8d06e803b8f8575a268aeca19ab4ce93176dd8e8f004aa60e6278bc615d50711
MD5 77fc46b7183d155e2b340e107e00edef
BLAKE2b-256 52cc404bb12a0a7647df355dc4afcb0baf0d25b26b9e3b495a1d3adfb8a3ad3d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.21-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 fc6546c2793f1186c97bbd0f7bd3fc17566f8d9b3ffc4fc0b4aaedb3cf8d00f7
MD5 d68043a9fa7080f12cd6c5fbdf5deabd
BLAKE2b-256 7807405264764278fd972425803319e444cc21bbc071a1d4c2e5bd5f72462d00

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