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

Uploaded CPython 3.10 Windows x86-64

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

Uploaded CPython 3.9 Windows x86-64

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

Uploaded CPython 3.8 Windows x86-64

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

Uploaded CPython 3.7m Windows x86-64

accera-1.2.22-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.22-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.22-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: accera-1.2.22-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.22-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 7ad4c6275a7acb85a30e0ec0b3001920e90a744cc69c92ff7229c9d8d02e9a13
MD5 390207715d14af453e0a39abbd02a910
BLAKE2b-256 716ced4e21debb569db5bc289a258f9a0789587390718ee5b7f29e2c609060f3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.22-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f6c823f68be4556ca37d644814d5f35bf080480f65eefe42de1270c8b835a4b3
MD5 4ee9f8de7e99cafcee2b7dc1767f0544
BLAKE2b-256 ca691f3e53afb1284b679be9c988258cec001667f550e7eb6077f5804c4f20bb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.22-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 63136162d4839d7a1cc80e929c632142f542b503f1c6d59c6d15f460e00659e0
MD5 235cbec8d5aaed07c03f5c16db488067
BLAKE2b-256 c31fe286730418fc5e0def2bece7b34cccd0020acc697987dbf5870997985ac5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: accera-1.2.22-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.22-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 f43de34899a76adaf53c826e0c45500b16c90588864a195052833c67ec48e1ab
MD5 5fa43639f2b260ae9235512fc2c8b856
BLAKE2b-256 d8def1cc13c2863a0d29508a0eed407eea0a352903952bc2e0802ea3a310fceb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.22-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 79603a7d387cdbb5e13a9905db01abbb85771aece4b1576d81e318cd343213be
MD5 a1d20fe042351517175671e391f49589
BLAKE2b-256 009a166b209ff2689ca868a83b882793b6acd1bec48529d91f188eeed838ee3e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.22-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 1288373c02c58a1321ce5ff2d716ae7196805f0a4f9eb158e8d59a5e8aa5c4f5
MD5 d69f07dace8268bb66e79566159dc19f
BLAKE2b-256 a03fde29775956dc1a2e5482fff8dfb49d3447d0ef80f30f169cae1b0ac68adc

See more details on using hashes here.

File details

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

File metadata

  • Download URL: accera-1.2.22-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.22-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 adff043a1eba7fedcea649c2cbcbf7720b9a7cbd34299e9b28187d15561093ad
MD5 f331e79df5cfe290a3f6d910ef9d5b97
BLAKE2b-256 6fdcc46e7440ea1e6313a97d4b3616bbc4a5212556aacc7bc8d337f33084871a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.22-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0387ec8edad02364e63e69814c1736c87abe905f6e21c2e0044a0312e3af34e0
MD5 ef1a2909b59f3e434434fc13c5ef2d8b
BLAKE2b-256 875fa39d31abbbab025dd169b11780dab8161a8ec1fbbdaa42ae19fa0ed4bbb4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.22-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 c492e727b512a1273e624262759a578bb8c0a0c9e26dfcfa1922bc5515c26a78
MD5 4d4c7a8ae374fe73003ab6494bd5b699
BLAKE2b-256 05aca0eb065344728bc2caecd4f019da17c000523acef77759f714280989ee32

See more details on using hashes here.

File details

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

File metadata

  • Download URL: accera-1.2.22-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.22-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 cdc0e9edc671ca71ffcf5bb1194c78f307a131c10d4f09f81191d767355369df
MD5 7120f39c3758463683cd40c5b72edbda
BLAKE2b-256 5b6b95f6582454fd967d785ced4efd6e08bfc4b9d92660b4203be5f0f74086f2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.22-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d12b0ca3b836262fc89354b17092be6415e22af6a3eb66aa40af5376791ddb11
MD5 e253165601ee5d934f6b0e8341bca90f
BLAKE2b-256 8bd24a5e41cfae0f878e4b3e055e78ea7e48b82e9db813b3dd068e3da2f42798

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.22-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 ae05fbb50f15e964199969eb1834b4e9ecd5f9a5f1f7c294a91050ded904a568
MD5 5137fa41b3a2d91908ad07c855cd9f22
BLAKE2b-256 aca34ce2e670299501497bfeb49638f74a967776e14b5a76e525d151dd5cfe53

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