sábado, 17 de abril de 2021

AWS in a nutshell 14. Administración de Amazon S3

Amazon Simple Storage Service (Amazon S3)  es un servicio de almacenamiento de objetos que permite escalabilidad, disponibilidad de datos, seguridad y rendimiento. Almacena y protege cualquier volumen de datos para cualquier utilidad como lagos de datos, sitios web, aplicaciones móviles, procesos de copia de seguridad y restauración, operaciones de archivado, aplicaciones empresariales, dispositivos IoT y análisis de big data. Amazon S3 proporciona características de administración fáciles de utilizar que permiten organizar los datos y configurar sofisticados controles de acceso. 

14.1 Replicación de S3 

Podemos habilitar la replicación entre regiones de bucket S3, o CRR, para una mayor redundancia. Esencialmente para sincronizar el contenido de un depósito S3, o para filtrar qué objetos se replican en un sitio alternativo. 

Para gestionarlo desde la consola de AWS escribimos  S3 y nos sale



AWS Administración de Amazon S3



14.2 versionado de S3  

El control de versiones de S3 es el tipo de característica que podemos esperar en una solución de administración de documentos, donde se retienen varias versiones de documentos individuales. 

Desde la consola ponemos  S3 y vamos a Bucket Projects → Versioning

14.3 Creación de un bucket S3

Utilizaremos la GUI de la consola de administración de AWS para crear un cubo (bucket) de S3. Antes de nada necesitamos saber el propósito de este cubo. ¿para alojar un sitio web? ¿Se utilizará para almacenar archivos de productividad de la oficina, como hojas de cálculo y documentos, y diapositivas para los usuarios? ¿Se usará para almacenar copias de seguridad? Y consideraremos cómo configurar el nivel de almacenamiento para el archivado a largo plazo.

Tecleamos S3 en la consola

AWS Creación de un bucket S3

14.4 Administración del ciclo de vida de S3

La administración del ciclo de vida del bucket de Amazon S3 utiliza las llamadas reglas de transición para migrar datos de un nivel de almacenamiento a otro, de manera automatizada. Como puede ser coger los datos a los que no se ha accedido en mucho tiempo y moverlos a la clase de almacenamiento Glacier. 

Para comenzar con la gestión del ciclo de vida, hay que abrir un cubo. 

Desde la consola ponemos Amazon S3 y vamos a Bucket Projects pulsamos sobre el botón Management y luego sobre el botón Add lifecycle rule

AWS Administración del ciclo de vida de S3


14.5  Niveles de almacenamiento S3 (Bucket Storage Tiers)

Podemos usar la Consola de administración S3 para ver y cambiar los niveles de almacenamiento S3 o las clases de almacenamiento para los objetos que hemos almacenado en S3.

Desde la Consola de administración S3 elegimos S3 Bucket 

14.6 Clases de almacenamiento S3

Para decidir una clase de almacenamiento, tenemos que considerar cosas como la cantidad de datos que se almacenarán en S3. La frecuencia con la que se necesita acceder a los datos,  la clase de almacenamiento y su redundancia, si necesitamos múltiples copias. Hay varias clases diferentes de almacenamiento S3.

AWS Clases de almacenamiento S3

14.7 Amazon S3 Glacier 

Amazon S3 Glacier es una solución de archivos en la nube de AWS, la recuperación de datos de un archivo Glacier puede llevar de minutos a horas. Podemos especificar recuperaciones aceleradas como opción. Podemos acceder a los datos entre uno a cinco minutos en función de una cierta tasa de la cantidad de datos que se recuperan. Se considera un medio de almacenamiento económico para los datos a los que se accede con frecuencia en la nube. Es la opción que elegiremos si necesitamos acceder a los datos una o dos veces al año y nos da igual necesitar entre 12 y 48 horas para la recuperación de estos.

AWS Amazon S3 Glacier

14.8 Aceleración de transferencia S3 

Como su nombre lo indica, el uso de la aceleración de transferencia S3 acelera las transferencias de archivos a un depósito S3. Esto se logra aprovechando la red de entrega de contenido de Amazon CloudFronto CDN, donde los datos se copian o almacenan en caché en diferentes puntos finales geográficos de todo el mundo.

hacemos clic en un cubo existente  en la Consola de administración S3.

14.9. Volúmenes de la almacenamiento de bloques elásticos  (Elastic Block Store Volumes.) 

Los volúmenes de Elastic Block Store o EBS 

son similares a los discos duros virtuales que pueden asociarse con máquinas virtuales.

Para comenzar a crear un volumen EBS, en la consola de administración de AWS, tecleamos EC2, y en Todos los servicios -> Computar.

Se abre una página web llamada "Consola de administración EC2". Se divide en dos partes: panel de navegación y panel de contenido. 

14.10 Adjuntar volúmenes a instancias EC2

Después de crear un volumen EBS, podemos adjuntarlo a una instancia EC2.

Se abre la Consola de administración EC2 en la que se abre la página Volúmenes. 

En la Consola de administración EC2, navegamos hasta la vista de volúmenes de Elastic Block Store.

14.11 Configurar el sistema de archivos elástico

En Amazon Web Services, Elastic File System, o EFS, 

es esencialmente una carpeta compartida en la nube a la que puede conectarse desde dispositivos locales o desde instancias EC2 que se ejecutan en la nube de AWS. Lo que es, es un recurso compartido NFS al que nos conectamos, por ejemplo, incluso desde un host Linux, usando el comando mount.

Buscamos EFS en la consola elegimos un resultado en la lista de búsqueda. Y pulsamos el botón Crear sistema de archivos.

Depués hacemos clic en el botón "Crear sistema de archivos" y se muestra su asistente correspondiente. 

Amazon Web Services, Elastic File System


sábado, 10 de abril de 2021

Autoencoders III. Autoencoders convolucionales, recurrentes y con ruido

 Autoencoders convolucionales

Si estamos trabajando con imágenes, los autoencoders no funcionarán muy bien a menos que las imágenes sean muy pequeñas. De modo que si queremos construir un autoencoder para imágenes, ya sea para reducir su dimensionalidad o hacer un pre-entrenamiento no supervisado, necesitaremos construir un autoencoder convolucional. En el cual, el codificador es una red neuronal convolucional compuesta de capas convolucionales y capas de agrupación. Esto típicamente reduce la dimensionalidad espacial de las entradas (ancho y alto) mientras que incrementa su profundidad (el número de mapas de características. El decodificador debe revertirlo, agrandando la escala de la imagen y reduciendo la profundidad hasta las dimensiones originales de la imagen. Para esto podemos utilizar capas convolucionales traspuestas. Alternativamente podemos combinar capas de muestreo con capas convolucionales. 

Aquí tenemos la implementación de  un autoencoder convolucional para el dataset de moda MNIST.

En este caso el Autoencoder apilado tiene 3 capas ocultas y una capa de salida (es decir, 2 Autoencoders apilados).

tf.random.set_seed(42)

np.random.seed(42)

 

conv_encoder = keras.models.Sequential([

    keras.layers.Reshape([28, 28, 1], input_shape=[28, 28]),

    keras.layers.Conv2D(16, kernel_size=3, padding="SAME", activation="selu"),

    keras.layers.MaxPool2D(pool_size=2),

    keras.layers.Conv2D(32, kernel_size=3, padding="SAME", activation="selu"),

    keras.layers.MaxPool2D(pool_size=2),

    keras.layers.Conv2D(64, kernel_size=3, padding="SAME", activation="selu"),

    keras.layers.MaxPool2D(pool_size=2)

])

conv_decoder = keras.models.Sequential([

    keras.layers.Conv2DTranspose(32, kernel_size=3, strides=2, padding="VALID", activation="selu",

                                 input_shape=[3, 3, 64]),

    keras.layers.Conv2DTranspose(16, kernel_size=3, strides=2, padding="SAME", activation="selu"),

    keras.layers.Conv2DTranspose(1, kernel_size=3, strides=2, padding="SAME", activation="sigmoid"),

    keras.layers.Reshape([28, 28])

])

conv_ae = keras.models.Sequential([conv_encoder, conv_decoder])

 

conv_ae.compile(loss="binary_crossentropy", optimizer=keras.optimizers.SGD(lr=1.0),

                metrics=[rounded_accuracy])

history = conv_ae.fit(X_train, X_train, epochs=5,

                      validation_data=(X_valid, X_valid))

Podemos ver un pequeño esquema de nuestra red neuronal poniendo 

conv_encoder.summary()

conv_decoder.summary()

Y mostrar las reconstrucciones con 

show_reconstructions(conv_ae)

plt.show()

Autoencoders convolucionales


Autoencoders Recurrentes

Si queremos construir un autoencoder para secuencias , tal como una serie de tiempo o texto, ya sea para reducir la dimensionalidad o para aprendizaje no supervisado construiremos un autoencoder recurrente es sencillo: el codificador es típicamente una red recurrente secuencia-a-vector RNN la cual comprime la secuencia de entrada en un vector sencillo. El decodificador es una RNN  vector-a-secuencia que hace el proceso inverso.

recurrent_encoder = keras.models.Sequential([

    keras.layers.LSTM(100, return_sequences=True, input_shape=[28, 28]),

    keras.layers.LSTM(30)

])

recurrent_decoder = keras.models.Sequential([

    keras.layers.RepeatVector(28, input_shape=[30]),

    keras.layers.LSTM(100, return_sequences=True),

    keras.layers.TimeDistributed(keras.layers.Dense(28, activation="sigmoid"))

])

recurrent_ae = keras.models.Sequential([recurrent_encoder, recurrent_decoder])

recurrent_ae.compile(loss="binary_crossentropy", optimizer=keras.optimizers.SGD(0.1),

                     metrics=[rounded_accuracy])

Este autoencoder recurrente puede procesar secuencias de cualquier longitud, con 28 dimensiones en cada paso de tiempo. Esto significa que puede procesar imágenes del dataset de moda MNIST tratando cada imagen como una secuencia de filas: cada paso de tiempo la red RNN procesa una fila simple de 28 pixels. Obviamente podríamos utilizar un autoencoder recurrente para cualquier tipo de secuencia. Hemos utilizado una capa RepeatVector como primera capa para el decodificador, para asegurarnos de que su vector de  entrada alimenta el decodificador en cada paso de tiempo.

show_reconstructions(recurrent_ae)

plt.show()

Autoencoders con ruido

Otra vía para forzar a un autoencoder a aprender caracteríaticas útiles, es añadir ruido a sus entradas y tratar de recuperar las entradas iniciales libres de ruido.

El ruido puede ser un ruido puro Gaussiano añadido a su entrada o puede ser un apagado aleatorio en las entradas. 

 

Autoencoders con ruido

La implementación es sencilla, es un autoencoder apilado regular con una capa adicional de Dropout (Abandono) aplicada en la entrada del codificador. También podemos podemos utilizar una capa GausianNoise en su lugar. Recuerda que la capa Dropout solo está activa durante el entrenamiento, lo mismo para el ruido Gaussiano.

tf.random.set_seed(42)

np.random.seed(42)

 

denoising_encoder = keras.models.Sequential([

    keras.layers.Flatten(input_shape=[28, 28]),

    keras.layers.GaussianNoise(0.2),

    keras.layers.Dense(100, activation="selu"),

    keras.layers.Dense(30, activation="selu")

])

denoising_decoder = keras.models.Sequential([

    keras.layers.Dense(100, activation="selu", input_shape=[30]),

    keras.layers.Dense(28 * 28, activation="sigmoid"),

    keras.layers.Reshape([28, 28])

])

denoising_ae = keras.models.Sequential([denoising_encoder, denoising_decoder])

denoising_ae.compile(loss="binary_crossentropy", optimizer=keras.optimizers.SGD(lr=1.0),

                     metrics=[rounded_accuracy])

history = denoising_ae.fit(X_train, X_train, epochs=10,

                           validation_data=(X_valid, X_valid))

Podemos ver las reconstrucciones aqui:

tf.random.set_seed(42)

np.random.seed(42)

 

noise = keras.layers.GaussianNoise(0.2)

show_reconstructions(denoising_ae, noise(X_valid, training=True))

plt.show()

Autoencoders con ruido

En la imagen se ven las imágenes de entrada con ruido y su reconstrucción sin ruido. Nótese cómo el autoencoder genera detalles que no están en la entrada, como por ejemplo el cuello del jersey blanco.


Traducido del capítulo 17 de “Hands-On Machine Learning with Scikit-Learn, Keras and Tensorflow, 2nd Edition by Aurelien Géron (O’Reilly). Copyright 2019 Kiwisoft S.A.S., 978-1-492-03264-9”