Las redes neuronales se han convertido en un componente esencial de los sistemas software modernos, y existe una gran variedad de frameworks de deep learning para facilitar su desarrollo. A medida que el ecosistema de la IA evoluciona rápidamente, puede ser necesario adoptar un framework diferente para aprovechar nuevas funcionalidades, responder a requisitos cambiantes o evitar depender de tecnologías / librerías obsoletas. Sin embargo, la migración de código de redes neuronales entre frameworks sigue siendo, en gran medida, un proceso manual y costoso en tiempo, debido a la falta de frameworks de migración específicamente diseñados para este tipo de código.

La ingeniería dirigida por modelos ofrece una vía prometedora para abordar este reto, ya que permite definir abstracciones de redes neuronales independientes del framework que pueden servir como base para automatizar la migración. Esta abstracción puede actuar como un pivote entre frameworks, desacoplando la red neuronal de su implementación original y permitiendo traducirla a cualquier framework de destino.

En nuestro artículo Towards Migrating Neural Network Implementations, aceptado en la ACM International Conference on AI-powered Software (AIware 2026), proponemos un enfoque automatizado para migrar código de redes neuronales entre frameworks de deep learning, utilizando el metamodelo de redes neuronales de BESSER como representación intermedia que guía la migración. Aunque nuestro enfoque de migración es genérico, en este trabajo nos centramos en dos frameworks de deep learning muy populares: PyTorch y TensorFlow.

Nuestro enfoque de migración consta de tres pasos principales: extracción del AST, transformación y generación de código, que se ilustran en la Figura 1.

Flujo de trabajo del enfoque de migración: extracción del AST, transformación y generación de código de TensorFlow a PyTorch

Figura 1: Visión general del enfoque de migración. TensorFlow y PyTorch se utilizan como frameworks de origen y destino, respectivamente. También se admite la migración de PyTorch a TensorFlow.

Paso 1: extracción del AST del código fuente

El primer paso consiste en extraer el árbol de sintaxis abstracta, o Abstract Syntax Tree (AST), del código fuente de la red neuronal. El AST es una representación estructurada del código que captura sus componentes, como las capas y sus atributos, mediante un árbol de nodos. Esta representación conserva las relaciones entre los distintos componentes de la red neuronal, lo que la hace adecuada para las transformaciones que se realizan en el paso siguiente.

Para analizar el código fuente, utilizamos la librería AST incluida en Python, ya que tanto PyTorch como TensorFlow se utilizan principalmente con este lenguaje. Nuestro extractor admite arquitecturas de redes neuronales tanto Sequential como Subclassing en ambos frameworks.

Paso 2: transformación

El segundo paso consiste en transformar el AST extraído en un modelo BESSER mediante transformaciones modelo a modelo (M2M). Cada componente de la red neuronal presente en el código fuente, incluidas las capas, las operaciones sobre tensores y las subredes, junto con sus correspondientes atributos, se mapea a su representación equivalente en el metamodelo de BESSER. El modelo BESSER resultante es independiente de la plataforma, es decir, está desacoplado del framework de origen y puede utilizarse como un pivote fiable para la migración.

Para admitir arquitecturas Sequential y Subclassing tanto en PyTorch como en TensorFlow, desarrollamos cuatro módulos de transformación, cada uno adaptado a una combinación específica de framework y tipo de arquitectura.

Paso 3: generación de código

El tercer paso toma como entrada el modelo pivote de BESSER y genera el código de la red neuronal en el framework de destino. Desarrollamos generadores de código tanto para PyTorch como para TensorFlow, que cubren todas las combinaciones de arquitecturas Sequential y Subclassing y permiten realizar migraciones en ambas direcciones.

El proceso de generación de código se basa en transformaciones de modelo a texto, implementadas mediante plantillas Jinja, para mapear los conceptos de las redes neuronales a sus construcciones de código equivalentes en el framework de destino.

La Figura 2 ilustra los tres pasos del proceso de migración de TensorFlow a PyTorch.

Proceso de migración de TensorFlow a PyTorch: extracción del AST, transformación y generación de código

Figura 2: Ilustración del proceso de migración de TensorFlow a PyTorch.

Retos de la migración

La migración de código de redes neuronales entre frameworks plantea varios retos. Por ejemplo, TensorFlow infiere automáticamente en tiempo de ejecución algunos atributos de las capas, por lo que no se definen explícitamente en el código fuente. Sin embargo, estos atributos son obligatorios en PyTorch y deben recuperarse antes de poder realizar la migración. Del mismo modo, ambos frameworks difieren en la forma de definir las funciones de activación y en sus convenciones para ordenar los canales, dos aspectos que requieren un tratamiento cuidadoso para garantizar que el código migrado siga siendo funcionalmente equivalente al original.

Evaluación

Evaluamos nuestro enfoque con cinco redes neuronales procedentes de la literatura, que cubren distintas arquitecturas, incluidas redes convolucionales y recurrentes. Las cinco redes se migraron correctamente entre PyTorch y TensorFlow en ambas direcciones.

Para validar adicionalmente la equivalencia funcional de las redes migradas, entrenamos tanto las implementaciones originales como las migradas con conjuntos de datos de referencia y comparamos su rendimiento. Los resultados presentados en la Tabla 1 confirman que las redes migradas son funcionalmente equivalentes a las originales.

Tabla comparativa de la precisión de TensorFlow y PyTorch en distintos conjuntos de datos y modelos

Tabla 1: Precisión de las redes neuronales de origen y migradas en conjuntos de datos de referencia utilizando PyTorch y TensorFlow.

Este trabajo representa un paso hacia la simplificación de la migración de código de redes neuronales, permitiendo trasladar implementaciones entre frameworks sin necesidad de reescribirlas manualmente. Todos los artefactos están disponibles en nuestro repositorio de código.