Huawei (I): arquitectura Ascend y núcleos Da Vinci
Rubén Rodríguez Abril
La inteligencia artificial se aplica a todo tipo de escalas, desde dispositivos IoT hasta grandes centros de entrenamiento de modelos, pasando por drones y coches autónomos. Huawei desarrolló la arquitectura Ascend, presentada en HPCA 2021, para ofrecer una solución escalable en NPUs integradas en SoCs (como Kirin 990 5G) o constituidas en chips independientes, que combinan núcleos ARM y DaVinci conectados por NoC para ejecutar modelos de IA.
Arquitectura Ascend
La inteligencia artificial ha asumido usos en múltiples áreas y diversas escalas que van desde lo más pequeño (dispositivos IoT -Internet de las Cosas-) hasta lo más grande (como los grandes centros de entrenamientos de modelos de lenguaje), pasando por aplicaciones de escala intermedia como los drones, los coches sin conductor o la IA embebida en cámaras y robots industriales.
Figura 1. El eje de ordenadas representa los requisitos de memoria, el de ordenadas, los requisitos de computación en TOPS, para diferentes tecnologías. Fuente: Huawei.
Dado que el diseño de chips es muy costoso, Huawei decidió crear una arquitectura escalable que pudiera adoptarse, con leves modificaciones, a cualquier tamaño. Fruto de estos esfuerzos fue la arquitectura Ascend, que fue presentada por primera vez en la edición de 2021 del simposio internacional de arquitecturas de computación alto rendimiento (HPCA) organizado por la IEEE (Institute of Electrical and Electronic Engineers). Las unidades construidas en esta arquitectura reciben el nombre de NPUs (Neural Processing Units) y pueden configurarse como áreas dentro de un SoC (como en Kirin 990 5G) o como chips independientes que auxilian a la CPU como coprocesadores de IA. Estos últimos se subdividen a su vez en chips de inferencia y chips de entrenamiento. Los segundos tienen mucho mayor tamaño y son mucho más potentes que los primeros.
Figura 2. Esquema general de la arquitectura Ascend. Las grandes áreas de procesamiento son los núcleos ARM (propósito general) y Da Vinci (especializado en cálculos aritméticos). Están interconectados entre sí y con otras áreas a través de la arquitectura NoC. Fuente: Huawei.
Básicamente, en una arquitectura Ascend existen dos tipos de núcleos, núcleos de arquitectura ARM (de propósito general) y núcleos DaVinci (especializados en cálculo), que cooperan entre sí para la ejecución de un modelo de IA, auxiliados por un varias áreas de memoria (por lo general, DDR o HMB) y dispositivos periféricos. Todos estos componentes se conectan entre sí a través de la arquitectura NoC (Network on Chip), de gran uso en Silicon Valley, y que como su propio nombre indica se utiliza para integrar en un mismo chip una red de unidades bastante heterogéneas entre sí y que deben de comunicarse con la menor latencia posible.
Núcleos Da Vinci
Los núcleos DaVinci son la principal unidad de cálculo existente en el chip. En cada núcleo existen cuatro grandes zonas: cachés/búferes, unidad aritmético-lógica, circuitos de control y registros.
Figura 3. Esquema general de un núcleo Da Vinci. En la fila más baja se esquematizan los circuitos de control. Las otras dos filas se refieren a unidades aritméticas o de almacenamiento. A la izquierda aparece, en verde oscuro, el búfer L1, seguido por el gestor de memoria MTE y por los búferes A, B y unificado. Más a la derecha se sitúan -arriba- el Cubo 3D (encargado de operaciones) y abajo, las unidades vectorial y escalar.
Áreas aritméticas
Las áreas aritméticas son fundamentalmente tres:
-El Cubo 3D (3D Cube), encargado de realizar operaciones matriciales en dos y tres dimensiones, acompañado de su acumulador. En la figura 2 se describe su funcionamiento.
-La unidad vectorial, que realiza operaciones que afecten a todos los componentes de un vector, como por ejemplo, las diferentes funciones de activación o los movimientos de traslación, rotación o reflexión. También perfecciona operaciones entre ellos, como el producto escalar, el producto exterior, o la aplicación de operadores lógicos (NOT, AND, etc..). La unidad tiene dos secciones especializadas, dedicadas a la función ReLU (esencial en muchos modelos de visión artificial) y la conversión de números de un formato de FP16 a otro FP32 (y viceversa). Puede procesar 2.048 bits de entrada a la vez, distribuidos en 8 vectores de 16 componentes con formato FP16.
-La unidad escalar, a la cual se adjuntan dentro del chip otras áreas como la AGU, que realiza operaciones de carga y descarga desde los registros hacia el caché y viceversa, el generador de máscaras, que aplica máscaras sobre un conjunto de datos (como sucede, por ejemplo, en las unidades de atención de los transformers), y por último los registros. Estos últimos, a su vez, pueden ser de dos tipos: registros de propósito general (GPR), que almacenan datos (generalmente intermedios) de operaciones aritméticas, y registros de propósito general, que almacenan datos necesarios para el adecuado control del flujo del programa, como el contador de un bucle, la configuración de la pila o las banderas.
Figura 4: Diferentes unidades aritméticas de un núcleo Da Vinci. En todas ellas, los operandos están en azul y en amarillo, las unidades de multiplicación-adición en verde y el resultado en rojo. A la derecha se describe la unidad cubo 3D. La dimensión de profundidad (común ambas matrices) se despliega verticalmente. Todos los elementos de las columnas en verde se sumas verticalmente (flechas en rosa) y la matriz resultado se guarda provisionalmente en el acumulador (amarillo) . Dado que las dimensiones del cubo son 16x16x16, el mismo puede realizar 4096 operaciones multiplicación-adición (INT 16) por segundo. Las operaciones en matrices de dos dimensiones son asignadas bien a la unidad vectorial o bien al cubo 3D, atendiendo a criterios de balanceo de carga.
Búferes
Un núcleo DaVinci está dotado de los siguientes búferes (cachés):
–L0 (640 KB), de muy rápido acceso y compuesto de cuatro subsecciones, que son los búferes A y B (almacenan las matrices operandas), el búfer C (almacena el resultado) y el búfer unificado
–L1 (1 MB) que tiene una mayor latencia por estar alejado de las áreas aritméticas.
-El transmisor de memoria (Memory Transfer Engine, MTE) es el encargado de realizar las oportunas transferencias de datos entre búferes.
El caché L2 está situado fuera de los núcleos Da Vinci individuales y es una memoria común a todos ellos.
Todos los búferes son de memoria SRAM: están hechos de circuitos biestables, en los que las celdillas se construyen a partir de transistores entrelazados entre sí.
Circuitos de control
Se enumeran a continuación:
-El Módulo de Control del Sistema (System Control) gestiona la operación de todo el núcleo. Un programador externo (generalmente, un núcleo ARM) introducirá dentro del núcleo, a través de un puerto de configuración, información sobre instrucciones, parámetros y bloques de tareas. Una vez que concluya la configuración, se iniciará la ejecución del bloque de tareas. Tras la ejecución, el núcleo dará un aviso al exterior, a través de una interrupción, de que la ejecución ha concluido, y comunicará el estado de máquina del mismo.
-El BIU (Bus Interface Unit) gestiona la entrada y salida de información desde el núcleo hacia el bus del sistema (que conduce a los núcleos ARM y otras partes del mismo).
–Caché de instrucciones (L0).
–Unidad de preextracción (prefetch), que ejecuta por adelantado instrucciones de transferencias de datos, con el objeto de que estos estén disponibles cuando sean necesarios.
–Unidad de despacho de instrucciones.
-Tres colas de instrucciones para las unidades aritméticas.
–Módulo de sincronización de eventos, que controla la existencia de dependencias de datos (p.e. una instrucción no puede ejecutarse porque uno de sus operandos aún no está listo, bien porque no ha sido aún cargado, bien porque no ha sido calculado por una instrucción anterior).
Versiones y tamaños de los núcleos Da Vinci
Hasta el momento, los núcleos Da Vinci se han diseñado en tres escalas diferentes: Max (que es la que se ha descrito en los párrafos anteriores), Lite y Tiny. Estas dos últimas se utilizan en teléfonos móviles y en dispositivos IoT. En la imagen se describe la capacidad aritmética de cada uno de ellos.
Figura 5. Diferentes versiones de los núcleos Da Vinci («m-a» es «multiplicación-adición».
Los núcleos DaVinci en sus diferentes escalas, combinados con núcleos de arquitectura ARM (de propósito general), áreas de memoria e diferentes interfaces, constituyen la base de los diferentes chips NPU creados por HiSilicon (filial de Huawei). Algunos de ellos serán mencionados en nuestro siguiente artículo.
Lecturas Recomendadas
–【昇腾学院】解密昇腾AI处理器–DaVinci架构(控制单元). Artículo del blog de Huawei (en chino).
– 深度解读达芬奇架构:华为AI芯片的“秘密武器”. Artículo del blog de Huawei (en chino).
– Da Vinci: A Scalable Architecture for Neural Network Computing.