Asista al Simposio Mujeres en ML el 7 de diciembre Regístrese ahora

Formas y diseño

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.

La XLA Shape proto ( xla_data.proto ) describe el rango, el tamaño y tipo de datos de una matriz N-dimensional (array en corto).

Terminología, notación y convenciones

  • El rango de una matriz es igual al número de dimensiones. El verdadero rango de una matriz es el número de dimensiones que tienen un tamaño mayor que 1.

  • Las dimensiones se numeran desde 0 hasta N-1 para un N matriz dimensional. Los números de dimensión son etiquetas arbitrarias por conveniencia. El orden de estos números de dimensión no implica un orden menor / mayor particular en el diseño de la forma. La disposición está determinada por el Layout proto.

  • Por convención, las dimensiones se enumeran en orden creciente de número de dimensión. Por ejemplo, para una matriz de 3 dimensiones de tamaño [A x B x C] , dimensión 0 tiene un tamaño A , dimensión 1 tiene un tamaño B y dimensión 2 tiene tamaño C .

    Algunas utilidades de XLA también admiten la indexación negativa, de manera similar a Python; dimensión -1 es la última dimensión (equivalente a N-1 para un N matriz unidimensional). Por ejemplo, para la matriz de 3-dimensional se ha descrito anteriormente, la dimensión -1 tiene tamaño C , dimensión -2 tiene tamaño B y así sucesivamente.

  • Las matrices de dos, tres y cuatro dimensiones a menudo tienen letras específicas asociadas con las dimensiones. Por ejemplo, para una matriz 2D:

    • dimensión 0: y
    • dimensión 1: x

    Para una matriz 3D:

    • dimensión 0: z
    • dimensión 1: y
    • dimensión 2: x

    Para una matriz 4D:

    • dimensión 0: p
    • dimensión 1: z
    • dimensión 2: y
    • dimensión 3: x
  • Las funciones de la API de XLA que toman dimensiones lo hacen en orden creciente de número de dimensión. Esto coincide con el orden utilizado cuando pasa dimensiones que un initializer_list ; p.ej

    ShapeUtil::MakeShape(F32, {A, B, C, D})

    Se creará una forma cuya matriz de tamaño dimensión consiste en la secuencia [A, B, C, D] .

Disposición

El Layout proto describe cómo una matriz se representa en la memoria. El Layout proto incluye los siguientes campos:

message Layout {
  repeated int64 minor_to_major = 1;
  repeated int64 padded_dimensions = 2;
  optional PaddingValue padding_value = 3;
}

Orden de dimensión menor a mayor

El campo sólo se requiere es minor_to_major . Este campo describe el orden de menor a mayor de las dimensiones dentro de una forma. Los valores en minor_to_major son un ordenamiento de las dimensiones de la matriz ( 0 a N-1 para un N matriz unidimensional) con el primer valor siendo la dimensión más-menor hasta el último valor que es la dimensión más-importante. La dimensión más secundaria es la dimensión que cambia más rápidamente al recorrer los elementos de la matriz dispuestos en la memoria lineal.

Por ejemplo, considere la siguiente matriz 2D de tamaño [2 x 3] :

a b c
d e f

Aquí dimensión 0 es el tamaño 2, y la dimensión 1 es el tamaño 3. Si el minor_to_major campo en el diseño es [0, 1] y luego dimensión 0 es la dimensión más-de menor importancia y la dimensión 1 es la dimensión más importante-. Esto corresponde al siguiente diseño en la memoria lineal:

a d b e c f

Este orden de dimensión-menor a mayor de 0 hasta N-1 es similar a la columna-principal (al rango 2). Suponiendo un orden monótono de dimensiones, otro nombre que podemos usar para referirnos a este diseño en el código es simplemente "dim 0 es menor".

Por otro lado, si el minor_to_major campo en el diseño es [1, 0] entonces la disposición en la memoria lineal es:

a b c d e f

Una orden de dimensión menor a mayor de N-1 a 0 para una N matriz unidimensional es similar a la fila mayor (en el rango 2). Suponiendo un orden monótono de dimensiones, otro nombre que podemos usar para referirnos a este diseño en el código es simplemente "dim 0 es mayor".

Orden predeterminado de menor a mayor

El diseño predeterminado para las formas recién creadas es "el orden de dimensión es mayor a menor" (similar a la fila mayor en el rango 2).

Relleno

El relleno se define en las opcionales padded_dimensions y padding_value campos. El campo padded_dimensions describe los tamaños (anchos) a los que se rellena cada dimensión. Si está presente, el número de elementos en padded_dimensions debe ser igual al rango de la forma.

Por ejemplo, dada la [2 x 3] array definido anteriormente, si padded_dimensions es [3, 5] luego dimensión 0 se rellena con una anchura de 3 y la dimensión 1 se rellena con una anchura de 5. La disposición en la memoria lineal (suponiendo un valor de relleno de 0 y diseño de columna principal) es:

a d 0 b e 0 c f 0 0 0 0 0 0 0

Esto es equivalente al diseño de la siguiente matriz con el mismo orden de dimensión menor a mayor:

a b c 0 0
d e f 0 0
0 0 0 0 0

Indexación en matrices

La clase IndexUtil en index_util.h proporciona utilidades para la conversión entre los índices multidimensionales y lineal índices recibe una forma y el diseño. Índices multidimensionales incluyen un int64 índice para cada dimensión. Índices lineales son una sola int64 valor que los índices en la memoria intermedia que sostiene la matriz. Ver shape_util.h y layout_util.h en el mismo directorio de los servicios públicos que la creación y manipulación de formas y diseños de simplificar.