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
    i, j, f, 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.24-cp310-cp310-win_amd64.whl (24.2 MB view details)

Uploaded CPython 3.10 Windows x86-64

accera-1.2.24-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.24-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.24-cp39-cp39-win_amd64.whl (24.2 MB view details)

Uploaded CPython 3.9 Windows x86-64

accera-1.2.24-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.24-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.24-cp38-cp38-win_amd64.whl (24.2 MB view details)

Uploaded CPython 3.8 Windows x86-64

accera-1.2.24-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.24-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.24-cp37-cp37m-win_amd64.whl (24.2 MB view details)

Uploaded CPython 3.7m Windows x86-64

accera-1.2.24-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.24-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.24-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: accera-1.2.24-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.24-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 f5d3ae2aee6317a49a494655ecb2920faaa1753ec0e6f2ae7bdbde6c9fb26f8e
MD5 68c7ae0a987a5acdbb364f1f2bd2b7c0
BLAKE2b-256 9f9a262bbfaa416273155e567c7334866a71bb1a1a35cc7a2a5d2758fe4969bc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.24-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f8f1a4f03fedc8e5c09f36f91d15309f5106e2eab97658f84c9c28e68ca45ff9
MD5 b2b4a0d840efde978aab6fd9d2e614e5
BLAKE2b-256 3f23c497a31b755edea044181d96711c5f479b676fa11db450f74185d914ffcb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.24-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 805812501f3d257faf3b3b76522c66eeb0b442e793d4b3d37505aad11a8f9b5e
MD5 7544e6e72eb551dd901e1d41c69651d4
BLAKE2b-256 e24d46c4ea24fd8f01b9af1d51154f5beae3632db2c0f74db4a26baf10a19469

See more details on using hashes here.

File details

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

File metadata

  • Download URL: accera-1.2.24-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.24-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 7b2ff6c645c59a6f5640965df47e0f7b1aed9c3a1674d54d3f430202ad94deb3
MD5 c8589036450a0e159565951b68d0b5a2
BLAKE2b-256 c1edeb18516c6fcf171cda89fe6473dc3d381561f125635d2cd63a0bd29e5e83

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.24-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7cab12d60222ee579947b967f5849c26d3bb94793bc1f2b13c7143df82467ded
MD5 f774949bebeec8331e7590f6555dbc1f
BLAKE2b-256 67829075d392e06c331b1530b26a8f8651ab39d08f222c1a11c5df320e0e37c2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.24-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 c608f70f68acf1b78452a2a75b4443c46d3e5e340358ca44a4c5b931c79a3188
MD5 39c81110e417a7d04ce077d56cacbc41
BLAKE2b-256 7276320a3fa98b51f5831668955d280f5dc90b1de2e5e5d6c79172da45d660ca

See more details on using hashes here.

File details

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

File metadata

  • Download URL: accera-1.2.24-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.24-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 6fa43798479f8cba98424980a7bc3eeac1f3304981ffb790e2fa4bbd208cb629
MD5 653d93c881dd5d5cb62a8037385130e2
BLAKE2b-256 830188fd6f3f092d8f6f70f4405b0690eb6e1501b3eca15dbb0a7168537bf24c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.24-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3822297ffb2c72bfb3a9c027a7db476da1cfe8248bc95cb36d00852f6df39600
MD5 1b10dc0a4f686f3060175762f755c582
BLAKE2b-256 5efe9015ef32e986cd85a95321b9db97c58d45c3c26e32376caf56615dff659a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.24-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 71ce561297a30b5d55f7e03b3baabcdbc93f0c54fbda85cbb5d96ebc9535db72
MD5 9abdaeb309912098c010ecce1522df30
BLAKE2b-256 fe2a752185b0666a3582ac84c9aed4d56642f8f52e01a3cd39a72f35bca06c6f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: accera-1.2.24-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.24-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 f67f1e2f0b124108cbf152ec2d7b7526afbdc6e793a6e93ac2a69d6e12b1790c
MD5 4ca1eed0b1d0ba74964835a55f60ad27
BLAKE2b-256 fd6aacd11d0d58550bbc9aa42e3e21d3eb85e7a93738c8fec078afe41a9f457d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.24-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a8b99bfc9efefebe6bccc55c598067e9767d089755f1a83ab788adc00e9167bf
MD5 7fd154ba802af27e1b9a42e21119affe
BLAKE2b-256 36349cefac692a34db6d9fc55dc1d5b31a9df22918876ddc3d61b7670e26d0e4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.24-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 2babe608a49720415f5b1d6a517ccb431fc6c10db8cf20686ecabe6a54c7a62c
MD5 e7b923d701f34f9092bd5a67bf42581f
BLAKE2b-256 983f8a03c6f7ff4a2b3f5b55e4da5206fb7cf10255f0a3ada93925f2dfc5e8ba

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