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

Uploaded CPython 3.10 Windows x86-64

accera-1.2.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (30.8 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

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

Uploaded CPython 3.9 Windows x86-64

accera-1.2.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (30.8 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

accera-1.2.10-cp39-cp39-macosx_10_15_x86_64.whl (33.5 MB view details)

Uploaded CPython 3.9 macOS 10.15+ x86-64

accera-1.2.10-cp38-cp38-win_amd64.whl (24.2 MB view details)

Uploaded CPython 3.8 Windows x86-64

accera-1.2.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (30.8 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

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

Uploaded CPython 3.7m Windows x86-64

accera-1.2.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (30.8 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

accera-1.2.10-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.10-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: accera-1.2.10-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.1 CPython/3.10.7

File hashes

Hashes for accera-1.2.10-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 dd5db89389a5a160c5fc591a39c38f26e17cce5bf2d32406002719a86558ace5
MD5 613076cd4c96cb0a1c0f6a122bf1821f
BLAKE2b-256 66e6f9e965f472c179180f2649b632457e8275105ebb07b23e2f3e89bc276623

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2d7f07982e25a9b69b97f5e173f314385408ce8feecbe6e77c0c6d3c3528c984
MD5 e556f2aec4f8434e48e3b683e475bed5
BLAKE2b-256 33469bf8d436947b57a755cf265ec39037e46aba8ce3406c18c2806c4e7eccda

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.10-cp310-cp310-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 0d829a3e42dfc68ec7e0368f040238274cca56200ea74748ce331f9f0fbc5244
MD5 d1f9874ad9dc737c7f6ff82fd5aaee75
BLAKE2b-256 a7ff9a22e8021c097b48de41022474b6719ffb4b8e75cbd03bb7d2b84535e25c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: accera-1.2.10-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.1 CPython/3.9.13

File hashes

Hashes for accera-1.2.10-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 c56988f795be61371c9dabce6507c2e6eec305cd4864db449cb28426d7062e40
MD5 a004705660d9efd11827ceeeba34e0d2
BLAKE2b-256 407dc0474340cda80f58906fa9e526ee67bb7c20a1bb64f72bb8a7b1db7a67ad

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f67e65513dd00a2750969893327766deb9e0a0670d86dbc3a15a38e4649461a2
MD5 fadb864962cdb518e652d45af05be317
BLAKE2b-256 33fd5fd003cdae6eeafae17103d9baa2311bea93e97f1a0bef56abc3daeb5d09

See more details on using hashes here.

File details

Details for the file accera-1.2.10-cp39-cp39-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for accera-1.2.10-cp39-cp39-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 5a41616fb7a026ddf22ecac2b465c8a40f3a3f8d092236f6238cdf9639c3f198
MD5 eb3378ad84113ffead7af586a3a0e836
BLAKE2b-256 145b25ef4647283fd8f27288d2b64793fa1c8f79b9b988c993a1a34f5f257c8d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: accera-1.2.10-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.1 CPython/3.8.10

File hashes

Hashes for accera-1.2.10-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 2457ed30bdc13d1abeeeaaf9264cca5a42042e8be5902d02544e872372f663ba
MD5 a1f3ee153f82e14fa08b4774b84d6810
BLAKE2b-256 792315a84ad6b6960001f6e78aadb1fb696c6e5cd6a2e70739d3699a8f275291

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 52aac21885b018a14698ce417911bd934b089d04facea31c7d12d5130133889a
MD5 343132702acd22f5a88aed20354db7df
BLAKE2b-256 b21cb396d3da62bbb42ab21916df7fc95531260d96a15724cd0260c74f8a464e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.10-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 5b7e4af54944d766d73c40c35648c2203667dda1ff872347ed37c6c964585a4a
MD5 c8b0923bd48903dfbe728e50f4478db0
BLAKE2b-256 98a8228e88a751413062ee591dff0d1fd6e4ca135305a063bba47fc2e670fd7b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: accera-1.2.10-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.1 CPython/3.7.9

File hashes

Hashes for accera-1.2.10-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 ea3fe52f8d84bfa619c74118a2d340f65876c46469d2e287145693bece6a6639
MD5 a48c66eeb5e0c333c0f6d7aeeaf390ce
BLAKE2b-256 d7454726a32f337a3ac6b3e9e6934530623ee17a86295acf03ee0b2d4617f3a3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4e96bd0463e71e0bb7be62739e93d69f1ab4511e722184a660b152b0388b7754
MD5 c1bd0b97ae3a80f0c9dfe090405f9056
BLAKE2b-256 a7357823b360d5ba19845a878aabf9d493d85931288677a467e105cc816866ea

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.10-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 ef24f442c331d3d77d9229297f255cecf0affe264dd12a292cbdccf12003c68a
MD5 8793b0dd8cd6ec71fc85e069afa4bdfd
BLAKE2b-256 8c9c2d8091eb839b2f26cf9fce436222de7417ae2cb54ca22abca6a66e339085

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