From 2ee0ecf537e4a2ecd2bb4bf3c8fc2f2d4b885059 Mon Sep 17 00:00:00 2001 From: Clive Cox Date: Wed, 16 Sep 2020 14:50:43 +0100 Subject: [PATCH] add updated triton server fixes and example for tensorrt --- doc/source/examples/digit.png | Bin 0 -> 3162 bytes doc/source/examples/notebooks.rst | 12 +- doc/source/examples/nvidia_mnist.nblink | 3 - doc/source/examples/tensorrt.nblink | 3 + doc/source/python/api/seldon_core.proto.rst | 19 +- doc/source/python/api/seldon_core.rst | 111 +- .../azure_aks_deep_mnist.ipynb | 10 +- examples/models/nvidia-mnist/.s2i/environment | 4 - examples/models/nvidia-mnist/Makefile | 14 - .../models/nvidia-mnist/MnistTransformer.py | 27 - examples/models/nvidia-mnist/fetch-model.sh | 1 - .../nvidia-mnist/nvidia-mnist/Chart.yaml | 6 - .../templates/mnist_nvidia_deployment.json | 138 -- .../nvidia-mnist/nvidia-mnist/values.yaml | 4 - .../models/nvidia-mnist/nvidia_mnist.ipynb | 1164 ----------------- .../nvidia-mnist/tensorrt_mnist/config.pbtxt | 19 - .../tensorrt_mnist/mnist_labels.txt | 10 - .../models/sklearn_iris/sklearn_iris.ipynb | 2 +- examples/models/tensorrt/.gitignore | 2 + examples/models/tensorrt/digit.png | Bin 0 -> 3162 bytes examples/models/tensorrt/requirements.txt | 3 + .../models/tensorrt/triton_tensorrt.ipynb | 266 ++++ executor/api/rest/server.go | 6 +- operator/constants/constants.go | 1 + .../seldondeployment_controller.go | 2 +- .../seldondeployment_prepackaged_servers.go | 16 +- ...ldondeployment_prepackaged_servers_test.go | 96 ++ operator/controllers/suite_test.go | 10 + 28 files changed, 476 insertions(+), 1473 deletions(-) create mode 100644 doc/source/examples/digit.png delete mode 100644 doc/source/examples/nvidia_mnist.nblink create mode 100644 doc/source/examples/tensorrt.nblink delete mode 100644 examples/models/nvidia-mnist/.s2i/environment delete mode 100644 examples/models/nvidia-mnist/Makefile delete mode 100644 examples/models/nvidia-mnist/MnistTransformer.py delete mode 100755 examples/models/nvidia-mnist/fetch-model.sh delete mode 100644 examples/models/nvidia-mnist/nvidia-mnist/Chart.yaml delete mode 100644 examples/models/nvidia-mnist/nvidia-mnist/templates/mnist_nvidia_deployment.json delete mode 100644 examples/models/nvidia-mnist/nvidia-mnist/values.yaml delete mode 100644 examples/models/nvidia-mnist/nvidia_mnist.ipynb delete mode 100644 examples/models/nvidia-mnist/tensorrt_mnist/config.pbtxt delete mode 100644 examples/models/nvidia-mnist/tensorrt_mnist/mnist_labels.txt create mode 100644 examples/models/tensorrt/.gitignore create mode 100644 examples/models/tensorrt/digit.png create mode 100644 examples/models/tensorrt/requirements.txt create mode 100644 examples/models/tensorrt/triton_tensorrt.ipynb diff --git a/doc/source/examples/digit.png b/doc/source/examples/digit.png new file mode 100644 index 0000000000000000000000000000000000000000..8e9de98d8b245613ed6603dec7f7fcab71ccf0ef GIT binary patch literal 3162 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 + + + Prepackaged Inference Server Examples ----- @@ -33,7 +43,7 @@ Specialised Framework Examples .. toctree:: :titlesonly: - NVIDIA TensorRT MNIST + NVIDIA TensorRT MNIST OpenVINO ImageNet OpenVINO ImageNet Ensemble ONNX ResNet with Intel nGraph diff --git a/doc/source/examples/nvidia_mnist.nblink b/doc/source/examples/nvidia_mnist.nblink deleted file mode 100644 index 67e1d42248..0000000000 --- a/doc/source/examples/nvidia_mnist.nblink +++ /dev/null @@ -1,3 +0,0 @@ -{ - "path": "../../../examples/models/nvidia-mnist/nvidia_mnist.ipynb" -} diff --git a/doc/source/examples/tensorrt.nblink b/doc/source/examples/tensorrt.nblink new file mode 100644 index 0000000000..11f90b6c68 --- /dev/null +++ b/doc/source/examples/tensorrt.nblink @@ -0,0 +1,3 @@ +{ + "path": "../../../examples/models/tensorrt/triton_tensorrt.ipynb" +} diff --git a/doc/source/python/api/seldon_core.proto.rst b/doc/source/python/api/seldon_core.proto.rst index 47fca459d1..d753287dea 100644 --- a/doc/source/python/api/seldon_core.proto.rst +++ b/doc/source/python/api/seldon_core.proto.rst @@ -2,9 +2,9 @@ seldon\_core.proto package ========================== .. automodule:: seldon_core.proto - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: Submodules ---------- @@ -13,16 +13,15 @@ seldon\_core.proto.prediction\_pb2 module ----------------------------------------- .. automodule:: seldon_core.proto.prediction_pb2 - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: seldon\_core.proto.prediction\_pb2\_grpc module ----------------------------------------------- .. automodule:: seldon_core.proto.prediction_pb2_grpc - :members: - :undoc-members: - :show-inheritance: - + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/python/api/seldon_core.rst b/doc/source/python/api/seldon_core.rst index fbc42ea12d..dd65a30945 100644 --- a/doc/source/python/api/seldon_core.rst +++ b/doc/source/python/api/seldon_core.rst @@ -2,16 +2,16 @@ seldon\_core package ==================== .. automodule:: seldon_core - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: Subpackages ----------- .. toctree:: - seldon_core.proto + seldon_core.proto Submodules ---------- @@ -20,9 +20,9 @@ seldon\_core.api\_tester module ------------------------------- .. automodule:: seldon_core.api_tester - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: seldon\_core.app module ----------------------- @@ -36,128 +36,127 @@ seldon\_core.batch\_processor module ------------------------------------ .. automodule:: seldon_core.batch_processor - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: seldon\_core.flask\_utils module -------------------------------- .. automodule:: seldon_core.flask_utils - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: seldon\_core.imports\_helper module ----------------------------------- .. automodule:: seldon_core.imports_helper - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: seldon\_core.metadata module ---------------------------- .. automodule:: seldon_core.metadata - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: seldon\_core.metrics module --------------------------- .. automodule:: seldon_core.metrics - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: seldon\_core.microservice module -------------------------------- .. automodule:: seldon_core.microservice - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: seldon\_core.microservice\_tester module ---------------------------------------- .. automodule:: seldon_core.microservice_tester - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: seldon\_core.persistence module ------------------------------- .. automodule:: seldon_core.persistence - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: seldon\_core.seldon\_client module ---------------------------------- .. automodule:: seldon_core.seldon_client - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: seldon\_core.seldon\_methods module ----------------------------------- .. automodule:: seldon_core.seldon_methods - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: seldon\_core.serving\_test\_gen module -------------------------------------- .. automodule:: seldon_core.serving_test_gen - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: seldon\_core.storage module --------------------------- .. automodule:: seldon_core.storage - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: seldon\_core.user\_model module ------------------------------- .. automodule:: seldon_core.user_model - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: seldon\_core.utils module ------------------------- .. automodule:: seldon_core.utils - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: seldon\_core.version module --------------------------- .. automodule:: seldon_core.version - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: seldon\_core.wrapper module --------------------------- .. automodule:: seldon_core.wrapper - :members: - :undoc-members: - :show-inheritance: - + :members: + :undoc-members: + :show-inheritance: diff --git a/examples/models/azure_aks_deep_mnist/azure_aks_deep_mnist.ipynb b/examples/models/azure_aks_deep_mnist/azure_aks_deep_mnist.ipynb index 30417c1adf..741eecda1f 100644 --- a/examples/models/azure_aks_deep_mnist/azure_aks_deep_mnist.ipynb +++ b/examples/models/azure_aks_deep_mnist/azure_aks_deep_mnist.ipynb @@ -585,13 +585,7 @@ "\u001b[1B32b1ff99: Preparing \n", "\u001b[1B64f96dbc: Preparing \n", "\u001b[1Be6d76fd9: Preparing \n", - "\u001b[1B11a84ad4: Preparing \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "\u001b[1B11a84ad4: Preparing \n", "\u001b[13B4b2c556: Pushing 187.1MB/648.8MB\u001b[14A\u001b[1K\u001b[K\u001b[12A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[14A\u001b[1K\u001b[K\u001b[12A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[9A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[9A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[9A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[9A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[9A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[9A\u001b[1K\u001b[K\u001b[15A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[9A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[9A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[9A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[9A\u001b[1K\u001b[K\u001b[9A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[9A\u001b[1K\u001b[K\u001b[9A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[8A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[6A\u001b[1K\u001b[K\u001b[6A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[6A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[6A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[10A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[6A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[6A\u001b[1K\u001b[K\u001b[6A\u001b[1K\u001b[K\u001b[11A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[6A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[6A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[6A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[KPushing 28.9MB/648.8MB\u001b[6A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[6A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[6A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[6A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[6A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[6A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[6A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[6A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[6A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[3A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[3A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[3A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[3A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[7A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[3A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[3A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[3A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[3A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[3A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[3A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[KPushing 60.12MB/141.8MB\u001b[4A\u001b[1K\u001b[KPushing 60.64MB/141.8MB\u001b[7A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[3A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[3A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[KPushing 141.9MB\u001b[2A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[4A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[KPushing 185.5MB/648.8MB\u001b[5A\u001b[1K\u001b[K\u001b[5B32b1ff99: Pushed 570.6MB/556.5MB\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[KPushing 254.7MB/556.5MB\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[KPushing 268.7MB/648.8MB\u001b[2A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[2A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[KPushing 6.456MB/100.6MB\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[KPushing 345.2MB/648.8MB\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[KPushing 398.1MB/648.8MB\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[KPushing 55.64MB/100.6MB\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[KPushing 481.1MB/648.8MB\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[KPushing 473.8MB/556.5MB\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[13A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[1A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K\u001b[5A\u001b[1K\u001b[K0.1: digest: sha256:b6110da62719e103bfd8c4b187f868b4341c35be16d288018d529da1cfa2585c size: 3482\n" ] } @@ -3340,7 +3334,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.5" + "version": "3.6.8" }, "varInspector": { "cols": { diff --git a/examples/models/nvidia-mnist/.s2i/environment b/examples/models/nvidia-mnist/.s2i/environment deleted file mode 100644 index 752bf2fd05..0000000000 --- a/examples/models/nvidia-mnist/.s2i/environment +++ /dev/null @@ -1,4 +0,0 @@ -MODEL_NAME=MnistTransformer -API_TYPE=REST -SERVICE_TYPE=TRANSFORMER -PERSISTENCE=0 diff --git a/examples/models/nvidia-mnist/Makefile b/examples/models/nvidia-mnist/Makefile deleted file mode 100644 index 322365c790..0000000000 --- a/examples/models/nvidia-mnist/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -TRANSFORMER_IMAGE=seldonio/mnist-caffe2-transformer:0.1 - -clean: - rm -f rm -f tensorrt_mnist/1/model.plan - rm -rf MNIST_data - rm -f mnist.json - rm -f tmp.json - -build_transformer: - s2i build . seldonio/seldon-core-s2i-python3:1.2.3-dev ${TRANSFORMER_IMAGE} - -push_transformer: - docker push ${TRANSFORMER_IMAGE} - diff --git a/examples/models/nvidia-mnist/MnistTransformer.py b/examples/models/nvidia-mnist/MnistTransformer.py deleted file mode 100644 index 84b097a077..0000000000 --- a/examples/models/nvidia-mnist/MnistTransformer.py +++ /dev/null @@ -1,27 +0,0 @@ -import numpy as np - -MEANS=np.array([255.0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,254,253,252,252,251,251,252,252,253,254,254,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,253,251,249,248,245,243,242,242,243,246,248,251,253,254,255,255,255,255,255,255,255,255,255,255,255,254,253,250,247,242,235,228,220,213,210,211,216,224,232,240,246,251,253,254,255,255,255,255,255,255,255,255,254,251,248,242,234,223,211,196,181,170,164,166,175,189,205,221,233,243,248,252,254,255,255,255,255,255,255,254,252,248,241,231,217,202,184,166,149,136,131,134,143,159,180,201,220,234,243,249,253,255,255,255,255,255,254,253,249,243,233,219,201,181,161,143,130,122,120,122,129,141,161,185,208,227,240,248,252,254,255,255,255,255,254,251,246,238,226,208,187,164,146,135,131,132,133,132,133,139,154,178,202,223,239,248,252,255,255,255,255,254,253,251,245,236,221,200,177,156,144,144,150,156,156,151,144,144,156,178,202,224,240,249,253,255,255,255,255,254,253,251,245,235,218,195,172,155,152,161,172,176,170,161,150,149,161,183,207,227,242,250,254,255,255,255,255,255,254,251,246,234,215,191,168,156,160,173,182,179,169,157,147,149,166,190,213,230,243,251,254,255,255,255,255,255,254,252,246,233,212,186,165,157,164,175,176,165,153,142,137,147,170,196,217,231,242,251,255,255,255,255,255,255,254,252,245,230,207,182,163,158,164,168,158,143,131,125,128,146,174,200,218,231,241,250,254,255,255,255,255,255,255,252,243,227,205,181,164,159,161,157,139,124,115,118,127,148,176,199,216,230,240,249,254,255,255,255,255,255,254,251,241,224,204,184,169,163,160,150,132,119,116,123,133,153,177,197,214,228,240,249,254,255,255,255,255,255,254,251,239,222,205,189,177,171,166,154,139,129,128,134,144,159,177,195,213,228,241,249,254,255,255,255,255,255,254,249,237,222,207,195,186,180,175,166,153,143,140,142,150,162,178,195,214,230,242,250,254,255,255,255,255,255,253,247,235,220,207,197,189,183,179,172,160,148,142,143,150,161,178,198,217,233,244,250,254,255,255,255,255,255,253,246,233,218,204,192,184,177,172,165,153,142,137,139,148,163,183,204,222,236,246,251,254,255,255,255,255,255,253,247,234,218,201,186,174,165,157,148,137,130,129,137,151,171,194,214,230,242,248,252,254,255,255,255,255,255,253,249,238,222,203,184,168,154,143,132,124,123,130,145,165,188,209,227,239,247,251,253,255,255,255,255,255,255,254,251,244,232,214,194,174,156,142,132,130,134,148,167,189,210,226,238,246,250,253,254,255,255,255,255,255,255,255,253,250,243,231,215,196,178,163,155,156,164,179,197,215,230,240,247,251,253,254,255,255,255,255,255,255,255,255,254,253,251,246,238,228,217,208,203,204,210,218,228,236,243,248,251,253,254,255,255,255,255,255,255,255,255,255,255,255,254,252,249,245,241,238,237,237,239,242,245,247,250,252,253,254,255,255,255,255,255,255,255,255,255,255,255,255,254,254,253,252,250,249,248,249,249,250,252,253,253,254,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,254,254,255,255,255,255,255,255,255,255,255,255,255,255]) - - -class MnistTransformer(object): - - def __init__(self): - print("init"); - - def preProcessMNIST(self,X): - ''' - Convert values assumed to be in 0-1 range to a value in 0-255. - The remove the training mean needed by the Caffe2 model. - Finally reshape the output to that expected by the model - ''' - X = X * 255 - X = 255 - X - X = (X.reshape(784) - MEANS).reshape(28,28,1) - X = np.transpose(X, (2, 0, 1)) - return X - - def transform_input(self,X,names): - return self.preProcessMNIST(X) - - def transform_output(self,X,names): - return X.reshape(1,10) diff --git a/examples/models/nvidia-mnist/fetch-model.sh b/examples/models/nvidia-mnist/fetch-model.sh deleted file mode 100755 index 6b298153f6..0000000000 --- a/examples/models/nvidia-mnist/fetch-model.sh +++ /dev/null @@ -1 +0,0 @@ -wget -O mnist_tensorrt_model/1/model.plan http://seldon-public.s3.amazonaws.com/nvidia-mnist-model/model.plan diff --git a/examples/models/nvidia-mnist/nvidia-mnist/Chart.yaml b/examples/models/nvidia-mnist/nvidia-mnist/Chart.yaml deleted file mode 100644 index cc00617700..0000000000 --- a/examples/models/nvidia-mnist/nvidia-mnist/Chart.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v1 -description: Seldon MNIST Nvidia Inference Server Example -name: nvidia-mnist -sources: -- https://github.com/SeldonIO/seldon-core -version: 0.1 diff --git a/examples/models/nvidia-mnist/nvidia-mnist/templates/mnist_nvidia_deployment.json b/examples/models/nvidia-mnist/nvidia-mnist/templates/mnist_nvidia_deployment.json deleted file mode 100644 index 67c8ace491..0000000000 --- a/examples/models/nvidia-mnist/nvidia-mnist/templates/mnist_nvidia_deployment.json +++ /dev/null @@ -1,138 +0,0 @@ -{ - "apiVersion": "machinelearning.seldon.io/v1alpha2", - "kind": "SeldonDeployment", - "metadata": { - "labels": { - "app": "seldon" - }, - "name": "nvidia-mnist", - "namespace": "{{ .Release.Namespace }}" - }, - "spec": { - "name": "caffe2-mnist", - "predictors": [ - { - "componentSpecs": [{ - "spec": { - "containers": [ - { - "image": "seldonio/mnist-caffe2-transformer:0.1", - "name": "mnist-transformer" - }, - { - "image": "seldonio/nvidia-inference-server-proxy:0.1", - "name": "nvidia-proxy" - }, - { - "args": [ - "--model-store={{ .Values.nvidia.model_store }}" - ], - "env": [ - { - "name": "LD_LIBRARY_PATH", - "value" : "/opt/inference_server/lib:/usr/local/nvidia/lib:/usr/local/nvidia/lib64:/lib" - } - ], - "command": [ - "inference_server" - ], - "image": "nvcr.io/nvidia/inferenceserver:18.08.1-py2", - "livenessProbe": { - "failureThreshold": 3, - "httpGet": { - "path": "/api/health/live", - "port": "server", - "scheme": "HTTP" - }, - "initialDelaySeconds": 5, - "periodSeconds": 5, - "successThreshold": 1, - "timeoutSeconds": 1 - }, - "name": "inference-server", - "ports": [ - { - "name": "server", - "containerPort": {{ .Values.nvidia.port }}, - "protocol": "TCP" - }, - { - "containerPort": 8001, - "protocol": "TCP" - }, - { - "containerPort": 8002, - "protocol": "TCP" - } - ], - "readinessProbe": { - "failureThreshold": 3, - "httpGet": { - "path": "/api/health/ready", - "port": "server", - "scheme": "HTTP" - }, - "initialDelaySeconds": 5, - "periodSeconds": 5, - "successThreshold": 1, - "timeoutSeconds": 1 - }, - "resources": { - "limits": { - "nvidia.com/gpu": "1" - }, - "requests": { - "cpu": "100m", - "nvidia.com/gpu": "1" - } - }, - "securityContext": { - "runAsUser": 1000 - } - } - ], - "terminationGracePeriodSeconds": 1, - "imagePullSecrets": [ - { - "name": "ngc" - } - ] - } - }], - "graph": { - "name": "mnist-transformer", - "endpoint": { "type" : "REST" }, - "type": "TRANSFORMER", - "children": [ - { - "name": "nvidia-proxy", - "endpoint": { "type" : "REST" }, - "type": "MODEL", - "children": [], - "parameters": - [ - { - "name":"url", - "type":"STRING", - "value":"127.0.0.1:{{ .Values.nvidia.port }}" - }, - { - "name":"model_name", - "type":"STRING", - "value":"tensorrt_mnist" - }, - { - "name":"protocol", - "type":"STRING", - "value":"HTTP" - } - ] - } - ] - }, - "name": "mnist-nvidia", - "replicas": 1 - } - ] - } -} diff --git a/examples/models/nvidia-mnist/nvidia-mnist/values.yaml b/examples/models/nvidia-mnist/nvidia-mnist/values.yaml deleted file mode 100644 index adaff98e15..0000000000 --- a/examples/models/nvidia-mnist/nvidia-mnist/values.yaml +++ /dev/null @@ -1,4 +0,0 @@ -nvidia: - model_store: gs://seldon-inference-server-model-store - port: 8000 - diff --git a/examples/models/nvidia-mnist/nvidia_mnist.ipynb b/examples/models/nvidia-mnist/nvidia_mnist.ipynb deleted file mode 100644 index 3a8e2be92b..0000000000 --- a/examples/models/nvidia-mnist/nvidia_mnist.ipynb +++ /dev/null @@ -1,1164 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# NVIDIA Inference Server MNIST Example\n", - "\n", - "This example shows how you can combine Seldon with the NVIDIA Inference Server. We will use a Seldon TensorRT proxy model image that will forward Seldon internal microservice prediction calls out to an external TensorRT Inference Server.\n", - "\n", - "The example will use the MNIST digit classification task with a pre-trained CAFFE2 model.\n", - "\n", - "A Seldon transformer will transform the inputs before sending to the Proxy which will forward the request to the Nvidia Inference Server.\n", - "\n", - "This example will:\n", - "\n", - " * Show the packaging of the components using S2I and a step by step local testing of these via Docker\n", - " * Show running the example in Seldon Core on GCP with an embedded Nvidia Inference Server\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Setup" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "import requests\n", - "from random import randint,random\n", - "import json\n", - "from matplotlib import pyplot as plt\n", - "import numpy as np\n", - "from tensorflow.examples.tutorials.mnist import input_data\n", - "import sys\n", - "sys.path.append(\"../../../notebooks\")\n", - "from visualizer import get_graph" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [], - "source": [ - "def gen_image(arr):\n", - " two_d = (np.reshape(arr, (28, 28)) * 255).astype(np.uint8)\n", - " plt.imshow(two_d,cmap=plt.cm.gray_r, interpolation='nearest')\n", - " return plt\n", - "\n", - "def download_mnist():\n", - " return input_data.read_data_sets(\"MNIST_data/\", one_hot = True)\n", - "\n", - "def rest_predict_request(endpoint,data):\n", - " request = {\"data\":{\"ndarray\":data.tolist()}}\n", - " response = requests.post(\n", - " \"http://\"+endpoint+\"/predict\",\n", - " data={\"json\":json.dumps(request),\"isDefault\":True})\n", - " return response.json() \n", - "\n", - "def rest_transform_input_request(endpoint,data):\n", - " request = {\"data\":{\"ndarray\":data.tolist()}}\n", - " response = requests.post(\n", - " \"http://\"+endpoint+\"/transform-input\",\n", - " data={\"json\":json.dumps(request),\"isDefault\":True})\n", - " return response.json() \n", - "\n", - "def rest_transform_output_request(endpoint,data):\n", - " request = {\"data\":{\"ndarray\":data.tolist()}}\n", - " response = requests.post(\n", - " \"http://\"+endpoint+\"/transform-output\",\n", - " data={\"json\":json.dumps(request),\"isDefault\":True})\n", - " return response.json() \n", - "\n", - "def rest_request_ambassador(deploymentName,endpoint=\"localhost:8003\",arr=None):\n", - " payload = {\"data\":{\"names\":[\"a\",\"b\"],\"tensor\":{\"shape\":[1,784],\"values\":arr.tolist()}}}\n", - " response = requests.post(\n", - " \"http://\"+endpoint+\"/seldon/seldon/\"+deploymentName+\"/api/v0.1/predictions\",\n", - " json=payload)\n", - " print(response.status_code)\n", - " print(response.text)\n", - "\n", - "\n", - "def gen_mnist_data(mnist):\n", - " batch_xs, batch_ys = mnist.train.next_batch(1)\n", - " chosen=0\n", - " gen_image(batch_xs[chosen]).show()\n", - " data = batch_xs[chosen].reshape((1,784))\n", - " return data\n" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WARNING:tensorflow:From :7: read_data_sets (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n", - "Instructions for updating:\n", - "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n", - "WARNING:tensorflow:From /home/clive/anaconda3/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:260: maybe_download (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.\n", - "Instructions for updating:\n", - "Please write your own downloading logic.\n", - "WARNING:tensorflow:From /home/clive/anaconda3/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/base.py:252: _internal_retry..wrap..wrapped_fn (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.\n", - "Instructions for updating:\n", - "Please use urllib or similar directly.\n", - "Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.\n", - "WARNING:tensorflow:From /home/clive/anaconda3/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:262: extract_images (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n", - "Instructions for updating:\n", - "Please use tf.data to implement this functionality.\n", - "Extracting MNIST_data/train-images-idx3-ubyte.gz\n", - "Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.\n", - "WARNING:tensorflow:From /home/clive/anaconda3/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:267: extract_labels (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n", - "Instructions for updating:\n", - "Please use tf.data to implement this functionality.\n", - "Extracting MNIST_data/train-labels-idx1-ubyte.gz\n", - "WARNING:tensorflow:From /home/clive/anaconda3/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:110: dense_to_one_hot (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n", - "Instructions for updating:\n", - "Please use tf.one_hot on tensors.\n", - "Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.\n", - "Extracting MNIST_data/t10k-images-idx3-ubyte.gz\n", - "Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.\n", - "Extracting MNIST_data/t10k-labels-idx1-ubyte.gz\n", - "WARNING:tensorflow:From /home/clive/anaconda3/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:290: DataSet.__init__ (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n", - "Instructions for updating:\n", - "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n" - ] - } - ], - "source": [ - "mnist = download_mnist()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Create an Nvidia Model Repository" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Fetch pretrained MNIST model ready for serving and place in model repository" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "!mkdir -p tensorrt_mnist/1" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "--2019-04-16 18:35:23-- http://seldon-public.s3.amazonaws.com/nvidia-mnist-model/model.plan\n", - "Resolving seldon-public.s3.amazonaws.com (seldon-public.s3.amazonaws.com)... 52.218.49.89\n", - "Connecting to seldon-public.s3.amazonaws.com (seldon-public.s3.amazonaws.com)|52.218.49.89|:80... connected.\n", - "HTTP request sent, awaiting response... 200 OK\n", - "Length: 1731864 (1.7M) [binary/octet-stream]\n", - "Saving to: ‘tensorrt_mnist/1/model.plan’\n", - "\n", - "tensorrt_mnist/1/mo 100%[===================>] 1.65M 846KB/s in 2.0s \n", - "\n", - "2019-04-16 18:35:25 (846 KB/s) - ‘tensorrt_mnist/1/model.plan’ saved [1731864/1731864]\n", - "\n" - ] - } - ], - "source": [ - "!wget -O tensorrt_mnist/1/model.plan http://seldon-public.s3.amazonaws.com/nvidia-mnist-model/model.plan" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To run your Mvidia Inference Server you will need to upload to a google bucket the model repository in mnsit_tensorrt_model. Follow the steps below:" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "env: MODEL_REPOSITORY_BUCKET=gs://seldon-inference-server-model-store\n" - ] - } - ], - "source": [ - "# CHANGE THIS TO YOUR OWN CHOSEN GOOGLE BUCKET NAME\n", - "%env MODEL_REPOSITORY_BUCKET=gs://seldon-inference-server-model-store" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Creating gs://seldon-inference-server-model-store/...\n", - "ServiceException: 409 Bucket seldon-inference-server-model-store already exists.\n" - ] - } - ], - "source": [ - "!gsutil mb ${MODEL_REPOSITORY_BUCKET}" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Copying file://tensorrt_mnist/config.pbtxt [Content-Type=application/octet-stream]...\n", - "Copying file://tensorrt_mnist/mnist_labels.txt [Content-Type=text/plain]... \n", - "Copying file://tensorrt_mnist/1/model.plan [Content-Type=application/octet-stream]...\n", - "- [3 files][ 1.7 MiB/ 1.7 MiB] \n", - "Operation completed over 3 objects/1.7 MiB. \n" - ] - } - ], - "source": [ - "!gsutil cp -r tensorrt_mnist ${MODEL_REPOSITORY_BUCKET}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Create your Nvidia Inference Server\n", - "\n", - "For example:\n", - "\n", - " * Follow the steps in the [Kubeflow guide](https://www.kubeflow.org/docs/components/serving/tritoninferenceserver/) to create your Nvidia Inference Server \n", - " * You will need to use the Google Bucket location" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Package and run a Transformer and Nvidia Proxy" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We will use a Seldon Transformer to remove the training-set mean values from the input features and rehsape the output as the prediction comes back." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[34mimport\u001b[39;49;00m \u001b[04m\u001b[36mnumpy\u001b[39;49;00m \u001b[34mas\u001b[39;49;00m \u001b[04m\u001b[36mnp\u001b[39;49;00m\r\n", - "\r\n", - "MEANS=np.array([\u001b[34m255.0\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m253\u001b[39;49;00m,\u001b[34m252\u001b[39;49;00m,\u001b[34m252\u001b[39;49;00m,\u001b[34m251\u001b[39;49;00m,\u001b[34m251\u001b[39;49;00m,\u001b[34m252\u001b[39;49;00m,\u001b[34m252\u001b[39;49;00m,\u001b[34m253\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m253\u001b[39;49;00m,\u001b[34m251\u001b[39;49;00m,\u001b[34m249\u001b[39;49;00m,\u001b[34m248\u001b[39;49;00m,\u001b[34m245\u001b[39;49;00m,\u001b[34m243\u001b[39;49;00m,\u001b[34m242\u001b[39;49;00m,\u001b[34m242\u001b[39;49;00m,\u001b[34m243\u001b[39;49;00m,\u001b[34m246\u001b[39;49;00m,\u001b[34m248\u001b[39;49;00m,\u001b[34m251\u001b[39;49;00m,\u001b[34m253\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m253\u001b[39;49;00m,\u001b[34m250\u001b[39;49;00m,\u001b[34m247\u001b[39;49;00m,\u001b[34m242\u001b[39;49;00m,\u001b[34m235\u001b[39;49;00m,\u001b[34m228\u001b[39;49;00m,\u001b[34m220\u001b[39;49;00m,\u001b[34m213\u001b[39;49;00m,\u001b[34m210\u001b[39;49;00m,\u001b[34m211\u001b[39;49;00m,\u001b[34m216\u001b[39;49;00m,\u001b[34m224\u001b[39;49;00m,\u001b[34m232\u001b[39;49;00m,\u001b[34m240\u001b[39;49;00m,\u001b[34m246\u001b[39;49;00m,\u001b[34m251\u001b[39;49;00m,\u001b[34m253\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m251\u001b[39;49;00m,\u001b[34m248\u001b[39;49;00m,\u001b[34m242\u001b[39;49;00m,\u001b[34m234\u001b[39;49;00m,\u001b[34m223\u001b[39;49;00m,\u001b[34m211\u001b[39;49;00m,\u001b[34m196\u001b[39;49;00m,\u001b[34m181\u001b[39;49;00m,\u001b[34m170\u001b[39;49;00m,\u001b[34m164\u001b[39;49;00m,\u001b[34m166\u001b[39;49;00m,\u001b[34m175\u001b[39;49;00m,\u001b[34m189\u001b[39;49;00m,\u001b[34m205\u001b[39;49;00m,\u001b[34m221\u001b[39;49;00m,\u001b[34m233\u001b[39;49;00m,\u001b[34m243\u001b[39;49;00m,\u001b[34m248\u001b[39;49;00m,\u001b[34m252\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m252\u001b[39;49;00m,\u001b[34m248\u001b[39;49;00m,\u001b[34m241\u001b[39;49;00m,\u001b[34m231\u001b[39;49;00m,\u001b[34m217\u001b[39;49;00m,\u001b[34m202\u001b[39;49;00m,\u001b[34m184\u001b[39;49;00m,\u001b[34m166\u001b[39;49;00m,\u001b[34m149\u001b[39;49;00m,\u001b[34m136\u001b[39;49;00m,\u001b[34m131\u001b[39;49;00m,\u001b[34m134\u001b[39;49;00m,\u001b[34m143\u001b[39;49;00m,\u001b[34m159\u001b[39;49;00m,\u001b[34m180\u001b[39;49;00m,\u001b[34m201\u001b[39;49;00m,\u001b[34m220\u001b[39;49;00m,\u001b[34m234\u001b[39;49;00m,\u001b[34m243\u001b[39;49;00m,\u001b[34m249\u001b[39;49;00m,\u001b[34m253\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m253\u001b[39;49;00m,\u001b[34m249\u001b[39;49;00m,\u001b[34m243\u001b[39;49;00m,\u001b[34m233\u001b[39;49;00m,\u001b[34m219\u001b[39;49;00m,\u001b[34m201\u001b[39;49;00m,\u001b[34m181\u001b[39;49;00m,\u001b[34m161\u001b[39;49;00m,\u001b[34m143\u001b[39;49;00m,\u001b[34m130\u001b[39;49;00m,\u001b[34m122\u001b[39;49;00m,\u001b[34m120\u001b[39;49;00m,\u001b[34m122\u001b[39;49;00m,\u001b[34m129\u001b[39;49;00m,\u001b[34m141\u001b[39;49;00m,\u001b[34m161\u001b[39;49;00m,\u001b[34m185\u001b[39;49;00m,\u001b[34m208\u001b[39;49;00m,\u001b[34m227\u001b[39;49;00m,\u001b[34m240\u001b[39;49;00m,\u001b[34m248\u001b[39;49;00m,\u001b[34m252\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m251\u001b[39;49;00m,\u001b[34m246\u001b[39;49;00m,\u001b[34m238\u001b[39;49;00m,\u001b[34m226\u001b[39;49;00m,\u001b[34m208\u001b[39;49;00m,\u001b[34m187\u001b[39;49;00m,\u001b[34m164\u001b[39;49;00m,\u001b[34m146\u001b[39;49;00m,\u001b[34m135\u001b[39;49;00m,\u001b[34m131\u001b[39;49;00m,\u001b[34m132\u001b[39;49;00m,\u001b[34m133\u001b[39;49;00m,\u001b[34m132\u001b[39;49;00m,\u001b[34m133\u001b[39;49;00m,\u001b[34m139\u001b[39;49;00m,\u001b[34m154\u001b[39;49;00m,\u001b[34m178\u001b[39;49;00m,\u001b[34m202\u001b[39;49;00m,\u001b[34m223\u001b[39;49;00m,\u001b[34m239\u001b[39;49;00m,\u001b[34m248\u001b[39;49;00m,\u001b[34m252\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m253\u001b[39;49;00m,\u001b[34m251\u001b[39;49;00m,\u001b[34m245\u001b[39;49;00m,\u001b[34m236\u001b[39;49;00m,\u001b[34m221\u001b[39;49;00m,\u001b[34m200\u001b[39;49;00m,\u001b[34m177\u001b[39;49;00m,\u001b[34m156\u001b[39;49;00m,\u001b[34m144\u001b[39;49;00m,\u001b[34m144\u001b[39;49;00m,\u001b[34m150\u001b[39;49;00m,\u001b[34m156\u001b[39;49;00m,\u001b[34m156\u001b[39;49;00m,\u001b[34m151\u001b[39;49;00m,\u001b[34m144\u001b[39;49;00m,\u001b[34m144\u001b[39;49;00m,\u001b[34m156\u001b[39;49;00m,\u001b[34m178\u001b[39;49;00m,\u001b[34m202\u001b[39;49;00m,\u001b[34m224\u001b[39;49;00m,\u001b[34m240\u001b[39;49;00m,\u001b[34m249\u001b[39;49;00m,\u001b[34m253\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m253\u001b[39;49;00m,\u001b[34m251\u001b[39;49;00m,\u001b[34m245\u001b[39;49;00m,\u001b[34m235\u001b[39;49;00m,\u001b[34m218\u001b[39;49;00m,\u001b[34m195\u001b[39;49;00m,\u001b[34m172\u001b[39;49;00m,\u001b[34m155\u001b[39;49;00m,\u001b[34m152\u001b[39;49;00m,\u001b[34m161\u001b[39;49;00m,\u001b[34m172\u001b[39;49;00m,\u001b[34m176\u001b[39;49;00m,\u001b[34m170\u001b[39;49;00m,\u001b[34m161\u001b[39;49;00m,\u001b[34m150\u001b[39;49;00m,\u001b[34m149\u001b[39;49;00m,\u001b[34m161\u001b[39;49;00m,\u001b[34m183\u001b[39;49;00m,\u001b[34m207\u001b[39;49;00m,\u001b[34m227\u001b[39;49;00m,\u001b[34m242\u001b[39;49;00m,\u001b[34m250\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m251\u001b[39;49;00m,\u001b[34m246\u001b[39;49;00m,\u001b[34m234\u001b[39;49;00m,\u001b[34m215\u001b[39;49;00m,\u001b[34m191\u001b[39;49;00m,\u001b[34m168\u001b[39;49;00m,\u001b[34m156\u001b[39;49;00m,\u001b[34m160\u001b[39;49;00m,\u001b[34m173\u001b[39;49;00m,\u001b[34m182\u001b[39;49;00m,\u001b[34m179\u001b[39;49;00m,\u001b[34m169\u001b[39;49;00m,\u001b[34m157\u001b[39;49;00m,\u001b[34m147\u001b[39;49;00m,\u001b[34m149\u001b[39;49;00m,\u001b[34m166\u001b[39;49;00m,\u001b[34m190\u001b[39;49;00m,\u001b[34m213\u001b[39;49;00m,\u001b[34m230\u001b[39;49;00m,\u001b[34m243\u001b[39;49;00m,\u001b[34m251\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m252\u001b[39;49;00m,\u001b[34m246\u001b[39;49;00m,\u001b[34m233\u001b[39;49;00m,\u001b[34m212\u001b[39;49;00m,\u001b[34m186\u001b[39;49;00m,\u001b[34m165\u001b[39;49;00m,\u001b[34m157\u001b[39;49;00m,\u001b[34m164\u001b[39;49;00m,\u001b[34m175\u001b[39;49;00m,\u001b[34m176\u001b[39;49;00m,\u001b[34m165\u001b[39;49;00m,\u001b[34m153\u001b[39;49;00m,\u001b[34m142\u001b[39;49;00m,\u001b[34m137\u001b[39;49;00m,\u001b[34m147\u001b[39;49;00m,\u001b[34m170\u001b[39;49;00m,\u001b[34m196\u001b[39;49;00m,\u001b[34m217\u001b[39;49;00m,\u001b[34m231\u001b[39;49;00m,\u001b[34m242\u001b[39;49;00m,\u001b[34m251\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m252\u001b[39;49;00m,\u001b[34m245\u001b[39;49;00m,\u001b[34m230\u001b[39;49;00m,\u001b[34m207\u001b[39;49;00m,\u001b[34m182\u001b[39;49;00m,\u001b[34m163\u001b[39;49;00m,\u001b[34m158\u001b[39;49;00m,\u001b[34m164\u001b[39;49;00m,\u001b[34m168\u001b[39;49;00m,\u001b[34m158\u001b[39;49;00m,\u001b[34m143\u001b[39;49;00m,\u001b[34m131\u001b[39;49;00m,\u001b[34m125\u001b[39;49;00m,\u001b[34m128\u001b[39;49;00m,\u001b[34m146\u001b[39;49;00m,\u001b[34m174\u001b[39;49;00m,\u001b[34m200\u001b[39;49;00m,\u001b[34m218\u001b[39;49;00m,\u001b[34m231\u001b[39;49;00m,\u001b[34m241\u001b[39;49;00m,\u001b[34m250\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m252\u001b[39;49;00m,\u001b[34m243\u001b[39;49;00m,\u001b[34m227\u001b[39;49;00m,\u001b[34m205\u001b[39;49;00m,\u001b[34m181\u001b[39;49;00m,\u001b[34m164\u001b[39;49;00m,\u001b[34m159\u001b[39;49;00m,\u001b[34m161\u001b[39;49;00m,\u001b[34m157\u001b[39;49;00m,\u001b[34m139\u001b[39;49;00m,\u001b[34m124\u001b[39;49;00m,\u001b[34m115\u001b[39;49;00m,\u001b[34m118\u001b[39;49;00m,\u001b[34m127\u001b[39;49;00m,\u001b[34m148\u001b[39;49;00m,\u001b[34m176\u001b[39;49;00m,\u001b[34m199\u001b[39;49;00m,\u001b[34m216\u001b[39;49;00m,\u001b[34m230\u001b[39;49;00m,\u001b[34m240\u001b[39;49;00m,\u001b[34m249\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m251\u001b[39;49;00m,\u001b[34m241\u001b[39;49;00m,\u001b[34m224\u001b[39;49;00m,\u001b[34m204\u001b[39;49;00m,\u001b[34m184\u001b[39;49;00m,\u001b[34m169\u001b[39;49;00m,\u001b[34m163\u001b[39;49;00m,\u001b[34m160\u001b[39;49;00m,\u001b[34m150\u001b[39;49;00m,\u001b[34m132\u001b[39;49;00m,\u001b[34m119\u001b[39;49;00m,\u001b[34m116\u001b[39;49;00m,\u001b[34m123\u001b[39;49;00m,\u001b[34m133\u001b[39;49;00m,\u001b[34m153\u001b[39;49;00m,\u001b[34m177\u001b[39;49;00m,\u001b[34m197\u001b[39;49;00m,\u001b[34m214\u001b[39;49;00m,\u001b[34m228\u001b[39;49;00m,\u001b[34m240\u001b[39;49;00m,\u001b[34m249\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m251\u001b[39;49;00m,\u001b[34m239\u001b[39;49;00m,\u001b[34m222\u001b[39;49;00m,\u001b[34m205\u001b[39;49;00m,\u001b[34m189\u001b[39;49;00m,\u001b[34m177\u001b[39;49;00m,\u001b[34m171\u001b[39;49;00m,\u001b[34m166\u001b[39;49;00m,\u001b[34m154\u001b[39;49;00m,\u001b[34m139\u001b[39;49;00m,\u001b[34m129\u001b[39;49;00m,\u001b[34m128\u001b[39;49;00m,\u001b[34m134\u001b[39;49;00m,\u001b[34m144\u001b[39;49;00m,\u001b[34m159\u001b[39;49;00m,\u001b[34m177\u001b[39;49;00m,\u001b[34m195\u001b[39;49;00m,\u001b[34m213\u001b[39;49;00m,\u001b[34m228\u001b[39;49;00m,\u001b[34m241\u001b[39;49;00m,\u001b[34m249\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m249\u001b[39;49;00m,\u001b[34m237\u001b[39;49;00m,\u001b[34m222\u001b[39;49;00m,\u001b[34m207\u001b[39;49;00m,\u001b[34m195\u001b[39;49;00m,\u001b[34m186\u001b[39;49;00m,\u001b[34m180\u001b[39;49;00m,\u001b[34m175\u001b[39;49;00m,\u001b[34m166\u001b[39;49;00m,\u001b[34m153\u001b[39;49;00m,\u001b[34m143\u001b[39;49;00m,\u001b[34m140\u001b[39;49;00m,\u001b[34m142\u001b[39;49;00m,\u001b[34m150\u001b[39;49;00m,\u001b[34m162\u001b[39;49;00m,\u001b[34m178\u001b[39;49;00m,\u001b[34m195\u001b[39;49;00m,\u001b[34m214\u001b[39;49;00m,\u001b[34m230\u001b[39;49;00m,\u001b[34m242\u001b[39;49;00m,\u001b[34m250\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m253\u001b[39;49;00m,\u001b[34m247\u001b[39;49;00m,\u001b[34m235\u001b[39;49;00m,\u001b[34m220\u001b[39;49;00m,\u001b[34m207\u001b[39;49;00m,\u001b[34m197\u001b[39;49;00m,\u001b[34m189\u001b[39;49;00m,\u001b[34m183\u001b[39;49;00m,\u001b[34m179\u001b[39;49;00m,\u001b[34m172\u001b[39;49;00m,\u001b[34m160\u001b[39;49;00m,\u001b[34m148\u001b[39;49;00m,\u001b[34m142\u001b[39;49;00m,\u001b[34m143\u001b[39;49;00m,\u001b[34m150\u001b[39;49;00m,\u001b[34m161\u001b[39;49;00m,\u001b[34m178\u001b[39;49;00m,\u001b[34m198\u001b[39;49;00m,\u001b[34m217\u001b[39;49;00m,\u001b[34m233\u001b[39;49;00m,\u001b[34m244\u001b[39;49;00m,\u001b[34m250\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m253\u001b[39;49;00m,\u001b[34m246\u001b[39;49;00m,\u001b[34m233\u001b[39;49;00m,\u001b[34m218\u001b[39;49;00m,\u001b[34m204\u001b[39;49;00m,\u001b[34m192\u001b[39;49;00m,\u001b[34m184\u001b[39;49;00m,\u001b[34m177\u001b[39;49;00m,\u001b[34m172\u001b[39;49;00m,\u001b[34m165\u001b[39;49;00m,\u001b[34m153\u001b[39;49;00m,\u001b[34m142\u001b[39;49;00m,\u001b[34m137\u001b[39;49;00m,\u001b[34m139\u001b[39;49;00m,\u001b[34m148\u001b[39;49;00m,\u001b[34m163\u001b[39;49;00m,\u001b[34m183\u001b[39;49;00m,\u001b[34m204\u001b[39;49;00m,\u001b[34m222\u001b[39;49;00m,\u001b[34m236\u001b[39;49;00m,\u001b[34m246\u001b[39;49;00m,\u001b[34m251\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m253\u001b[39;49;00m,\u001b[34m247\u001b[39;49;00m,\u001b[34m234\u001b[39;49;00m,\u001b[34m218\u001b[39;49;00m,\u001b[34m201\u001b[39;49;00m,\u001b[34m186\u001b[39;49;00m,\u001b[34m174\u001b[39;49;00m,\u001b[34m165\u001b[39;49;00m,\u001b[34m157\u001b[39;49;00m,\u001b[34m148\u001b[39;49;00m,\u001b[34m137\u001b[39;49;00m,\u001b[34m130\u001b[39;49;00m,\u001b[34m129\u001b[39;49;00m,\u001b[34m137\u001b[39;49;00m,\u001b[34m151\u001b[39;49;00m,\u001b[34m171\u001b[39;49;00m,\u001b[34m194\u001b[39;49;00m,\u001b[34m214\u001b[39;49;00m,\u001b[34m230\u001b[39;49;00m,\u001b[34m242\u001b[39;49;00m,\u001b[34m248\u001b[39;49;00m,\u001b[34m252\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m253\u001b[39;49;00m,\u001b[34m249\u001b[39;49;00m,\u001b[34m238\u001b[39;49;00m,\u001b[34m222\u001b[39;49;00m,\u001b[34m203\u001b[39;49;00m,\u001b[34m184\u001b[39;49;00m,\u001b[34m168\u001b[39;49;00m,\u001b[34m154\u001b[39;49;00m,\u001b[34m143\u001b[39;49;00m,\u001b[34m132\u001b[39;49;00m,\u001b[34m124\u001b[39;49;00m,\u001b[34m123\u001b[39;49;00m,\u001b[34m130\u001b[39;49;00m,\u001b[34m145\u001b[39;49;00m,\u001b[34m165\u001b[39;49;00m,\u001b[34m188\u001b[39;49;00m,\u001b[34m209\u001b[39;49;00m,\u001b[34m227\u001b[39;49;00m,\u001b[34m239\u001b[39;49;00m,\u001b[34m247\u001b[39;49;00m,\u001b[34m251\u001b[39;49;00m,\u001b[34m253\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m251\u001b[39;49;00m,\u001b[34m244\u001b[39;49;00m,\u001b[34m232\u001b[39;49;00m,\u001b[34m214\u001b[39;49;00m,\u001b[34m194\u001b[39;49;00m,\u001b[34m174\u001b[39;49;00m,\u001b[34m156\u001b[39;49;00m,\u001b[34m142\u001b[39;49;00m,\u001b[34m132\u001b[39;49;00m,\u001b[34m130\u001b[39;49;00m,\u001b[34m134\u001b[39;49;00m,\u001b[34m148\u001b[39;49;00m,\u001b[34m167\u001b[39;49;00m,\u001b[34m189\u001b[39;49;00m,\u001b[34m210\u001b[39;49;00m,\u001b[34m226\u001b[39;49;00m,\u001b[34m238\u001b[39;49;00m,\u001b[34m246\u001b[39;49;00m,\u001b[34m250\u001b[39;49;00m,\u001b[34m253\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m253\u001b[39;49;00m,\u001b[34m250\u001b[39;49;00m,\u001b[34m243\u001b[39;49;00m,\u001b[34m231\u001b[39;49;00m,\u001b[34m215\u001b[39;49;00m,\u001b[34m196\u001b[39;49;00m,\u001b[34m178\u001b[39;49;00m,\u001b[34m163\u001b[39;49;00m,\u001b[34m155\u001b[39;49;00m,\u001b[34m156\u001b[39;49;00m,\u001b[34m164\u001b[39;49;00m,\u001b[34m179\u001b[39;49;00m,\u001b[34m197\u001b[39;49;00m,\u001b[34m215\u001b[39;49;00m,\u001b[34m230\u001b[39;49;00m,\u001b[34m240\u001b[39;49;00m,\u001b[34m247\u001b[39;49;00m,\u001b[34m251\u001b[39;49;00m,\u001b[34m253\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m253\u001b[39;49;00m,\u001b[34m251\u001b[39;49;00m,\u001b[34m246\u001b[39;49;00m,\u001b[34m238\u001b[39;49;00m,\u001b[34m228\u001b[39;49;00m,\u001b[34m217\u001b[39;49;00m,\u001b[34m208\u001b[39;49;00m,\u001b[34m203\u001b[39;49;00m,\u001b[34m204\u001b[39;49;00m,\u001b[34m210\u001b[39;49;00m,\u001b[34m218\u001b[39;49;00m,\u001b[34m228\u001b[39;49;00m,\u001b[34m236\u001b[39;49;00m,\u001b[34m243\u001b[39;49;00m,\u001b[34m248\u001b[39;49;00m,\u001b[34m251\u001b[39;49;00m,\u001b[34m253\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m252\u001b[39;49;00m,\u001b[34m249\u001b[39;49;00m,\u001b[34m245\u001b[39;49;00m,\u001b[34m241\u001b[39;49;00m,\u001b[34m238\u001b[39;49;00m,\u001b[34m237\u001b[39;49;00m,\u001b[34m237\u001b[39;49;00m,\u001b[34m239\u001b[39;49;00m,\u001b[34m242\u001b[39;49;00m,\u001b[34m245\u001b[39;49;00m,\u001b[34m247\u001b[39;49;00m,\u001b[34m250\u001b[39;49;00m,\u001b[34m252\u001b[39;49;00m,\u001b[34m253\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m253\u001b[39;49;00m,\u001b[34m252\u001b[39;49;00m,\u001b[34m250\u001b[39;49;00m,\u001b[34m249\u001b[39;49;00m,\u001b[34m248\u001b[39;49;00m,\u001b[34m249\u001b[39;49;00m,\u001b[34m249\u001b[39;49;00m,\u001b[34m250\u001b[39;49;00m,\u001b[34m252\u001b[39;49;00m,\u001b[34m253\u001b[39;49;00m,\u001b[34m253\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m254\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m,\u001b[34m255\u001b[39;49;00m])\r\n", - "\r\n", - "\r\n", - "\u001b[34mclass\u001b[39;49;00m \u001b[04m\u001b[32mMnistTransformer\u001b[39;49;00m(\u001b[36mobject\u001b[39;49;00m):\r\n", - "\r\n", - " \u001b[34mdef\u001b[39;49;00m \u001b[32m__init__\u001b[39;49;00m(\u001b[36mself\u001b[39;49;00m):\r\n", - " \u001b[34mprint\u001b[39;49;00m(\u001b[33m\"\u001b[39;49;00m\u001b[33minit\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m);\r\n", - " \r\n", - " \u001b[34mdef\u001b[39;49;00m \u001b[32mpreProcessMNIST\u001b[39;49;00m(\u001b[36mself\u001b[39;49;00m,X):\r\n", - " \u001b[33m'''\u001b[39;49;00m\r\n", - "\u001b[33m Convert values assumed to be in 0-1 range to a value in 0-255.\u001b[39;49;00m\r\n", - "\u001b[33m The remove the training mean needed by the Caffe2 model.\u001b[39;49;00m\r\n", - "\u001b[33m Finally reshape the output to that expected by the model\u001b[39;49;00m\r\n", - "\u001b[33m '''\u001b[39;49;00m\r\n", - " X = X * \u001b[34m255\u001b[39;49;00m\r\n", - " X = \u001b[34m255\u001b[39;49;00m - X\r\n", - " X = (X.reshape(\u001b[34m784\u001b[39;49;00m) - MEANS).reshape(\u001b[34m28\u001b[39;49;00m,\u001b[34m28\u001b[39;49;00m,\u001b[34m1\u001b[39;49;00m)\r\n", - " X = np.transpose(X, (\u001b[34m2\u001b[39;49;00m, \u001b[34m0\u001b[39;49;00m, \u001b[34m1\u001b[39;49;00m))\r\n", - " \u001b[34mreturn\u001b[39;49;00m X\r\n", - "\r\n", - " \u001b[34mdef\u001b[39;49;00m \u001b[32mtransform_input\u001b[39;49;00m(\u001b[36mself\u001b[39;49;00m,X,names):\r\n", - " \u001b[34mreturn\u001b[39;49;00m \u001b[36mself\u001b[39;49;00m.preProcessMNIST(X)\r\n", - "\r\n", - " \u001b[34mdef\u001b[39;49;00m \u001b[32mtransform_output\u001b[39;49;00m(\u001b[36mself\u001b[39;49;00m,X,names):\r\n", - " \u001b[34mreturn\u001b[39;49;00m X.reshape(\u001b[34m1\u001b[39;49;00m,\u001b[34m10\u001b[39;49;00m)\r\n" - ] - } - ], - "source": [ - "!pygmentize MnistTransformer.py" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "---> Installing application source...\n", - "Build completed successfully\n" - ] - } - ], - "source": [ - "!s2i build . seldonio/seldon-core-s2i-python3:1.2.3-dev mnist-caffe2-transformer:0.1" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "f2ce59df93344847d070d4218d6bccb5a7d1dab48120967a2e213435a69dce9c\r\n" - ] - } - ], - "source": [ - "!docker run --name \"mnist-transformer\" -d --rm -p 5000:5000 mnist-caffe2-transformer:0.1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Run the Seldon Nvidia Inference Server Proxy Model.\n", - "\n", - "** CHANGE THE IP ADDRESS BELOW TO THAT OF YOUR RUNNING NVIDIA SERVER **" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3bcca7450fadcbb8d54f90af0b40c32f26b875938b742451a4365ced0c5d3ccf\r\n" - ] - } - ], - "source": [ - "!docker run --name \"tensorrt-proxy\" -d --rm -p 5001:5001 \\\n", - " -e PREDICTIVE_UNIT_SERVICE_PORT=5001 \\\n", - " -e PREDICTIVE_UNIT_PARAMETERS='[{\"name\":\"url\",\"type\":\"STRING\",\"value\":\"35.204.115.6:8000\"},{\"name\":\"model_name\",\"type\":\"STRING\",\"value\":\"tensorrt_mnist\"},{\"name\":\"protocol\",\"type\":\"STRING\",\"value\":\"HTTP\"}]' \\\n", - " seldonio/nvidia-inference-server-proxy:0.1" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "TRANSFORMER_URL=\"localhost:5000\"\n", - "PREDICTOR_URL=\"localhost:5001\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the next few steps we illustrate each step by step process and test that out on our running Docker containers." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP8AAAD8CAYAAAC4nHJkAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAC7dJREFUeJzt3V2IXIUZxvHnqdUb9ULJaBeNXRukKEKTMATBUiwS0SLEDxQDKRGC8UJRwYtKEBKQgpSq9aIKsVncgB8V1JoLaRUNWKGE3Yj40dgqstFtQjLBinolJm8v9kTWuDM7O3M+Jn3/P5CZOefszMvgf8/MnMkeR4QA5PODpgcA0AziB5IifiAp4geSIn4gKeIHkiJ+ICniB5IifiCpH9b5YMuWLYvx8fE6HxJIZWZmRkeOHHE/2w4Vv+2rJT0q6RRJf4qIB3ttPz4+runp6WEeEkAP7Xa7720Hftlv+xRJf5R0jaRLJK23fcmg9wegXsO8518j6aOI+Dgivpb0rKR15YwFoGrDxH+epE/n3Z4tln2H7c22p21PdzqdIR4OQJmGiX+hDxW+9++DI2J7RLQjot1qtYZ4OABlGib+WUnL590+X9KB4cYBUJdh4p+SdJHtC22fJukWSbvKGQtA1QY+1BcR39i+U9LfNHeobyIi3i9tMgCVGuo4f0S8LOnlkmYBUCO+3gskRfxAUsQPJEX8QFLEDyRF/EBSxA8kRfxAUsQPJEX8QFLEDyRF/EBSxA8kRfxAUsQPJEX8QFLEDyRF/EBSxA8kRfxAUsQPJEX8QFLEDyRF/EBSxA8kRfxAUsQPJEX8QFLEDyQ11Fl6bc9I+lLSUUnfRES7jKFQn1tvvbXn+snJyZ7rH3jggZ7r77///qWOhJoMFX/hlxFxpIT7AVAjXvYDSQ0bf0h6xfZe25vLGAhAPYZ92X95RBywfY6kV21/EBFvzN+g+KWwWZIuuOCCIR8OQFmG2vNHxIHi8rCkFyWtWWCb7RHRjoh2q9Ua5uEAlGjg+G2fbvvM49clXSXpvbIGA1CtYV72nyvpRdvH7+fpiPhrKVMBqNzA8UfEx5J+VuIsGEHFL/euduzY0XP9pk2buq4bGxsbaCaUg0N9QFLEDyRF/EBSxA8kRfxAUsQPJFXGv+pDYvv37++5/vPPP++6jkN9zWLPDyRF/EBSxA8kRfxAUsQPJEX8QFLEDyRF/EBSxA8kRfxAUsQPJEX8QFLEDyRF/EBSxA8kRfxAUsQPJEX8QFLEDyRF/EBSxA8kRfxAUsQPJLXo3+23PSHpWkmHI+LSYtnZkv4saVzSjKSbI+K/1Y2Jqqxatarn+p07dw51/3v37u267uKLLx7qvjGcfvb8T0q6+oRl90l6LSIukvRacRvASWTR+CPiDUmfnbB4naTJ4vqkpOtKngtAxQZ9z39uRByUpOLynPJGAlCHyj/ws73Z9rTt6U6nU/XDAejToPEfsj0mScXl4W4bRsT2iGhHRLvVag34cADKNmj8uyRtLK5vlPRSOeMAqMui8dt+RtI/JP3U9qztTZIelLTW9oeS1ha3AZxEFj3OHxHru6y6suRZ0IC1a9dWev+vv/5613UbNmyo9LHRG9/wA5IifiAp4geSIn4gKeIHkiJ+ICniB5IifiAp4geSIn4gKeIHkiJ+ICniB5IifiAp4geSIn4gKeIHkiJ+ICniB5IifiAp4geSIn4gqUX/dDf+v83OzlZ6/zfccEOl94/BsecHkiJ+ICniB5IifiAp4geSIn4gKeIHklr0OL/tCUnXSjocEZcWy7ZJuk1Sp9hsS0S8XNWQqM6ePXsqvf8VK1ZUev8YXD97/iclXb3A8kciYmXxH+EDJ5lF44+INyR9VsMsAGo0zHv+O22/Y3vC9lmlTQSgFoPG/7ikFZJWSjoo6aFuG9rebHva9nSn0+m2GYCaDRR/RByKiKMRcUzSE5LW9Nh2e0S0I6LdarUGnRNAyQaK3/bYvJvXS3qvnHEA1KWfQ33PSLpC0jLbs5K2SrrC9kpJIWlG0u0VzgigAovGHxHrF1i8o4JZ0IAbb7yx5/qtW7fWNAnqxjf8gKSIH0iK+IGkiB9IiviBpIgfSIo/3Z3c1NRU0yOgIez5gaSIH0iK+IGkiB9IiviBpIgfSIr4gaQ4zp/c7t27mx4BDWHPDyRF/EBSxA8kRfxAUsQPJEX8QFLEDyRF/EBSxA8kRfxAUsQPJEX8QFLEDyRF/EBSxA8ktWj8tpfb3m17n+33bd9dLD/b9qu2Pywuz6p+XABl6WfP/42keyPiYkmXSbrD9iWS7pP0WkRcJOm14jaAk8Si8UfEwYh4q7j+paR9ks6TtE7SZLHZpKTrqhoSQPmW9J7f9rikVZL2SDo3Ig5Kc78gJJ1T9nAAqtN3/LbPkPS8pHsi4osl/Nxm29O2pzudziAzAqhAX/HbPlVz4T8VES8Uiw/ZHivWj0k6vNDPRsT2iGhHRLvVapUxM4AS9PNpvyXtkLQvIh6et2qXpI3F9Y2SXip/PABV6edPd18u6deS3rX9drFsi6QHJT1ne5OkTyTdVM2IGGWXXXZZz/XLly+vaRIs1aLxR8Sbktxl9ZXljgOgLnzDD0iK+IGkiB9IiviBpIgfSIr4gaQ4RTeGcvTo0Z7rP/jgg67r2u122eNgCdjzA0kRP5AU8QNJET+QFPEDSRE/kBTxA0lxnB9DmZqa6rn+scce67puYmKi7HGwBOz5gaSIH0iK+IGkiB9IiviBpIgfSIr4gaQ4zp/cXXfd1XP9zp07e67fsGFDz/Xbtm1b6kioCXt+ICniB5IifiAp4geSIn4gKeIHkiJ+IKlFj/PbXi5pp6QfSTomaXtEPGp7m6TbJHWKTbdExMtVDYpqrF69uuf6Y8eO1TQJ6tbPl3y+kXRvRLxl+0xJe22/Wqx7JCJ+X914AKqyaPwRcVDSweL6l7b3STqv6sEAVGtJ7/ltj0taJWlPsehO2+/YnrB9Vpef2Wx72vZ0p9NZaBMADeg7fttnSHpe0j0R8YWkxyWtkLRSc68MHlro5yJie0S0I6LdarVKGBlAGfqK3/apmgv/qYh4QZIi4lBEHI2IY5KekLSmujEBlG3R+G1b0g5J+yLi4XnLx+Ztdr2k98ofD0BV+vm0/3JJv5b0ru23i2VbJK23vVJSSJqRdHslEwKoRD+f9r8pyQus4pg+cBLjG35AUsQPJEX8QFLEDyRF/EBSxA8kRfxAUsQPJEX8QFLEDyRF/EBSxA8kRfxAUsQPJOWIqO/B7I6k/fMWLZN0pLYBlmZUZxvVuSRmG1SZs/04Ivr6e3m1xv+9B7enI6Ld2AA9jOpsozqXxGyDamo2XvYDSRE/kFTT8W9v+PF7GdXZRnUuidkG1chsjb7nB9Ccpvf8ABrSSPy2r7b9L9sf2b6viRm6sT1j+13bb9uebniWCduHbb83b9nZtl+1/WFxueBp0hqabZvt/xTP3du2f9XQbMtt77a9z/b7tu8uljf63PWYq5HnrfaX/bZPkfRvSWslzUqakrQ+Iv5Z6yBd2J6R1I6Ixo8J2/6FpK8k7YyIS4tlv5P0WUQ8WPziPCsifjMis22T9FXTZ24uTigzNv/M0pKuk3SrGnzuesx1sxp43prY86+R9FFEfBwRX0t6VtK6BuYYeRHxhqTPTli8TtJkcX1Sc//z1K7LbCMhIg5GxFvF9S8lHT+zdKPPXY+5GtFE/OdJ+nTe7VmN1im/Q9Irtvfa3tz0MAs4tzht+vHTp5/T8DwnWvTMzXU64czSI/PcDXLG67I1Ef9CZ/8ZpUMOl0fEaknXSLqjeHmL/vR15ua6LHBm6ZEw6Bmvy9ZE/LOSls+7fb6kAw3MsaCIOFBcHpb0okbv7MOHjp8ktbg83PA83xqlMzcvdGZpjcBzN0pnvG4i/ilJF9m+0PZpkm6RtKuBOb7H9unFBzGyfbqkqzR6Zx/eJWljcX2jpJcanOU7RuXMzd3OLK2Gn7tRO+N1I1/yKQ5l/EHSKZImIuK3tQ+xANs/0dzeXpo7ienTTc5m+xlJV2juX30dkrRV0l8kPSfpAkmfSLopImr/4K3LbFdo7qXrt2duPv4eu+bZfi7p75LelXSsWLxFc++vG3vuesy1Xg08b3zDD0iKb/gBSRE/kBTxA0kRP5AU8QNJET+QFPEDSRE/kNT/AHPCTzzFq9UKAAAAAElFTkSuQmCC\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(1, 28, 28)\n" - ] - } - ], - "source": [ - "data = gen_mnist_data(mnist)\n", - "response = rest_transform_input_request(TRANSFORMER_URL,data)\n", - "transformed = np.array(response['data']['ndarray'])\n", - "print(transformed.shape)" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[[[6.36274109e-08]]\n", - "\n", - " [[9.99982357e-01]]\n", - "\n", - " [[1.35594092e-07]]\n", - "\n", - " [[2.00526298e-08]]\n", - "\n", - " [[1.17960089e-05]]\n", - "\n", - " [[8.07224509e-08]]\n", - "\n", - " [[4.73712625e-08]]\n", - "\n", - " [[4.78241873e-06]]\n", - "\n", - " [[6.21992911e-07]]\n", - "\n", - " [[9.71163061e-08]]]]\n" - ] - } - ], - "source": [ - "response = rest_predict_request(PREDICTOR_URL,transformed)\n", - "predictions = np.array(response[\"data\"][\"ndarray\"])\n", - "print(predictions)" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'data': {'names': None, 'ndarray': [[6.362741089560586e-08, 0.9999823570251465, 1.3559409239860543e-07, 2.005262977888833e-08, 1.1796008948294912e-05, 8.072245094581376e-08, 4.737126246823209e-08, 4.782418727700133e-06, 6.219929105100164e-07, 9.711630610809152e-08]]}}\n" - ] - } - ], - "source": [ - "response = rest_transform_output_request(TRANSFORMER_URL,predictions)\n", - "print(response)" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "mnist-transformer\n", - "tensorrt-proxy\n" - ] - } - ], - "source": [ - "!docker rm -f mnist-transformer\n", - "!docker rm -f tensorrt-proxy" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Test From GCP Cluster" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Set up GCP Kubernetes Cluster\n", - "\n", - "To run the steps below you will need to:\n", - "\n", - " 1. Create a GCP Cluster with a GPU node pool with Nvidia V100 GPUs\n", - " 2. Enable CUDA on the GPU nodes\n", - " 3. Add an Image Pull Secret so you can download the Nvidia Inference Server \n", - " \n", - "#### Create a GCP Cluster\n", - " This can be done from the Google console or via the command line as shown below. Change the cluster name and zones as appropriate for your setup.\n", - "\n", - "```\n", - " gcloud container clusters create myinferenceserver --num-nodes=2 --region=europe-west4-a\n", - " gcloud config set container/cluster myinferenceserver\n", - " gcloud container node-pools create gpu-pool --num-nodes=1 --machine-type=n1-standard-8 --accelerator type=nvidia-tesla-v100,count=1 --region=europe-west4-a\n", - " gcloud container clusters get-credentials myinferenceserver\n", - "```\n", - "\n", - "#### Enable CUDA on GPU Nodes\n", - "\n", - "To enable the CUDA drivers on your GPU nodes run:\n", - "\n", - "```\n", - "kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/stable/nvidia-driver-installer/cos/daemonset-preloaded.yaml\n", - "```\n", - "\n", - "#### Create Image Pull Secret for the Nvidia Repository\n", - "\n", - " * [Sign up to the NVIDIA GPU Cloud and get an API Key](https://ngc.nvidia.com/signup)\n", - " * Create a kubernetes secret\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "namespace/seldon created\r\n" - ] - } - ], - "source": [ - "!kubectl create namespace seldon" - ] - }, - { - "cell_type": "raw", - "metadata": {}, - "source": [ - "%env NVIDIA_API_KEY=\n", - "%env NVIDIA_CLOUD_EMAIL=" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Context \"gke_seldon-demos_europe-west4-a_myinferenceserver\" modified.\r\n" - ] - } - ], - "source": [ - "!kubectl config set-context $(kubectl config current-context) --namespace=seldon" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "secret/ngc created\r\n" - ] - } - ], - "source": [ - "!kubectl create secret docker-registry ngc \\\n", - " --docker-server=nvcr.io \\\n", - " --docker-username=\\$oauthtoken \\\n", - " --docker-password=${NVIDIA_API_KEY} --docker-email=${NVIDIA_CLOUD_EMAIL}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Run MNIST Inference Graph" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Setup Seldon Core\n", - "\n", - "Use the setup notebook to [Setup Cluster](../../../notebooks/seldon_core_setup.ipynb#Setup-Cluster) with [Ambassador Ingress](../../../notebooks/seldon_core_setup.ipynb#Ambassador) and [Install Seldon Core](../../seldon_core_setup.ipynb#Install-Seldon-Core). Instructions [also online](./seldon_core_setup.html)." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "NAME: nvidia-mnist\r\n", - "LAST DEPLOYED: Wed Dec 4 10:31:29 2019\r\n", - "NAMESPACE: default\r\n", - "STATUS: deployed\r\n", - "REVISION: 1\r\n", - "TEST SUITE: None\r\n" - ] - } - ], - "source": [ - "!helm install nvidia-mnist nvidia-mnist --set tfserving.model_base_path=${MODEL_REPOSITORY_BUCKET}" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "!helm template nvidia-mnist nvidia-mnist --namespace seldon --set tfserving.model_base_path=${MODEL_REPOSITORY_BUCKET} > mnist.json" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "!sed '1,2d' mnist.json > tmp.json" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "%3\n", - "\n", - "cluster_0\n", - "\n", - "predictor-0\n", - "\n", - "\n", - "mnist-transformer0\n", - "\n", - "mnist-transformer\n", - "\n", - "\n", - "mnist-transformer0endpoint\n", - "\n", - "REST\n", - "\n", - "\n", - "mnist-transformer0->mnist-transformer0endpoint\n", - "\n", - "\n", - "\n", - "\n", - "nvidia-proxy\n", - "\n", - "nvidia-proxy\n", - "\n", - "\n", - "mnist-transformer0->nvidia-proxy\n", - "\n", - "\n", - "\n", - "\n", - "nvidia-proxyendpoint\n", - "\n", - "REST\n", - "\n", - "\n", - "nvidia-proxy->nvidia-proxyendpoint\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "get_graph(\"tmp.json\")" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[04m\u001b[31;01m-\u001b[39;49;00m\u001b[04m\u001b[31;01m-\u001b[39;49;00m\u001b[04m\u001b[31;01m-\u001b[39;49;00m\r\n", - "\u001b[04m\u001b[31;01m#\u001b[39;49;00m \u001b[04m\u001b[31;01mS\u001b[39;49;00m\u001b[04m\u001b[31;01mo\u001b[39;49;00m\u001b[04m\u001b[31;01mu\u001b[39;49;00m\u001b[04m\u001b[31;01mr\u001b[39;49;00m\u001b[04m\u001b[31;01mc\u001b[39;49;00m\u001b[04m\u001b[31;01me\u001b[39;49;00m\u001b[04m\u001b[31;01m:\u001b[39;49;00m \u001b[04m\u001b[31;01mn\u001b[39;49;00m\u001b[04m\u001b[31;01mv\u001b[39;49;00m\u001b[04m\u001b[31;01mi\u001b[39;49;00m\u001b[04m\u001b[31;01md\u001b[39;49;00m\u001b[04m\u001b[31;01mi\u001b[39;49;00m\u001b[04m\u001b[31;01ma\u001b[39;49;00m\u001b[04m\u001b[31;01m-\u001b[39;49;00m\u001b[04m\u001b[31;01mm\u001b[39;49;00m\u001b[04m\u001b[31;01mn\u001b[39;49;00m\u001b[04m\u001b[31;01mi\u001b[39;49;00m\u001b[04m\u001b[31;01ms\u001b[39;49;00m\u001b[04m\u001b[31;01mt\u001b[39;49;00m\u001b[04m\u001b[31;01m/\u001b[39;49;00m\u001b[04m\u001b[31;01mt\u001b[39;49;00m\u001b[04m\u001b[31;01me\u001b[39;49;00m\u001b[04m\u001b[31;01mm\u001b[39;49;00m\u001b[04m\u001b[31;01mp\u001b[39;49;00m\u001b[04m\u001b[31;01ml\u001b[39;49;00m\u001b[04m\u001b[31;01ma\u001b[39;49;00m\u001b[04m\u001b[31;01mt\u001b[39;49;00m\u001b[04m\u001b[31;01me\u001b[39;49;00m\u001b[04m\u001b[31;01ms\u001b[39;49;00m\u001b[04m\u001b[31;01m/\u001b[39;49;00m\u001b[04m\u001b[31;01mm\u001b[39;49;00m\u001b[04m\u001b[31;01mn\u001b[39;49;00m\u001b[04m\u001b[31;01mi\u001b[39;49;00m\u001b[04m\u001b[31;01ms\u001b[39;49;00m\u001b[04m\u001b[31;01mt\u001b[39;49;00m\u001b[04m\u001b[31;01m_\u001b[39;49;00m\u001b[04m\u001b[31;01mn\u001b[39;49;00m\u001b[04m\u001b[31;01mv\u001b[39;49;00m\u001b[04m\u001b[31;01mi\u001b[39;49;00m\u001b[04m\u001b[31;01md\u001b[39;49;00m\u001b[04m\u001b[31;01mi\u001b[39;49;00m\u001b[04m\u001b[31;01ma\u001b[39;49;00m\u001b[04m\u001b[31;01m_\u001b[39;49;00m\u001b[04m\u001b[31;01md\u001b[39;49;00m\u001b[04m\u001b[31;01me\u001b[39;49;00m\u001b[04m\u001b[31;01mp\u001b[39;49;00m\u001b[04m\u001b[31;01ml\u001b[39;49;00m\u001b[04m\u001b[31;01mo\u001b[39;49;00m\u001b[04m\u001b[31;01my\u001b[39;49;00m\u001b[04m\u001b[31;01mm\u001b[39;49;00m\u001b[04m\u001b[31;01me\u001b[39;49;00m\u001b[04m\u001b[31;01mn\u001b[39;49;00m\u001b[04m\u001b[31;01mt\u001b[39;49;00m\u001b[04m\u001b[31;01m.\u001b[39;49;00m\u001b[04m\u001b[31;01mj\u001b[39;49;00m\u001b[04m\u001b[31;01ms\u001b[39;49;00m\u001b[04m\u001b[31;01mo\u001b[39;49;00m\u001b[04m\u001b[31;01mn\u001b[39;49;00m\r\n", - "{\r\n", - " \u001b[34;01m\"apiVersion\"\u001b[39;49;00m: \u001b[33m\"machinelearning.seldon.io/v1alpha2\"\u001b[39;49;00m,\r\n", - " \u001b[34;01m\"kind\"\u001b[39;49;00m: \u001b[33m\"SeldonDeployment\"\u001b[39;49;00m,\r\n", - " \u001b[34;01m\"metadata\"\u001b[39;49;00m: {\r\n", - " \u001b[34;01m\"labels\"\u001b[39;49;00m: {\r\n", - " \u001b[34;01m\"app\"\u001b[39;49;00m: \u001b[33m\"seldon\"\u001b[39;49;00m\r\n", - " },\r\n", - " \u001b[34;01m\"name\"\u001b[39;49;00m: \u001b[33m\"nvidia-mnist\"\u001b[39;49;00m,\r\n", - "\t\u001b[34;01m\"namespace\"\u001b[39;49;00m: \u001b[33m\"seldon\"\u001b[39;49;00m\r\n", - " },\r\n", - " \u001b[34;01m\"spec\"\u001b[39;49;00m: {\r\n", - " \u001b[34;01m\"name\"\u001b[39;49;00m: \u001b[33m\"caffe2-mnist\"\u001b[39;49;00m,\r\n", - " \u001b[34;01m\"predictors\"\u001b[39;49;00m: [\r\n", - " {\r\n", - " \u001b[34;01m\"componentSpecs\"\u001b[39;49;00m: [{\r\n", - " \u001b[34;01m\"spec\"\u001b[39;49;00m: {\r\n", - " \u001b[34;01m\"containers\"\u001b[39;49;00m: [\r\n", - " {\r\n", - " \u001b[34;01m\"image\"\u001b[39;49;00m: \u001b[33m\"seldonio/mnist-caffe2-transformer:0.1\"\u001b[39;49;00m,\r\n", - " \u001b[34;01m\"name\"\u001b[39;49;00m: \u001b[33m\"mnist-transformer\"\u001b[39;49;00m\r\n", - " },\r\n", - " {\r\n", - " \u001b[34;01m\"image\"\u001b[39;49;00m: \u001b[33m\"seldonio/nvidia-inference-server-proxy:0.1\"\u001b[39;49;00m,\r\n", - " \u001b[34;01m\"name\"\u001b[39;49;00m: \u001b[33m\"nvidia-proxy\"\u001b[39;49;00m\r\n", - " },\r\n", - "\t\t\t {\r\n", - "\t\t\t\t\u001b[34;01m\"args\"\u001b[39;49;00m: [\r\n", - "\t\t\t\t \u001b[33m\"--model-store=gs://seldon-inference-server-model-store\"\u001b[39;49;00m\r\n", - "\t\t\t\t],\r\n", - "\t\t\t\t\u001b[34;01m\"command\"\u001b[39;49;00m: [\r\n", - "\t\t\t\t \u001b[33m\"inference_server\"\u001b[39;49;00m\r\n", - "\t\t\t\t],\r\n", - "\t\t\t\t\u001b[34;01m\"image\"\u001b[39;49;00m: \u001b[33m\"nvcr.io/nvidia/inferenceserver:18.08.1-py2\"\u001b[39;49;00m,\r\n", - "\t\t\t\t\u001b[34;01m\"livenessProbe\"\u001b[39;49;00m: {\r\n", - "\t\t\t\t \u001b[34;01m\"failureThreshold\"\u001b[39;49;00m: \u001b[34m3\u001b[39;49;00m,\r\n", - "\t\t\t\t \u001b[34;01m\"handler\"\u001b[39;49;00m:{\r\n", - "\t\t\t\t\t\u001b[34;01m\"httpGet\"\u001b[39;49;00m: {\r\n", - "\t\t\t\t\t \u001b[34;01m\"path\"\u001b[39;49;00m: \u001b[33m\"/api/health/live\"\u001b[39;49;00m,\r\n", - "\t\t\t\t\t \u001b[34;01m\"port\"\u001b[39;49;00m: \u001b[34m8000\u001b[39;49;00m,\r\n", - "\t\t\t\t\t \u001b[34;01m\"scheme\"\u001b[39;49;00m: \u001b[33m\"HTTP\"\u001b[39;49;00m\r\n", - "\t\t\t\t\t}\r\n", - "\t\t\t\t },\r\n", - "\t\t\t\t \u001b[34;01m\"initialDelaySeconds\"\u001b[39;49;00m: \u001b[34m5\u001b[39;49;00m,\r\n", - "\t\t\t\t \u001b[34;01m\"periodSeconds\"\u001b[39;49;00m: \u001b[34m5\u001b[39;49;00m,\r\n", - "\t\t\t\t \u001b[34;01m\"successThreshold\"\u001b[39;49;00m: \u001b[34m1\u001b[39;49;00m,\r\n", - "\t\t\t\t \u001b[34;01m\"timeoutSeconds\"\u001b[39;49;00m: \u001b[34m1\u001b[39;49;00m\r\n", - "\t\t\t\t},\r\n", - "\t\t\t\t\u001b[34;01m\"name\"\u001b[39;49;00m: \u001b[33m\"inference-server\"\u001b[39;49;00m,\r\n", - "\t\t\t\t\u001b[34;01m\"ports\"\u001b[39;49;00m: [\r\n", - "\t\t\t\t {\r\n", - "\t\t\t\t\t\u001b[34;01m\"containerPort\"\u001b[39;49;00m: \u001b[34m8000\u001b[39;49;00m,\r\n", - "\t\t\t\t\t\u001b[34;01m\"protocol\"\u001b[39;49;00m: \u001b[33m\"TCP\"\u001b[39;49;00m\r\n", - "\t\t\t\t },\r\n", - "\t\t\t\t {\r\n", - "\t\t\t\t\t\u001b[34;01m\"containerPort\"\u001b[39;49;00m: \u001b[34m8001\u001b[39;49;00m,\r\n", - "\t\t\t\t\t\u001b[34;01m\"protocol\"\u001b[39;49;00m: \u001b[33m\"TCP\"\u001b[39;49;00m\r\n", - "\t\t\t\t },\r\n", - "\t\t\t\t {\r\n", - "\t\t\t\t\t\u001b[34;01m\"containerPort\"\u001b[39;49;00m: \u001b[34m8002\u001b[39;49;00m,\r\n", - "\t\t\t\t\t\u001b[34;01m\"protocol\"\u001b[39;49;00m: \u001b[33m\"TCP\"\u001b[39;49;00m\r\n", - "\t\t\t\t }\r\n", - "\t\t\t\t],\r\n", - "\t\t\t\t\u001b[34;01m\"readinessProbe\"\u001b[39;49;00m: {\r\n", - "\t\t\t\t \u001b[34;01m\"failureThreshold\"\u001b[39;49;00m: \u001b[34m3\u001b[39;49;00m,\r\n", - "\t\t\t\t \u001b[34;01m\"handler\"\u001b[39;49;00m:{\r\n", - "\t\t\t\t\t\u001b[34;01m\"httpGet\"\u001b[39;49;00m: {\r\n", - "\t\t\t\t\t \u001b[34;01m\"path\"\u001b[39;49;00m: \u001b[33m\"/api/health/ready\"\u001b[39;49;00m,\r\n", - "\t\t\t\t\t \u001b[34;01m\"port\"\u001b[39;49;00m: \u001b[34m8000\u001b[39;49;00m,\r\n", - "\t\t\t\t\t \u001b[34;01m\"scheme\"\u001b[39;49;00m: \u001b[33m\"HTTP\"\u001b[39;49;00m\r\n", - "\t\t\t\t\t}\r\n", - "\t\t\t\t },\r\n", - "\t\t\t\t \u001b[34;01m\"initialDelaySeconds\"\u001b[39;49;00m: \u001b[34m5\u001b[39;49;00m,\r\n", - "\t\t\t\t \u001b[34;01m\"periodSeconds\"\u001b[39;49;00m: \u001b[34m5\u001b[39;49;00m,\r\n", - "\t\t\t\t \u001b[34;01m\"successThreshold\"\u001b[39;49;00m: \u001b[34m1\u001b[39;49;00m,\r\n", - "\t\t\t\t \u001b[34;01m\"timeoutSeconds\"\u001b[39;49;00m: \u001b[34m1\u001b[39;49;00m\r\n", - "\t\t\t\t},\r\n", - "\t\t\t\t\u001b[34;01m\"resources\"\u001b[39;49;00m: {\r\n", - "\t\t\t\t \u001b[34;01m\"limits\"\u001b[39;49;00m: {\r\n", - "\t\t\t\t\t\u001b[34;01m\"nvidia.com/gpu\"\u001b[39;49;00m: \u001b[33m\"1\"\u001b[39;49;00m\r\n", - "\t\t\t\t },\r\n", - "\t\t\t\t \u001b[34;01m\"requests\"\u001b[39;49;00m: {\r\n", - "\t\t\t\t\t\u001b[34;01m\"cpu\"\u001b[39;49;00m: \u001b[33m\"100m\"\u001b[39;49;00m,\r\n", - "\t\t\t\t\t\u001b[34;01m\"nvidia.com/gpu\"\u001b[39;49;00m: \u001b[33m\"1\"\u001b[39;49;00m\r\n", - "\t\t\t\t }\r\n", - "\t\t\t\t},\r\n", - "\t\t\t\t\u001b[34;01m\"securityContext\"\u001b[39;49;00m: {\r\n", - "\t\t\t\t \u001b[34;01m\"runAsUser\"\u001b[39;49;00m: \u001b[34m1000\u001b[39;49;00m\r\n", - "\t\t\t\t}\r\n", - "\t\t\t }\r\n", - "\t\t\t],\r\n", - "\t\t\t\u001b[34;01m\"terminationGracePeriodSeconds\"\u001b[39;49;00m: \u001b[34m1\u001b[39;49;00m,\r\n", - "\t\t\t\u001b[34;01m\"imagePullSecrets\"\u001b[39;49;00m: [\r\n", - "\t\t\t {\r\n", - "\t\t\t\t\u001b[34;01m\"name\"\u001b[39;49;00m: \u001b[33m\"ngc\"\u001b[39;49;00m\r\n", - "\t\t\t }\r\n", - "\t\t\t]\r\n", - "\t\t }\r\n", - "\t\t}],\r\n", - " \u001b[34;01m\"graph\"\u001b[39;49;00m: {\r\n", - " \u001b[34;01m\"name\"\u001b[39;49;00m: \u001b[33m\"mnist-transformer\"\u001b[39;49;00m,\r\n", - " \u001b[34;01m\"endpoint\"\u001b[39;49;00m: { \u001b[34;01m\"type\"\u001b[39;49;00m : \u001b[33m\"REST\"\u001b[39;49;00m },\r\n", - " \u001b[34;01m\"type\"\u001b[39;49;00m: \u001b[33m\"TRANSFORMER\"\u001b[39;49;00m,\r\n", - "\t\t \u001b[34;01m\"children\"\u001b[39;49;00m: [\r\n", - "\t\t\t{\r\n", - "\t\t\t \u001b[34;01m\"name\"\u001b[39;49;00m: \u001b[33m\"nvidia-proxy\"\u001b[39;49;00m,\r\n", - "\t\t\t \u001b[34;01m\"endpoint\"\u001b[39;49;00m: { \u001b[34;01m\"type\"\u001b[39;49;00m : \u001b[33m\"REST\"\u001b[39;49;00m },\r\n", - "\t\t\t \u001b[34;01m\"type\"\u001b[39;49;00m: \u001b[33m\"MODEL\"\u001b[39;49;00m,\r\n", - "\t\t\t \u001b[34;01m\"children\"\u001b[39;49;00m: [],\r\n", - "\t\t\t \u001b[34;01m\"parameters\"\u001b[39;49;00m:\r\n", - "\t\t\t [\r\n", - "\t\t\t\t{\r\n", - "\t\t\t\t \u001b[34;01m\"name\"\u001b[39;49;00m:\u001b[33m\"url\"\u001b[39;49;00m,\r\n", - "\t\t\t\t \u001b[34;01m\"type\"\u001b[39;49;00m:\u001b[33m\"STRING\"\u001b[39;49;00m,\r\n", - "\t\t\t\t \u001b[34;01m\"value\"\u001b[39;49;00m:\u001b[33m\"127.0.0.1:8000\"\u001b[39;49;00m\r\n", - "\t\t\t\t},\r\n", - "\t\t\t\t{\r\n", - "\t\t\t\t \u001b[34;01m\"name\"\u001b[39;49;00m:\u001b[33m\"model_name\"\u001b[39;49;00m,\r\n", - "\t\t\t\t \u001b[34;01m\"type\"\u001b[39;49;00m:\u001b[33m\"STRING\"\u001b[39;49;00m,\r\n", - "\t\t\t\t \u001b[34;01m\"value\"\u001b[39;49;00m:\u001b[33m\"tensorrt_mnist\"\u001b[39;49;00m\r\n", - "\t\t\t\t},\r\n", - "\t\t\t\t{\r\n", - "\t\t\t\t \u001b[34;01m\"name\"\u001b[39;49;00m:\u001b[33m\"protocol\"\u001b[39;49;00m,\r\n", - "\t\t\t\t \u001b[34;01m\"type\"\u001b[39;49;00m:\u001b[33m\"STRING\"\u001b[39;49;00m,\r\n", - "\t\t\t\t \u001b[34;01m\"value\"\u001b[39;49;00m:\u001b[33m\"HTTP\"\u001b[39;49;00m\r\n", - "\t\t\t\t}\r\n", - "\t\t\t ]\r\n", - "\t\t\t}\r\n", - "\t\t ]\r\n", - " },\r\n", - " \u001b[34;01m\"name\"\u001b[39;49;00m: \u001b[33m\"mnist-nvidia\"\u001b[39;49;00m,\r\n", - " \u001b[34;01m\"replicas\"\u001b[39;49;00m: \u001b[34m1\u001b[39;49;00m\r\n", - " }\r\n", - " ]\r\n", - " }\r\n", - "}\r\n" - ] - } - ], - "source": [ - "!pygmentize mnist.json" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Port forward Ambassador**\n", - "\n", - "```\n", - "kubectl port-forward $(kubectl get pods -n seldon -l app.kubernetes.io/name=ambassador -o jsonpath='{.items[0].metadata.name}') -n seldon 8003:8080\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "200\n", - "{\n", - " \"meta\": {\n", - " \"puid\": \"pvms7jocoktb37gkb8hpj4cej0\",\n", - " \"tags\": {\n", - " },\n", - " \"routing\": {\n", - " \"mnist-transformer\": -1\n", - " },\n", - " \"requestPath\": {\n", - " \"nvidia-proxy\": \"seldonio/nvidia-inference-server-proxy:0.1\",\n", - " \"mnist-transformer\": \"seldonio/mnist-caffe2-transformer:0.1\"\n", - " },\n", - " \"metrics\": []\n", - " },\n", - " \"data\": {\n", - " \"names\": [\"t:0\", \"t:1\", \"t:2\", \"t:3\", \"t:4\", \"t:5\", \"t:6\", \"t:7\", \"t:8\", \"t:9\"],\n", - " \"tensor\": {\n", - " \"shape\": [1, 10, 1, 1],\n", - " \"values\": [2.5883252874336904E-7, 0.9981641173362732, 2.274509461130947E-5, 8.619469736004248E-5, 3.228335117455572E-6, 2.4672864640251646E-8, 4.060555909290997E-7, 0.0016722471918910742, 5.0836355512728915E-5, 1.2317170394737786E-8]\n", - " }\n", - " }\n", - "}\n" - ] - } - ], - "source": [ - "data = gen_mnist_data(mnist)\n", - "data = data.reshape((784))\n", - "rest_request_ambassador(\"nvidia-mnist\",endpoint=\"localhost:8003\",arr=data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Analytics and Load Test" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "NAME: seldon-core-analytics\n", - "LAST DEPLOYED: Mon Sep 24 14:40:46 2018\n", - "NAMESPACE: seldon\n", - "STATUS: DEPLOYED\n", - "\n", - "RESOURCES:\n", - "==> v1beta1/ClusterRoleBinding\n", - "NAME AGE\n", - "prometheus 0s\n", - "\n", - "==> v1/Job\n", - "NAME DESIRED SUCCESSFUL AGE\n", - "grafana-prom-import-dashboards 1 0 0s\n", - "\n", - "==> v1/Service\n", - "NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\n", - "alertmanager ClusterIP 10.39.243.208 80/TCP 0s\n", - "grafana-prom NodePort 10.39.246.121 80:30588/TCP 0s\n", - "prometheus-node-exporter ClusterIP None 9100/TCP 0s\n", - "prometheus-seldon ClusterIP 10.39.253.10 80/TCP 0s\n", - "\n", - "==> v1beta1/DaemonSet\n", - "NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE\n", - "prometheus-node-exporter 1 1 0 1 0 0s\n", - "\n", - "==> v1/ConfigMap\n", - "NAME DATA AGE\n", - "alertmanager-server-conf 1 0s\n", - "grafana-import-dashboards 7 0s\n", - "prometheus-rules 4 0s\n", - "prometheus-server-conf 1 0s\n", - "\n", - "==> v1beta1/ClusterRole\n", - "NAME AGE\n", - "prometheus 0s\n", - "\n", - "==> v1beta1/Deployment\n", - "NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE\n", - "alertmanager-deployment 1 1 1 0 0s\n", - "grafana-prom-deployment 1 1 1 0 0s\n", - "prometheus-deployment 1 1 1 0 0s\n", - "\n", - "==> v1/Pod(related)\n", - "NAME READY STATUS RESTARTS AGE\n", - "grafana-prom-import-dashboards-wrtnb 0/1 ContainerCreating 0 0s\n", - "alertmanager-deployment-557b99ccf8-ztdnk 0/1 ContainerCreating 0 0s\n", - "grafana-prom-deployment-dd84b7788-zwwls 0/1 ContainerCreating 0 0s\n", - "prometheus-node-exporter-zg9cg 0/1 ContainerCreating 0 0s\n", - "prometheus-deployment-78dd89b44f-8ntcw 0/1 Pending 0 0s\n", - "\n", - "==> v1/Secret\n", - "NAME TYPE DATA AGE\n", - "grafana-prom-secret Opaque 1 0s\n", - "\n", - "==> v1/ServiceAccount\n", - "NAME SECRETS AGE\n", - "prometheus 1 0s\n", - "\n", - "\n", - "NOTES:\n", - "NOTES: TODO\n", - "\n", - "\n" - ] - } - ], - "source": [ - "!helm install seldon-core-analytics ../../../helm-charts/seldon-core-analytics \\\n", - " --set grafana_prom_admin_password=password \\\n", - " --set persistence.enabled=false \\\n", - " --namespace seldon" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "node \"gke-cluster-1-default-pool-5e22f4e3-djd7\" labeled\r\n" - ] - } - ], - "source": [ - "!kubectl label nodes $(kubectl get nodes -o jsonpath='{.items[0].metadata.name}') role=locust" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "NAME: loadtest\n", - "LAST DEPLOYED: Mon Sep 24 14:40:53 2018\n", - "NAMESPACE: seldon\n", - "STATUS: DEPLOYED\n", - "\n", - "RESOURCES:\n", - "==> v1/ReplicationController\n", - "NAME DESIRED CURRENT READY AGE\n", - "locust-slave-1 1 1 0 0s\n", - "locust-master-1 1 1 0 0s\n", - "\n", - "==> v1/Service\n", - "NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\n", - "locust-master-1 NodePort 10.39.254.17 5557:31880/TCP,5558:30185/TCP,8089:32570/TCP 0s\n", - "\n", - "==> v1/Pod(related)\n", - "NAME READY STATUS RESTARTS AGE\n", - "locust-slave-1-p5n6f 0/1 ContainerCreating 0 0s\n", - "locust-master-1-ksk7g 0/1 ContainerCreating 0 0s\n", - "\n", - "\n" - ] - } - ], - "source": [ - "!helm install loadtest seldon-core-loadtesting \\\n", - " --namespace seldon \\\n", - " --repo https://storage.googleapis.com/seldon-charts \\\n", - " --set locust.script=mnist_rest_locust.py \\\n", - " --set locust.host=http://caffe2-mnist:8000 \\\n", - " --set oauth.enabled=false \\\n", - " --set locust.hatchRate=1 \\\n", - " --set locust.clients=1 \\\n", - " --set loadtest.sendFeedback=1 \\\n", - " --set locust.minWait=0 \\\n", - " --set locust.maxWait=0 \\\n", - " --set replicaCount=1 \\\n", - " --set data.size=784\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You should port-foward the grafana dashboard\n", - "\n", - "```\n", - "kubectl port-forward $(kubectl get pods -n seldon -l app=grafana-prom-server -o jsonpath='{.items[0].metadata.name}') -n seldon 3000:3000\n", - "```\n", - "\n", - "You can then view an analytics dashboard inside the cluster at http://localhost:3000/dashboard/db/prediction-analytics?refresh=5s&orgId=1. Your IP address may be different. get it via minikube ip. Login with:\n", - "\n", - " Username : admin\n", - "\n", - " password : password (as set when starting seldon-core-analytics above)" - ] - }, - { - "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.7.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/models/nvidia-mnist/tensorrt_mnist/config.pbtxt b/examples/models/nvidia-mnist/tensorrt_mnist/config.pbtxt deleted file mode 100644 index 57032e9d08..0000000000 --- a/examples/models/nvidia-mnist/tensorrt_mnist/config.pbtxt +++ /dev/null @@ -1,19 +0,0 @@ -name: "tensorrt_mnist" -platform: "tensorrt_plan" -max_batch_size: 1 -input [ - { - name: "data" - data_type: TYPE_FP32 - format: FORMAT_NCHW - dims: [ 1, 28, 28 ] - } -] -output [ - { - name: "prob" - data_type: TYPE_FP32 - dims: [ 10, 1, 1 ] - label_filename: "mnist_labels.txt" - } -] diff --git a/examples/models/nvidia-mnist/tensorrt_mnist/mnist_labels.txt b/examples/models/nvidia-mnist/tensorrt_mnist/mnist_labels.txt deleted file mode 100644 index 8b1acc12b6..0000000000 --- a/examples/models/nvidia-mnist/tensorrt_mnist/mnist_labels.txt +++ /dev/null @@ -1,10 +0,0 @@ -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 diff --git a/examples/models/sklearn_iris/sklearn_iris.ipynb b/examples/models/sklearn_iris/sklearn_iris.ipynb index 64f88aadd1..dd59455430 100644 --- a/examples/models/sklearn_iris/sklearn_iris.ipynb +++ b/examples/models/sklearn_iris/sklearn_iris.ipynb @@ -318,7 +318,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.6" + "version": "3.6.8" }, "varInspector": { "cols": { diff --git a/examples/models/tensorrt/.gitignore b/examples/models/tensorrt/.gitignore new file mode 100644 index 0000000000..bf436d581b --- /dev/null +++ b/examples/models/tensorrt/.gitignore @@ -0,0 +1,2 @@ +model.yaml +input.json diff --git a/examples/models/tensorrt/digit.png b/examples/models/tensorrt/digit.png new file mode 100644 index 0000000000000000000000000000000000000000..8e9de98d8b245613ed6603dec7f7fcab71ccf0ef GIT binary patch literal 3162 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.2.0 +tensorflow-datasets>=3.2.1 +numpy>=1.17.2 diff --git a/examples/models/tensorrt/triton_tensorrt.ipynb b/examples/models/tensorrt/triton_tensorrt.ipynb new file mode 100644 index 0000000000..b10643d8eb --- /dev/null +++ b/examples/models/tensorrt/triton_tensorrt.ipynb @@ -0,0 +1,266 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# NVIDIA TensorRT MNIST Example with Triton Inference Server\n", + "\n", + "![digit](digit.png)\n", + "\n", + "This example shows how you can deploy a TensorRT model with NVIDIA Triton Server. In this case we use a prebuilt TensorRT model for NVIDIA v100 GPUs.\n", + "\n", + "Note this example requires some advanced setup and is directed for those with tensorRT experience.\n", + "\n", + "## Prerequisites\n", + "\n", + " * Install requirements in `requirements.txt`\n", + " * An authorized kubernetes cluster with V100 GPUs installed and configured. \n", + " * For GKE see [GKE GPU Documentation](https://cloud.google.com/kubernetes-engine/docs/how-to/gpus)\n", + " * [Install Seldon Core](file:///home/clive/work/seldon-core/fork-seldon-core/doc/_build/html/examples/seldon_core_setup.html) and install Ambassador and port-foward to Ambassador on localhost:8003\n", + " \n", + " \n", + "This example uses the [KFServing protocol supported by Triton Infernence Server](https://github.com/triton-inference-server/server/tree/master/docs/protocol) which Seldon also supports." + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "import json\n", + "from matplotlib import pyplot as plt\n", + "import numpy as np\n", + "import tensorflow as tf\n", + "import tensorflow_datasets as tfds\n", + "import numpy as np\n", + "\n", + "def gen_image(arr):\n", + " two_d = (np.reshape(arr, (28, 28)) * 255).astype(np.uint8)\n", + " plt.imshow(two_d,cmap=plt.cm.gray_r, interpolation='nearest')\n", + " return plt" + ] + }, + { + "cell_type": "code", + "execution_count": 125, + "metadata": {}, + "outputs": [], + "source": [ + "(ds_train, ds_test), ds_info = tfds.load(\n", + " 'mnist',\n", + " split=['train', 'test'],\n", + " shuffle_files=True,\n", + " as_supervised=True,\n", + " with_info=True,\n", + ")\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 126, + "metadata": {}, + "outputs": [], + "source": [ + "def normalize_img(image, label):\n", + " \"\"\"Normalizes images: `uint8` -> `float32`.\"\"\"\n", + " return tf.cast(image, tf.float32) * 255, label\n", + "\n", + "ds_train = ds_train.map(\n", + " normalize_img, num_parallel_calls=tf.data.experimental.AUTOTUNE)\n", + "\n", + "npX = tfds.as_numpy(\n", + " ds_train, graph=None\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "metadata": {}, + "outputs": [], + "source": [ + "MEANS=np.array([255.0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,254,253,252,252,251,251,252,252,253,254,254,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,253,251,249,248,245,243,242,242,243,246,248,251,253,254,255,255,255,255,255,255,255,255,255,255,255,254,253,250,247,242,235,228,220,213,210,211,216,224,232,240,246,251,253,254,255,255,255,255,255,255,255,255,254,251,248,242,234,223,211,196,181,170,164,166,175,189,205,221,233,243,248,252,254,255,255,255,255,255,255,254,252,248,241,231,217,202,184,166,149,136,131,134,143,159,180,201,220,234,243,249,253,255,255,255,255,255,254,253,249,243,233,219,201,181,161,143,130,122,120,122,129,141,161,185,208,227,240,248,252,254,255,255,255,255,254,251,246,238,226,208,187,164,146,135,131,132,133,132,133,139,154,178,202,223,239,248,252,255,255,255,255,254,253,251,245,236,221,200,177,156,144,144,150,156,156,151,144,144,156,178,202,224,240,249,253,255,255,255,255,254,253,251,245,235,218,195,172,155,152,161,172,176,170,161,150,149,161,183,207,227,242,250,254,255,255,255,255,255,254,251,246,234,215,191,168,156,160,173,182,179,169,157,147,149,166,190,213,230,243,251,254,255,255,255,255,255,254,252,246,233,212,186,165,157,164,175,176,165,153,142,137,147,170,196,217,231,242,251,255,255,255,255,255,255,254,252,245,230,207,182,163,158,164,168,158,143,131,125,128,146,174,200,218,231,241,250,254,255,255,255,255,255,255,252,243,227,205,181,164,159,161,157,139,124,115,118,127,148,176,199,216,230,240,249,254,255,255,255,255,255,254,251,241,224,204,184,169,163,160,150,132,119,116,123,133,153,177,197,214,228,240,249,254,255,255,255,255,255,254,251,239,222,205,189,177,171,166,154,139,129,128,134,144,159,177,195,213,228,241,249,254,255,255,255,255,255,254,249,237,222,207,195,186,180,175,166,153,143,140,142,150,162,178,195,214,230,242,250,254,255,255,255,255,255,253,247,235,220,207,197,189,183,179,172,160,148,142,143,150,161,178,198,217,233,244,250,254,255,255,255,255,255,253,246,233,218,204,192,184,177,172,165,153,142,137,139,148,163,183,204,222,236,246,251,254,255,255,255,255,255,253,247,234,218,201,186,174,165,157,148,137,130,129,137,151,171,194,214,230,242,248,252,254,255,255,255,255,255,253,249,238,222,203,184,168,154,143,132,124,123,130,145,165,188,209,227,239,247,251,253,255,255,255,255,255,255,254,251,244,232,214,194,174,156,142,132,130,134,148,167,189,210,226,238,246,250,253,254,255,255,255,255,255,255,255,253,250,243,231,215,196,178,163,155,156,164,179,197,215,230,240,247,251,253,254,255,255,255,255,255,255,255,255,254,253,251,246,238,228,217,208,203,204,210,218,228,236,243,248,251,253,254,255,255,255,255,255,255,255,255,255,255,255,254,252,249,245,241,238,237,237,239,242,245,247,250,252,253,254,255,255,255,255,255,255,255,255,255,255,255,255,254,254,253,252,250,249,248,249,249,250,252,253,253,254,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,254,254,255,255,255,255,255,255,255,255,255,255,255,255])" + ] + }, + { + "cell_type": "code", + "execution_count": 128, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Overwriting model.yaml\n" + ] + } + ], + "source": [ + "%%writefile model.yaml\n", + "apiVersion: machinelearning.seldon.io/v1alpha2\n", + "kind: SeldonDeployment\n", + "metadata:\n", + " name: mnist\n", + "spec:\n", + " protocol: kfserving\n", + " transport: rest\n", + " predictors:\n", + " - graph:\n", + " children: []\n", + " implementation: TRITON_SERVER\n", + " modelUri: gs://seldon-models/tensorrt/v100_mnist\n", + " name: mnist\n", + " componentSpecs:\n", + " - spec:\n", + " containers:\n", + " - name: mnist\n", + " resources:\n", + " limits:\n", + " nvidia.com/gpu: 1\n", + " name: tensorrt\n", + " replicas: 1" + ] + }, + { + "cell_type": "code", + "execution_count": 129, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "seldondeployment.machinelearning.seldon.io/mnist configured\r\n" + ] + } + ], + "source": [ + "!kubectl apply -f model.yaml" + ] + }, + { + "cell_type": "code", + "execution_count": 130, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "deployment \"mnist-tensorrt-0-mnist\" successfully rolled out\r\n" + ] + } + ], + "source": [ + "!kubectl rollout status deploy/$(kubectl get deploy -l seldon-deployment-id=mnist -o jsonpath='{.items[0].metadata.name}')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Check metadata of model" + ] + }, + { + "cell_type": "code", + "execution_count": 131, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\"name\":\"mnist\",\"versions\":[\"1\"],\"platform\":\"tensorrt_plan\",\"inputs\":[{\"name\":\"data\",\"datatype\":\"FP32\",\"shape\":[-1,1,28,28]}],\"outputs\":[{\"name\":\"prob\",\"datatype\":\"FP32\",\"shape\":[-1,10,1,1]}]}" + ] + } + ], + "source": [ + "!curl http://0.0.0.0:8003/seldon/default/mnist/v2/models/mnist" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Test prediction on random digit." + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'model_name': 'mnist', 'model_version': '1', 'outputs': [{'name': 'prob', 'datatype': 'FP32', 'shape': [1, 10, 1, 1], 'data': [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0]}]}\n", + "Truth 4 predicted 4\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "x,y = next(npX)\n", + "X = 255 - x\n", + "X = (X.reshape(784) - MEANS) \n", + "gen_image(x)\n", + "values = np.expand_dims(X, axis=0).reshape((1,1,28,28)).flatten().tolist() \n", + "cmd = '{\"inputs\":[{\"name\":\"data\",\"data\":'+str(values)+',\"datatype\":\"FP32\",\"shape\":[1,1,28,28]}]}'\n", + "with open(\"input.json\",\"w\") as f:\n", + " f.write(cmd)\n", + "res=!curl -s -d @./input.json \\\n", + " -X POST http://0.0.0.0:8003/seldon/default/mnist/v2/models/mnist/infer \\\n", + " -H \"Content-Type: application/json\"\n", + "d=json.loads(res[0])\n", + "print(d)\n", + "predicted = np.array(d[\"outputs\"][0][\"data\"]).argmax()\n", + "print(\"Truth\",y,\"predicted\",predicted)" + ] + }, + { + "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.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/executor/api/rest/server.go b/executor/api/rest/server.go index ea7dbcfeae..5ee29c7da3 100644 --- a/executor/api/rest/server.go +++ b/executor/api/rest/server.go @@ -160,10 +160,10 @@ func (r *SeldonRestApi) Initialise() { r.Router.NewRoute().Path("/v1/models/{"+ModelHttpPathVariable+"}").Methods("GET", "OPTIONS").HandlerFunc(r.wrapMetrics(metric.StatusHttpServiceName, r.status)) r.Router.NewRoute().Path("/v1/models/{"+ModelHttpPathVariable+"}/metadata").Methods("GET", "OPTIONS").HandlerFunc(r.wrapMetrics(metric.MetadataHttpServiceName, r.metadata)) case api.ProtocolKFserving: - r.Router.NewRoute().Path("/v2/models/{" + ModelHttpPathVariable + "}/infer").Methods("OPTIONS", "POST").HandlerFunc(r.wrapMetrics(metric.PredictionHttpServiceName, r.predictions)) + r.Router.NewRoute().Path("/v2/models/{"+ModelHttpPathVariable+"}/infer").Methods("OPTIONS", "POST").HandlerFunc(r.wrapMetrics(metric.PredictionHttpServiceName, r.predictions)) r.Router.NewRoute().Path("/v1/models/infer").Methods("OPTIONS", "POST").HandlerFunc(r.wrapMetrics(metric.PredictionHttpServiceName, r.predictions)) // Nonstandard path - Seldon extension - r.Router.NewRoute().Path("/v2/models/{" + ModelHttpPathVariable + "}/ready").Methods("GET", "OPTIONS").HandlerFunc(r.wrapMetrics(metric.StatusHttpServiceName, r.status)) - r.Router.NewRoute().Path("/v2/models/{" + ModelHttpPathVariable + "}").Methods("GET", "OPTIONS").HandlerFunc(r.wrapMetrics(metric.MetadataHttpServiceName, r.metadata)) + r.Router.NewRoute().Path("/v2/models/{"+ModelHttpPathVariable+"}/ready").Methods("GET", "OPTIONS").HandlerFunc(r.wrapMetrics(metric.StatusHttpServiceName, r.status)) + r.Router.NewRoute().Path("/v2/models/{"+ModelHttpPathVariable+"}").Methods("GET", "OPTIONS").HandlerFunc(r.wrapMetrics(metric.MetadataHttpServiceName, r.metadata)) } } diff --git a/operator/constants/constants.go b/operator/constants/constants.go index 4ab2733c75..2392bd33ff 100644 --- a/operator/constants/constants.go +++ b/operator/constants/constants.go @@ -9,6 +9,7 @@ const ( PrePackedServerTensorflow = "TENSORFLOW_SERVER" PrePackedServerSklearn = "SKLEARN_SERVER" + PrePackedServerTriton = "TRITON_SERVER" TfServingGrpcPort = 2000 TfServingRestPort = 2001 diff --git a/operator/controllers/seldondeployment_controller.go b/operator/controllers/seldondeployment_controller.go index 36aac79342..7fe1da4458 100644 --- a/operator/controllers/seldondeployment_controller.go +++ b/operator/controllers/seldondeployment_controller.go @@ -1576,7 +1576,7 @@ func (r *SeldonDeploymentReconciler) updateStatusForError(desired *machinelearni desired.Status.State = machinelearningv1.StatusStateFailed desired.Status.Description = err.Error() - + existing := &machinelearningv1.SeldonDeployment{} namespacedName := types.NamespacedName{Name: desired.Name, Namespace: desired.Namespace} if err := r.Get(context.TODO(), namespacedName, existing); err != nil { diff --git a/operator/controllers/seldondeployment_prepackaged_servers.go b/operator/controllers/seldondeployment_prepackaged_servers.go index ccc725809d..d9951457cc 100644 --- a/operator/controllers/seldondeployment_prepackaged_servers.go +++ b/operator/controllers/seldondeployment_prepackaged_servers.go @@ -212,12 +212,22 @@ func (pi *PrePackedInitialiser) addTritonServer(pu *machinelearningv1.Predictive machinelearningv1.SetImageNameForPrepackContainer(pu, cServer, serverConfig) if existing { - cServer.DeepCopyInto(c) + // Overwrite core items if not existing or required + if c.Image == "" { + c.Image = cServer.Image + } + if c.Args == nil { + c.Args = cServer.Args + } + c.Ports = cServer.Ports + c.ReadinessProbe = cServer.ReadinessProbe + c.LivenessProbe = cServer.LivenessProbe + c.SecurityContext = cServer.SecurityContext } else { if len(deploy.Spec.Template.Spec.Containers) > 0 { - deploy.Spec.Template.Spec.Containers = append(deploy.Spec.Template.Spec.Containers, *c) + deploy.Spec.Template.Spec.Containers = append(deploy.Spec.Template.Spec.Containers, *cServer) } else { - deploy.Spec.Template.Spec.Containers = []v1.Container{*c} + deploy.Spec.Template.Spec.Containers = []v1.Container{*cServer} } } diff --git a/operator/controllers/seldondeployment_prepackaged_servers_test.go b/operator/controllers/seldondeployment_prepackaged_servers_test.go index 42643993d1..daeb839026 100644 --- a/operator/controllers/seldondeployment_prepackaged_servers_test.go +++ b/operator/controllers/seldondeployment_prepackaged_servers_test.go @@ -582,3 +582,99 @@ var _ = Describe("Create a prepacked sklearn server", func() { }) }) + +var _ = Describe("Create a prepacked triton server", func() { + const timeout = time.Second * 30 + const interval = time.Second * 1 + const name = "pp1" + const sdepName = "prepack5" + envExecutorUser = "2" + By("Creating a resource") + It("should create a resource with defaults and security context", func() { + Expect(k8sClient).NotTo(BeNil()) + var modelType = machinelearningv1.MODEL + modelName := "classifier" + var impl = machinelearningv1.PredictiveUnitImplementation(constants.PrePackedServerTriton) + key := types.NamespacedName{ + Name: sdepName, + Namespace: "default", + } + instance := &machinelearningv1.SeldonDeployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: key.Name, + Namespace: key.Namespace, + }, + Spec: machinelearningv1.SeldonDeploymentSpec{ + Name: name, + Predictors: []machinelearningv1.PredictorSpec{ + { + Name: "p1", + ComponentSpecs: []*machinelearningv1.SeldonPodSpec{ + { + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Name: modelName, + }, + }, + }, + }, + }, + Graph: machinelearningv1.PredictiveUnit{ + Name: modelName, + Type: &modelType, + Implementation: &impl, + Endpoint: &machinelearningv1.Endpoint{Type: machinelearningv1.REST}, + }, + }, + }, + }, + } + + configMapName := types.NamespacedName{Name: "seldon-config", + Namespace: "seldon-system"} + + configResult := &corev1.ConfigMap{} + const timeout = time.Second * 30 + Eventually(func() error { return k8sClient.Get(context.TODO(), configMapName, configResult) }, timeout). + Should(Succeed()) + + // Run Defaulter + instance.Default() + + //set security user + envUseExecutor = "true" + envDefaultUser = "2" + + Expect(k8sClient.Create(context.Background(), instance)).Should(Succeed()) + //time.Sleep(time.Second * 5) + + fetched := &machinelearningv1.SeldonDeployment{} + Eventually(func() error { + err := k8sClient.Get(context.Background(), key, fetched) + return err + }, timeout, interval).Should(BeNil()) + Expect(fetched.Name).Should(Equal(sdepName)) + + sPodSpec, idx := utils.GetSeldonPodSpecForPredictiveUnit(&instance.Spec.Predictors[0], instance.Spec.Predictors[0].Graph.Name) + depName := machinelearningv1.GetDeploymentName(instance, instance.Spec.Predictors[0], sPodSpec, idx) + depKey := types.NamespacedName{ + Name: depName, + Namespace: "default", + } + depFetched := &appsv1.Deployment{} + Eventually(func() error { + err := k8sClient.Get(context.Background(), depKey, depFetched) + return err + }, timeout, interval).Should(BeNil()) + Expect(len(depFetched.Spec.Template.Spec.Containers)).Should(Equal(2)) + Expect(depFetched.Spec.Template.Spec.SecurityContext).ToNot(BeNil()) + Expect(*depFetched.Spec.Template.Spec.SecurityContext.RunAsUser).To(Equal(int64(2))) + + Expect(k8sClient.Delete(context.Background(), instance)).Should(Succeed()) + + //j, _ := json.Marshal(depFetched) + //fmt.Println(string(j)) + }) + +}) diff --git a/operator/controllers/suite_test.go b/operator/controllers/suite_test.go index 13bc109d2e..14a303971c 100644 --- a/operator/controllers/suite_test.go +++ b/operator/controllers/suite_test.go @@ -104,6 +104,16 @@ var configs = map[string]string{ "image": "seldonio/mlflowserver_grpc", "defaultImageVersion": "0.2" } + }, + "TRITON_SERVER": { + "rest": { + "image": "nvcr.io/nvidia/tritonserver", + "defaultImageVersion": "20.08-py3" + }, + "grpc": { + "image": "nvcr.io/nvidia/tritonserver", + "defaultImageVersion": "20.08-py3" + } } }`, "storageInitializer": `