Visão geral
Para separar diferentes alvos de hardware e software, o MLIR possui “dialetos”, incluindo:
- TensorFlow IR, que representa tudo o que é possível nos gráficos do TensorFlow.
- XLA HLO IR, que foi projetado para aproveitar as vantagens das capacidades de compilação do XLA (com saída para, entre outras coisas, TPUs).
- Um dialeto afim experimental, que se concentra em representações e otimizações poliédricas .
- LLVM IR, que possui um mapeamento 1:1 entre ele e a própria representação do LLVM, permitindo que o MLIR emita código GPU e CPU através do LLVM.
- TensorFlow Lite, que se traduzirá na execução de código em plataformas móveis.
Cada dialeto consiste em um conjunto de operações definidas que possuem invariantes colocadas sobre elas, como: “Este é um operador binário e as entradas e saídas têm os mesmos tipos”.
Adicionando ao MLIR
O MLIR não possui uma lista fixa/integrada de operações globalmente conhecidas (sem “intrínsecas”). Os dialetos podem definir tipos totalmente personalizados, e é assim que o MLIR pode modelar coisas como o sistema de tipo IR LLVM (que possui agregados de primeira classe), abstrações de domínio importantes para aceleradores otimizados para ML, como tipos quantizados, e até mesmo os sistemas do tipo Swift ou Clang (que são construídos em torno de nós de declaração Swift/Clang) no futuro.
Se você deseja conectar um novo compilador de baixo nível, você deve criar um novo dialeto e as reduções entre o dialeto TensorFlow Graph e seu dialeto. Isso facilita o caminho para fabricantes de hardware e compiladores. Você pode até direcionar dialetos em diferentes níveis no mesmo modelo; os otimizadores de nível superior respeitarão as partes desconhecidas do IR e esperarão por um nível inferior para lidar com isso.