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

Uploaded CPython 3.10 Windows x86-64

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

Uploaded CPython 3.9 Windows x86-64

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

Uploaded CPython 3.8 Windows x86-64

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

Uploaded CPython 3.7m Windows x86-64

accera-1.2.17-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.17-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.17-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: accera-1.2.17-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.17-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 b0124c993b33b1695ee9cb727e0f1cc6b99b8652504546358ac6b7bfaee324bf
MD5 6bc9d66e54e991a664aa62d5c86f908f
BLAKE2b-256 5355c1fb0f548db14b5553dd2f0d26b3cdbcf243584cf7fb1167c6ce327266af

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.17-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 574e1cd2ad6777240b161b4d9d8c71eebdb654a000c49183896da6c920aad093
MD5 37e143964bc5138be684fbb8a5078503
BLAKE2b-256 a8c6973f6b9cfff483a79ded2431c16687880a0ca472a3b87bde826981b23413

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.17-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 8acfa45bccfb655f7ab918ab33b878b66479e992ba587dff72332af196199244
MD5 6e5ec4533e6a90218afb83e79a0a166a
BLAKE2b-256 311d20e723e9f7ea70edd2585d91774522e842145ae8231b1f006f03ea096205

See more details on using hashes here.

File details

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

File metadata

  • Download URL: accera-1.2.17-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.17-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 9e2d2e6835b4ffad5ad582783373b95896bb9f71f17e36e2c870db7d407aa6d0
MD5 ca42ccfb896c357e8a9732e69af55df1
BLAKE2b-256 840bbf3d253d49cc37e7350540fa070ca0042d5be7e5343fe900c82485e1e969

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.17-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 449137157509c306bf383869d609b80436a7ae2018d9631eed3bbdb875d75110
MD5 2cf5705c08996cbbd40449e08d1f285c
BLAKE2b-256 57800b297cc52655ee905ad2f84c9e57258365c73cc233be6c88f8da327bb26c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.17-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 172df78c722f719557618a6cd402a6ae124d8db825b23be1f866c78552298e72
MD5 5d142714e6da4f3d590702465768ea20
BLAKE2b-256 454c2c9a5bb75dae6ae3f6d388339591eb9de453365f268bde1414a61dd75f1e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: accera-1.2.17-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.17-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 c47119effc47fd9701a3fc2944144afb639fdff146fe8c905d08484b9fe519e3
MD5 61b12ac2f7eaea243c81ae63735b19ae
BLAKE2b-256 67812a7633be7ca617d00d3d768535f556dcad785342e769d7644ab8358fb1fa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.17-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5eb96d0baedb3ac0502cf4316946d46b79ac30d28ff3cbce0b4ce8824e9af34f
MD5 ab2a5e2e3ed24c56a7d0ddb631761975
BLAKE2b-256 c2fb2ac87e90707b9cf3bab7aaa04d2cd27365ddc6a58616d77cb85f7a8c15a5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.17-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 0f41aecae3bdf00f66f97efdf4318077e52c7afd684e5bea08e4d646d4ecf988
MD5 472a610b5f0fd9d40961889b24902751
BLAKE2b-256 c78bab0761c7dc54848a124897392475618dc413379f060aa486f18855ee67dd

See more details on using hashes here.

File details

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

File metadata

  • Download URL: accera-1.2.17-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.17-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 17fb3b9e05038235f8b34c9029fdc9f8573ea0e02881961d12391a3b17b3655e
MD5 7f574719876fd86957975ff04d5f637d
BLAKE2b-256 0813507c18aee8eb4f9375e333843158ea28b29932e693f54d28334aed7b879e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.17-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5ad782c4acdfde2fa35d4e001d968afea96540d94c4d185e9611d20064dd7bfd
MD5 0618ded7c66e9f50bb80356e61e07ae0
BLAKE2b-256 6e4b7201e4cb86bc44aec13a37ad77865f997af2112ae9b09b03f64386957a62

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.17-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 f4f7209b0fe3222b146193e4d804c8c67333f13113ac513642dd1223a048a4e3
MD5 10ee50870f1c639ff9fa0734dd32dfe5
BLAKE2b-256 6554bfee68c2c8971e1548594b9aae84f962783dce58ecc96c4d43f85aa35708

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