{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
\n",
"# Aprendizaje profundo\n",
"Tu primer modelo hizo disparos aleatorios y tu segundo modelo trató de igualar el juego actual con juegos anteriores; sin embargo, si ningún juego anterior coincidió, entonces fueron solo intentos al azar. Este modelo tendrá un mejor desempeño al __aprender__ el patrón de distribución de los barcos, no solo memorizándolos."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Datos\n",
"Usarás datos de juegos anteriores para entrenar el modelo. Primero debemos descargar los datos del juego maestro archivado ejecutando: (ten en cuenta que los datos se están actualizando constantemente a medida que los juegos se juegan)\n",
"```bash\n",
"./bin/download_data.sh # Download, parse data, create sample data\n",
"```\n",
"a continuación copia el archivo de datos de muestra en el directorio de simulación del código para este modelo\n",
"```bash\n",
"cp ./data/data.min.json ./containers/Shoot/cnn/mock/data/data.json\n",
"```\n",
"Ahora podrás probar tu modelo entrenando localmente\n",
"\n",
"A continuación debemos cargar los datos a nuestro bucket s3 para que podamos entrenar el modelo de producción en él. Ejecuta:\n",
"```bash\n",
"./bin/upload_data.sh\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Código\n",
"El código está en /containers/Shoot/CNN y contiene los siguientes archivos\n",
" \n",
"- ### ./containers/Shoot/CNN/Makefile\n",
"Makefile para crear el archivo tar.gz del código para el entorno de trabajo de sagemaker\n",
"\n",
"- ### [./containers/Shoot/CNN/host.py](/edit/GameDayRepo/containers/Shoot/CNN/host.py)\n",
"El código para generar inferencias (no ejecutes este archivo directamente). Además de ejecutar nuestro modelo, también colocará una etiqueta en el atributo de la sesión que usaremos en athena para comparar diferentes modelos. Puedes cambiar el valor de la etiqueta (lo cual deberías hacer por cada modelo) editando el archivo host.py.\n",
"\n",
"- ### [./containers/Shoot/CNN/test.py](/edit/GameDayRepo/containers/Shoot/CNN/test.py)\n",
"código para probar los archivos host.py y train.py localmente. Crea una simulación de tiempo de ejecución de sagemaker para ejecutar train.py y luego test.py. Puedes editar este archivo para personalizar tu prueba. Si recibes un mensaje acerca de dependencias faltantes (como mxnet) simplemente instálalas con:\n",
"```shell\n",
"pip install mxnet # for example\n",
"```\n",
"\n",
"- ### [./containers/Shoot/CNN/train.py](/edit/GameDayRepo/containers/Shoot/CNN/train.py)\n",
"el código de entrenamiento (no ejecutes este archivo directamente)\n",
"\n",
"\n",
"A continuación, ejecuta el script de prueba localmente para confirmar que los scripts funcionan. Para hacer esto debes descargar el conjunto de datos y crear un conjunto de datos de muestra. Haz esto ejecutando el script de descarga en el directorio bin. \n",
"```shell\n",
"./bin/download_data.sh #downloads data from master Archive, parses it, and also create data sample\n",
"```\n",
"\n",
"luego en el directorio del código (/containers/Shoot/CNN) ejecuta:\n",
"```shell\n",
"mkdir -p mock/data \n",
"cp ../../../data/data.min.json mock/data/data.json #copy the data sample to the mock directory\n",
"```\n",
"Ahora puedes ejecutar el script de prueba:\n",
"```shell\n",
"python ./test.py\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Configurar\n",
"Antes de poder implementar tu segundo modelo, debes configurar la implementación. Como se describe en el [Cuadernillo final](../Endpoint_Reference.ipynb), editarás para la configuración de la implementación en [/shoot-config.json](/edit/GameDayRepo/shoot-config.json). deberás editar el siguiente campo según los siguientes valores\n",
"\n",
"|campo de parámetro|Valor|descripción|\n",
"|---|---|---|\n",
"|trainsourcefile|`shoot-CNN.tar.gz`|código para nuestro modelo|\n",
"|hostsourcefile|`shoot-CNN.tar.gz`|un código para nuestro modelo|\n",
"|hyperparameters.epochs|2|Máx. épocas para las cuales entrenar|\n",
"|hyperparameters.warm_up|1|Cuántas épocas esperar para comenzar a detenerse anticipadamente|\n",
"|hyperparameters.patience|1|Cuántas épocas sin mejoras antes de detenerse anticipadamente|\n",
"|hyperparameters.learning_rate|0.005||\n",
"|hyperparameters.width|32|Cuántos filtros de características en cada capa|\n",
"|hyperparameters.depth|4|cuántas capas|\n",
"|hyperparameters.batch_size|1024|tamaño del lote para entrenamiento|\n",
"|metrics|[{Name:\"Validation\",Regex:\"Testing loss: (.*?);\"},{Name:\"Training\",Regex:\"Training loss: (.*?);\"},{Name:\"Throughput\",Regex:\"Throughput=(.*?);\"}]|Indicadores para enviar a registros de cloudwatch|\n",
"|traininstancetype|\"ml.p3.2xlarge\"|tipo de instancia con la cual entrenar|\n",
"|channels|{\"train\":{\"path\":\"all/data.json\"}}|ruta hacia los datos en bucket de datos|"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Implementar\n",
"1. sigue las instrucciones desde la referencia del punto final para aplicar tu código, y luego transferir tus cambios al módulo remoto.\n",
"1. Descarga, analiza y carga los datos de entrenamiento ejecutando los scripts download_data.sh y upload_data.sh\n",
"```shell\n",
"./bin/download_data.sh\n",
"./bin/upload_data.sh\n",
"```\n",
"2. indica a operaciones que implementen tus cambios\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Evaluación de aprendizaje\n",
"Después de que tu modelo se haya ejecutado, hay dos maneras en las que desearás evaluar tu modelo\n",
" 1. Validation Performance: This is how well your model did on the hold out data set.\n",
" 2. Training Throughput: how many data items can it train on per second.\n",
"\n",
"para ver estos indicadores:\n",
"1. Visita los [trabajos de entrenamiento de sagemaker](https://us-west-2.console.aws.amazon.com/sagemaker/home?#/jobs) en\n",
"1. Selecciona el trabajo de entrenamiento que deseas evaluar (probablemente el más reciente)\n",
"
\n",
"2. desplázate hacia abajo hasta que veas la tarjeta del monitor. Verás tres opciones\n",
"
\n",
" 1. Ver indicadores de Algorith: abrirá cloudwatch y puedes ver un diagrama de los indicadores de tu modelo. Para este modelo, puedes ver la puntuación de entrenamiento, la puntuación de validación y el desempeño.\n",
" 2. Ver registros: Te llevará a los registros de cloudwatch para ver la salida de registros del contenedor de modelos (útil para hacer depuración de errores).\n",
" 3. Ver indicadores de Algorith: abrirá cloudwatch y puedes ver un diagrama de los indicadores. (uso de CPU, uso de GPU, uso de memoria, etc...)\n",
" \n",
"### Validación del desempeño\n",
"El modelo que entrenaste utiliza la [puntuación DICE](https://forums.fast.ai/t/understanding-the-dice-coefficient/5838) que será un número entre 0,0 y 1,0 en el que 1,0 representa un modelo perfecto. Querrás que tu modelo tenga una puntuación de dados lo más alta posible. Aumentar los hiperparámetros de ancho y profundidad hará que tu modelo sea más poderoso y le dará una puntuación de dados más alta (pero llevará más tiempo entrenarlo)\n",
"\n",
"### Resultado del entrenamiento\n",
"Tu primer trabajo de entrenamiento debería haber entrenado para solo algunas épocas. Esto te dará una buena estimación del resultado del entrenamiento que puedes usar para ajustar para cuántas épocas entrenar a tu modelo a continuación. Demasiado bajo y tu modelo no aprende lo suficiente, demasiado largo y tu modelo nunca terminó a tiempo para ganar puntos para ti. Como equipo deberás decidir por cuánto tiempo deseas entrenar a un modelo. Observa que aumentar los hiperparámetros de ancho y profundidad disminuirá tu rendimiento, pero usar un tipo de instancia mayor aumentará el rendimiento. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Desempeño de la implementación\n",
"A continuación, monitorea el desempeño de tu modelo. Consulta [Athena](../Athena.ipynb) para obtener más detalles sobre cómo configurar Athena (reemplaza los valores entre `<>` como en las instrucciones de Athena). La siguiente consulta mostrará el porcentaje ganado por tipo de disparo.\n",
"\n",
"```sql\n",
"SELECT type,\n",
" sum(won)/(sum(won)+sum(lost)) as won,\n",
" sum(lost)/(sum(won)+sum(lost)) as lost\n",
"FROM \n",
" (SELECT json_extract(session,'$.shootType') AS type,\n",
" CASE\n",
" WHEN winner = '' THEN 1.0\n",
" ELSE 0.0\n",
" END AS won,\n",
" CASE\n",
" WHEN winner != '' THEN 1.0\n",
" ELSE 0.0\n",
" END AS lost\n",
" FROM \n",
" (SELECT teama.session AS session,\n",
" teama.teamname AS team,\n",
" winner\n",
" FROM \"\".\"\"\n",
" UNION\n",
" SELECT teamb.session AS session,\n",
" teamb.teamname AS team,\n",
" winner\n",
" FROM \"\".\"\" )\n",
" WHERE team = '' )\n",
" GROUP BY type\n",
"```\n",
"\n",
"Intenta editar los hiperparámetros o el código para mejorar los resultados de tu desempeño."
]
},
{
"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"
},
"latex_envs": {
"LaTeX_envs_menu_present": true,
"autoclose": false,
"autocomplete": true,
"bibliofile": "biblio.bib",
"cite_by": "apalike",
"current_citInitial": 1,
"eqLabelWithNumbers": true,
"eqNumInitial": 1,
"hotkeys": {
"equation": "Ctrl-E",
"itemize": "Ctrl-I"
},
"labels_anchors": false,
"latex_user_defs": false,
"report_style_numbering": false,
"user_envs_cfg": false
}
},
"nbformat": 4,
"nbformat_minor": 2
}