Розуміння 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 при створенні кастомних операторів.
Джерела