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

Uploaded CPython 3.10 Windows x86-64

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

Uploaded CPython 3.9 Windows x86-64

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

Uploaded CPython 3.8 Windows x86-64

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

Uploaded CPython 3.7m Windows x86-64

accera-1.2.15-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.15-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.15-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: accera-1.2.15-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.15-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 5a3b84d970855b51bb5b156cad64991bcd61eafb42f50e26f3dbb4a24b655aa7
MD5 7f0f2f336e8ace1a7117bb1427b2a319
BLAKE2b-256 cc606882613b76bf96f74a7441b54db89485cd0ad6303dee37a35cada441bab3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 137a5d4478e4c0a16efaa6b36037ca7457f4bb96bf9fd5bfc3e8096fc38c00f6
MD5 e3df4fd25d51a0bb7c64aa47e1616745
BLAKE2b-256 7b6d0e93d10c81ee05de9f84b356cdc7b0fe591ba28a6fd62e2e4cdd55fa75cd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.15-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 4249db7723d689d054f672120870c3ce9215039b00b24853a78349b55f145af7
MD5 4bb60279e136d8b0a0ab81fe30e42a69
BLAKE2b-256 0942e3e9d30d87aea0833017a8a8e1538abf0771509c5b035a0421a936556dd1

See more details on using hashes here.

File details

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

File metadata

  • Download URL: accera-1.2.15-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.15-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 0281afa63374ca62a7e073e5d1578863737a28965807544cc43d0e7cfb9b9584
MD5 e68e76a38471e84431c42794ebf56424
BLAKE2b-256 49d4dabbe7f4e28f9234cea1995831af38fd2ce707313f6ae33ed3cb72266d3d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 77cb62828d99d3953f984d7ad0a647639b5cea6a0d2da87db37de6915ed5bed6
MD5 d4caff49168c5200a13894f106f5dad0
BLAKE2b-256 466545b3d3b8367725c2702414b6a8874117444fd7ee66c4524ace481d884558

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.15-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 a117960ec65103e7b4ed6fa014e3411cb8f2a9e0e9a12a1326d9819ca2737856
MD5 d31288d557d293c95270b82f6d2567b3
BLAKE2b-256 c0502d0f7f7e45cf0190310d7d769e24c9b017c78f9dacdcaf2bcdf420b9f6ad

See more details on using hashes here.

File details

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

File metadata

  • Download URL: accera-1.2.15-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.15-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 ce633b96d5be02d882bf772facf6bf6278218e6af72bc61982cf98da299a5d0d
MD5 29eda31f46f4e21d5411b75f72287507
BLAKE2b-256 dc6aee57f25963b3f9937246c761ca99fa9f9fa66a1e4314dc11ef9bcbf079e2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 919a99f9dcf02ffb40995a9db629df87e51f4d3b10a4376465a421e0519e626a
MD5 3131e73c4b22047381012b5c9bfd1c34
BLAKE2b-256 32fc20405e154295e423716256298f84545c661189f85ad956897b2817bf71dd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.15-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 1b9763c238fccf97fb4bc8932a3606f8b6cab66fcefb0daccbea514ddf20ab08
MD5 136e7b026b56063ace894df45796aa57
BLAKE2b-256 a14336569f75bcb6702e14ee992393d28b0f7dbc503b81b09ebf4ce79ef68c8d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: accera-1.2.15-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.15-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 4903ec8225b985fe7d7a4525a9546ad1eff3a9b92873a6e54a3d1c90bff8145c
MD5 fbf5e7ce3e9c99cb8a345a56d9195fb7
BLAKE2b-256 1378ffcfaf694d33d7591d02a663df383ff9de62d8dd3c09b4e7d38b84436e0e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.15-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 946e08b7fe44c030133a9788537a9eb76c2a81c433de31efda312851d0826f98
MD5 19de675a8c0afd172d1205748a4ff7a6
BLAKE2b-256 c7a63c486bf30321a5dcbbe92bdf5b5e00c66cee948a4e77e06e76d33fd774d8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.15-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 c0a41443d54028c14f3b35b60a469ef859ffb3bd31d49817133a330609f624e1
MD5 74afd205ed8d329b373f82fc361a40c9
BLAKE2b-256 a73a1088690679cee1089b1da8e841a9f33582c9d1b8e177c6f0eaa595ccbf22

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