___ ___ ___
/\__\ /\ \ /\ \
/:/ / ___ \:\ \ \:\ \
/:/ / /\__\ \:\ \ \:\ \
/:/ / ___ /:/__/ _____\:\ \ _____\:\ \
/:/__/ /\__\/::\ \ /::::::::\__\/::::::::\__\
\:\ \ /:/ /\/\:\ \__\:\~~\~~\/__/\:\~~\~~\/__/
\:\ /:/ / \:\/\__\\:\ \ \:\ \
\:\/:/ / \::/ / \:\ \ \:\ \
\::/ / /:/ / \:\__\ \:\__\
\/__/ \/__/ \/__/ \/__/
The project CINN is a machine learning compiler and executor for multiple hardware backends. It is designed to provide multiple layers of APIs to make tensor computation easier to define, faster to execute, and more convenient to extend with hardware backends. Currently, it targets x86 CPUs and Nvidia GPUs.
This project is under active development.
The CINN lowers a traditional DNN model into a two-level intermediate representation(IR), the high-level IR(HLIR) and CINN IR.
The HLIR helps to define some domain-specific computation and perform some overall optimization on the IR-graph; the CINN IR helps to represent some computation semantic and finally lower to a hardware backend.
Both levels of IR have the similar SSA graph, analysis and optimization facilities. The schedule transform is applied on the CINN IR to do optimizations.
For more details, you can refer to: https://github.com/PaddlePaddle/docs/tree/develop/docs/guides/cinn
Clone PaddlePaddle first.
git clone https://github.com/PaddlePaddle/Paddle.git
cd Paddle
mkdir build
cd build
Build paddle with cinn:
cmake .. -DCINN_ONLY=OFF -DWITH_CINN=ON -DWITH_GPU=ON
Build cinn only:
cmake .. -DCINN_ONLY=ON -DWITH_CINN=ON -DWITH_GPU=ON
And then
make -j
Install paddle with cinn:
pip install python/dist/paddlepaddle_gpu-xxx.whl
Install cinn only:
pip install python/dist/cinn_gpu-xxx.whl
Then you can import paddle in the python environment and check if a paddle version with CINN is installed.
import paddle
paddle.is_compiled_with_cinn()
There are two levels of APIs in CINN, the higher level is HLIR and the lower level is CINN IR, both contain some concepts.
In HLIR
frontend::Program
, the program helps to define a machine learning computation,hlir::framework::Tensor
, multi-dimensional arrays helps to manage a memory buffer.hlir::framework::Program
, the final executable program in runtime. It holds many basic executable elements.hlir::framework::Graph
, the graph that represents the structure of a model. Each node in the graph represents an operator (conv2d, relu, mul, etc.).hlir::framework::GraphCompiler
, the compiler that transforms the graph representation(hlir::framework::Graph) of a model into an executable program(hlir::framework::Program).
In CINN IR
Compute
, the method to define a computation,Lower
, the method to lower a computation to the corresponding IR,LoweredFunc
, the function defined in CINN IR,Var
, a scalar variable,Expr
, an expression represents any CINN IR node(no specified Statement node),
CINN is licensed under the Apache 2.0 license.
CINN learned a lot from the following projects:
- Halide: Referenced the design of most IR nodes,
- TVM: We learned many ideas including the semantics of some schedule primitives, TOPI, NNVM, and so on,
- tiramisu: The isl usage, polyhedral compilation, schedule primitive implementation, and so on,
- tensorflow/xla: Referenced the semantics of the primitive operations.