Cómo obtener gradientes exactos de código Fortran gracias a LFortran y Enzyme

Fuentes: Differentiable Fortran with LFortran and Enzyme

El blog Tesseract presenta una cadena de compilación experimental que permite derivar automáticamente código Fortran heredado y obtener gradientes exactos sin reescribirlo en JAX o PyTorch. La propuesta combina LFortran, LLVM y Enzyme, un sistema de diferenciación automática que opera a nivel de LLVM IR y, por tanto, puede aplicarse a cualquier lenguaje que compile a LLVM.

El artículo describe el caso de uso: décadas de código validado en dinámica de fluidos computacional, clima, aeroespacial y nuclear permanecen inaccesibles a los flujos modernos de aprendizaje automático porque no exponen gradientes. Reescribir esos programas en marcos de ML sería inviable, así que la alternativa es dejarlos donde están y extraerles derivadas automáticas.

Como ejemplo se utiliza un solver térmico bidimensional transitorio en Fortran 90 puro, de unas 220 líneas, con conductividad dependiente de la temperatura y condiciones de contorno mixtas. Se detallan los seis pasos de la cadena: pasar Fortran a LLVM IR con LFortran, aplicar optimizaciones con -O1, generar un envoltorio en C, enlazar ambos módulos, ejecutar el pase de Enzyme para sintetizar la derivada y compilar el resultado como biblioteca compartida. Se justifica el uso de LFortran frente a Flang porque emite IR mucho más limpio, basado en punteros planos, que Enzyme puede rastrear con facilidad. El texto también señala las trabas reales: evitar arrays asignables y comprobaciones de límites, revisar manualmente el IR cuando algo falla y comparar resultados analíticos para validar los gradientes. Integrar el solver en JAX mediante Tesseract lo convierte en una capa diferenciable utilizable en problemas inversos de alto rendimiento.