AKSDeploymentTutorial/Tensorflow/02_BuildImage.ipynb

563 строки
36 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Build Docker Image \n",
"In this notebook we will build the docker image that contains the Resnet 152 model, Flask web application, model driver and all dependencies."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"from os import path\n",
"import json\n",
"import shutil\n",
"%load_ext dotenv"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We will be using the following Docker information to push the image to docker hub."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"tags": [
"parameters"
]
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Overwriting .env\n"
]
}
],
"source": [
"%%writefile .env\n",
"# This cell is tagged `parameters`\n",
"# Please modify the values below as you see fit\n",
"\n",
"# Your docker login and image repository name\n",
"docker_login = \"YOUR_DOCKER_LOGIN\"\n",
"image_repo = \"/tfresnet-gpu\""
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"os.makedirs('flaskwebapp', exist_ok=True)\n",
"os.makedirs(os.path.join('flaskwebapp', 'nginx'), exist_ok=True)\n",
"os.makedirs(os.path.join('flaskwebapp', 'etc'), exist_ok=True)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['etc', 'driver.py', 'synset.txt', 'nginx', 'resnet_v1_152.ckpt']"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"shutil.copy('resnet_v1_152.ckpt', 'flaskwebapp')\n",
"shutil.copy('synset.txt', 'flaskwebapp')\n",
"shutil.copy('driver.py', 'flaskwebapp')\n",
"os.listdir('flaskwebapp')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Below is the module for the Flask web application."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Writing flaskwebapp/app.py\n"
]
}
],
"source": [
"%%writefile flaskwebapp/app.py\n",
"from flask import Flask, request\n",
"import time\n",
"import logging\n",
"import json\n",
"import driver\n",
"\n",
"app = Flask(__name__)\n",
"predict_for = driver.get_model_api()\n",
"\n",
"\n",
"@app.route('/score', methods = ['POST'])\n",
"def scoreRRS():\n",
" \"\"\" Endpoint for scoring\n",
" \"\"\"\n",
" if request.headers['Content-Type'] != 'application/json':\n",
" return Response(json.dumps({}), status= 415, mimetype ='application/json')\n",
" request_input = request.json['input']\n",
" predictions = predict_for(request_input)\n",
" return json.dumps({'result': predictions})\n",
"\n",
"\n",
"@app.route(\"/\")\n",
"def healthy():\n",
" return \"Healthy\"\n",
"\n",
"\n",
"@app.route('/version', methods = ['GET'])\n",
"def version_request():\n",
" return driver.version()\n",
"\n",
"\n",
"if __name__ == \"__main__\":\n",
" app.run(host='0.0.0.0') # Ignore, Development server"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Writing flaskwebapp/wsgi.py\n"
]
}
],
"source": [
"%%writefile flaskwebapp/wsgi.py\n",
"import sys\n",
"from app import app as application\n",
"\n",
"def create():\n",
" print(\"Initialising\")\n",
" application.run(host='127.0.0.1', port=5000)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The configuration for the Nginx. Note that it creates a proxy between ports **80** and **5000**."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Writing flaskwebapp/nginx/app\n"
]
}
],
"source": [
"%%writefile flaskwebapp/nginx/app\n",
"server {\n",
" listen 80;\n",
" server_name _;\n",
" \n",
" location / {\n",
" include proxy_params;\n",
" proxy_pass http://127.0.0.1:5000;\n",
" proxy_connect_timeout 5000s;\n",
" proxy_read_timeout 5000s;\n",
" }\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Writing flaskwebapp/gunicorn_logging.conf\n"
]
}
],
"source": [
"%%writefile flaskwebapp/gunicorn_logging.conf\n",
"\n",
"[loggers]\n",
"keys=root, gunicorn.error\n",
"\n",
"[handlers]\n",
"keys=console\n",
"\n",
"[formatters]\n",
"keys=json\n",
"\n",
"[logger_root]\n",
"level=INFO\n",
"handlers=console\n",
"\n",
"[logger_gunicorn.error]\n",
"level=ERROR\n",
"handlers=console\n",
"propagate=0\n",
"qualname=gunicorn.error\n",
"\n",
"[handler_console]\n",
"class=StreamHandler\n",
"formatter=json\n",
"args=(sys.stdout, )\n",
"\n",
"[formatter_json]\n",
"class=jsonlogging.JSONFormatter"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Writing flaskwebapp/kill_supervisor.py\n"
]
}
],
"source": [
"%%writefile flaskwebapp/kill_supervisor.py\n",
"import sys\n",
"import os\n",
"import signal\n",
"\n",
"\n",
"def write_stdout(s):\n",
" sys.stdout.write(s)\n",
" sys.stdout.flush()\n",
"\n",
"# this function is modified from the code and knowledge found here: http://supervisord.org/events.html#example-event-listener-implementation\n",
"def main():\n",
" while 1:\n",
" write_stdout('READY\\n')\n",
" # wait for the event on stdin that supervisord will send\n",
" line = sys.stdin.readline()\n",
" write_stdout('Killing supervisor with this event: ' + line);\n",
" try:\n",
" # supervisord writes its pid to its file from which we read it here, see supervisord.conf\n",
" pidfile = open('/tmp/supervisord.pid','r')\n",
" pid = int(pidfile.readline());\n",
" os.kill(pid, signal.SIGQUIT)\n",
" except Exception as e:\n",
" write_stdout('Could not kill supervisor: ' + e.strerror + '\\n')\n",
" write_stdout('RESULT 2\\nOK')\n",
"\n",
"main()\n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Writing flaskwebapp/etc/supervisord.conf\n"
]
}
],
"source": [
"%%writefile flaskwebapp/etc/supervisord.conf \n",
"[supervisord]\n",
"logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)\n",
"logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB)\n",
"logfile_backups=10 ; (num of main logfile rotation backups;default 10)\n",
"loglevel=info ; (log level;default info; others: debug,warn,trace)\n",
"pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)\n",
"nodaemon=true ; (start in foreground if true;default false)\n",
"minfds=1024 ; (min. avail startup file descriptors;default 1024)\n",
"minprocs=200 ; (min. avail process descriptors;default 200)\n",
"\n",
"[program:gunicorn]\n",
"command=bash -c \"gunicorn --workers 1 -m 007 --timeout 100000 --capture-output --error-logfile - --log-config gunicorn_logging.conf \\\"wsgi:create()\\\"\"\n",
"directory=/code\n",
"redirect_stderr=true\n",
"stdout_logfile =/dev/stdout\n",
"stdout_logfile_maxbytes=0\n",
"startretries=2\n",
"startsecs=20\n",
"\n",
"[program:nginx]\n",
"command=/usr/sbin/nginx -g \"daemon off;\"\n",
"startretries=2\n",
"startsecs=5\n",
"priority=3\n",
"\n",
"[eventlistener:program_exit]\n",
"command=python kill_supervisor.py\n",
"directory=/code\n",
"events=PROCESS_STATE_FATAL\n",
"priority=2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We create a custom image based on the CUDA 9 image from NVIDIA and install all the necessary dependencies. This is in order to try and keep the size of the image as small as possible."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Writing flaskwebapp/requirements.txt\n"
]
}
],
"source": [
"%%writefile flaskwebapp/requirements.txt\n",
"pillow\n",
"click==6.7\n",
"configparser==3.5.0\n",
"Flask==0.11.1\n",
"gunicorn==19.6.0\n",
"json-logging-py==0.2\n",
"MarkupSafe==1.0\n",
"olefile==0.44\n",
"requests==2.12.3"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Writing flaskwebapp/dockerfile\n"
]
}
],
"source": [
"%%writefile flaskwebapp/dockerfile\n",
"\n",
"FROM nvidia/cuda:9.0-cudnn7-devel-ubuntu16.04\n",
"MAINTAINER Mathew Salvaris <mathew.salvaris@microsoft.com>\n",
"\n",
"RUN echo \"deb http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1604/x86_64 /\" > /etc/apt/sources.list.d/nvidia-ml.list\n",
"\n",
"RUN mkdir /code\n",
"WORKDIR /code\n",
"ADD . /code/\n",
"ADD etc /etc\n",
"\n",
"RUN apt-get update && apt-get install -y --no-install-recommends \\\n",
" build-essential \\\n",
" ca-certificates \\\n",
" cmake \\\n",
" curl \\\n",
" git \\\n",
" nginx \\\n",
" supervisor \\\n",
" wget && \\\n",
" rm -rf /var/lib/apt/lists/*\n",
"\n",
"ENV PYTHON_VERSION=3.5\n",
"RUN curl -o ~/miniconda.sh -O https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh && \\\n",
" chmod +x ~/miniconda.sh && \\\n",
" ~/miniconda.sh -b -p /opt/conda && \\\n",
" rm ~/miniconda.sh && \\\n",
" /opt/conda/bin/conda create -y --name py$PYTHON_VERSION python=$PYTHON_VERSION numpy scipy pandas scikit-learn && \\\n",
" /opt/conda/bin/conda clean -ya\n",
"ENV PATH /opt/conda/envs/py$PYTHON_VERSION/bin:$PATH\n",
"ENV LD_LIBRARY_PATH /opt/conda/envs/py$PYTHON_VERSION/lib:/usr/local/cuda/lib64/:$LD_LIBRARY_PATH\n",
"ENV PYTHONPATH /code/:$PYTHONPATH\n",
"\n",
"RUN rm /etc/nginx/sites-enabled/default && \\\n",
" cp /code/nginx/app /etc/nginx/sites-available/ && \\\n",
" ln -s /etc/nginx/sites-available/app /etc/nginx/sites-enabled/ && \\\n",
" pip install tensorflow-gpu==1.9.0 && \\\n",
" pip install -r /code/requirements.txt\n",
"\n",
"EXPOSE 80\n",
"CMD [\"supervisord\", \"-c\", \"/etc/supervisord.conf\"]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The image name below referes to our dockerhub account. If you wish to push the image to your accountmake sure you change the docker login."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"%dotenv\n",
"image_name = os.getenv('docker_login') + os.getenv('image_repo')\n",
"application_path = 'flaskwebapp'\n",
"docker_file_location = path.join(application_path, 'dockerfile')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next, we build our docker image. The output of this cell is cleared from this notebook as it is quite long due to all the installations required to build the image. However, you should make sure you see *Successfully built* and *Successfully tagged* messages in the last line of the output when you run the cell. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"!docker build -t $image_name -f $docker_file_location $application_path"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Below we will push the image created to our dockerhub registry. Make sure you have already logged in to the appropriate dockerhub account using the docker login command. If you haven't loged in to the approrpiate dockerhub account you will get an error."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The push refers to repository [docker.io/caia/tfresnet-gpu]\n",
"\n",
"\u001b[1B972d3bd5: Preparing \n",
"\u001b[1B7660082a: Preparing \n",
"\u001b[1Bcdacb173: Preparing \n",
"\u001b[1Bd7bb955d: Preparing \n",
"\u001b[1B9d4cefeb: Preparing \n",
"\u001b[1Bf7f1d023: Preparing \n",
"\u001b[1B006e8a0c: Preparing \n",
"\u001b[1Ba273db2b: Preparing \n",
"\u001b[1B35faacf3: Preparing \n",
"\u001b[1B6f924f59: Preparing \n",
"\u001b[1B5cb8493b: Preparing \n",
"\u001b[1B62ee5fac: Preparing \n",
"\u001b[1B28798916: Preparing \n",
"\u001b[1Bdd00b1a4: Preparing \n",
"\u001b[1Bc3c04cbd: Preparing \n",
"\u001b[1Bdaf493f1: Preparing \n",
"\u001b[1B88d0e278: Preparing \n",
"\u001b[17B660082a: Pushing 1.024GB/1.267GB\u001b[15A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[16A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[16A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[16A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[16A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[16A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[16A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[16A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[16A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[16A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[16A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[16A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[16A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[16A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[16A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[16A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[16A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[16A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[16A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[12A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[16A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[16A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[16A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[16A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[16A\u001b[1K\u001b[K\u001b[16A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[16A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[9A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[8A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[6A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[3A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17B660082a: Pushed 1.304GB/1.267GB\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[18A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[K\u001b[17A\u001b[1K\u001b[Klatest: digest: sha256:fee37694784bc8e8b40911ce0eed46cb38ea8d32254406a603588aab304ce148 size: 4096\n"
]
}
],
"source": [
"!docker push $image_name"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Docker image name caia/tfresnet-gpu\n"
]
}
],
"source": [
"print('Docker image name {}'.format(image_name)) "
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"### Test locally\n",
"Go to the [Test Locally notebook](03_TestLocally.ipynb) to test your Docker image"
]
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python [conda env:AKSDeployment]",
"language": "python",
"name": "conda-env-AKSDeployment-py"
},
"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.5.5"
}
},
"nbformat": 4,
"nbformat_minor": 1
}