{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
\n",
"# Inicio\n",
"\n",
"El propósito de este día de juegos es aprender cómo desarrollar e implementar rápidamente modelos de aprendizaje de máquina en un entorno competitivo. Llevaremos a cabo esto desarrollando modelos para jugar el juego de la batalla naval."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Descripción del juego y reglas\n",
"¡Tu equipo creará modelos de aprendizaje de máquina para jugar \"AI Command\" que es similar a la batalla naval! (como en \"¡hundiste mi barco de guerra!\") Cada equipo tendrá un tablero en el que colocarán sus barcos e intentarán adivinar la ubicación de los barcos del equipo contrario. Durante cada ronda, los equipos elegirán una ubicación en el tablero del equipo contrario, lo que se revelará como un acierto o un yerro. ¡El primer equipo en encontrar todos los barcos del equipo contrario gana!\n",
"\n",
"Para jugar el juego, cada equipo deberá crear dos modelos de aprendizaje de máquina: un modelo de distribución que ubique los barcos en el tablero y un modelo de disparo que adivine las ubicaciones de los barcos del otro equipo. \n",
"\n",
"### Reglas\n",
"- __Tablero__: Cada equipo en cada juego colocará sus barcos en un tablero de juego rectangular y luego adivinará o disparará al tablero de barcos contrario. El tamaño del tablero te será dado. \n",
"- __Distribución__:\n",
" - Barcos: Los barcos pueden ser de __cualquier forma__ siempre que sigan las restricciones dadas para la situación. Los detalles de estas restricciones estarán en las Instrucciones de punto final de distribución\n",
"- __disparo__: Los equipos realizarán un disparo por vez hasta que suceda una de las siguientes cosas:\n",
" 1. un equipo hunde todos los barcos del equipo contrario\n",
" 2. Se alcanza a la cantidad máxima de rondas de disparos. La cantidad máxima de rondas de disparo es igual al área del tablero de juego. Por lo tanto, si un Tablero de juego es de 10x10, habrá un máximo de 100 disparos por equipo por juego\n",
"- __Puntuación__: se llevará un registro de la puntuación de los equipos a lo largo de tres dimensiones\n",
" 1. Juegos ganados\n",
" 1. Cantidad total de aciertos contra los adversarios \n",
" 1. Cantidad total de aciertos de los adversarios"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Arquitectura\n",
"\n",
"
\n",
"\n",
"El motor del juego funciona de la siguiente manera:\n",
"1. una alarma de cloudwatch activa el __launcher lambda__ cada 30 segundos (u otro intervalo de tiempo) \n",
"2. el launcher lambda lee la __tabla dynamodb del equipo__ (la cual se te lee cuando inscribes a tu equipo) y escribe en el SQS del juego una configuración del juego para cada par de equipos. \n",
"3. __Game lambda__ lee los objetos de la cola del juego y ejecuta cada juego \n",
" 1. llamando al __punto final de distribución__ de cada equipo\n",
" 2. llamando repetidamente al __punto final de disparo__ de cada equipo y actualizando la puntuación\n",
" 3. cuando el juego termina, escribe los datos del juego en la __tabla dynamodb del juego__\n",
" 4. si hay algún error en los equipos, escribe el error en el __error sns topic__ del equipo\n",
"4. La tabla __game DynamoDb__ transmite al lambda de transmisión, el cual: \n",
" 1. escribe los datos del juego un __kinesis firehose__ que escribe los datos en un __bucket S3__ (para que los equipos consuman y descarguen) y una base de datos __elasticsearch database__ (para que los administradores del juego depuren los errores).\n",
" 1. uando se escriben nuevos datos en el bucket s3 se activa un __SNS topic__ para notificar a los equipos de los nuevos datos\n",
" 2. escribe las actualizaciones de puntuaciones en un __redis cluster__"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Preparación\n",
"El éxito de tu equipo depende de:\n",
"\n",
"- Su capacidad de trabajar juntos\n",
"- Su capacidad de implementar modelos rápidamente\n",
"- Usar el tiempo eficazmente\n",
"- Sus conocimientos de aprendizaje de máquina\n",
"\n",
"\n",
"### Organiza a tu equipo\n",
"Para ayudar a tu equipo a trabajar juntos e implementar modelos rápidamente, recomendamos organizar a tu equipo en tres grupos: Operaciones, defensa y ataque. Cada grupo tendrá sus propias habilidades y responsabilidades, y trabajarán con los otros grupos para ganar el juego. \n",
"\n",
"1. __Grupo de defensa__: Responsable de investigar y desarrollar el punto final de distribución. Los miembros que tengan buenas habilidades en ciencias de datos o habilidades de programación en python tendrán un buen desempeño en este equipo.\n",
"1. __Grupo de ataque__: Responsable de investigar y desarrollar el punto final de disparo. Los miembros con buenas habilidades en aprendizaje de máquina tendrán un buen desempeño en este equipo.\n",
"1. __Operaciones__: Los miembros que no se adecuen bien a los grupos de ataque o defensa pueden trabajar en este grupo:\n",
" 1. Administración/implementación de la infraestructura\n",
" 2. Implementación de modelos\n",
" 3. comunicación de los errores y comentarios a los grupos de Distribución y Disparos\n",
"\n",
"¡También tendrás que darle un nombre a tu equipo! \n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Planificación\n",
"Para ayudar a tu equipo a usar su tiempo eficazmente, les sugerimos realizar la planificación para cada equipo y cada grupo. También les recomendamos trabajar en \"lotes de tamaño pequeño\". Prueba hacer muchos cambios pequeños e implementaciones rápidamente en lugar de hacer pocas implementaciones más grandes.\n",
"\n",
"
\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Código \n",
"\n",
"### Organización\n",
"El código que necesitarás ya fue instalado en tu instancia del cuaderno de notas. El directorio raíz del proyecto está en /home/ec2-user/SageMaker/GameDayRepo y las rutas dadas en cualquier cuaderno de notas posterior serán relativas a este directorio. En la raíz del proyecto hay un par de directorios y archivos que se deben tener en cuenta\n",
"\n",
"\n",
"```\n",
"bin/ #A directory of scripts to help you with common tasks\n",
"├── athena_info.sh\n",
"├── register_outputs.sh\n",
"├── startPipeline.js\n",
"├── testLayout.py\n",
"├── testShoot.py\n",
"├── upload_code.sh\n",
"├── download_data.sh\n",
"└── upload_data.sh\n",
"\n",
"layout-config.json # Deploy/Train config for layout endpoint\n",
"shoot-config.json # Deploy/Train config for shoot endpoint\n",
"\n",
"containers/ #contains all the code for you sagemaker training jobs and endpoints\n",
"├── Layout # code for the layout endpoint\n",
"│ ├── 2vs3\n",
"│ │ ├── host.py\n",
"│ │ ├── test.py\n",
"│ │ └── train.py\n",
"└── Shoot # code for the shoot endpoint\n",
" ├── CNN # code for Deep learning CNN model\n",
" │ ├── cnn.py\n",
" │ ├── host.py\n",
" │ ├── mock\n",
" │ │ ├── data # directory to put sample data for local testing\n",
" │ │ └── out\n",
" │ ├── test.py\n",
" │ ├── train.py\n",
" ├── line # code for line shooting model\n",
" │ ├── host.py\n",
" │ ├── test.py\n",
" │ └── train.py\n",
" \n",
"notebooks/ # Jupyter notebooks/Tutorials for your team to help you through the day\n",
"├── Athena.ipynb\n",
"├── Endpoint_Reference.ipynb\n",
"├── defense\n",
"│ ├── Analytics.ipynb\n",
"│ └── getting_started.ipynb\n",
"├── getting_started.ipynb\n",
"├── offensive\n",
"│ ├── CNN.ipynb\n",
"│ └── getting_started.ipynb\n",
"└── opperations\n",
" └── getting_started.ipynb\n",
" \n",
"data/ # Directory where the game data is downloaded and saved to.\n",
"```\n",
"\n",
"### Implementación\n",
"Cada grupo trabajará en una instancia del cuaderno de notas de SageMaker. Los siguientes diagramas muestran cómo cada envío o lectura del cuaderno de notas cambia al codecommit repo principal (este repositorio ya fue creado para ti)\n",
"
\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## ¡Divídanse en grupos!\n",
"sepárense en tres grupos y trabajen en los tutoriales correspondientes\n",
"\n",
"- [Cuaderno de notas de operaciones](./opperations/getting_started.ipynb)\n",
"- [Cuaderno de notas ataque](./offensive/getting_started.ipynb)\n",
"- [Cuaderno de notas defensa](./defense/getting_started.ipynb)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}