Volver a los cursos
AI023 Professional

Introducción a la programación con Triton: Una guía práctica

Una tutorial científico completo diseñado para proporcionar una ruta completa de aprendizaje para Triton, un lenguaje basado en Python y un compilador para escribir kernels personalizados para GPU. El curso cubre modelos de programación, semántica del lenguaje, comportamiento numérico y optimización del rendimiento, avanzando desde la suma vectorial básica hasta operadores fusionados y segmentados utilizados en sistemas modernos de aprendizaje profundo.

5.0
30.0h
561 estudiantes
0 me gusta
Inteligencia Artificial
Comenzar a aprender

Descripción del curso

📚 Resumen del Contenido

Una tutorial científico completo diseñado para proporcionar una ruta de aprendizaje completa para Triton, un lenguaje y compilador basado en Python para escribir kernels personalizados para GPU. El curso cubre modelos de programación, semántica del lenguaje, comportamiento numérico y optimización de rendimiento, avanzando desde la suma básica de vectores hasta operadores fusionados y segmentados utilizados en sistemas modernos de aprendizaje profundo.

Domina el arte de la ingeniería de kernels de GPU de alto rendimiento desde los principios fundamentales.

Autor: EvoClass

Agradecimientos: Documentación de Triton y repositorio de GitHub de Triton.

🎯 Objetivos de Aprendizaje

  1. Definir Triton y su papel en la pila de software de aprendizaje profundo.
  2. Distinguir Triton de CUDA, código eager de PyTorch y ensamblaje de bajo nivel de GPU.
  3. Identificar qué cargas de trabajo son candidatas adecuadas para Triton y comprender la relevancia de la fusión de kernels y cuellos de botella.
  4. Realizar una instalación limpia del entorno Triton y verificar la pila de software.
  5. Implementar un kernel básico de copia de vector para validar la lógica del entorno frente a la lógica del kernel.
  6. Identificar y categorizar cuellos de botella de GPU para justificar el uso de fusión de operadores de PyTorch.
  7. Definir una instancia de programa y calcular las dimensiones de una rejilla de lanzamiento 1D usando cdiv.
  8. Realizar aritmética de punteros para mapear IDs de programa específicos (pid) a desplazamientos de memoria.
  9. Distinguir entre tensores de PyTorch (metadatos del lado host) y tensores de Triton (bloques a nivel de compilador).
  10. Calcular el mapeo entre un ID de programa (pid) y desplazamientos de memoria específicos usando tl.arange.

🔹 Lección 1: Introducción a Triton: Filosofía y Diseño

Resumen: Esta lección presenta Triton, un lenguaje específico de dominio y compilador diseñado para cerrar la brecha entre la productividad de Python de alto nivel y el rendimiento de bajo nivel de GPU. Los estudiantes explorarán la filosofía de diseño central de Triton y establecerán un modelo mental conceptual sobre cómo maneja el cálculo paralelo de forma diferente a PyTorch o CUDA estándar.

Resultados del Aprendizaje:

  • Definir Triton y su papel en la pila de software de aprendizaje profundo.
  • Distinguir Triton de CUDA, código eager de PyTorch y ensamblaje de bajo nivel de GPU.
  • Identificar qué cargas de trabajo son candidatas adecuadas para Triton y comprender la relevancia de la fusión de kernels y cuellos de botella.

🔹 Lección 2: Instalación del Entorno e Identificación de Cuellos de Botella de GPU

Resumen: Esta lección abarca los fundamentos esenciales para el desarrollo con Triton, centrándose en establecer un entorno estable y limpio y verificarlo con un "kernel de sanidad" básico. Los estudiantes aprenderán a distinguir entre diferentes tipos de cuellos de botella de rendimiento de GPU —aritméticos, de memoria y de sobrecarga de lanzamiento— para identificar qué operaciones de PyTorch son mejores candidatas para la fusión manual de operadores.

Resultados del Aprendizaje:

  • Realizar una instalación limpia del entorno Triton y verificar la pila de software.
  • Implementar un kernel básico de copia de vector para validar la lógica del entorno frente a la lógica del kernel.
  • Identificar y categorizar cuellos de botella de GPU para justificar el uso de fusión de operadores de PyTorch.

🔹 Lección 3: Modelo de Programación de Triton: Grillas y Punteros

Resumen: Esta lección introduce el modelo de programación de Triton, pasando de las abstracciones de alto nivel de PyTorch a un enfoque basado en bloques SPMD (Programa único, múltiples datos). Los estudiantes aprenderán cómo Triton organiza la ejecución mediante rejillas de lanzamiento 1D y instancias de programa, cómo manipular punteros para acceder a la memoria y las diferencias fundamentales entre tensores de PyTorch (metadatos del lado host) y tensores de Triton (bloques a nivel de compilador).

Resultados del Aprendizaje:

  • Definir una instancia de programa y calcular las dimensiones de una rejilla de lanzamiento 1D usando cdiv.
  • Realizar aritmética de punteros para mapear IDs de programa específicos (pid) a desplazamientos de memoria.
  • Distinguir entre tensores de PyTorch (metadatos del lado host) y tensores de Triton (bloques a nivel de compilador).

🔹 Lección 4: Semántica Básica del Lenguaje y Máscara de Memoria

Resumen: Esta lección cubre las operaciones fundamentales necesarias para mover datos entre la memoria global y los registros de la GPU utilizando la semántica básica del lenguaje de Triton. Los estudiantes aprenderán a mapear instancias de programa paralelas a índices de datos específicos, gestionar condiciones de borde mediante máscaras de memoria y diferenciar entre constantes de tiempo de compilación y variables de tiempo de ejecución.

Resultados del Aprendizaje:

  • Calcular el mapeo entre un ID de programa (pid) y desplazamientos de memoria específicos usando tl.arange.
  • Implementar accesos a memoria robustos usando tl.load y tl.store con máscaras de borde.
  • Explicar la necesidad de tl.constexpr para optimizaciones del compilador y las restricciones sobre valores de tiempo de ejecución en funciones que definen formas.

🔹 Lección 5: Implementación de tu Primer Kernel: Suma de Vectores

Resumen: Esta lección te guía a través del ciclo completo de creación de un kernel de Triton, pasando de la teoría a una implementación funcional de la suma de vectores. Aprenderás a escribir el kernel del lado GPU, diseñar un contenedor robusto en Python del lado host para lanzarlo y implementar un protocolo de validación científica para garantizar la corrección.

Resultados del Aprendizaje:

  • Implementar un kernel completo de suma de vectores usando la aritmética de punteros y sistemas de máscara de Triton.
  • Diseñar un contenedor en Python del lado host que gestione el lanzamiento de rejillas, seguridad de memoria y validación de entradas.
  • Ejecutar un protocolo de validación riguroso usando torch.allclose para verificar resultados en diversos tamaños de entrada y casos extremos.

🔹 Lección 6: Fundamentos del Rendimiento: Ocupación y Benchmarking

Resumen: Esta lección pasa de la sintaxis básica del kernel a los "Principios Fundamentales" del rendimiento de GPU, centrándose en por qué el código que es lógicamente correcto puede seguir siendo ineficiente. Los estudiantes explorarán la relación entre tráfico de memoria, ocupación y utilización del hardware, culminando en un enfoque científico de benchmarking y optimización de BLOCK_SIZE.

Resultados del Aprendizaje:

  • Distinguir entre kernels limitados por cómputo y kernels limitados por memoria usando principios fundamentales de rendimiento de GPU.
  • Explicar el "Triángulo de Compromiso" y cómo la ocupación ayuda a ocultar la latencia de memoria.
  • Ejecutar un protocolo de benchmarking científico, incluyendo calentamiento, sincronización y barrido de parámetros.

🔹 Lección 7: Tensores 2D y Diseño de Kernels Conscientes de Disposición

Resumen: Esta lección pasa de operaciones elementales 1D a procesamiento de tensores 2D en Triton. Se enfoca en la relación fundamental entre índices lógicos multidimensionales y la memoria física lineal a través de desplazamientos (strides). Los estudiantes aprenderán a construir rejillas 2D de direcciones en Triton y diseñar kernels que respeten la localidad de memoria.

Resultados del Aprendizaje:

  • Comprender cómo se representan los tensores 2D en memoria usando punteros base y desplazamientos.
  • Construir rejillas 2D de direcciones en Triton usando patrones de desplazamiento broadcasteado.
  • Implementar kernels conscientes de disposición (copiar, transponer, sumar sesgo) que manejen correctamente la memoria no contigua.

🔹 Lección 8: Reducciones, Softmax y Estabilidad Numérica

Resumen: Esta lección cubre la transición de kernels elementales simples a operaciones de reducción más complejas en Triton. Los estudiantes aprenderán las diferencias arquitectónicas entre estos tipos de kernel, el patrón de implementación estándar para un Softmax por filas y el papel crítico de la estabilidad numérica en el hardware.

Resultados del Aprendizaje:

  • Contrastar los patrones computacionales de kernels de reducción frente a kernels punto a punto.
  • Implementar un kernel de Softmax por filas con estabilidad numérica usando el patrón de reducción de 5 pasos de Triton.
  • Explicar la necesidad matemática y de nivel de hardware de restar el valor máximo antes de la exponenciación para evitar desbordamiento numérico.

🔹 Lección 9: Multiplicación de Matrices y Fusión de Operadores de LLM

Resumen: Esta lección explora la transición de kernels elementales básicos a la multiplicación general de matrices (GEMM) y su papel fundamental en Modelos de Lenguaje de Gran Tamaño (LLMs). Los estudiantes aprenderán el modelo mental para el segmentado (tiling) en Triton, las ganancias de eficiencia obtenidas mediante fusión de operadores y los estándares requeridos para kernels listos para producción.

Resultados del Aprendizaje:

  • Describir el modelo mental de GEMM en Triton, incluyendo instancias de programa y dimensiones de fragmentos.
  • Identificar oportunidades de fusión de operadores en flujos de trabajo de LLM y explicar su impacto en el rendimiento.
  • Diseñar una implementación lógica para fusionar la adición de sesgo en la salida de un GEMM.

🔹 Lección 10: Ciclo de Optimización: Depuración y Autotuning

Resumen: Esta lección abarca la transición de escribir código Triton funcional a desarrollar kernels de alto rendimiento listos para producción. Establece una línea de depuración sistemática "semántica a rendimiento" e introduce la mentalidad rigurosa necesaria para autotuning y benchmarking.

Resultados del Aprendizaje:

  • Sistematizar la Depuración: Aplicar una estrategia por capas que priorice la corrección semántica y la estabilidad numérica antes de abordar cuellos de botella de rendimiento.
  • Implementar Flujos de Autotuning: Definir espacios de búsqueda válidos para meta-parámetros y ejecutar protocolos de benchmarking que eviten trampas comunes como el sobreajuste al hardware.
  • Mapa del Crecimiento Profesional: Identificar la "escalera práctica" desde la implementación básica de Triton hasta el desarrollo avanzado de kernels listos para producción.