From 7345e481e4a0c503e81780c2ee5094242e1bc4fd Mon Sep 17 00:00:00 2001 From: Milan Topalovic <163355844+mtopalovicTT@users.noreply.github.com> Date: Wed, 24 Jul 2024 12:11:54 +0200 Subject: [PATCH 01/33] Adding translation from ttnn to flatbuffer (#216) We can now use ttmlir-translate tool to translate from TTNN IR to flatbuffer. Example: `./build/bin/ttmlir-opt --ttir-to-ttnn-backend-pipeline test/ttmlir/Dialect/TTNN/simple_matmul.mlir | ./build/bin/ttmlir-translate --ttnn-to-flatbuffer -o out.ttnn` To get flatbuffer from tt-forge we call std::vector ttnnToFlatbuffer(Operation *op). resolves #120 --- docs/src/adding-an-op.md | 6 +- docs/src/ttmlir-opt.md | 6 - docs/src/ttmlir-translate.md | 9 ++ .../ttmlir/Dialect/TTNN/Transforms/Passes.td | 11 -- .../TTNN/Transforms/TTNNToSerializedBinary.h | 15 -- include/ttmlir/Target/TTNN/TTNNToFlatbuffer.h | 22 +++ lib/CMakeLists.txt | 1 + lib/Dialect/TTNN/Transforms/CMakeLists.txt | 1 - lib/Target/CMakeLists.txt | 1 + lib/Target/TTNN/CMakeLists.txt | 15 ++ .../TTNN/TTNNToFlatbuffer.cpp} | 137 +++++++----------- .../TTNN/TTNNToFlatbufferRegistration.cpp | 33 +++++ tools/ttmlir-translate/CMakeLists.txt | 8 +- tools/ttmlir-translate/ttmlir-translate.cpp | 12 +- 14 files changed, 152 insertions(+), 125 deletions(-) delete mode 100644 include/ttmlir/Dialect/TTNN/Transforms/TTNNToSerializedBinary.h create mode 100644 include/ttmlir/Target/TTNN/TTNNToFlatbuffer.h create mode 100644 lib/Target/CMakeLists.txt create mode 100644 lib/Target/TTNN/CMakeLists.txt rename lib/{Dialect/TTNN/Transforms/TTNNToSerializedBinary.cpp => Target/TTNN/TTNNToFlatbuffer.cpp} (73%) create mode 100644 lib/Target/TTNN/TTNNToFlatbufferRegistration.cpp diff --git a/docs/src/adding-an-op.md b/docs/src/adding-an-op.md index 883b4e5069..91f5a49da0 100644 --- a/docs/src/adding-an-op.md +++ b/docs/src/adding-an-op.md @@ -215,11 +215,11 @@ to a program called `flatc` which generates C++ code (or any language for that matter) for serializing and deserializing the schema. This generated code can be found in `build/include/ttmlir/Target/TTNN/program_generated.h`. -Let's head over to `lib/Dialect/TTNN/Transforms/TTNNToSerializedBinary.cpp` to define +Let's head over to `lib/Target/TTNN/TTNNToFlatbuffer.cpp` to define a `createOp` overloaded function that does the conversion from MLIR to flatbuffer: ```cpp -{{#include ../../../lib/Dialect/TTNN/Transforms/TTNNToSerializedBinary.cpp:adding_an_op_matmul_serialize_to_binary}} +{{#include ../../../lib/Target/TTNN/TTNNToFlatbuffer.cpp:adding_an_op_matmul_serialize_to_binary}} ``` Lots of things are happening here, let's break it down: @@ -241,7 +241,7 @@ Lots of things are happening here, let's break it down: We can finally generate a binary with our new Op! We can use the following command: ```bash -./build/bin/ttmlir-opt --ttir-layout --ttnn-open-device --convert-ttir-to-ttnn --ttnn-serialize-to-binary="output=out.ttnn" test/ttmlir/Dialect/TTNN/simple_matmul.mlir +./build/bin/ttmlir-opt --ttir-to-ttnn-backend-pipeline test/ttmlir/Dialect/TTNN/simple_matmul.mlir | ./build/bin/ttmlir-translate --ttnn-to-flatbuffer -o out.ttnn ``` And we can inspect the with [`ttrt`](./ttrt.md): diff --git a/docs/src/ttmlir-opt.md b/docs/src/ttmlir-opt.md index fd58e57187..fe14d2ff46 100644 --- a/docs/src/ttmlir-opt.md +++ b/docs/src/ttmlir-opt.md @@ -2,12 +2,6 @@ The `ttmlir` optimizer driver. This tool is used to run the `ttmlir` compiler passes on a `.mlir` source files and is central to developing and testing the compiler. -## Generate a flatbuffer file - -```bash -./build/bin/ttmlir-opt --ttir-to-ttnn-backend-pipeline --ttnn-serialize-to-binary="output=out.ttnn" test/ttmlir/Dialect/TTNN/simple_multiply.mlir -``` - ## Simple Test ```bash diff --git a/docs/src/ttmlir-translate.md b/docs/src/ttmlir-translate.md index fa9fd8287a..fa6f0bef50 100644 --- a/docs/src/ttmlir-translate.md +++ b/docs/src/ttmlir-translate.md @@ -11,6 +11,15 @@ The `ttmlir-translate` translation utility. Unlike `ttmlir-opt` tool which is us ./build/bin/ttmlir-translate -mlir-to-cpp c.mlir -allow-unregistered-dialect ``` +## Generate flatbuffer file from MLIR +```bash +# First run `ttmlir-opt` to convert to proper dialect +./build/bin/ttmlir-opt --ttir-to-ttnn-backend-pipeline test/ttmlir/Dialect/TTNN/simple_multiply.mlir -o ttnn.mlir + +# Now run `ttmlir-translate` to produce flatbuffer file +./build/bin/ttmlir-translate --ttnn-to-flatbuffer ttnn.mlir -o out.ttnn +``` + Bonus: These two commands can be piped, to avoid writing a `mlir` file to disk, like so: ```bash ./build/bin/ttmlir-opt --ttir-layout --ttnn-open-device --convert-ttir-to-ttnn --convert-ttnn-to-emitc test/ttmlir/Dialect/TTNN/simple_multiply.mlir | ./build/bin/ttmlir-translate -mlir-to-cpp -allow-unregistered-dialect diff --git a/include/ttmlir/Dialect/TTNN/Transforms/Passes.td b/include/ttmlir/Dialect/TTNN/Transforms/Passes.td index e004b5052e..5cb329e677 100644 --- a/include/ttmlir/Dialect/TTNN/Transforms/Passes.td +++ b/include/ttmlir/Dialect/TTNN/Transforms/Passes.td @@ -21,15 +21,4 @@ def ConvertTTIRToTTNN: Pass<"convert-ttir-to-ttnn", "::mlir::ModuleOp"> { }]; } -def TTNNSerializeToBinary: Pass<"ttnn-serialize-to-binary", "::mlir::ModuleOp"> { - let summary = ""; - let description = [{ - todo - }]; - - list