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

Uploaded CPython 3.10 Windows x86-64

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

Uploaded CPython 3.9 Windows x86-64

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

Uploaded CPython 3.8 Windows x86-64

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

Uploaded CPython 3.7m Windows x86-64

accera-1.2.25-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.25-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.25-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: accera-1.2.25-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.25-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 bf4941dd744e7ecf9575b0f666a7ee1d5db0cbd9a0c9a57f80ccc9d44146c166
MD5 5736d4653494fc6b25b7e5459fa67719
BLAKE2b-256 40f0ff6ca48bc6e7f5ec5b2435a3a57b4bc71aaf2f4a63ba094fb7393c9aa9ab

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 50387534c78a7cf8af39a44d9b961df8aa0e2ca14944b392ad62a68a585b1e7b
MD5 5bdb778b479ba72ae74bfc273e3d9162
BLAKE2b-256 d551f7bf2fbf869603d9e540cb40666befae51f844eaa41d6cdaefe9ce4d94f6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.25-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 eb17bd0bb9d6ce4475a064f41bfd337e44fd17423c2c6436396ca7fe66e16749
MD5 5df483de9f3f87688cd7e1e3f8f667fb
BLAKE2b-256 e5aa5c4838e9f78e9500674f7ab6f4af7011655baff3de82e94f35867ac2125e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: accera-1.2.25-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.25-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 780e23e38bbe70a2fdf60dd84746b78e98939b4c075a5756f2e53c4441032cee
MD5 6d868198d6cb7876ec2eaaa27838d1d5
BLAKE2b-256 50487b734cc07ff5ddc7c3c50bb60bb34912c0d9548dd6d6faf053ba07f6dc00

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 50510f51ebe8d70992d0889709d5f9d2e40e59a3fecdb73b41028623c3eaa5ec
MD5 0e4461d31ce78179f57efd726f9f3ae8
BLAKE2b-256 6126e7e0a3313287ecdfef8bb521fb33a1b261eae76afe07deebf0c38181daad

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.25-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 8315ce2e9648d79979afc35cfa09269cd73dec5dc05f4649e8ea16918da1d38f
MD5 babb17dfaf6ac08448e3001d2910753e
BLAKE2b-256 21f342dbc5a5e2555bebff1b48c77c60205a9fbd6cdc8ee46a95ce567b4e0ced

See more details on using hashes here.

File details

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

File metadata

  • Download URL: accera-1.2.25-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.25-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 f812f65795958a7b12dc86869ee377d9a4f8b0e7c2b98f96aabf8f866bddc2d3
MD5 0d5ec72fa14eb5533839adfe761602f3
BLAKE2b-256 387374f93375795bfcd826d5d9aa023fa6986e117d04d0b02a99e44fb6ddde82

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1506e0fd533719285e64d396bde5c05a98abc6b051318f4dcd21271921f0a387
MD5 8da5f9bc1bba55ae31b5316d08703da3
BLAKE2b-256 2631f0f3a9c4d3e66fd99070b1e03f2a7b690c2e1d41a1481be31b5cd4ccf09b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.25-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 65eaf071b468b6e7b4fdd09fe95003cc8e685ad393365ebac5208e3f23065f66
MD5 79335006f837b31e5754855a42fe3a02
BLAKE2b-256 c8465664ba1a8f12f88872d306ed1584db937841dfeb04585d60057083e0e0de

See more details on using hashes here.

File details

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

File metadata

  • Download URL: accera-1.2.25-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.25-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 1c07c6f93103c8c2d883fd17903436f953557ba1a41b9e6557c4748a96e35a30
MD5 79a115ac106f377fa5b0f22a14cd595a
BLAKE2b-256 e8d161f16cbbac827678010fa71168c87f8e6d9b7fbec3e85b07c9921d9abefc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1b68d8b41563985199f3731cfd10bfe99a91b83fbc6913197335a09d18d167fa
MD5 ed59f6106ae74855d5162f8263983b74
BLAKE2b-256 a8a55794ad791a28c2bf4e62b26a0d77bc6c17f8a2d31951ecbf93ff94e28fc2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for accera-1.2.25-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 6e05d5c1350ce602d8ba98799eb21678ca40033106f060a2d878549dad4a8f09
MD5 7e9298828339d6054630b9e0e62d6c44
BLAKE2b-256 dee11007f20ad389144c616545b7249a5bbcc2b64e972294de602ae1db1537f6

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