Розуміння MLIR: стек діалектів багаторівневого проміжного представлення для компіляторів штучного інтелекту
MLIR надає модульну фреймворк-структуру проміжного представлення, що використовується в XLA, Triton, Mojo та Torch-MLIR. Вона використовує рекурсивні операції та діалекти для поступового зниження високорівневих тензорних операцій до машинного коду.

Чому це важливо
Інженери, які розробляють кастомні оператори ШІ або пайплайни компіляції, можуть використовувати MLIR для збереження структури домену перед кодогенерацією.
TL;DR
- 01MLIR надає конструктор проміжних представлень із рекурсивними регіонами замість фіксованого асемблера.
- 02Покрокове зниження зберігає структуру домену до моменту компіляції під конкретне залізо.
- 03Triton, Torch-MLIR та Mojo покладаються на діалекти MLIR для компіляції під GPU та CPU.
Ключові факти
- Підтримувані фронтенди
- XLA, Triton, Mojo, Torch-MLIR, IREE, ONNX-MLIR
- Рівні діалектів
- Високий (linalg, tensor), Середній (memref, scf), Низький (llvm, nvvm, rocdl)
Архітектура стека діалектів
MLIR працює на основі уніфікованих операцій в регіонах SSA. Високорівневі діалекти, такі як stablehlo, tosa та linalg, описують тензорну семантику. Покрокове зниження перетворює тензори на буфери memref, які далі трансформуються в цикли scf та скалярні операції arith перед генерацією коду в llvm або GPU NVVM PTX.
Покрокове зниження та буферизація
Буферизація перевозить програму від чистого потоку даних над тензорами до явного виділення пам'яті. Завдяки співіснуванню кількох діалектів у єдиному блоці IR, менеджери проходів MLIR реалізують кастомні оптимізації на відповідних рівнях абстракції.
Спробуй за 2 хвилини
func.func @scale_in_place(%buf: memref<1024xf32>, %a: f32) {
%c0 = arith.constant 0 : index
%c1 = arith.constant 1 : index
%n = arith.constant 1024 : index
scf.for %i = %c0 to %n step %c1 {
%x = memref.load %buf[%i] : memref<1024xf32>
%y = arith.mulf %x, %a : f32
memref.store %y, %buf[%i] : memref<1024xf32>
}
}mlir
✓ Коли використовувати
- Розробка кастомних операторів ШІ або спеціалізованих компіляторних бекендів
- Компіляція під кілька апаратних платформ (CPU, GPU) з одного фронтенду
✕ Коли НЕ варто
- Розробка стандартного веб-софту чи прикладної логіки
- Промпт-інжиніринг без потреби у власних обчислювальних ядрах
Що зробити сьогодні
- Дослідіть проміжні етапи зниження в Triton чи Torch-MLIR за допомогою прапорців налагодження.
- Використовуйте структуровані операції linalg при створенні кастомних операторів.