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

Uploaded CPython 3.10 Windows x86-64

accera-1.2.14-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.14-cp310-cp310-macosx_10_15_x86_64.whl (33.5 MB view details)

Uploaded CPython 3.10 macOS 10.15+ x86-64

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

Uploaded CPython 3.9 Windows x86-64

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

Uploaded CPython 3.8 Windows x86-64

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

Uploaded CPython 3.7m Windows x86-64

accera-1.2.14-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.14-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.14-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: accera-1.2.14-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.8

File hashes

Hashes for accera-1.2.14-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 3f93327bd45ca7b08b42a35290951e7012946706917a351fc81780f6914b9b23
MD5 9d80e88222c799befd40728f09a6c37a
BLAKE2b-256 fba6dd7da8a12c403f6e689284f00fde624a34bd28f25663f5c0e0b3a1ba0034

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0019b8267c043c3c84bb74a4c4346848d2d71cd16cec80fafdc12ec284d0aca9
MD5 434bec4f7350714c8a875c78a5bfeb7c
BLAKE2b-256 61bf25cec176c79d7c6afd623d8df4283f494bb508121791417bcf4910c557a4

See more details on using hashes here.

File details

Details for the file accera-1.2.14-cp310-cp310-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for accera-1.2.14-cp310-cp310-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 146ede3acce966ae70c386d59d07789e568e63c6f2bd78a13bb428489b2c2603
MD5 2fe5c2a4eaa0ecdec177a38f5076e80e
BLAKE2b-256 f5b5904bcb61209d30325b97dc392b96db0416ad45940abaac6b82fb85e251ef

See more details on using hashes here.

File details

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

File metadata

  • Download URL: accera-1.2.14-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.14-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 39621569128b4b03816c52ab0112c26fb11d58eace77b2b862f7bb31364d37b7
MD5 8228d1da93e6dbff8e7deab341e42b8b
BLAKE2b-256 3cd63f7cbf79e08e351bdccbf1b7f4cee4253d4ee4fec4b6b03412c4d7cc92d2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c16758231250c6ab0a816b2510cf04ec5626eccca6b44ff4596f029ecddb5ef3
MD5 37f4cc85dc46ba1a69556e577636d7bd
BLAKE2b-256 13334e0760a110d06c8c0d7ebd504354209d9ea24e7a11b69de10f090f9ea474

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.14-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 8e8955c6ee51fd2ffc511cb4c802282f7e23bae7f47e40e0d3b10c39fa18ac0e
MD5 e554ece3bd1cad39b7b217aa618ea046
BLAKE2b-256 84e921dcec3fa16ef24c275ac808eaa5349b9d0cfa80f7389d6500df3f8640c1

See more details on using hashes here.

File details

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

File metadata

  • Download URL: accera-1.2.14-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.14-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 d8c37b2db8e2bf22cdb27ca4f362795bdb328a74fcc3501f034840b2daf886e5
MD5 0ffab658be86a8498043023cba38480f
BLAKE2b-256 8432829e5753bca9c11dc10d75e2c7f04af22f38f61b29e574113303f359be01

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8c0e474c5f891eece811f3d98ab66f296ff53f6567979b3ee23a64e5b9c567fd
MD5 848ce739c2bbdafdf1fafcec381a2a9d
BLAKE2b-256 acf46870e47383376750ca43b290fe5359afdb4df64034a726641d938027b17b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.14-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 b887d458e7ec4447b430797f468269d17d02f73d8e1aafaadcbbc9e88273dab7
MD5 5c132744a01e84d41f597a085fad0447
BLAKE2b-256 e37fe5d13caf72c99596888205dca5b452486b168e04ed0c28e0f45c51eb9e72

See more details on using hashes here.

File details

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

File metadata

  • Download URL: accera-1.2.14-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.14-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 18d801396ba0afaf3257a3f9d8538895497a82286eacd84e7ba741bea30b4b36
MD5 5a84acce632d0d08c8eeb7dfb0417896
BLAKE2b-256 80495fc0a1a069ea220c7415d7fa88cc97d317588a1347efb163e387f9373bf9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.14-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0603a31c608ce512c3bdebbc6c3c9cdabc637097a0d40477004b9cd58006a654
MD5 4af0319a76d9a92f21d815702966aff6
BLAKE2b-256 cd2a2a7f73e0bc72afd118c228d7f1cc79654c2cdf79efb1dcda85eee948b92f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.14-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 f354ad4af3d77b2ed4f4264ee161f524added4d001fdb2c0368c0c0ba9d7ea69
MD5 abbe9c4695df877e2ec7af0ef89bd2c1
BLAKE2b-256 c172507d632464203a068fd5616047bf31bb118a6714d48a34cfc845e199aa06

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