From 017075431e4ee598d45d5ce2dd57fc3ba7db0545 Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Fri, 24 May 2019 08:24:29 +0100 Subject: [PATCH 01/22] Initial pipeline steps --- examples/kubeflow/mnist_pipeline.py | 89 ++ .../kubeflow/persistent-volume-setup.yaml | 27 + examples/kubeflow/pipeline.yaml | 170 +++ examples/kubeflow/pipeline/__init__.py | 0 .../kubeflow/pipeline/clean_text/Dockerfile | 4 + .../kubeflow/pipeline/clean_text/__init__.py | 0 .../pipeline/clean_text/pipeline_step.py | 57 + .../pipeline/clean_text/requirements.txt | 3 + .../pipeline/lr_text_classifier/Dockerfile | 4 + .../pipeline/lr_text_classifier/__init__.py | 0 .../lr_text_classifier/pipeline_step.py | 49 + .../lr_text_classifier/requirements.txt | 4 + .../lr_text_classifier/tfidf_vectors.data | Bin 0 -> 643 bytes .../sklearn_spacy_text/.s2i/environment | 4 + .../sklearn_spacy_text/RedditClassifier.py | 23 + .../pipeline/sklearn_spacy_text/__init__.py | 0 .../pipeline/sklearn_spacy_text/ml_utils.py | 75 ++ .../sklearn_spacy_text/reddit_clf.json | 53 + .../sklearn_spacy_text/requirements.txt | 4 + ...klearn_spacy_text_classifier_example.ipynb | 1064 +++++++++++++++++ .../pipeline/spacy_tokenize/Dockerfile | 5 + .../pipeline/spacy_tokenize/__init__.py | 0 .../pipeline/spacy_tokenize/pipeline_step.py | 48 + .../pipeline/spacy_tokenize/requirements.txt | 4 + .../pipeline/tfidf_vectorizer/Dockerfile | 4 + .../pipeline/tfidf_vectorizer/__init__.py | 0 .../tfidf_vectorizer/pipeline_step.py | 47 + .../tfidf_vectorizer/requirements.txt | 4 + examples/kubeflow/requirements.txt | 3 + examples/kubeflow/test/__init__.py | 0 examples/kubeflow/test/clean_text.data | Bin 0 -> 479 bytes examples/kubeflow/test/labels.data | Bin 0 -> 284 bytes examples/kubeflow/test/raw_text.data | Bin 0 -> 479 bytes examples/kubeflow/test/test_pipeline.py | 85 ++ examples/kubeflow/test/tfidf.model | Bin 0 -> 2475 bytes examples/kubeflow/test/tfidf_vectors.data | Bin 0 -> 643 bytes examples/kubeflow/test/tokenized_text.data | Bin 0 -> 382 bytes 37 files changed, 1830 insertions(+) create mode 100644 examples/kubeflow/mnist_pipeline.py create mode 100644 examples/kubeflow/persistent-volume-setup.yaml create mode 100644 examples/kubeflow/pipeline.yaml create mode 100644 examples/kubeflow/pipeline/__init__.py create mode 100644 examples/kubeflow/pipeline/clean_text/Dockerfile create mode 100644 examples/kubeflow/pipeline/clean_text/__init__.py create mode 100644 examples/kubeflow/pipeline/clean_text/pipeline_step.py create mode 100644 examples/kubeflow/pipeline/clean_text/requirements.txt create mode 100644 examples/kubeflow/pipeline/lr_text_classifier/Dockerfile create mode 100644 examples/kubeflow/pipeline/lr_text_classifier/__init__.py create mode 100644 examples/kubeflow/pipeline/lr_text_classifier/pipeline_step.py create mode 100644 examples/kubeflow/pipeline/lr_text_classifier/requirements.txt create mode 100644 examples/kubeflow/pipeline/lr_text_classifier/tfidf_vectors.data create mode 100644 examples/kubeflow/pipeline/sklearn_spacy_text/.s2i/environment create mode 100644 examples/kubeflow/pipeline/sklearn_spacy_text/RedditClassifier.py create mode 100644 examples/kubeflow/pipeline/sklearn_spacy_text/__init__.py create mode 100644 examples/kubeflow/pipeline/sklearn_spacy_text/ml_utils.py create mode 100644 examples/kubeflow/pipeline/sklearn_spacy_text/reddit_clf.json create mode 100644 examples/kubeflow/pipeline/sklearn_spacy_text/requirements.txt create mode 100644 examples/kubeflow/pipeline/sklearn_spacy_text/sklearn_spacy_text_classifier_example.ipynb create mode 100644 examples/kubeflow/pipeline/spacy_tokenize/Dockerfile create mode 100644 examples/kubeflow/pipeline/spacy_tokenize/__init__.py create mode 100644 examples/kubeflow/pipeline/spacy_tokenize/pipeline_step.py create mode 100644 examples/kubeflow/pipeline/spacy_tokenize/requirements.txt create mode 100644 examples/kubeflow/pipeline/tfidf_vectorizer/Dockerfile create mode 100644 examples/kubeflow/pipeline/tfidf_vectorizer/__init__.py create mode 100644 examples/kubeflow/pipeline/tfidf_vectorizer/pipeline_step.py create mode 100644 examples/kubeflow/pipeline/tfidf_vectorizer/requirements.txt create mode 100644 examples/kubeflow/requirements.txt create mode 100644 examples/kubeflow/test/__init__.py create mode 100644 examples/kubeflow/test/clean_text.data create mode 100644 examples/kubeflow/test/labels.data create mode 100644 examples/kubeflow/test/raw_text.data create mode 100644 examples/kubeflow/test/test_pipeline.py create mode 100644 examples/kubeflow/test/tfidf.model create mode 100644 examples/kubeflow/test/tfidf_vectors.data create mode 100644 examples/kubeflow/test/tokenized_text.data diff --git a/examples/kubeflow/mnist_pipeline.py b/examples/kubeflow/mnist_pipeline.py new file mode 100644 index 0000000000..923be7a4da --- /dev/null +++ b/examples/kubeflow/mnist_pipeline.py @@ -0,0 +1,89 @@ +# Copyright 2019 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +Kubeflow Pipelines MNIST example + +Run this script to compile pipeline +""" + + +import kfp.dsl as dsl +from kubernetes import client as k8s + + +@dsl.pipeline( + name='MNIST', + description='A pipeline to train and serve the MNIST example.' +) +def mnist_pipeline(model_export_dir='/mnt/export', + train_steps='200', + learning_rate='0.01', + batch_size='100'): + """ + Pipeline with three stages: + 1. train an MNIST classifier + 2. deploy a tf-serving instance to the cluster + 3. deploy a web-ui to interact with it + """ + vop = dsl.VolumeOp( + name='{{workflow.name}}-my-pvc', + resource_name="my-pvc", + modes=["ReadWriteMany"], + size="2Gi" + ) + + train = dsl.ContainerOp( + name='train', + image='gcr.io/kubeflow-examples/mnist/model:v20190304-v0.2-176-g15d997b', + arguments=[ + "/opt/model.py", + "--tf-export-dir", model_export_dir, + "--tf-train-steps", train_steps, + "--tf-batch-size", batch_size, + "--tf-learning-rate", learning_rate + ], + pvolumes={"/mnt": vop.volume} + ) + + serve = dsl.ContainerOp( + name='serve', + image='gcr.io/ml-pipeline/ml-pipeline-kubeflow-deployer:' + '7775692adf28d6f79098e76e839986c9ee55dd61', + arguments=[ + '--model-export-path', model_export_dir, + '--server-name', "mnist-service" + ], + pvolumes={"/mnt": train.pvolume} + ) + + web_ui = dsl.ContainerOp( + name='web-ui', + image='gcr.io/kubeflow-examples/mnist/deploy-service:latest', + arguments=[ + '--image', 'gcr.io/kubeflow-examples/mnist/web-ui:' + 'v20190304-v0.2-176-g15d997b-pipelines', + '--name', 'web-ui', + '--container-port', '5000', + '--service-port', '80', + '--service-type', "LoadBalancer" + ], + pvolumes={"/mnt": serve.pvolume} + ) + + web_ui.after(serve) + + +if __name__ == '__main__': + import kfp.compiler as compiler + compiler.Compiler().compile(mnist_pipeline, __file__ + '.tar.gz') diff --git a/examples/kubeflow/persistent-volume-setup.yaml b/examples/kubeflow/persistent-volume-setup.yaml new file mode 100644 index 0000000000..82e55c4090 --- /dev/null +++ b/examples/kubeflow/persistent-volume-setup.yaml @@ -0,0 +1,27 @@ +apiVersion: v1 +kind: PersistentVolume +metadata: + name: task-pv-volume + labels: + type: local +spec: + storageClassName: manual + capacity: + storage: 10Gi + accessModes: + - ReadWriteOnce + hostPath: + path: /c/Users/alejandro/Programming/kfnotebooks/test +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: task-pv-claim +spec: + storageClassName: manual + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 3Gi + diff --git a/examples/kubeflow/pipeline.yaml b/examples/kubeflow/pipeline.yaml new file mode 100644 index 0000000000..07cd8280ea --- /dev/null +++ b/examples/kubeflow/pipeline.yaml @@ -0,0 +1,170 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Workflow +metadata: + generateName: mnist- +spec: + arguments: + parameters: + - name: model-export-dir + value: /mnt/export + - name: create-pvc + value: my-pvc + - name: train-steps + value: '200' + - name: learning-rate + value: '0.01' + - name: batch-size + value: '100' + entrypoint: mnist + serviceAccountName: pipeline-runner + templates: + - name: create-pvc + outputs: + parameters: + - name: create-pvc-manifest + valueFrom: + jsonPath: '{}' + - name: create-pvc-name + valueFrom: + jsonPath: '{.metadata.name}' + - name: create-pvc-size + valueFrom: + jsonPath: '{.status.capacity.storage}' + resource: + action: create + manifest: "apiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n name: '{{workflow.name}}-my-pvc'\n\ + spec:\n accessModes:\n - ReadWriteMany\n resources:\n requests:\n \ + \ storage: 2Gi\n" + - dag: + tasks: + - name: create-pvc + template: create-pvc + - arguments: + parameters: + - name: create-pvc-name + value: '{{tasks.create-pvc.outputs.parameters.create-pvc-name}}' + - name: model-export-dir + value: '{{inputs.parameters.model-export-dir}}' + dependencies: + - create-pvc + - train + name: serve + template: serve + - arguments: + parameters: + - name: batch-size + value: '{{inputs.parameters.batch-size}}' + - name: create-pvc-name + value: '{{tasks.create-pvc.outputs.parameters.create-pvc-name}}' + - name: learning-rate + value: '{{inputs.parameters.learning-rate}}' + - name: model-export-dir + value: '{{inputs.parameters.model-export-dir}}' + - name: train-steps + value: '{{inputs.parameters.train-steps}}' + dependencies: + - create-pvc + name: train + template: train + - arguments: + parameters: + - name: create-pvc-name + value: '{{tasks.create-pvc.outputs.parameters.create-pvc-name}}' + dependencies: + - create-pvc + - serve + name: web-ui + template: web-ui + inputs: + parameters: + - name: batch-size + - name: learning-rate + - name: model-export-dir + - name: train-steps + name: mnist + - container: + args: + - --model-export-path + - '{{inputs.parameters.model-export-dir}}' + - --server-name + - mnist-service + image: gcr.io/ml-pipeline/ml-pipeline-kubeflow-deployer:7775692adf28d6f79098e76e839986c9ee55dd61 + volumeMounts: + - mountPath: /mnt + name: create-pvc + inputs: + parameters: + - name: create-pvc-name + - name: model-export-dir + name: serve + outputs: + artifacts: + - name: mlpipeline-ui-metadata + optional: true + path: /mlpipeline-ui-metadata.json + - name: mlpipeline-metrics + optional: true + path: /mlpipeline-metrics.json + - container: + args: + - /opt/model.py + - --tf-export-dir + - '{{inputs.parameters.model-export-dir}}' + - --tf-train-steps + - '{{inputs.parameters.train-steps}}' + - --tf-batch-size + - '{{inputs.parameters.batch-size}}' + - --tf-learning-rate + - '{{inputs.parameters.learning-rate}}' + image: gcr.io/kubeflow-examples/mnist/model:v20190304-v0.2-176-g15d997b + volumeMounts: + - mountPath: /mnt + name: create-pvc + inputs: + parameters: + - name: batch-size + - name: create-pvc-name + - name: learning-rate + - name: model-export-dir + - name: train-steps + name: train + outputs: + artifacts: + - name: mlpipeline-ui-metadata + optional: true + path: /mlpipeline-ui-metadata.json + - name: mlpipeline-metrics + optional: true + path: /mlpipeline-metrics.json + - container: + args: + - --image + - gcr.io/kubeflow-examples/mnist/web-ui:v20190304-v0.2-176-g15d997b-pipelines + - --name + - web-ui + - --container-port + - '5000' + - --service-port + - '80' + - --service-type + - LoadBalancer + image: gcr.io/kubeflow-examples/mnist/deploy-service:latest + volumeMounts: + - mountPath: /mnt + name: create-pvc + inputs: + parameters: + - name: create-pvc-name + name: web-ui + outputs: + artifacts: + - name: mlpipeline-ui-metadata + optional: true + path: /mlpipeline-ui-metadata.json + - name: mlpipeline-metrics + optional: true + path: /mlpipeline-metrics.json + volumes: + - name: create-pvc + persistentVolumeClaim: + claimName: '{{workflow.name}}-my-pvc' diff --git a/examples/kubeflow/pipeline/__init__.py b/examples/kubeflow/pipeline/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/examples/kubeflow/pipeline/clean_text/Dockerfile b/examples/kubeflow/pipeline/clean_text/Dockerfile new file mode 100644 index 0000000000..0caca3e8f6 --- /dev/null +++ b/examples/kubeflow/pipeline/clean_text/Dockerfile @@ -0,0 +1,4 @@ +FROM python:3.7-slim +COPY . /app +WORKDIR /app +RUN pip install -r requirements.txt diff --git a/examples/kubeflow/pipeline/clean_text/__init__.py b/examples/kubeflow/pipeline/clean_text/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/examples/kubeflow/pipeline/clean_text/pipeline_step.py b/examples/kubeflow/pipeline/clean_text/pipeline_step.py new file mode 100644 index 0000000000..a4e1239c72 --- /dev/null +++ b/examples/kubeflow/pipeline/clean_text/pipeline_step.py @@ -0,0 +1,57 @@ +import re +from html.parser import HTMLParser +import dill +import click +import numpy as np +import dill + +class CleanTextTransformer(): + __html_parser = HTMLParser() + __uplus_pattern = \ + re.compile("\<[uU]\+(?P[a-zA-Z0-9]+)\>") + __markup_link_pattern = \ + re.compile("\[(.*)\]\((.*)\)") + + def transform(self, X, **kwargs): + f = np.vectorize(CleanTextTransformer.transform_clean_text) + X_clean = f(X) + return X_clean + + def fit(self, X, y=None, **fit_params): + return self + + @staticmethod + def transform_clean_text(raw_text): + try: + decoded = raw_text.encode("ISO-8859-1").decode("utf-8") + except: + decoded = raw_text.encode("ISO-8859-1").decode("cp1252") + html_unescaped = CleanTextTransformer.\ + __html_parser.unescape(decoded) + html_unescaped = re.sub(r"\r\n", " ", html_unescaped) + html_unescaped = re.sub(r"\r\r\n", " ", html_unescaped) + html_unescaped = re.sub(r"\r", " ", html_unescaped) + html_unescaped = html_unescaped.replace(">", " > ") + html_unescaped = html_unescaped.replace("<", " < ") + html_unescaped = html_unescaped.replace("--", " - ") + html_unescaped = CleanTextTransformer.__uplus_pattern.sub( + " U\g ", html_unescaped) + html_unescaped = CleanTextTransformer.__markup_link_pattern.sub( + " \1 \2 ", html_unescaped) + html_unescaped = html_unescaped.replace("\\", "") + return html_unescaped + +@click.command() +@click.option('--in-path', default="/mnt/raw_text.data") +@click.option('--out-path', default="/mnt/clean_text.data") +def run_pipeline(in_path, out_path): + clean_text_transformer = CleanTextTransformer() + with open(in_path, 'rb') as in_f: + x = dill.load(in_f) + y = clean_text_transformer.transform(x) + with open(out_path, "wb") as out_f: + dill.dump(y, out_f) + +if __name__ == "__main__": + run_pipeline() + diff --git a/examples/kubeflow/pipeline/clean_text/requirements.txt b/examples/kubeflow/pipeline/clean_text/requirements.txt new file mode 100644 index 0000000000..cfe90b1699 --- /dev/null +++ b/examples/kubeflow/pipeline/clean_text/requirements.txt @@ -0,0 +1,3 @@ +dill==0.2.9 +click +numpy diff --git a/examples/kubeflow/pipeline/lr_text_classifier/Dockerfile b/examples/kubeflow/pipeline/lr_text_classifier/Dockerfile new file mode 100644 index 0000000000..0caca3e8f6 --- /dev/null +++ b/examples/kubeflow/pipeline/lr_text_classifier/Dockerfile @@ -0,0 +1,4 @@ +FROM python:3.7-slim +COPY . /app +WORKDIR /app +RUN pip install -r requirements.txt diff --git a/examples/kubeflow/pipeline/lr_text_classifier/__init__.py b/examples/kubeflow/pipeline/lr_text_classifier/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/examples/kubeflow/pipeline/lr_text_classifier/pipeline_step.py b/examples/kubeflow/pipeline/lr_text_classifier/pipeline_step.py new file mode 100644 index 0000000000..06014df54e --- /dev/null +++ b/examples/kubeflow/pipeline/lr_text_classifier/pipeline_step.py @@ -0,0 +1,49 @@ +import click +import numpy as np +import dill +from sklearn.linear_model import LogisticRegression + +@click.command() +@click.option('--in-path', default="/mnt/tfidf_vectors.data") +@click.option('--labels-path', default="/mnt/labels.data") +@click.option('--out-path', default="/mnt/lr_prediction.data") +@click.option('--c-param', default=1000) +@click.option('--action', default="predict", + type=click.Choice(['predict', 'train'])) +@click.option('--model-path', default="/mnt/lr_text.model") +def run_pipeline( + in_path, + labels_path, + out_path, + c_param, + action, + model_path): + + with open(in_path, 'rb') as in_f: + x = dill.load(in_f) + + if action == "train": + lr_model = LogisticRegression( + C=0.1, + solver='sag') + + with open(labels_path, "rb") as f: + labels = dill.load(f) + + lr_model.fit(x, labels) + + with open(model_path, "wb") as model_f: + dill.dump(lr_model, model_f) + + elif action == "predict": + with open(model_path, "rb") as model_f: + lr_model = dill.load(model_f) + + y = lr_model.predict_proba(x) + + with open(out_path, "wb") as out_f: + dill.dump(y, out_f) + +if __name__ == "__main__": + run_pipeline() + diff --git a/examples/kubeflow/pipeline/lr_text_classifier/requirements.txt b/examples/kubeflow/pipeline/lr_text_classifier/requirements.txt new file mode 100644 index 0000000000..4f2707419d --- /dev/null +++ b/examples/kubeflow/pipeline/lr_text_classifier/requirements.txt @@ -0,0 +1,4 @@ +dill==0.2.9 +click +numpy==1.16.3 +scikit-learn==0.20.3 diff --git a/examples/kubeflow/pipeline/lr_text_classifier/tfidf_vectors.data b/examples/kubeflow/pipeline/lr_text_classifier/tfidf_vectors.data new file mode 100644 index 0000000000000000000000000000000000000000..1651c9c81546869ae02c262d049669a33a919b40 GIT binary patch literal 643 zcmb`D&2H2%6or#X+i6XqrRAqUp-?DI`3X?5V1dM9c32vrtg^E_j=_;8nH&K5@u!NC`V z$LPh`QV;~9F|yW(c#pFaEM&_xE9Fsbi^^eWN{Thry=GNDH?q!y8Lke(5jIY-8S{`6;oAIG?xr>U_IlRy zv0mc_4|sTrn<=(p9%Ug--{RJAIDG$`R=4rM;r8fk5c_I;8@{$hl3y#N1yV%vNDsgr zhwY)m-4yq_j;X%dS?rj8Y}QQY@4g{(54^c(hF!CDHt_K}Ec1wm4vz@2m*R2e`MGow z`+osq4>*{odt%N5eSCwb=YgK3cus-Lzfls3^5Ms?Z{PR6{(SepzIfsAlKj3(aoCQM EKU|a8F8}}l literal 0 HcmV?d00001 diff --git a/examples/kubeflow/pipeline/sklearn_spacy_text/.s2i/environment b/examples/kubeflow/pipeline/sklearn_spacy_text/.s2i/environment new file mode 100644 index 0000000000..bf867a009a --- /dev/null +++ b/examples/kubeflow/pipeline/sklearn_spacy_text/.s2i/environment @@ -0,0 +1,4 @@ +MODEL_NAME=RedditClassifier +API_TYPE=REST +SERVICE_TYPE=MODEL +PERSISTENCE=0 diff --git a/examples/kubeflow/pipeline/sklearn_spacy_text/RedditClassifier.py b/examples/kubeflow/pipeline/sklearn_spacy_text/RedditClassifier.py new file mode 100644 index 0000000000..f24abfb60f --- /dev/null +++ b/examples/kubeflow/pipeline/sklearn_spacy_text/RedditClassifier.py @@ -0,0 +1,23 @@ +import dill + +from ml_utils import CleanTextTransformer, SpacyTokenTransformer + +class RedditClassifier(object): + def __init__(self): + + self._clean_text_transformer = CleanTextTransformer() + self._spacy_tokenizer = SpacyTokenTransformer() + + with open('tfidf_vectorizer.model', 'rb') as model_file: + self._tfidf_vectorizer = dill.load(model_file) + + with open('lr.model', 'rb') as model_file: + self._lr_model = dill.load(model_file) + + def predict(self, X, feature_names): + clean_text = self._clean_text_transformer.transform(X) + spacy_tokens = self._spacy_tokenizer.transform(clean_text) + tfidf_features = self._tfidf_vectorizer.transform(spacy_tokens) + predictions = self._lr_model.predict_proba(tfidf_features) + return predictions + diff --git a/examples/kubeflow/pipeline/sklearn_spacy_text/__init__.py b/examples/kubeflow/pipeline/sklearn_spacy_text/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/examples/kubeflow/pipeline/sklearn_spacy_text/ml_utils.py b/examples/kubeflow/pipeline/sklearn_spacy_text/ml_utils.py new file mode 100644 index 0000000000..08cb189de9 --- /dev/null +++ b/examples/kubeflow/pipeline/sklearn_spacy_text/ml_utils.py @@ -0,0 +1,75 @@ +import spacy +from spacy.cli import download +import re +import numpy as np +from sklearn.base import TransformerMixin +from html.parser import HTMLParser +import dill +import sys, os + +download("en_core_web_sm") +nlp = spacy.load('en_core_web_sm', parser=False, entity=False) + +class SpacyTokenTransformer(TransformerMixin): + __symbols = set("!$%^&*()_+|~-=`{}[]:\";'<>?,./-") + + def transform(self, X, **kwargs): + f = np.vectorize(SpacyTokenTransformer.transform_to_token, otypes=[object]) + X_tokenized = f(X) + return X_tokenized + + def fit(self, X, y=None, **fit_params): + return self + + @staticmethod + def transform_to_token(text): + str_text = str(text) + doc = nlp(str_text, disable=['parser', 'tagger', 'ner']) + tokens = [] + for token in doc: + if token.like_url: + clean_token = "URL" + else: + clean_token = token.lemma_.lower().strip() + if len(clean_token) < 1 or clean_token in \ + SpacyTokenTransformer.__symbols: + continue + tokens.append(clean_token) + return tokens + +class CleanTextTransformer(TransformerMixin): + __html_parser = HTMLParser() + __uplus_pattern = \ + re.compile("\<[uU]\+(?P[a-zA-Z0-9]+)\>") + __markup_link_pattern = \ + re.compile("\[(.*)\]\((.*)\)") + + def transform(self, X, **kwargs): + f = np.vectorize(CleanTextTransformer.transform_clean_text) + X_clean = f(X) + return X_clean + + def fit(self, X, y=None, **fit_params): + return self + + @staticmethod + def transform_clean_text(raw_text): + try: + decoded = raw_text.encode("ISO-8859-1").decode("utf-8") + except: + decoded = raw_text.encode("ISO-8859-1").decode("cp1252") + html_unescaped = CleanTextTransformer.\ + __html_parser.unescape(decoded) + html_unescaped = re.sub(r"\r\n", " ", html_unescaped) + html_unescaped = re.sub(r"\r\r\n", " ", html_unescaped) + html_unescaped = re.sub(r"\r", " ", html_unescaped) + html_unescaped = html_unescaped.replace(">", " > ") + html_unescaped = html_unescaped.replace("<", " < ") + html_unescaped = html_unescaped.replace("--", " - ") + html_unescaped = CleanTextTransformer.__uplus_pattern.sub( + " U\g ", html_unescaped) + html_unescaped = CleanTextTransformer.__markup_link_pattern.sub( + " \1 \2 ", html_unescaped) + html_unescaped = html_unescaped.replace("\\", "") + return html_unescaped + \ No newline at end of file diff --git a/examples/kubeflow/pipeline/sklearn_spacy_text/reddit_clf.json b/examples/kubeflow/pipeline/sklearn_spacy_text/reddit_clf.json new file mode 100644 index 0000000000..66872421f7 --- /dev/null +++ b/examples/kubeflow/pipeline/sklearn_spacy_text/reddit_clf.json @@ -0,0 +1,53 @@ +{ + "apiVersion": "machinelearning.seldon.io/v1alpha2", + "kind": "SeldonDeployment", + "metadata": { + "labels": { + "app": "seldon" + }, + "name": "reddit-classifier" + }, + "spec": { + "annotations": { + "project_name": "Reddit classifier", + "deployment_version": "v1" + }, + "name": "reddit-classifier", + "oauth_key": "oauth-key", + "oauth_secret": "oauth-secret", + "predictors": [ + { + "componentSpecs": [{ + "spec": { + "containers": [ + { + "image": "reddit-classifier:0.1", + "imagePullPolicy": "IfNotPresent", + "name": "classifier", + "resources": { + "requests": { + "memory": "1Mi" + } + } + } + ], + "terminationGracePeriodSeconds": 20 + } + }], + "graph": { + "children": [], + "name": "classifier", + "endpoint": { + "type" : "REST" + }, + "type": "MODEL" + }, + "name": "single-model", + "replicas": 1, + "annotations": { + "predictor_version" : "v1" + } + } + ] + } +} diff --git a/examples/kubeflow/pipeline/sklearn_spacy_text/requirements.txt b/examples/kubeflow/pipeline/sklearn_spacy_text/requirements.txt new file mode 100644 index 0000000000..021017680f --- /dev/null +++ b/examples/kubeflow/pipeline/sklearn_spacy_text/requirements.txt @@ -0,0 +1,4 @@ +scipy>= 0.13.3 +scikit-learn>=0.18 +spacy==2.0.18 +dill==0.2.9 diff --git a/examples/kubeflow/pipeline/sklearn_spacy_text/sklearn_spacy_text_classifier_example.ipynb b/examples/kubeflow/pipeline/sklearn_spacy_text/sklearn_spacy_text_classifier_example.ipynb new file mode 100644 index 0000000000..1d84c72425 --- /dev/null +++ b/examples/kubeflow/pipeline/sklearn_spacy_text/sklearn_spacy_text_classifier_example.ipynb @@ -0,0 +1,1064 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Reddit classification\n", + "\n", + "We are wrapping a logistic regression model that receives the text output from a tfidf model that stores 1000 features.\n", + "\n", + "## Dependencies\n", + "\n", + "### Training\n", + "* Spacy\n", + "* Sklearn\n", + "* Seldon-core\n", + "\n", + "### Seldon\n", + "* Sklearn\n", + "* Dill\n" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: scipy>=0.13.3 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from -r requirements.txt (line 1)) (1.2.1)\n", + "Requirement already satisfied: scikit-learn>=0.18 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from -r requirements.txt (line 2)) (0.20.3)\n", + "Collecting spacy==2.0.18 (from -r requirements.txt (line 3))\n", + " Using cached https://files.pythonhosted.org/packages/cd/70/65504a011d7b262e73cfe470c36ca245a1f8e45b3b6661081289ffd72009/spacy-2.0.18-cp37-cp37m-manylinux1_x86_64.whl\n", + "Requirement already satisfied: dill==0.2.9 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from -r requirements.txt (line 4)) (0.2.9)\n", + "Requirement already satisfied: numpy>=1.8.2 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from scikit-learn>=0.18->-r requirements.txt (line 2)) (1.16.3)\n", + "Requirement already satisfied: ujson>=1.35 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from spacy==2.0.18->-r requirements.txt (line 3)) (1.35)\n", + "Requirement already satisfied: murmurhash<1.1.0,>=0.28.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from spacy==2.0.18->-r requirements.txt (line 3)) (1.0.2)\n", + "Requirement already satisfied: cymem<2.1.0,>=2.0.2 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from spacy==2.0.18->-r requirements.txt (line 3)) (2.0.2)\n", + "Requirement already satisfied: preshed<2.1.0,>=2.0.1 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from spacy==2.0.18->-r requirements.txt (line 3)) (2.0.1)\n", + "Collecting regex==2018.01.10 (from spacy==2.0.18->-r requirements.txt (line 3))\n", + "Requirement already satisfied: plac<1.0.0,>=0.9.6 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from spacy==2.0.18->-r requirements.txt (line 3)) (0.9.6)\n", + "Requirement already satisfied: thinc<6.13.0,>=6.12.1 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from spacy==2.0.18->-r requirements.txt (line 3)) (6.12.1)\n", + "Requirement already satisfied: requests<3.0.0,>=2.13.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from spacy==2.0.18->-r requirements.txt (line 3)) (2.21.0)\n", + "Collecting msgpack<0.6.0,>=0.5.6 (from thinc<6.13.0,>=6.12.1->spacy==2.0.18->-r requirements.txt (line 3))\n", + "Requirement already satisfied: msgpack-numpy<0.4.4 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from thinc<6.13.0,>=6.12.1->spacy==2.0.18->-r requirements.txt (line 3)) (0.4.3.2)\n", + "Requirement already satisfied: cytoolz<0.10,>=0.9.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from thinc<6.13.0,>=6.12.1->spacy==2.0.18->-r requirements.txt (line 3)) (0.9.0.1)\n", + "Requirement already satisfied: wrapt<1.11.0,>=1.10.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from thinc<6.13.0,>=6.12.1->spacy==2.0.18->-r requirements.txt (line 3)) (1.10.11)\n", + "Requirement already satisfied: tqdm<5.0.0,>=4.10.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from thinc<6.13.0,>=6.12.1->spacy==2.0.18->-r requirements.txt (line 3)) (4.31.1)\n", + "Requirement already satisfied: six<2.0.0,>=1.10.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from thinc<6.13.0,>=6.12.1->spacy==2.0.18->-r requirements.txt (line 3)) (1.12.0)\n", + "Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from requests<3.0.0,>=2.13.0->spacy==2.0.18->-r requirements.txt (line 3)) (3.0.4)\n", + "Requirement already satisfied: idna<2.9,>=2.5 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from requests<3.0.0,>=2.13.0->spacy==2.0.18->-r requirements.txt (line 3)) (2.8)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from requests<3.0.0,>=2.13.0->spacy==2.0.18->-r requirements.txt (line 3)) (2019.3.9)\n", + "Requirement already satisfied: urllib3<1.25,>=1.21.1 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from requests<3.0.0,>=2.13.0->spacy==2.0.18->-r requirements.txt (line 3)) (1.24.2)\n", + "Requirement already satisfied: toolz>=0.8.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from cytoolz<0.10,>=0.9.0->thinc<6.13.0,>=6.12.1->spacy==2.0.18->-r requirements.txt (line 3)) (0.9.0)\n", + "Installing collected packages: regex, spacy, msgpack\n", + " Found existing installation: regex 2019.4.14\n", + " Uninstalling regex-2019.4.14:\n", + " Successfully uninstalled regex-2019.4.14\n", + " Found existing installation: spacy 2.0.16\n", + " Uninstalling spacy-2.0.16:\n", + " Successfully uninstalled spacy-2.0.16\n", + " Found existing installation: msgpack 0.6.1\n", + " Uninstalling msgpack-0.6.1:\n", + " Successfully uninstalled msgpack-0.6.1\n", + "Successfully installed msgpack-0.5.6 regex-2018.1.10 spacy-2.0.18\n" + ] + } + ], + "source": [ + "# Let's first install any dependencies\n", + "!pip install -r requirements.txt\n", + "!pip install seldon-core" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\u001b[93m Linking successful\u001b[0m\n", + " /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages/en_core_web_sm\n", + " -->\n", + " /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages/spacy/data/en_core_web_sm\n", + "\n", + " You can now load the model via spacy.load('en_core_web_sm')\n", + "\n" + ] + } + ], + "source": [ + "import pandas as pd \n", + "from sklearn.model_selection import train_test_split\n", + "import numpy as np\n", + "from sklearn.feature_extraction.text import TfidfVectorizer\n", + "from sklearn.linear_model import LogisticRegression\n", + "from seldon_core.seldon_client import SeldonClient\n", + "import dill\n", + "import sys, os\n", + "\n", + "# This import may take a while as it will download the Spacy ENGLISH model\n", + "from ml_utils import CleanTextTransformer, SpacyTokenTransformer" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
prev_idxparent_idxbodyremoved
087568877Always be wary of news articles that cite unpu...0
173307432The problem I have with this is that the artic...0
21571115944This is indicative of a typical power law, and...0
316041625This doesn't make sense. Chess obviously trans...0
413327135201. I dispute that gene engineering is burdenso...0
\n", + "
" + ], + "text/plain": [ + " prev_idx parent_idx body \\\n", + "0 8756 8877 Always be wary of news articles that cite unpu... \n", + "1 7330 7432 The problem I have with this is that the artic... \n", + "2 15711 15944 This is indicative of a typical power law, and... \n", + "3 1604 1625 This doesn't make sense. Chess obviously trans... \n", + "4 13327 13520 1. I dispute that gene engineering is burdenso... \n", + "\n", + " removed \n", + "0 0 \n", + "1 0 \n", + "2 0 \n", + "3 0 \n", + "4 0 " + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_cols = [\"prev_idx\", \"parent_idx\", \"body\", \"removed\"]\n", + "\n", + "TEXT_COLUMN = \"body\" \n", + "CLEAN_COLUMN = \"clean_body\"\n", + "TOKEN_COLUMN = \"token_body\"\n", + "\n", + "# Downloading the 50k reddit dataset of moderated comments\n", + "df = pd.read_csv(\"https://raw.githubusercontent.com/axsauze/reddit-classification-exploration/master/data/reddit_train.csv\", \n", + " names=df_cols, skiprows=1, encoding=\"ISO-8859-1\")\n", + "\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Let's see how many examples we have of each class\n", + "df[\"removed\"].value_counts().plot.bar()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "x = df[\"body\"].values\n", + "y = df[\"removed\"].values\n", + "x_train, x_test, y_train, y_test = train_test_split(\n", + " x, y, \n", + " stratify=y, \n", + " random_state=42, \n", + " test_size=0.1, shuffle=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# Clean the text\n", + "clean_text_transformer = CleanTextTransformer()\n", + "x_train_clean = clean_text_transformer.transform(x_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# Tokenize the text and get the lemmas\n", + "spacy_tokenizer = SpacyTokenTransformer()\n", + "x_train_tokenized = spacy_tokenizer.transform(x_train_clean)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "TfidfVectorizer(analyzer='word', binary=False, decode_error='strict',\n", + " dtype=, encoding='utf-8', input='content',\n", + " lowercase=True, max_df=1.0, max_features=10000, min_df=1,\n", + " ngram_range=(1, 3), norm='l2',\n", + " preprocessor= at 0x7fce08047378>,\n", + " smooth_idf=True, stop_words=None, strip_accents=None,\n", + " sublinear_tf=False, token_pattern=None,\n", + " tokenizer= at 0x7fce080472f0>, use_idf=True,\n", + " vocabulary=None)" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Build tfidf vectorizer\n", + "tfidf_vectorizer = TfidfVectorizer(\n", + " max_features=10000,\n", + " preprocessor=lambda x: x, \n", + " tokenizer=lambda x: x, \n", + " token_pattern=None,\n", + " ngram_range=(1, 3))\n", + "\n", + "tfidf_vectorizer.fit(x_train_tokenized)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "# Transform our tokens to tfidf vectors\n", + "x_train_tfidf = tfidf_vectorizer.transform(\n", + " x_train_tokenized)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "LogisticRegression(C=0.1, class_weight=None, dual=False, fit_intercept=True,\n", + " intercept_scaling=1, max_iter=100, multi_class='warn',\n", + " n_jobs=None, penalty='l2', random_state=None, solver='sag',\n", + " tol=0.0001, verbose=0, warm_start=False)" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Train logistic regression classifier\n", + "lr = LogisticRegression(C=0.1, solver='sag')\n", + "lr.fit(x_train_tfidf, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "# These are the models we'll deploy\n", + "with open('tfidf_vectorizer.model', 'wb') as model_file:\n", + " dill.dump(tfidf_vectorizer, model_file)\n", + "with open('lr.model', 'wb') as model_file:\n", + " dill.dump(lr, model_file)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "import dill\r\n", + "\r\n", + "from ml_utils import CleanTextTransformer, SpacyTokenTransformer\r\n", + "\r\n", + "class RedditClassifier(object):\r\n", + " def __init__(self):\r\n", + " \r\n", + " self._clean_text_transformer = CleanTextTransformer()\r\n", + " self._spacy_tokenizer = SpacyTokenTransformer()\r\n", + " \r\n", + " with open('tfidf_vectorizer.model', 'rb') as model_file:\r\n", + " self._tfidf_vectorizer = dill.load(model_file)\r\n", + " \r\n", + " with open('lr.model', 'rb') as model_file:\r\n", + " self._lr_model = dill.load(model_file)\r\n", + "\r\n", + " def predict(self, X, feature_names):\r\n", + " clean_text = self._clean_text_transformer.transform(X)\r\n", + " spacy_tokens = self._spacy_tokenizer.transform(clean_text)\r\n", + " tfidf_features = self._tfidf_vectorizer.transform(spacy_tokens)\r\n", + " predictions = self._lr_model.predict_proba(tfidf_features)\r\n", + " return predictions\r\n", + "\r\n" + ] + } + ], + "source": [ + "# This is the class we will use to deploy\n", + "!cat RedditClassifier.py" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['This is the study that the article is based on:\\r\\n\\r\\nhttps://www.nature.com/articles/nature25778.epdf']\n", + "[[0.82767056 0.17232944]]\n" + ] + } + ], + "source": [ + "# test that our model works\n", + "from RedditClassifier import RedditClassifier\n", + "# With one sample\n", + "sample = x_test[0:1]\n", + "print(sample)\n", + "print(RedditClassifier().predict(sample, [\"feature_name\"]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Create Docker Image\n", + "Using the S2I command line interface we wrap our current model to seve it through the Seldon interface" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MODEL_NAME=RedditClassifier\r\n", + "API_TYPE=REST\r\n", + "SERVICE_TYPE=MODEL\r\n", + "PERSISTENCE=0\r\n" + ] + } + ], + "source": [ + "# To create a docker image we need to create the .s2i folder configuration as below:\n", + "!cat .s2i/environment" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "scipy>= 0.13.3\r\n", + "scikit-learn>=0.18\r\n", + "spacy==2.0.18\r\n", + "dill==0.2.9\r\n" + ] + } + ], + "source": [ + "# As well as a requirements.txt file with all the relevant dependencies\n", + "!cat requirements.txt" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---> Installing application source...\n", + "---> Installing dependencies ...\n", + "Looking in links: /whl\n", + "Collecting scipy>=0.13.3 (from -r requirements.txt (line 1))\n", + " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", + "Downloading https://files.pythonhosted.org/packages/72/4c/5f81e7264b0a7a8bd570810f48cd346ba36faedbd2ba255c873ad556de76/scipy-1.3.0-cp36-cp36m-manylinux1_x86_64.whl (25.2MB)\n", + "Collecting scikit-learn>=0.18 (from -r requirements.txt (line 2))\n", + " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", + "Downloading https://files.pythonhosted.org/packages/90/c7/401c231c445fb6fad135e92197da9c3e77983de169ff1887cc18af94498d/scikit_learn-0.21.1-cp36-cp36m-manylinux1_x86_64.whl (6.7MB)\n", + "Collecting spacy==2.0.18 (from -r requirements.txt (line 3))\n", + " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", + "Downloading https://files.pythonhosted.org/packages/ae/6e/a89da6b5c83f8811e46e3a9270c1aed90e9b9ee6c60faf52b7239e5d3d69/spacy-2.0.18-cp36-cp36m-manylinux1_x86_64.whl (25.2MB)\n", + "Collecting dill==0.2.9 (from -r requirements.txt (line 4))\n", + " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", + "Downloading https://files.pythonhosted.org/packages/fe/42/bfe2e0857bc284cbe6a011d93f2a9ad58a22cb894461b199ae72cfef0f29/dill-0.2.9.tar.gz (150kB)\n", + "Requirement already satisfied: numpy>=1.13.3 in /usr/local/lib/python3.6/site-packages (from scipy>=0.13.3->-r requirements.txt (line 1)) (1.16.3)\n", + "Collecting joblib>=0.11 (from scikit-learn>=0.18->-r requirements.txt (line 2))\n", + " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", + "Downloading https://files.pythonhosted.org/packages/cd/c1/50a758e8247561e58cb87305b1e90b171b8c767b15b12a1734001f41d356/joblib-0.13.2-py2.py3-none-any.whl (278kB)\n", + "Collecting preshed<2.1.0,>=2.0.1 (from spacy==2.0.18->-r requirements.txt (line 3))\n", + " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", + "Downloading https://files.pythonhosted.org/packages/20/93/f222fb957764a283203525ef20e62008675fd0a14ffff8cc1b1490147c63/preshed-2.0.1-cp36-cp36m-manylinux1_x86_64.whl (83kB)\n", + "Collecting ujson>=1.35 (from spacy==2.0.18->-r requirements.txt (line 3))\n", + " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", + "Downloading https://files.pythonhosted.org/packages/16/c4/79f3409bc710559015464e5f49b9879430d8f87498ecdc335899732e5377/ujson-1.35.tar.gz (192kB)\n", + "Collecting regex==2018.01.10 (from spacy==2.0.18->-r requirements.txt (line 3))\n", + " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", + "Downloading https://files.pythonhosted.org/packages/76/f4/7146c3812f96fcaaf2d06ff6862582302626a59011ccb6f2833bb38d80f7/regex-2018.01.10.tar.gz (612kB)\n", + "Requirement already satisfied: requests<3.0.0,>=2.13.0 in /usr/local/lib/python3.6/site-packages (from spacy==2.0.18->-r requirements.txt (line 3)) (2.21.0)\n", + "Collecting plac<1.0.0,>=0.9.6 (from spacy==2.0.18->-r requirements.txt (line 3))\n", + " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", + "Downloading https://files.pythonhosted.org/packages/9e/9b/62c60d2f5bc135d2aa1d8c8a86aaf84edb719a59c7f11a4316259e61a298/plac-0.9.6-py2.py3-none-any.whl\n", + "Collecting thinc<6.13.0,>=6.12.1 (from spacy==2.0.18->-r requirements.txt (line 3))\n", + " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", + "Downloading https://files.pythonhosted.org/packages/db/a7/46640a46fd707aeb204aa4257a70974b6a22a0204ba703164d803215776f/thinc-6.12.1-cp36-cp36m-manylinux1_x86_64.whl (1.9MB)\n", + " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", + "Collecting murmurhash<1.1.0,>=0.28.0 (from spacy==2.0.18->-r requirements.txt (line 3))\n", + "Downloading https://files.pythonhosted.org/packages/a6/e6/63f160a4fdf0e875d16b28f972083606d8d54f56cd30cb8929f9a1ee700e/murmurhash-1.0.2-cp36-cp36m-manylinux1_x86_64.whl\n", + "Collecting cymem<2.1.0,>=2.0.2 (from spacy==2.0.18->-r requirements.txt (line 3))\n", + " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", + "Downloading https://files.pythonhosted.org/packages/3d/61/9b0520c28eb199a4b1ca667d96dd625bba003c14c75230195f9691975f85/cymem-2.0.2-cp36-cp36m-manylinux1_x86_64.whl\n", + "Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python3.6/site-packages (from requests<3.0.0,>=2.13.0->spacy==2.0.18->-r requirements.txt (line 3)) (3.0.4)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/site-packages (from requests<3.0.0,>=2.13.0->spacy==2.0.18->-r requirements.txt (line 3)) (2019.3.9)\n", + "Requirement already satisfied: urllib3<1.25,>=1.21.1 in /usr/local/lib/python3.6/site-packages (from requests<3.0.0,>=2.13.0->spacy==2.0.18->-r requirements.txt (line 3)) (1.24.2)\n", + "Requirement already satisfied: idna<2.9,>=2.5 in /usr/local/lib/python3.6/site-packages (from requests<3.0.0,>=2.13.0->spacy==2.0.18->-r requirements.txt (line 3)) (2.8)\n", + "Collecting wrapt<1.11.0,>=1.10.0 (from thinc<6.13.0,>=6.12.1->spacy==2.0.18->-r requirements.txt (line 3))\n", + " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", + "Downloading https://files.pythonhosted.org/packages/a0/47/66897906448185fcb77fc3c2b1bc20ed0ecca81a0f2f88eda3fc5a34fc3d/wrapt-1.10.11.tar.gz\n", + "Collecting tqdm<5.0.0,>=4.10.0 (from thinc<6.13.0,>=6.12.1->spacy==2.0.18->-r requirements.txt (line 3))\n", + " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", + "Downloading https://files.pythonhosted.org/packages/45/af/685bf3ce889ea191f3b916557f5677cc95a5e87b2fa120d74b5dd6d049d0/tqdm-4.32.1-py2.py3-none-any.whl (49kB)\n", + "Collecting msgpack-numpy<0.4.4 (from thinc<6.13.0,>=6.12.1->spacy==2.0.18->-r requirements.txt (line 3))\n", + " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", + "Downloading https://files.pythonhosted.org/packages/ad/45/464be6da85b5ca893cfcbd5de3b31a6710f636ccb8521b17bd4110a08d94/msgpack_numpy-0.4.3.2-py2.py3-none-any.whl\n", + "Collecting msgpack<0.6.0,>=0.5.6 (from thinc<6.13.0,>=6.12.1->spacy==2.0.18->-r requirements.txt (line 3))\n", + " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", + "Downloading https://files.pythonhosted.org/packages/22/4e/dcf124fd97e5f5611123d6ad9f40ffd6eb979d1efdc1049e28a795672fcd/msgpack-0.5.6-cp36-cp36m-manylinux1_x86_64.whl (315kB)\n", + "Requirement already satisfied: six<2.0.0,>=1.10.0 in /usr/local/lib/python3.6/site-packages (from thinc<6.13.0,>=6.12.1->spacy==2.0.18->-r requirements.txt (line 3)) (1.12.0)\n", + "Collecting cytoolz<0.10,>=0.9.0 (from thinc<6.13.0,>=6.12.1->spacy==2.0.18->-r requirements.txt (line 3))\n", + " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", + "Downloading https://files.pythonhosted.org/packages/36/f4/9728ba01ccb2f55df9a5af029b48ba0aaca1081bbd7823ea2ee223ba7a42/cytoolz-0.9.0.1.tar.gz (443kB)\n", + "Collecting toolz>=0.8.0 (from cytoolz<0.10,>=0.9.0->thinc<6.13.0,>=6.12.1->spacy==2.0.18->-r requirements.txt (line 3))\n", + " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", + "Downloading https://files.pythonhosted.org/packages/14/d0/a73c15bbeda3d2e7b381a36afb0d9cd770a9f4adc5d1532691013ba881db/toolz-0.9.0.tar.gz (45kB)\n", + "Building wheels for collected packages: dill, ujson, regex, wrapt, cytoolz, toolz\n", + "Building wheel for dill (setup.py): started\n", + "Building wheel for dill (setup.py): finished with status 'done'\n", + "Stored in directory: /root/.cache/pip/wheels/5b/d7/0f/e58eae695403de585269f4e4a94e0cd6ca60ec0c202936fa4a\n", + "Building wheel for ujson (setup.py): started\n", + "Building wheel for ujson (setup.py): finished with status 'done'\n", + "Stored in directory: /root/.cache/pip/wheels/28/77/e4/0311145b9c2e2f01470e744855131f9e34d6919687550f87d1\n", + "Building wheel for regex (setup.py): started\n", + "Building wheel for regex (setup.py): finished with status 'done'\n", + "Stored in directory: /root/.cache/pip/wheels/74/17/3f/c77bba99efd74ba1a19862c9dd97f4b6d735e2826721dc00ff\n", + "Building wheel for wrapt (setup.py): started\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Building wheel for wrapt (setup.py): finished with status 'done'\n", + "Stored in directory: /root/.cache/pip/wheels/48/5d/04/22361a593e70d23b1f7746d932802efe1f0e523376a74f321e\n", + "Building wheel for cytoolz (setup.py): started\n", + "Building wheel for cytoolz (setup.py): finished with status 'done'\n", + "Stored in directory: /root/.cache/pip/wheels/88/f3/11/9817b001e59ab04889e8cffcbd9087e2e2155b9ebecfc8dd38\n", + "Building wheel for toolz (setup.py): started\n", + "Building wheel for toolz (setup.py): finished with status 'done'\n", + "Stored in directory: /root/.cache/pip/wheels/f4/0c/f6/ce6b2d1aa459ee97cc3c0f82236302bd62d89c86c700219463\n", + "Successfully built dill ujson regex wrapt cytoolz toolz\n", + "Installing collected packages: scipy, joblib, scikit-learn, cymem, preshed, ujson, regex, dill, plac, wrapt, tqdm, msgpack, msgpack-numpy, murmurhash, toolz, cytoolz, thinc, spacy\n", + "Successfully installed cymem-2.0.2 cytoolz-0.9.0.1 dill-0.2.9 joblib-0.13.2 msgpack-0.5.6 msgpack-numpy-0.4.3.2 murmurhash-1.0.2 plac-0.9.6 preshed-2.0.1 regex-2018.1.10 scikit-learn-0.21.1 scipy-1.3.0 spacy-2.0.18 thinc-6.12.1 toolz-0.9.0 tqdm-4.32.1 ujson-1.35 wrapt-1.10.11\n", + "WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", + "WARNING: You are using pip version 19.1, however version 19.1.1 is available.\n", + "You should consider upgrading via the 'pip install --upgrade pip' command.\n", + "Build completed successfully\n" + ] + } + ], + "source": [ + "!s2i build . seldonio/seldon-core-s2i-python3:0.6 reddit-classifier:0.1" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "reddit_predictor\r\n" + ] + } + ], + "source": [ + "# Remove previously deployed containers for this model\n", + "!docker rm -f reddit_predictor" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "812a02932fb6d61eb90727f99df051a67720a14de59504bbd808f1159fcda65e\r\n" + ] + } + ], + "source": [ + "!docker run --name \"reddit_predictor\" -d --rm -p 5001:5000 reddit-classifier:0.1" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2019-05-21T05:18:10.089008100Z starting microservice\n", + "2019-05-21T05:18:11.567254000Z 2019-05-21 05:18:11,566 - seldon_core.microservice:main:154 - INFO: Starting microservice.py:main\n", + "2019-05-21T05:18:11.568744400Z 2019-05-21 05:18:11,568 - seldon_core.microservice:main:185 - INFO: Annotations: {}\n", + "2019-05-21T05:18:12.629109700Z Collecting en_core_web_sm==2.0.0 from https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.0.0/en_core_web_sm-2.0.0.tar.gz#egg=en_core_web_sm==2.0.0\n", + "2019-05-21T05:18:13.675815500Z Downloading https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.0.0/en_core_web_sm-2.0.0.tar.gz (37.4MB)\n", + "2019-05-21T05:18:22.124982300Z Building wheels for collected packages: en-core-web-sm\n", + "2019-05-21T05:18:22.125493500Z Building wheel for en-core-web-sm (setup.py): started\n", + "2019-05-21T05:18:24.199642200Z Building wheel for en-core-web-sm (setup.py): finished with status 'done'\n", + "2019-05-21T05:18:24.199964600Z Stored in directory: /tmp/pip-ephem-wheel-cache-d7p16zav/wheels/54/7c/d8/f86364af8fbba7258e14adae115f18dd2c91552406edc3fdaa\n", + "2019-05-21T05:18:24.513275700Z Successfully built en-core-web-sm\n", + "2019-05-21T05:18:24.513295200Z Installing collected packages: en-core-web-sm\n", + "2019-05-21T05:18:24.579380500Z Successfully installed en-core-web-sm-2.0.0\n", + "2019-05-21T05:18:24.893582100Z WARNING: You are using pip version 19.1, however version 19.1.1 is available.\n", + "2019-05-21T05:18:24.893610900Z You should consider upgrading via the 'pip install --upgrade pip' command.\n", + "2019-05-21T05:18:26.083684000Z --- Logging error ---\n", + "2019-05-21T05:18:26.083710200Z Traceback (most recent call last):\n", + "2019-05-21T05:18:26.083714300Z File \"/usr/local/lib/python3.6/logging/__init__.py\", line 994, in emit\n", + "2019-05-21T05:18:26.083718000Z msg = self.format(record)\n", + "2019-05-21T05:18:26.083721100Z File \"/usr/local/lib/python3.6/logging/__init__.py\", line 840, in format\n", + "2019-05-21T05:18:26.083724100Z return fmt.format(record)\n", + "2019-05-21T05:18:26.083726900Z File \"/usr/local/lib/python3.6/logging/__init__.py\", line 577, in format\n", + "2019-05-21T05:18:26.083729900Z record.message = record.getMessage()\n", + "2019-05-21T05:18:26.083732600Z File \"/usr/local/lib/python3.6/logging/__init__.py\", line 338, in getMessage\n", + "2019-05-21T05:18:26.083735600Z msg = msg % self.args\n", + "2019-05-21T05:18:26.083738400Z TypeError: not all arguments converted during string formatting\n", + "2019-05-21T05:18:26.083741300Z Call stack:\n", + "2019-05-21T05:18:26.083744100Z File \"/usr/local/bin/seldon-core-microservice\", line 10, in \n", + "2019-05-21T05:18:26.083747200Z sys.exit(main())\n", + "2019-05-21T05:18:26.083749900Z File \"/usr/local/lib/python3.6/site-packages/seldon_core/microservice.py\", line 189, in main\n", + "2019-05-21T05:18:26.083752800Z logger.info(\"Importing \",args.interface_name)\n", + "2019-05-21T05:18:26.083755600Z Message: 'Importing '\n", + "2019-05-21T05:18:26.083758300Z Arguments: ('RedditClassifier',)\n", + "2019-05-21T05:18:26.083774500Z /usr/local/lib/python3.6/site-packages/sklearn/base.py:306: UserWarning: Trying to unpickle estimator TfidfTransformer from version 0.20.3 when using version 0.21.1. This might lead to breaking code or invalid results. Use at your own risk.\n", + "2019-05-21T05:18:26.083778100Z UserWarning)\n", + "2019-05-21T05:18:26.083781000Z /usr/local/lib/python3.6/site-packages/sklearn/base.py:306: UserWarning: Trying to unpickle estimator TfidfVectorizer from version 0.20.3 when using version 0.21.1. This might lead to breaking code or invalid results. Use at your own risk.\n", + "2019-05-21T05:18:26.083784100Z UserWarning)\n", + "2019-05-21T05:18:26.083786800Z /usr/local/lib/python3.6/site-packages/sklearn/base.py:306: UserWarning: Trying to unpickle estimator LogisticRegression from version 0.20.3 when using version 0.21.1. This might lead to breaking code or invalid results. Use at your own risk.\n", + "2019-05-21T05:18:26.083789900Z UserWarning)\n", + "2019-05-21T05:18:26.083792600Z 2019-05-21 05:18:26,082 - seldon_core.microservice:main:226 - INFO: REST microservice running on port 5000\n", + "2019-05-21T05:18:26.083795500Z 2019-05-21 05:18:26,083 - seldon_core.microservice:main:260 - INFO: Starting servers\n", + "2019-05-21T05:18:26.084624400Z \n", + "2019-05-21T05:18:26.084636400Z \u001b[93m Linking successful\u001b[0m\n", + "2019-05-21T05:18:26.084639800Z /usr/local/lib/python3.6/site-packages/en_core_web_sm -->\n", + "2019-05-21T05:18:26.084642700Z /usr/local/lib/python3.6/site-packages/spacy/data/en_core_web_sm\n", + "2019-05-21T05:18:26.084645500Z \n", + "2019-05-21T05:18:26.084648200Z You can now load the model via spacy.load('en_core_web_sm')\n", + "2019-05-21T05:18:26.084651000Z \n", + "2019-05-21T05:18:26.100898500Z * Serving Flask app \"seldon_core.wrapper\" (lazy loading)\n", + "2019-05-21T05:18:26.100924900Z * Environment: production\n", + "2019-05-21T05:18:26.100930600Z WARNING: Do not use the development server in a production environment.\n", + "2019-05-21T05:18:26.100936000Z Use a production WSGI server instead.\n", + "2019-05-21T05:18:26.100941400Z * Debug mode: off\n", + "2019-05-21T05:18:26.111993300Z 2019-05-21 05:18:26,111 - werkzeug:_log:122 - INFO: * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)\n", + "^C\n" + ] + } + ], + "source": [ + "# Here we need to wait until we see \"Linking successful\", as it's downloading the Spacy English model\n", + "# You can hit stop when this happens\n", + "!docker logs -t -f reddit_predictor" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Success:True message:\n", + "Request:\n", + "data {\n", + " names: \"tfidf\"\n", + " ndarray {\n", + " values {\n", + " string_value: \"This is the study that the article is based on:\\r\\n\\r\\nhttps://www.nature.com/articles/nature25778.epdf\"\n", + " }\n", + " }\n", + "}\n", + "\n", + "Response:\n", + "meta {\n", + "}\n", + "data {\n", + " names: \"t:0\"\n", + " names: \"t:1\"\n", + " ndarray {\n", + " values {\n", + " list_value {\n", + " values {\n", + " number_value: 0.8276705633548711\n", + " }\n", + " values {\n", + " number_value: 0.17232943664512895\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n" + ] + } + ], + "source": [ + "# We now test the REST endpoint expecting the same result\n", + "endpoint = \"0.0.0.0:5000\"\n", + "batch = sample\n", + "payload_type = \"ndarray\"\n", + "\n", + "sc = SeldonClient(microservice_endpoint=endpoint)\n", + "response = sc.microservice(\n", + " data=batch,\n", + " method=\"predict\",\n", + " payload_type=payload_type,\n", + " names=[\"tfidf\"])\n", + "\n", + "print(response)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "reddit_predictor\r\n" + ] + } + ], + "source": [ + "# We now stop it to run it in docker\n", + "!docker stop reddit_predictor" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Run in kubernetes cluster" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "NAME READY STATUS RESTARTS AGE\r\n", + "seldon-core-redis-master-0 1/1 Running 0 59s\r\n", + "seldon-core-seldon-apiserver-d8fd4cd68-5mzzt 1/1 Running 0 59s\r\n", + "seldon-core-seldon-cluster-manager-67c64974b6-d8cfb 1/1 Running 0 59s\r\n" + ] + } + ], + "source": [ + "# Make sure that seldon is running \n", + "!kubectl get pods " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# If not running you can install it\n", + "# First initialise helm\n", + "!kubectl create clusterrolebinding kube-system-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:default\n", + "!helm init\n", + "!kubectl rollout status deploy/tiller-deploy -n kube-system" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Then install and run seldon\n", + "helm install seldon-core-crd --name seldon-core-crd --repo https://storage.googleapis.com/seldon-charts\n", + "helm install seldon-core --name seldon-core --repo https://storage.googleapis.com/seldon-charts " + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\r\n", + " \"apiVersion\": \"machinelearning.seldon.io/v1alpha2\",\r\n", + " \"kind\": \"SeldonDeployment\",\r\n", + " \"metadata\": {\r\n", + " \"labels\": {\r\n", + " \"app\": \"seldon\"\r\n", + " },\r\n", + " \"name\": \"reddit-classifier\"\r\n", + " },\r\n", + " \"spec\": {\r\n", + " \"annotations\": {\r\n", + " \"project_name\": \"Reddit classifier\",\r\n", + " \"deployment_version\": \"v1\"\r\n", + " },\r\n", + " \"name\": \"reddit-classifier\",\r\n", + " \"oauth_key\": \"oauth-key\",\r\n", + " \"oauth_secret\": \"oauth-secret\",\r\n", + " \"predictors\": [\r\n", + " {\r\n", + " \"componentSpecs\": [{\r\n", + " \"spec\": {\r\n", + " \"containers\": [\r\n", + " {\r\n", + " \"image\": \"reddit-classifier:0.1\",\r\n", + " \"imagePullPolicy\": \"IfNotPresent\",\r\n", + " \"name\": \"classifier\",\r\n", + " \"resources\": {\r\n", + " \"requests\": {\r\n", + " \"memory\": \"1Mi\"\r\n", + " }\r\n", + " }\r\n", + " }\r\n", + " ],\r\n", + " \"terminationGracePeriodSeconds\": 20\r\n", + " }\r\n", + " }],\r\n", + " \"graph\": {\r\n", + " \"children\": [],\r\n", + " \"name\": \"classifier\",\r\n", + " \"endpoint\": {\r\n", + " \"type\" : \"REST\"\r\n", + " },\r\n", + " \"type\": \"MODEL\"\r\n", + " },\r\n", + " \"name\": \"single-model\",\r\n", + " \"replicas\": 1,\r\n", + " \"annotations\": {\r\n", + " \"predictor_version\" : \"v1\"\r\n", + " }\r\n", + " }\r\n", + " ]\r\n", + " }\r\n", + "}\r\n" + ] + } + ], + "source": [ + "# We'll use our seldon deployment file\n", + "!cat reddit_clf.json" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "seldondeployment.machinelearning.seldon.io/reddit-classifier created\r\n" + ] + } + ], + "source": [ + "!kubectl apply -f reddit_clf.json" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "NAME READY STATUS RESTARTS AGE\r\n", + "reddit-classifier-single-model-9199e4b-5c49c85c7d-mjvrh 2/2 Running 0 62s\r\n", + "seldon-core-redis-master-0 1/1 Running 0 2m14s\r\n", + "seldon-core-seldon-apiserver-d8fd4cd68-5mzzt 1/1 Running 0 2m14s\r\n", + "seldon-core-seldon-cluster-manager-67c64974b6-d8cfb 1/1 Running 0 2m14s\r\n" + ] + } + ], + "source": [ + "!kubectl get pods " + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "31203\r\n" + ] + } + ], + "source": [ + "!echo `kubectl get svc -l app=seldon-apiserver-container-app -o jsonpath='{.items[0].spec.ports[0].nodePort}'`" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WORKS!!!!\n", + "Success:True message:\n", + "Request:\n", + "data {\n", + " names: \"text\"\n", + " ndarray {\n", + " values {\n", + " string_value: \"This is the study that the article is based on:\\r\\n\\r\\nhttps://www.nature.com/articles/nature25778.epdf\"\n", + " }\n", + " }\n", + "}\n", + "\n", + "Response:\n", + "meta {\n", + " puid: \"9359cpdudo3b6i6cv82ktsl4pe\"\n", + " requestPath {\n", + " key: \"classifier\"\n", + " value: \"reddit-classifier:0.1\"\n", + " }\n", + "}\n", + "data {\n", + " names: \"t:0\"\n", + " names: \"t:1\"\n", + " ndarray {\n", + " values {\n", + " list_value {\n", + " values {\n", + " number_value: 0.8276705633548711\n", + " }\n", + " values {\n", + " number_value: 0.17232943664512895\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n" + ] + } + ], + "source": [ + "host = \"localhost\"\n", + "port = \"31203\" # Make sure you use the port above\n", + "batch = sample\n", + "payload_type = \"ndarray\"\n", + "\n", + "sc = SeldonClient(gateway=\"seldon\", seldon_rest_endpoint=host + \":\" + port,\n", + " oauth_key=\"oauth-key\", oauth_secret=\"oauth-secret\")\n", + "response = sc.predict(\n", + " data=batch, \n", + " deployment_name=\"mymodel\",\n", + " names=[\"text\"],\n", + " payload_type=payload_type)\n", + "\n", + "print(response)" + ] + }, + { + "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.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/kubeflow/pipeline/spacy_tokenize/Dockerfile b/examples/kubeflow/pipeline/spacy_tokenize/Dockerfile new file mode 100644 index 0000000000..edf57d2ca2 --- /dev/null +++ b/examples/kubeflow/pipeline/spacy_tokenize/Dockerfile @@ -0,0 +1,5 @@ +FROM python:3.7-slim +COPY . /app +WORKDIR /app +RUN pip install -r requirements.txt +RUN python -m spacy download en_core_web_sm diff --git a/examples/kubeflow/pipeline/spacy_tokenize/__init__.py b/examples/kubeflow/pipeline/spacy_tokenize/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/examples/kubeflow/pipeline/spacy_tokenize/pipeline_step.py b/examples/kubeflow/pipeline/spacy_tokenize/pipeline_step.py new file mode 100644 index 0000000000..8f6a7b9f52 --- /dev/null +++ b/examples/kubeflow/pipeline/spacy_tokenize/pipeline_step.py @@ -0,0 +1,48 @@ +import click +import numpy as np +import dill +import spacy + +nlp = spacy.load('en_core_web_sm', parser=False, entity=False) + +class SpacyTokenTransformer(): + __symbols = set("!$%^&*()_+|~-=`{}[]:\";'<>?,./-") + + def transform(self, X, **kwargs): + f = np.vectorize(SpacyTokenTransformer.transform_to_token, otypes=[object]) + X_tokenized = f(X) + return X_tokenized + + def fit(self, X, y=None, **fit_params): + return self + + @staticmethod + def transform_to_token(text): + str_text = str(text) + doc = nlp(str_text, disable=['parser', 'tagger', 'ner']) + tokens = [] + for token in doc: + if token.like_url: + clean_token = "URL" + else: + clean_token = token.lemma_.lower().strip() + if len(clean_token) < 1 or clean_token in \ + SpacyTokenTransformer.__symbols: + continue + tokens.append(clean_token) + return tokens + +@click.command() +@click.option('--in-path', default="/mnt/clean_text.data") +@click.option('--out-path', default="/mnt/tokenized_text.data") +def run_pipeline(in_path, out_path): + spacy_transformer = SpacyTokenTransformer() + with open(in_path, 'rb') as in_f: + x = dill.load(in_f) + y = spacy_transformer.transform(x) + with open(out_path, "wb") as out_f: + dill.dump(y, out_f) + +if __name__ == "__main__": + run_pipeline() + diff --git a/examples/kubeflow/pipeline/spacy_tokenize/requirements.txt b/examples/kubeflow/pipeline/spacy_tokenize/requirements.txt new file mode 100644 index 0000000000..8e8d782062 --- /dev/null +++ b/examples/kubeflow/pipeline/spacy_tokenize/requirements.txt @@ -0,0 +1,4 @@ +dill==0.2.9 +click +numpy +spacy diff --git a/examples/kubeflow/pipeline/tfidf_vectorizer/Dockerfile b/examples/kubeflow/pipeline/tfidf_vectorizer/Dockerfile new file mode 100644 index 0000000000..0caca3e8f6 --- /dev/null +++ b/examples/kubeflow/pipeline/tfidf_vectorizer/Dockerfile @@ -0,0 +1,4 @@ +FROM python:3.7-slim +COPY . /app +WORKDIR /app +RUN pip install -r requirements.txt diff --git a/examples/kubeflow/pipeline/tfidf_vectorizer/__init__.py b/examples/kubeflow/pipeline/tfidf_vectorizer/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/examples/kubeflow/pipeline/tfidf_vectorizer/pipeline_step.py b/examples/kubeflow/pipeline/tfidf_vectorizer/pipeline_step.py new file mode 100644 index 0000000000..a57d5b35bd --- /dev/null +++ b/examples/kubeflow/pipeline/tfidf_vectorizer/pipeline_step.py @@ -0,0 +1,47 @@ +import click +import numpy as np +import dill +from sklearn.feature_extraction.text import TfidfVectorizer + +@click.command() +@click.option('--in-path', default="/mnt/tokenized_text.data") +@click.option('--out-path', default="/mnt/tfidf_vectors.data") +@click.option('--max-features', default=1000) +@click.option('--ngram-range', default=3) +@click.option('--action', default="predict", + type=click.Choice(['predict', 'train'])) +@click.option('--model-path', default="/mnt/tfidf.model") +def run_pipeline( + in_path, + out_path, + max_features, + ngram_range, + action, + model_path): + + with open(in_path, 'rb') as in_f: + x = dill.load(in_f) + + if action == "train": + tfidf_vectorizer = TfidfVectorizer( + max_features=max_features, + preprocessor=lambda x: x, # We're using cleantext + tokenizer=lambda x: x, # We're using spacy + token_pattern=None, + ngram_range=(1, ngram_range)) + + tfidf_vectorizer.fit(x) + with open(model_path, "wb") as model_f: + dill.dump(tfidf_vectorizer, model_f) + elif action == "predict": + with open(model_path, "rb") as model_f: + tfidf_vectorizer = dill.load(model_f) + + y = tfidf_vectorizer.transform(x) + + with open(out_path, "wb") as out_f: + dill.dump(y, out_f) + +if __name__ == "__main__": + run_pipeline() + diff --git a/examples/kubeflow/pipeline/tfidf_vectorizer/requirements.txt b/examples/kubeflow/pipeline/tfidf_vectorizer/requirements.txt new file mode 100644 index 0000000000..4f2707419d --- /dev/null +++ b/examples/kubeflow/pipeline/tfidf_vectorizer/requirements.txt @@ -0,0 +1,4 @@ +dill==0.2.9 +click +numpy==1.16.3 +scikit-learn==0.20.3 diff --git a/examples/kubeflow/requirements.txt b/examples/kubeflow/requirements.txt new file mode 100644 index 0000000000..cac0f9189b --- /dev/null +++ b/examples/kubeflow/requirements.txt @@ -0,0 +1,3 @@ +python-dateutil +https://storage.googleapis.com/ml-pipeline/release/0.1.20/kfp.tar.gz +kubernetes diff --git a/examples/kubeflow/test/__init__.py b/examples/kubeflow/test/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/examples/kubeflow/test/clean_text.data b/examples/kubeflow/test/clean_text.data new file mode 100644 index 0000000000000000000000000000000000000000..6c50c26b2d2763f4a1abcd9a29c75d2d81343bef GIT binary patch literal 479 zcmaKmJx{|h5Qd$mKndmhYhlQkDFX`&TSrS7A|Yk7T*so3@^$WI$i@;X{vki7cU3Z! z0ZWg4_xiop{_;&;lx3`V50r6MqgC2D-3K6|qsvc=N+Y@eyd%A++Qy-(n!GD*0JH2x z2vK)c+sCGHHda+vVsXe+U8QjY{s8k7PO>E#m9wU)x9B>9aQY2rDJ;xkI;ivUBj-{K z5Ujj4TTO#~Z>rrDL&$EZ?{}#{G1ivxm^Qrx8TD|~ Yr$4sT^DOt1hcg&>KzK|Lo>F*@_nGlz!~g&Q literal 0 HcmV?d00001 diff --git a/examples/kubeflow/test/labels.data b/examples/kubeflow/test/labels.data new file mode 100644 index 0000000000000000000000000000000000000000..5b6c87c4453bbea52eaa5f71e98c57768e96e600 GIT binary patch literal 284 zcmY*TJyV1*6imR+czWk|;}4*swy?X-%urC#WpW{-%n)GXOF?IYH~wl3%r&>g7Q6d) z-*;;2rfqXIvrxucO;%~|^(eryBlE+O(nMZ>AL)%7dQZyrb!e?XQoS(7y5NQ}H@&yH za-pSW=~TgK`b0Y6q{L~pib3VA>ANrT!4S@Va9-lVEZ3r|506|*HbHFp4p)1uGRb8! z;rfuOX&mD0O_jv9<`rwnB;R9G;x?0M#iRO$yP_!G{~{KWjBvmE-EN|{U=Gc|1L3hC JJe7FP{{b1JS&RSx literal 0 HcmV?d00001 diff --git a/examples/kubeflow/test/raw_text.data b/examples/kubeflow/test/raw_text.data new file mode 100644 index 0000000000000000000000000000000000000000..6c50c26b2d2763f4a1abcd9a29c75d2d81343bef GIT binary patch literal 479 zcmaKmJx{|h5Qd$mKndmhYhlQkDFX`&TSrS7A|Yk7T*so3@^$WI$i@;X{vki7cU3Z! z0ZWg4_xiop{_;&;lx3`V50r6MqgC2D-3K6|qsvc=N+Y@eyd%A++Qy-(n!GD*0JH2x z2vK)c+sCGHHda+vVsXe+U8QjY{s8k7PO>E#m9wU)x9B>9aQY2rDJ;xkI;ivUBj-{K z5Ujj4TTO#~Z>rrDL&$EZ?{}#{G1ivxm^Qrx8TD|~ Yr$4sT^DOt1hcg&>KzK|Lo>F*@_nGlz!~g&Q literal 0 HcmV?d00001 diff --git a/examples/kubeflow/test/test_pipeline.py b/examples/kubeflow/test/test_pipeline.py new file mode 100644 index 0000000000..a8457d8af3 --- /dev/null +++ b/examples/kubeflow/test/test_pipeline.py @@ -0,0 +1,85 @@ +import click +from click.testing import CliRunner +import dill +import numpy as np + +from pipeline.clean_text.pipeline_step import run_pipeline as clean_cli +from pipeline.spacy_tokenize.pipeline_step import run_pipeline as spacy_cli +from pipeline.tfidf_vectorizer.pipeline_step import run_pipeline as tfidf_cli +from pipeline.lr_text_classifier.pipeline_step import run_pipeline as lr_cli + +import sys +sys.path.append("..") + +def test_pipeline(): + + runner = CliRunner() + + with runner.isolated_filesystem(): + # Creating test data + with open('raw_text.data', 'wb') as f: + raw_arr = np.array([ + "hello this is a test", + "another sentence to process"]) + dill.dump(raw_arr, f) + + # Test Clean text transformer + result = runner.invoke(clean_cli, [ + '--in-path', 'raw_text.data', + '--out-path', 'clean_text.data']) + + with open('raw_text.data', "rb") as f: + clean_arr = dill.load(f) + assert all(raw_arr == clean_arr) + + # Test spacy tokenizer + result = runner.invoke(spacy_cli, [ + '--in-path', 'clean_text.data', + '--out-path', 'tokenized_text.data']) + + with open('tokenized_text.data', "rb") as f: + tokenized_arr = dill.load(f) + expected_array = np.array([ + ["hello", "this", "be", "a", "test"], + ["another", "sentence", "to", "process"] + ]) + assert all(tokenized_arr == expected_array) + + # Test tfidf vectorizer + result = runner.invoke(tfidf_cli, [ + '--in-path', 'tokenized_text.data', + '--out-path', 'tfidf_vectors.data', + '--max-features', "10", + '--ngram-range', "3", + '--action', 'train', + '--model-path', 'tfidf.model']) + + with open("tfidf_vectors.data", "rb") as f: + tfidf_vectors = dill.load(f) + assert tfidf_vectors.shape == (2,10) + + with open("tfidf.model", "rb") as f: + assert f + + # Test lr model + + with open("labels.data", "wb") as f: + labels = np.array([0,1]) + dill.dump(labels, f) + + result = runner.invoke(lr_cli, [ + '--in-path', 'tfidf_vectors.data', + '--labels-path', 'labels.data', + '--out-path', 'prediction.data', + '--c_param', "0.1", + '--action', 'train', + '--model-path', 'lr_text.model']) + + with open("prediction.data", "rb") as f: + lr_prediction = dill.load(f) + print(lr_prediction) + assert lr_prediction + + with open("lr_text.model", "rb") as f: + assert f + diff --git a/examples/kubeflow/test/tfidf.model b/examples/kubeflow/test/tfidf.model new file mode 100644 index 0000000000000000000000000000000000000000..93a64385060eb871b35e4bd505d931eede24654d GIT binary patch literal 2475 zcmb_dS)0^E6zySHGk_rA3fk^H3f(v$j*6f*h|t(#7%(mvtCQ+Um~@g;slYTc0&0gD zP~7(o_kCY}1HZ&)eDTExy;bP}26^D~v%W9gN!6{o_nv#st%JQzG7@km!g7-{nF?<6 zQ7M=s{U|I;dN+oezT4c%9T^FK9~TA+{fE#qhG`{hMxjvf!#I`bwPw+~6NQq864R~O z^u!svR>a32c<=mO&d58O65Rm7u?_>C|GQ zw%f#wo7SJCbsG7sAFA1#YCW1!%BV~G1j}oN)klV*DyS`3ILxtv2+^CNtexzM9M(t! zCfcavP8xowzE)0Xg1d@fxY-HQR@^qI#7wSPZD2rqwsmc=>ipz3MDCMjBw9*ut4VLS zjA2blV-wOWZndUSq`?3NweHe{+e9JUHlCx=iX!RhncK&8qDk6NOk;w=z#S7BS+!1# zV8dAJB#s}q%Sp^c!plw~40`MqBT0@LxRd;^8^iiio=D;`O7pIoQ8O~!t;dK-AV)L>oe_?LiVt!gZoTu)`{DKI!#EuC8gf7B}2``)^349w;Ra)wL%B=YEJ_X z9L6@)35*UN>{{uf8Zb5B{%UMjZQ?M7OzbGtdUbnPi=Fj)eaqi8^iQoI@la!;TB1M; zs(+|j_0prLty-pPcdA{gCaKg1OXA_W#3Lpi)ff|eu@rdB+feehdOE&c9tHQf3a+mM z+uJcwT~0gC>v$y)JR!lzMZ<)nY2-4=;GW@tD+kSP_QPJDaB~n|p0ICXHzn--JJk_N zb=#ufD}SBX|L6Mu>mPwci{cGUL}|lXKq=VWi;5bhNa%J#tg%{I9#~mk1(4N3vTFLH z+_g_j)rOd`=IiaJdIT{a$&r~SkJ~5yIG{Cux_{V^-dsynE8!Ap2YXEH-G$MTwTR|e zNW$Wxn9#jM*BdX&2yM;y?h5wlSkJb@le$BAJP0D}*9B(-y@B$J3gr^zsbv;8_zLo#2^(WMep-_Y!^TxVO>U zto7Cq0X+{mao8dhZ@8?%nZbM*xkXudq z!to3rn)pa}sL6ui&K5@u!NC`V z$LPh`QV;~9F|yW(c#pFaEM&_xE9Fsbi^^eWN{Thry=GNDH?q!y8Lke(5jIY-8S{`6;oAIG?xr>U_IlRy zv0mc_4|sTrn<=(p9%Ug--{RJAIDG$`R=4rM;r8fk5c_I;8@{$hl3y#N1yV%vNDsgr zhwY)m-4yq_j;X%dS?rj8Y}QQY@4g{(54^c(hF!CDHt_K}Ec1wm4vz@2m*R2e`MGow z`+osq4>*{odt%N5eSCwb=YgK3cus-Lzfls3^5Ms?Z{PR6{(SepzIfsAlKj3(aoCQM EKU|a8F8}}l literal 0 HcmV?d00001 diff --git a/examples/kubeflow/test/tokenized_text.data b/examples/kubeflow/test/tokenized_text.data new file mode 100644 index 0000000000000000000000000000000000000000..2cea865f51568c169c8fefde21a55f0fbf5ae16c GIT binary patch literal 382 zcmY+8IZwkt5QXg=B$#mD5YEb#YdQ)#EE&nwHqpvikFX`%>$e^kktk?F#IJ_Mq{$Sc zIllL1KKm-oiz1MJ*^|mp!Xy)8l7$Dy-&npA%Y@l@a5v_8S!=_x)M;Cghn|=^j#IT| zy$F;x6v(nIIPW}VTPB>Lzr-NMP)sZ+4JlnUY+A+G`obv2SaoWzO4pBUht3k-i#x~8 z3KKtc!`>3RYbxbMZO`tBo^^YB!hYz4?g|Gn4*jq%Ts!^1Q4~e5KQ_7)J~NKz-!q)} zGo1QjXqk+PLgP#fY|UBT;Jh=O6D~TB1egCiY8Y2E!?iC)mQ5B`~s Date: Fri, 24 May 2019 08:38:43 +0100 Subject: [PATCH 02/22] added nlp pipeline --- examples/kubeflow/nlp_pipeline.py | 87 +++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 examples/kubeflow/nlp_pipeline.py diff --git a/examples/kubeflow/nlp_pipeline.py b/examples/kubeflow/nlp_pipeline.py new file mode 100644 index 0000000000..03034d01af --- /dev/null +++ b/examples/kubeflow/nlp_pipeline.py @@ -0,0 +1,87 @@ + +import kfp.dsl as dsl +from kubernetes import client as k8s + + +@dsl.pipeline( + name='NLP', + description='A pipeline demonstrating reproducible steps for NLP' +) +def nlp_pipeline( + raw_text_path='/mnt/text.data', + labels_path='/mnt/labels.data', + clean_text_path='/mnt/clean.data', + spacy_tokens_path='tokens.data', + tfidf_vectors_path='tfidf.data', + lr_prediction_path='prediction.data', + tfidf_model_path='/mnt/tfidf.model', + lr_model_path='/mnt/lr.model', + lr_c_param=0.1, + tfidf_max_features=10000, + tfidf_ngram_range=3, + batch_size='100'): + """ + Pipeline + """ + vop = dsl.VolumeOp( + name='my-pvc', + resource_name="my-pvc", + modes=["ReadWriteMany"], + size="2Gi" + ) + + clean_step = dsl.ContainerOp( + name='clean_text', + image='clean_text_transformer:0.1', + arguments=[ + "/app/pipeline_step.py", + "--in-path", raw_text_path, + "--out-path", clean_text_path, + ], + pvolumes={"/mnt": vop.volume} + ) + + tokenize_step = dsl.ContainerOp( + name='tokenize', + image='spacy_tokenizer:0.1', + arguments=[ + "/app/pipeline_step.py", + "--in-path", clean_text_path, + "--out-path", spacy_tokens_path, + ], + pvolumes={"/mnt": clean_step.pvolume} + ) + + vectorize_step = dsl.ContainerOp( + name='vectorize', + image='tfidf_vectorizer:0.1', + arguments=[ + "/app/pipeline_step.py", + "--in-path", spacy_tokens_path, + "--out-path", tfidf_vectors_path, + "--max-features", tfidf_max_features, + "--ngram-range", tfidf_ngram_range, + "--action", "train", + "--model-path", tfidf_model_path, + ], + pvolumes={"/mnt": tokenize_step.pvolume} + ) + + predict_step = dsl.ContainerOp( + name='predictor', + image='lr_text_classifier:0.1', + arguments=[ + "/app/pipeline_step.py", + "--in-path", tfidf_vectors_path, + "--labels-path", labels_path, + "--out-path", lr_prediction_path, + "--ngram-range", lr_c_param, + "--action", "train", + "--model-path", lr_model_path, + ], + pvolumes={"/mnt": vectorize_step.pvolume} + ) + +if __name__ == '__main__': + import kfp.compiler as compiler + compiler.Compiler().compile(nlp_pipeline, __file__ + '.tar.gz') From 515ada0f2136c5935a63a30c21489ef400381d20 Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Fri, 24 May 2019 09:57:32 +0100 Subject: [PATCH 03/22] added test pipeline --- examples/kubeflow/test/test_pipeline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/kubeflow/test/test_pipeline.py b/examples/kubeflow/test/test_pipeline.py index a8457d8af3..12bf55a008 100644 --- a/examples/kubeflow/test/test_pipeline.py +++ b/examples/kubeflow/test/test_pipeline.py @@ -28,7 +28,7 @@ def test_pipeline(): '--in-path', 'raw_text.data', '--out-path', 'clean_text.data']) - with open('raw_text.data', "rb") as f: + with open('clean_text.data', "rb") as f: clean_arr = dill.load(f) assert all(raw_arr == clean_arr) From 7dc326a0dc2226e2b7224f10ee3ef4edc35c05e6 Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Fri, 24 May 2019 11:30:27 +0100 Subject: [PATCH 04/22] added data downloader --- .../pipeline/data_downloader/Dockerfile | 4 +++ .../pipeline/data_downloader/__init__.py | 0 .../pipeline/data_downloader/pipeline_step.py | 32 +++++++++++++++++++ .../pipeline/data_downloader/requirements.txt | 5 +++ 4 files changed, 41 insertions(+) create mode 100644 examples/kubeflow/pipeline/data_downloader/Dockerfile create mode 100644 examples/kubeflow/pipeline/data_downloader/__init__.py create mode 100644 examples/kubeflow/pipeline/data_downloader/pipeline_step.py create mode 100644 examples/kubeflow/pipeline/data_downloader/requirements.txt diff --git a/examples/kubeflow/pipeline/data_downloader/Dockerfile b/examples/kubeflow/pipeline/data_downloader/Dockerfile new file mode 100644 index 0000000000..0caca3e8f6 --- /dev/null +++ b/examples/kubeflow/pipeline/data_downloader/Dockerfile @@ -0,0 +1,4 @@ +FROM python:3.7-slim +COPY . /app +WORKDIR /app +RUN pip install -r requirements.txt diff --git a/examples/kubeflow/pipeline/data_downloader/__init__.py b/examples/kubeflow/pipeline/data_downloader/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/examples/kubeflow/pipeline/data_downloader/pipeline_step.py b/examples/kubeflow/pipeline/data_downloader/pipeline_step.py new file mode 100644 index 0000000000..4b3726c156 --- /dev/null +++ b/examples/kubeflow/pipeline/data_downloader/pipeline_step.py @@ -0,0 +1,32 @@ +import click +import numpy as np +import dill +import pandas as pd + +@click.command() +@click.option('--labels-path', default="/mnt/labels.data") +@click.option('--features-path', default="/mnt/features.data") +@click.option('--csv-url', default="https://raw.githubusercontent.com/axsauze/reddit-classification-exploration/master/data/reddit_train.csv") +@click.option('--csv-encoding', default="ISO-8859-1") +@click.option('--features-column', default="BODY") +@click.option('--labels-column', default="REMOVED") +def run_pipeline( + labels_path, + features_path, + csv_url, + csv_encoding, + features_column, + labels_column): + + df = pd.read_csv(csv_url, encoding=csv_encoding) + x = df[features_column].values + y = df[labels_column].values + + with open(labels_path, "wb") as out_f: + dill.dump(y, out_f) + with open(features_path, "wb") as out_f: + dill.dump(y, out_f) + +if __name__ == "__main__": + run_pipeline() + diff --git a/examples/kubeflow/pipeline/data_downloader/requirements.txt b/examples/kubeflow/pipeline/data_downloader/requirements.txt new file mode 100644 index 0000000000..537ca0e8e8 --- /dev/null +++ b/examples/kubeflow/pipeline/data_downloader/requirements.txt @@ -0,0 +1,5 @@ +dill==0.2.9 +click +numpy==1.16.3 +pandas==0.24.2 + From 53958acac39b0b584967ec74a583f64e11a358c3 Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Fri, 24 May 2019 11:36:23 +0100 Subject: [PATCH 05/22] added pipeline --- examples/kubeflow/nlp_pipeline.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/examples/kubeflow/nlp_pipeline.py b/examples/kubeflow/nlp_pipeline.py index 03034d01af..23c66dabcf 100644 --- a/examples/kubeflow/nlp_pipeline.py +++ b/examples/kubeflow/nlp_pipeline.py @@ -8,6 +8,10 @@ description='A pipeline demonstrating reproducible steps for NLP' ) def nlp_pipeline( + csv_url="https://raw.githubusercontent.com/axsauze/reddit-classification-exploration/master/data/reddit_train.csv", + csv_encoding="ISO-8859-1", + features_column="BODY", + labels_colum="REMOVED", raw_text_path='/mnt/text.data', labels_path='/mnt/labels.data', clean_text_path='/mnt/clean.data', @@ -30,6 +34,21 @@ def nlp_pipeline( size="2Gi" ) + download_step = dsl.ContainerOp( + name='data_downloader', + image='data_downloader:0.1', + arguments=[ + "/app/pipeline_step.py", + "--labels-path", labels_path, + "--features-path", raw_text_path, + "--csv-url", csv_url, + "--csv-encoding", csv_encoding, + "--features-column", features_column, + "--labels-column", labels_column + ], + pvolumes={"/mnt": vop.volume} + ) + clean_step = dsl.ContainerOp( name='clean_text', image='clean_text_transformer:0.1', @@ -38,7 +57,7 @@ def nlp_pipeline( "--in-path", raw_text_path, "--out-path", clean_text_path, ], - pvolumes={"/mnt": vop.volume} + pvolumes={"/mnt": download_step.volume} ) tokenize_step = dsl.ContainerOp( From a764991e8712fff0ca8c36a365125380ee942e5c Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Fri, 24 May 2019 18:38:56 +0100 Subject: [PATCH 06/22] added data downloader --- .../pipeline/data_downloader/pipeline_step.py | 7 +++++-- .../pipeline/lr_text_classifier/pipeline_step.py | 2 +- .../lr_text_classifier/tfidf_vectors.data | Bin 643 -> 0 bytes 3 files changed, 6 insertions(+), 3 deletions(-) delete mode 100644 examples/kubeflow/pipeline/lr_text_classifier/tfidf_vectors.data diff --git a/examples/kubeflow/pipeline/data_downloader/pipeline_step.py b/examples/kubeflow/pipeline/data_downloader/pipeline_step.py index 4b3726c156..4996d5dfec 100644 --- a/examples/kubeflow/pipeline/data_downloader/pipeline_step.py +++ b/examples/kubeflow/pipeline/data_downloader/pipeline_step.py @@ -19,13 +19,16 @@ def run_pipeline( labels_column): df = pd.read_csv(csv_url, encoding=csv_encoding) + x = df[features_column].values + + with open(features_path, "wb") as out_f: + dill.dump(x, out_f) + y = df[labels_column].values with open(labels_path, "wb") as out_f: dill.dump(y, out_f) - with open(features_path, "wb") as out_f: - dill.dump(y, out_f) if __name__ == "__main__": run_pipeline() diff --git a/examples/kubeflow/pipeline/lr_text_classifier/pipeline_step.py b/examples/kubeflow/pipeline/lr_text_classifier/pipeline_step.py index 06014df54e..4b661961f5 100644 --- a/examples/kubeflow/pipeline/lr_text_classifier/pipeline_step.py +++ b/examples/kubeflow/pipeline/lr_text_classifier/pipeline_step.py @@ -7,7 +7,7 @@ @click.option('--in-path', default="/mnt/tfidf_vectors.data") @click.option('--labels-path', default="/mnt/labels.data") @click.option('--out-path', default="/mnt/lr_prediction.data") -@click.option('--c-param', default=1000) +@click.option('--c-param', default=0.1) @click.option('--action', default="predict", type=click.Choice(['predict', 'train'])) @click.option('--model-path', default="/mnt/lr_text.model") diff --git a/examples/kubeflow/pipeline/lr_text_classifier/tfidf_vectors.data b/examples/kubeflow/pipeline/lr_text_classifier/tfidf_vectors.data deleted file mode 100644 index 1651c9c81546869ae02c262d049669a33a919b40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 643 zcmb`D&2H2%6or#X+i6XqrRAqUp-?DI`3X?5V1dM9c32vrtg^E_j=_;8nH&K5@u!NC`V z$LPh`QV;~9F|yW(c#pFaEM&_xE9Fsbi^^eWN{Thry=GNDH?q!y8Lke(5jIY-8S{`6;oAIG?xr>U_IlRy zv0mc_4|sTrn<=(p9%Ug--{RJAIDG$`R=4rM;r8fk5c_I;8@{$hl3y#N1yV%vNDsgr zhwY)m-4yq_j;X%dS?rj8Y}QQY@4g{(54^c(hF!CDHt_K}Ec1wm4vz@2m*R2e`MGow z`+osq4>*{odt%N5eSCwb=YgK3cus-Lzfls3^5Ms?Z{PR6{(SepzIfsAlKj3(aoCQM EKU|a8F8}}l From a135c2fee1a11c2066bbac1320ecea52a3dac94a Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Fri, 24 May 2019 18:39:19 +0100 Subject: [PATCH 07/22] added tests for end to end --- examples/kubeflow/test/clean_text.data | Bin 479 -> 0 bytes examples/kubeflow/test/labels.data | Bin 284 -> 0 bytes examples/kubeflow/test/raw_text.data | Bin 479 -> 0 bytes examples/kubeflow/test/test_pipeline.py | 24 +++++++++++++++------ examples/kubeflow/test/tfidf.model | Bin 2475 -> 0 bytes examples/kubeflow/test/tfidf_vectors.data | Bin 643 -> 0 bytes examples/kubeflow/test/tokenized_text.data | Bin 382 -> 0 bytes 7 files changed, 18 insertions(+), 6 deletions(-) delete mode 100644 examples/kubeflow/test/clean_text.data delete mode 100644 examples/kubeflow/test/labels.data delete mode 100644 examples/kubeflow/test/raw_text.data delete mode 100644 examples/kubeflow/test/tfidf.model delete mode 100644 examples/kubeflow/test/tfidf_vectors.data delete mode 100644 examples/kubeflow/test/tokenized_text.data diff --git a/examples/kubeflow/test/clean_text.data b/examples/kubeflow/test/clean_text.data deleted file mode 100644 index 6c50c26b2d2763f4a1abcd9a29c75d2d81343bef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 479 zcmaKmJx{|h5Qd$mKndmhYhlQkDFX`&TSrS7A|Yk7T*so3@^$WI$i@;X{vki7cU3Z! z0ZWg4_xiop{_;&;lx3`V50r6MqgC2D-3K6|qsvc=N+Y@eyd%A++Qy-(n!GD*0JH2x z2vK)c+sCGHHda+vVsXe+U8QjY{s8k7PO>E#m9wU)x9B>9aQY2rDJ;xkI;ivUBj-{K z5Ujj4TTO#~Z>rrDL&$EZ?{}#{G1ivxm^Qrx8TD|~ Yr$4sT^DOt1hcg&>KzK|Lo>F*@_nGlz!~g&Q diff --git a/examples/kubeflow/test/labels.data b/examples/kubeflow/test/labels.data deleted file mode 100644 index 5b6c87c4453bbea52eaa5f71e98c57768e96e600..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 284 zcmY*TJyV1*6imR+czWk|;}4*swy?X-%urC#WpW{-%n)GXOF?IYH~wl3%r&>g7Q6d) z-*;;2rfqXIvrxucO;%~|^(eryBlE+O(nMZ>AL)%7dQZyrb!e?XQoS(7y5NQ}H@&yH za-pSW=~TgK`b0Y6q{L~pib3VA>ANrT!4S@Va9-lVEZ3r|506|*HbHFp4p)1uGRb8! z;rfuOX&mD0O_jv9<`rwnB;R9G;x?0M#iRO$yP_!G{~{KWjBvmE-EN|{U=Gc|1L3hC JJe7FP{{b1JS&RSx diff --git a/examples/kubeflow/test/raw_text.data b/examples/kubeflow/test/raw_text.data deleted file mode 100644 index 6c50c26b2d2763f4a1abcd9a29c75d2d81343bef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 479 zcmaKmJx{|h5Qd$mKndmhYhlQkDFX`&TSrS7A|Yk7T*so3@^$WI$i@;X{vki7cU3Z! z0ZWg4_xiop{_;&;lx3`V50r6MqgC2D-3K6|qsvc=N+Y@eyd%A++Qy-(n!GD*0JH2x z2vK)c+sCGHHda+vVsXe+U8QjY{s8k7PO>E#m9wU)x9B>9aQY2rDJ;xkI;ivUBj-{K z5Ujj4TTO#~Z>rrDL&$EZ?{}#{G1ivxm^Qrx8TD|~ Yr$4sT^DOt1hcg&>KzK|Lo>F*@_nGlz!~g&Q diff --git a/examples/kubeflow/test/test_pipeline.py b/examples/kubeflow/test/test_pipeline.py index 12bf55a008..9d80a6d08e 100644 --- a/examples/kubeflow/test/test_pipeline.py +++ b/examples/kubeflow/test/test_pipeline.py @@ -3,6 +3,7 @@ import dill import numpy as np +from pipeline.data_downloader.pipeline_step import run_pipeline as download_cli from pipeline.clean_text.pipeline_step import run_pipeline as clean_cli from pipeline.spacy_tokenize.pipeline_step import run_pipeline as spacy_cli from pipeline.tfidf_vectorizer.pipeline_step import run_pipeline as tfidf_cli @@ -16,12 +17,23 @@ def test_pipeline(): runner = CliRunner() with runner.isolated_filesystem(): - # Creating test data - with open('raw_text.data', 'wb') as f: - raw_arr = np.array([ - "hello this is a test", - "another sentence to process"]) - dill.dump(raw_arr, f) + + # Test Data Downloader + result = runner.invoke(download_cli, [ + '--labels-path', 'labels.data', + '--features-path', 'raw_text.data']) + + with open('raw_text.data', "rb") as f: + assert f + with open('labels.data', "rb") as f: + assert f + + ## Creating test data + #with open('raw_text.data', 'wb') as f: + # raw_arr = np.array([ + # "hello this is a test", + # "another sentence to process"]) + # dill.dump(raw_arr, f) # Test Clean text transformer result = runner.invoke(clean_cli, [ diff --git a/examples/kubeflow/test/tfidf.model b/examples/kubeflow/test/tfidf.model deleted file mode 100644 index 93a64385060eb871b35e4bd505d931eede24654d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2475 zcmb_dS)0^E6zySHGk_rA3fk^H3f(v$j*6f*h|t(#7%(mvtCQ+Um~@g;slYTc0&0gD zP~7(o_kCY}1HZ&)eDTExy;bP}26^D~v%W9gN!6{o_nv#st%JQzG7@km!g7-{nF?<6 zQ7M=s{U|I;dN+oezT4c%9T^FK9~TA+{fE#qhG`{hMxjvf!#I`bwPw+~6NQq864R~O z^u!svR>a32c<=mO&d58O65Rm7u?_>C|GQ zw%f#wo7SJCbsG7sAFA1#YCW1!%BV~G1j}oN)klV*DyS`3ILxtv2+^CNtexzM9M(t! zCfcavP8xowzE)0Xg1d@fxY-HQR@^qI#7wSPZD2rqwsmc=>ipz3MDCMjBw9*ut4VLS zjA2blV-wOWZndUSq`?3NweHe{+e9JUHlCx=iX!RhncK&8qDk6NOk;w=z#S7BS+!1# zV8dAJB#s}q%Sp^c!plw~40`MqBT0@LxRd;^8^iiio=D;`O7pIoQ8O~!t;dK-AV)L>oe_?LiVt!gZoTu)`{DKI!#EuC8gf7B}2``)^349w;Ra)wL%B=YEJ_X z9L6@)35*UN>{{uf8Zb5B{%UMjZQ?M7OzbGtdUbnPi=Fj)eaqi8^iQoI@la!;TB1M; zs(+|j_0prLty-pPcdA{gCaKg1OXA_W#3Lpi)ff|eu@rdB+feehdOE&c9tHQf3a+mM z+uJcwT~0gC>v$y)JR!lzMZ<)nY2-4=;GW@tD+kSP_QPJDaB~n|p0ICXHzn--JJk_N zb=#ufD}SBX|L6Mu>mPwci{cGUL}|lXKq=VWi;5bhNa%J#tg%{I9#~mk1(4N3vTFLH z+_g_j)rOd`=IiaJdIT{a$&r~SkJ~5yIG{Cux_{V^-dsynE8!Ap2YXEH-G$MTwTR|e zNW$Wxn9#jM*BdX&2yM;y?h5wlSkJb@le$BAJP0D}*9B(-y@B$J3gr^zsbv;8_zLo#2^(WMep-_Y!^TxVO>U zto7Cq0X+{mao8dhZ@8?%nZbM*xkXudq z!to3rn)pa}sL6ui&K5@u!NC`V z$LPh`QV;~9F|yW(c#pFaEM&_xE9Fsbi^^eWN{Thry=GNDH?q!y8Lke(5jIY-8S{`6;oAIG?xr>U_IlRy zv0mc_4|sTrn<=(p9%Ug--{RJAIDG$`R=4rM;r8fk5c_I;8@{$hl3y#N1yV%vNDsgr zhwY)m-4yq_j;X%dS?rj8Y}QQY@4g{(54^c(hF!CDHt_K}Ec1wm4vz@2m*R2e`MGow z`+osq4>*{odt%N5eSCwb=YgK3cus-Lzfls3^5Ms?Z{PR6{(SepzIfsAlKj3(aoCQM EKU|a8F8}}l diff --git a/examples/kubeflow/test/tokenized_text.data b/examples/kubeflow/test/tokenized_text.data deleted file mode 100644 index 2cea865f51568c169c8fefde21a55f0fbf5ae16c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 382 zcmY+8IZwkt5QXg=B$#mD5YEb#YdQ)#EE&nwHqpvikFX`%>$e^kktk?F#IJ_Mq{$Sc zIllL1KKm-oiz1MJ*^|mp!Xy)8l7$Dy-&npA%Y@l@a5v_8S!=_x)M;Cghn|=^j#IT| zy$F;x6v(nIIPW}VTPB>Lzr-NMP)sZ+4JlnUY+A+G`obv2SaoWzO4pBUht3k-i#x~8 z3KKtc!`>3RYbxbMZO`tBo^^YB!hYz4?g|Gn4*jq%Ts!^1Q4~e5KQ_7)J~NKz-!q)} zGo1QjXqk+PLgP#fY|UBT;Jh=O6D~TB1egCiY8Y2E!?iC)mQ5B`~s Date: Fri, 24 May 2019 18:52:31 +0100 Subject: [PATCH 08/22] changed to model --- .../pipeline/clean_text/.s2i/environment | 4 ++ .../kubeflow/pipeline/clean_text/Model.py | 40 ++++++++++++++++++ .../pipeline/clean_text/pipeline_step.py | 42 +------------------ 3 files changed, 46 insertions(+), 40 deletions(-) create mode 100644 examples/kubeflow/pipeline/clean_text/.s2i/environment create mode 100644 examples/kubeflow/pipeline/clean_text/Model.py diff --git a/examples/kubeflow/pipeline/clean_text/.s2i/environment b/examples/kubeflow/pipeline/clean_text/.s2i/environment new file mode 100644 index 0000000000..bf867a009a --- /dev/null +++ b/examples/kubeflow/pipeline/clean_text/.s2i/environment @@ -0,0 +1,4 @@ +MODEL_NAME=RedditClassifier +API_TYPE=REST +SERVICE_TYPE=MODEL +PERSISTENCE=0 diff --git a/examples/kubeflow/pipeline/clean_text/Model.py b/examples/kubeflow/pipeline/clean_text/Model.py new file mode 100644 index 0000000000..2813c5469f --- /dev/null +++ b/examples/kubeflow/pipeline/clean_text/Model.py @@ -0,0 +1,40 @@ +import re +from html.parser import HTMLParser +import numpy as np + +class Model(): + __html_parser = HTMLParser() + __uplus_pattern = \ + re.compile("\<[uU]\+(?P[a-zA-Z0-9]+)\>") + __markup_link_pattern = \ + re.compile("\[(.*)\]\((.*)\)") + + def transform(self, X, **kwargs): + f = np.vectorize(Model.transform_clean_text) + X_clean = f(X) + return X_clean + + def fit(self, X, y=None, **fit_params): + return self + + @staticmethod + def transform_clean_text(raw_text): + try: + decoded = raw_text.encode("ISO-8859-1").decode("utf-8") + except: + decoded = raw_text.encode("ISO-8859-1").decode("cp1252") + html_unescaped =Model.\ + __html_parser.unescape(decoded) + html_unescaped = re.sub(r"\r\n", " ", html_unescaped) + html_unescaped = re.sub(r"\r\r\n", " ", html_unescaped) + html_unescaped = re.sub(r"\r", " ", html_unescaped) + html_unescaped = html_unescaped.replace(">", " > ") + html_unescaped = html_unescaped.replace("<", " < ") + html_unescaped = html_unescaped.replace("--", " - ") + html_unescaped = Model.__uplus_pattern.sub( + " U\g ", html_unescaped) + html_unescaped = Model.__markup_link_pattern.sub( + " \1 \2 ", html_unescaped) + html_unescaped = html_unescaped.replace("\\", "") + return html_unescaped + diff --git a/examples/kubeflow/pipeline/clean_text/pipeline_step.py b/examples/kubeflow/pipeline/clean_text/pipeline_step.py index a4e1239c72..2c9662c4fe 100644 --- a/examples/kubeflow/pipeline/clean_text/pipeline_step.py +++ b/examples/kubeflow/pipeline/clean_text/pipeline_step.py @@ -1,51 +1,13 @@ -import re -from html.parser import HTMLParser import dill import click -import numpy as np import dill - -class CleanTextTransformer(): - __html_parser = HTMLParser() - __uplus_pattern = \ - re.compile("\<[uU]\+(?P[a-zA-Z0-9]+)\>") - __markup_link_pattern = \ - re.compile("\[(.*)\]\((.*)\)") - - def transform(self, X, **kwargs): - f = np.vectorize(CleanTextTransformer.transform_clean_text) - X_clean = f(X) - return X_clean - - def fit(self, X, y=None, **fit_params): - return self - - @staticmethod - def transform_clean_text(raw_text): - try: - decoded = raw_text.encode("ISO-8859-1").decode("utf-8") - except: - decoded = raw_text.encode("ISO-8859-1").decode("cp1252") - html_unescaped = CleanTextTransformer.\ - __html_parser.unescape(decoded) - html_unescaped = re.sub(r"\r\n", " ", html_unescaped) - html_unescaped = re.sub(r"\r\r\n", " ", html_unescaped) - html_unescaped = re.sub(r"\r", " ", html_unescaped) - html_unescaped = html_unescaped.replace(">", " > ") - html_unescaped = html_unescaped.replace("<", " < ") - html_unescaped = html_unescaped.replace("--", " - ") - html_unescaped = CleanTextTransformer.__uplus_pattern.sub( - " U\g ", html_unescaped) - html_unescaped = CleanTextTransformer.__markup_link_pattern.sub( - " \1 \2 ", html_unescaped) - html_unescaped = html_unescaped.replace("\\", "") - return html_unescaped +from .Model import Model @click.command() @click.option('--in-path', default="/mnt/raw_text.data") @click.option('--out-path', default="/mnt/clean_text.data") def run_pipeline(in_path, out_path): - clean_text_transformer = CleanTextTransformer() + clean_text_transformer = Model() with open(in_path, 'rb') as in_f: x = dill.load(in_f) y = clean_text_transformer.transform(x) From a580c0304fba8a0c6c25024a49f04216b6330f65 Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Fri, 24 May 2019 18:58:58 +0100 Subject: [PATCH 09/22] added spacy --- .../pipeline/spacy_tokenize/.s2i/environment | 4 +++ .../pipeline/spacy_tokenize/Transformer.py | 32 +++++++++++++++++ .../pipeline/spacy_tokenize/build_image.sh | 4 +++ .../pipeline/spacy_tokenize/pipeline_step.py | 34 ++----------------- 4 files changed, 42 insertions(+), 32 deletions(-) create mode 100644 examples/kubeflow/pipeline/spacy_tokenize/.s2i/environment create mode 100644 examples/kubeflow/pipeline/spacy_tokenize/Transformer.py create mode 100644 examples/kubeflow/pipeline/spacy_tokenize/build_image.sh diff --git a/examples/kubeflow/pipeline/spacy_tokenize/.s2i/environment b/examples/kubeflow/pipeline/spacy_tokenize/.s2i/environment new file mode 100644 index 0000000000..1edcfa1db0 --- /dev/null +++ b/examples/kubeflow/pipeline/spacy_tokenize/.s2i/environment @@ -0,0 +1,4 @@ +MODEL_NAME=Transformer +API_TYPE=REST +SERVICE_TYPE=MODEL +PERSISTENCE=0 diff --git a/examples/kubeflow/pipeline/spacy_tokenize/Transformer.py b/examples/kubeflow/pipeline/spacy_tokenize/Transformer.py new file mode 100644 index 0000000000..0ad6e5aca1 --- /dev/null +++ b/examples/kubeflow/pipeline/spacy_tokenize/Transformer.py @@ -0,0 +1,32 @@ +import spacy +import numpy as np + +nlp = spacy.load('en_core_web_sm', parser=False, entity=False) + +class Transformer(): + __symbols = set("!$%^&*()_+|~-=`{}[]:\";'<>?,./-") + + def transform(self, X, **kwargs): + f = np.vectorize(Transformer.transform_to_token, otypes=[object]) + X_tokenized = f(X) + return X_tokenized + + def fit(self, X, y=None, **fit_params): + return self + + @staticmethod + def transform_to_token(text): + str_text = str(text) + doc = nlp(str_text, disable=['parser', 'tagger', 'ner']) + tokens = [] + for token in doc: + if token.like_url: + clean_token = "URL" + else: + clean_token = token.lemma_.lower().strip() + if len(clean_token) < 1 or clean_token in \ + Transformer.__symbols: + continue + tokens.append(clean_token) + return tokens + diff --git a/examples/kubeflow/pipeline/spacy_tokenize/build_image.sh b/examples/kubeflow/pipeline/spacy_tokenize/build_image.sh new file mode 100644 index 0000000000..d6a6078a2d --- /dev/null +++ b/examples/kubeflow/pipeline/spacy_tokenize/build_image.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +s2i build . seldonio/seldon-core-s2i-python3:0.6 spacy_tokenizer:0.1 + diff --git a/examples/kubeflow/pipeline/spacy_tokenize/pipeline_step.py b/examples/kubeflow/pipeline/spacy_tokenize/pipeline_step.py index 8f6a7b9f52..e30ac49208 100644 --- a/examples/kubeflow/pipeline/spacy_tokenize/pipeline_step.py +++ b/examples/kubeflow/pipeline/spacy_tokenize/pipeline_step.py @@ -1,42 +1,12 @@ import click -import numpy as np import dill -import spacy - -nlp = spacy.load('en_core_web_sm', parser=False, entity=False) - -class SpacyTokenTransformer(): - __symbols = set("!$%^&*()_+|~-=`{}[]:\";'<>?,./-") - - def transform(self, X, **kwargs): - f = np.vectorize(SpacyTokenTransformer.transform_to_token, otypes=[object]) - X_tokenized = f(X) - return X_tokenized - - def fit(self, X, y=None, **fit_params): - return self - - @staticmethod - def transform_to_token(text): - str_text = str(text) - doc = nlp(str_text, disable=['parser', 'tagger', 'ner']) - tokens = [] - for token in doc: - if token.like_url: - clean_token = "URL" - else: - clean_token = token.lemma_.lower().strip() - if len(clean_token) < 1 or clean_token in \ - SpacyTokenTransformer.__symbols: - continue - tokens.append(clean_token) - return tokens +from .Transformer import Transformer @click.command() @click.option('--in-path', default="/mnt/clean_text.data") @click.option('--out-path', default="/mnt/tokenized_text.data") def run_pipeline(in_path, out_path): - spacy_transformer = SpacyTokenTransformer() + spacy_transformer = Transformer() with open(in_path, 'rb') as in_f: x = dill.load(in_f) y = spacy_transformer.transform(x) From 79c06e75070a0f25f17a94136a837983126a6b75 Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Sat, 25 May 2019 09:06:20 +0100 Subject: [PATCH 10/22] Moved to s2i for seldon pipeline --- .gitignore | 3 +- examples/kubeflow/mnist_pipeline.py | 89 -- examples/kubeflow/nlp_pipeline.py | 27 +- examples/kubeflow/pipeline.yaml | 170 --- .../pipeline/clean_text/.s2i/environment | 2 +- .../clean_text/{Model.py => Transformer.py} | 10 +- .../pipeline/clean_text/build_image.sh | 4 + .../pipeline/clean_text/pipeline_step.py | 4 +- .../.s2i/environment | 2 +- .../lr_text_classifier/Transformer.py | 14 + .../lr_text_classifier/build_image.sh | 4 + .../sklearn_spacy_text/RedditClassifier.py | 23 - .../pipeline/sklearn_spacy_text/__init__.py | 0 .../pipeline/sklearn_spacy_text/ml_utils.py | 75 -- .../sklearn_spacy_text/reddit_clf.json | 53 - .../sklearn_spacy_text/requirements.txt | 4 - ...klearn_spacy_text_classifier_example.ipynb | 1064 ----------------- .../pipeline/spacy_tokenize/Transformer.py | 2 + .../pipeline/spacy_tokenize/build_image.sh | 0 .../tfidf_vectorizer/.s2i/environment | 4 + .../pipeline/tfidf_vectorizer/Transformer.py | 14 + .../pipeline/tfidf_vectorizer/build_image.sh | 4 + .../tfidf_vectorizer/pipeline_step.py | 1 + .../kubeflow/seldon_production_pipeline.yaml | 49 + examples/kubeflow/test/test_pipeline.py | 38 +- 25 files changed, 141 insertions(+), 1519 deletions(-) delete mode 100644 examples/kubeflow/mnist_pipeline.py delete mode 100644 examples/kubeflow/pipeline.yaml rename examples/kubeflow/pipeline/clean_text/{Model.py => Transformer.py} (83%) create mode 100755 examples/kubeflow/pipeline/clean_text/build_image.sh rename examples/kubeflow/pipeline/{sklearn_spacy_text => lr_text_classifier}/.s2i/environment (62%) create mode 100644 examples/kubeflow/pipeline/lr_text_classifier/Transformer.py create mode 100755 examples/kubeflow/pipeline/lr_text_classifier/build_image.sh delete mode 100644 examples/kubeflow/pipeline/sklearn_spacy_text/RedditClassifier.py delete mode 100644 examples/kubeflow/pipeline/sklearn_spacy_text/__init__.py delete mode 100644 examples/kubeflow/pipeline/sklearn_spacy_text/ml_utils.py delete mode 100644 examples/kubeflow/pipeline/sklearn_spacy_text/reddit_clf.json delete mode 100644 examples/kubeflow/pipeline/sklearn_spacy_text/requirements.txt delete mode 100644 examples/kubeflow/pipeline/sklearn_spacy_text/sklearn_spacy_text_classifier_example.ipynb mode change 100644 => 100755 examples/kubeflow/pipeline/spacy_tokenize/build_image.sh create mode 100644 examples/kubeflow/pipeline/tfidf_vectorizer/.s2i/environment create mode 100644 examples/kubeflow/pipeline/tfidf_vectorizer/Transformer.py create mode 100755 examples/kubeflow/pipeline/tfidf_vectorizer/build_image.sh create mode 100644 examples/kubeflow/seldon_production_pipeline.yaml diff --git a/.gitignore b/.gitignore index ef68dccc41..0200d96402 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ /target/ /public cluster-manager/.m2/ +.mypy_cache .ipynb_checkpoints @@ -202,4 +203,4 @@ wrappers/s2i/python/_python/ seldon-controller/go -testing/scripts/go \ No newline at end of file +testing/scripts/go diff --git a/examples/kubeflow/mnist_pipeline.py b/examples/kubeflow/mnist_pipeline.py deleted file mode 100644 index 923be7a4da..0000000000 --- a/examples/kubeflow/mnist_pipeline.py +++ /dev/null @@ -1,89 +0,0 @@ -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -""" -Kubeflow Pipelines MNIST example - -Run this script to compile pipeline -""" - - -import kfp.dsl as dsl -from kubernetes import client as k8s - - -@dsl.pipeline( - name='MNIST', - description='A pipeline to train and serve the MNIST example.' -) -def mnist_pipeline(model_export_dir='/mnt/export', - train_steps='200', - learning_rate='0.01', - batch_size='100'): - """ - Pipeline with three stages: - 1. train an MNIST classifier - 2. deploy a tf-serving instance to the cluster - 3. deploy a web-ui to interact with it - """ - vop = dsl.VolumeOp( - name='{{workflow.name}}-my-pvc', - resource_name="my-pvc", - modes=["ReadWriteMany"], - size="2Gi" - ) - - train = dsl.ContainerOp( - name='train', - image='gcr.io/kubeflow-examples/mnist/model:v20190304-v0.2-176-g15d997b', - arguments=[ - "/opt/model.py", - "--tf-export-dir", model_export_dir, - "--tf-train-steps", train_steps, - "--tf-batch-size", batch_size, - "--tf-learning-rate", learning_rate - ], - pvolumes={"/mnt": vop.volume} - ) - - serve = dsl.ContainerOp( - name='serve', - image='gcr.io/ml-pipeline/ml-pipeline-kubeflow-deployer:' - '7775692adf28d6f79098e76e839986c9ee55dd61', - arguments=[ - '--model-export-path', model_export_dir, - '--server-name', "mnist-service" - ], - pvolumes={"/mnt": train.pvolume} - ) - - web_ui = dsl.ContainerOp( - name='web-ui', - image='gcr.io/kubeflow-examples/mnist/deploy-service:latest', - arguments=[ - '--image', 'gcr.io/kubeflow-examples/mnist/web-ui:' - 'v20190304-v0.2-176-g15d997b-pipelines', - '--name', 'web-ui', - '--container-port', '5000', - '--service-port', '80', - '--service-type', "LoadBalancer" - ], - pvolumes={"/mnt": serve.pvolume} - ) - - web_ui.after(serve) - - -if __name__ == '__main__': - import kfp.compiler as compiler - compiler.Compiler().compile(mnist_pipeline, __file__ + '.tar.gz') diff --git a/examples/kubeflow/nlp_pipeline.py b/examples/kubeflow/nlp_pipeline.py index 23c66dabcf..a7e38f751d 100644 --- a/examples/kubeflow/nlp_pipeline.py +++ b/examples/kubeflow/nlp_pipeline.py @@ -11,13 +11,13 @@ def nlp_pipeline( csv_url="https://raw.githubusercontent.com/axsauze/reddit-classification-exploration/master/data/reddit_train.csv", csv_encoding="ISO-8859-1", features_column="BODY", - labels_colum="REMOVED", + labels_column="REMOVED", raw_text_path='/mnt/text.data', labels_path='/mnt/labels.data', clean_text_path='/mnt/clean.data', - spacy_tokens_path='tokens.data', - tfidf_vectors_path='tfidf.data', - lr_prediction_path='prediction.data', + spacy_tokens_path='/mnt/tokens.data', + tfidf_vectors_path='/mnt/tfidf.data', + lr_prediction_path='/mnt/prediction.data', tfidf_model_path='/mnt/tfidf.model', lr_model_path='/mnt/lr.model', lr_c_param=0.1, @@ -37,8 +37,9 @@ def nlp_pipeline( download_step = dsl.ContainerOp( name='data_downloader', image='data_downloader:0.1', + command="python", arguments=[ - "/app/pipeline_step.py", + "/microservice/pipeline_step.py", "--labels-path", labels_path, "--features-path", raw_text_path, "--csv-url", csv_url, @@ -52,19 +53,21 @@ def nlp_pipeline( clean_step = dsl.ContainerOp( name='clean_text', image='clean_text_transformer:0.1', + command="python", arguments=[ - "/app/pipeline_step.py", + "/microservice/pipeline_step.py", "--in-path", raw_text_path, "--out-path", clean_text_path, ], - pvolumes={"/mnt": download_step.volume} + pvolumes={"/mnt": download_step.pvolume} ) tokenize_step = dsl.ContainerOp( name='tokenize', image='spacy_tokenizer:0.1', + command="python", arguments=[ - "/app/pipeline_step.py", + "/microservice/pipeline_step.py", "--in-path", clean_text_path, "--out-path", spacy_tokens_path, ], @@ -74,8 +77,9 @@ def nlp_pipeline( vectorize_step = dsl.ContainerOp( name='vectorize', image='tfidf_vectorizer:0.1', + command="python", arguments=[ - "/app/pipeline_step.py", + "/microservice/pipeline_step.py", "--in-path", spacy_tokens_path, "--out-path", tfidf_vectors_path, "--max-features", tfidf_max_features, @@ -89,12 +93,13 @@ def nlp_pipeline( predict_step = dsl.ContainerOp( name='predictor', image='lr_text_classifier:0.1', + command="python", arguments=[ - "/app/pipeline_step.py", + "/microservice/pipeline_step.py", "--in-path", tfidf_vectors_path, "--labels-path", labels_path, "--out-path", lr_prediction_path, - "--ngram-range", lr_c_param, + "--c-param", lr_c_param, "--action", "train", "--model-path", lr_model_path, ], diff --git a/examples/kubeflow/pipeline.yaml b/examples/kubeflow/pipeline.yaml deleted file mode 100644 index 07cd8280ea..0000000000 --- a/examples/kubeflow/pipeline.yaml +++ /dev/null @@ -1,170 +0,0 @@ -apiVersion: argoproj.io/v1alpha1 -kind: Workflow -metadata: - generateName: mnist- -spec: - arguments: - parameters: - - name: model-export-dir - value: /mnt/export - - name: create-pvc - value: my-pvc - - name: train-steps - value: '200' - - name: learning-rate - value: '0.01' - - name: batch-size - value: '100' - entrypoint: mnist - serviceAccountName: pipeline-runner - templates: - - name: create-pvc - outputs: - parameters: - - name: create-pvc-manifest - valueFrom: - jsonPath: '{}' - - name: create-pvc-name - valueFrom: - jsonPath: '{.metadata.name}' - - name: create-pvc-size - valueFrom: - jsonPath: '{.status.capacity.storage}' - resource: - action: create - manifest: "apiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n name: '{{workflow.name}}-my-pvc'\n\ - spec:\n accessModes:\n - ReadWriteMany\n resources:\n requests:\n \ - \ storage: 2Gi\n" - - dag: - tasks: - - name: create-pvc - template: create-pvc - - arguments: - parameters: - - name: create-pvc-name - value: '{{tasks.create-pvc.outputs.parameters.create-pvc-name}}' - - name: model-export-dir - value: '{{inputs.parameters.model-export-dir}}' - dependencies: - - create-pvc - - train - name: serve - template: serve - - arguments: - parameters: - - name: batch-size - value: '{{inputs.parameters.batch-size}}' - - name: create-pvc-name - value: '{{tasks.create-pvc.outputs.parameters.create-pvc-name}}' - - name: learning-rate - value: '{{inputs.parameters.learning-rate}}' - - name: model-export-dir - value: '{{inputs.parameters.model-export-dir}}' - - name: train-steps - value: '{{inputs.parameters.train-steps}}' - dependencies: - - create-pvc - name: train - template: train - - arguments: - parameters: - - name: create-pvc-name - value: '{{tasks.create-pvc.outputs.parameters.create-pvc-name}}' - dependencies: - - create-pvc - - serve - name: web-ui - template: web-ui - inputs: - parameters: - - name: batch-size - - name: learning-rate - - name: model-export-dir - - name: train-steps - name: mnist - - container: - args: - - --model-export-path - - '{{inputs.parameters.model-export-dir}}' - - --server-name - - mnist-service - image: gcr.io/ml-pipeline/ml-pipeline-kubeflow-deployer:7775692adf28d6f79098e76e839986c9ee55dd61 - volumeMounts: - - mountPath: /mnt - name: create-pvc - inputs: - parameters: - - name: create-pvc-name - - name: model-export-dir - name: serve - outputs: - artifacts: - - name: mlpipeline-ui-metadata - optional: true - path: /mlpipeline-ui-metadata.json - - name: mlpipeline-metrics - optional: true - path: /mlpipeline-metrics.json - - container: - args: - - /opt/model.py - - --tf-export-dir - - '{{inputs.parameters.model-export-dir}}' - - --tf-train-steps - - '{{inputs.parameters.train-steps}}' - - --tf-batch-size - - '{{inputs.parameters.batch-size}}' - - --tf-learning-rate - - '{{inputs.parameters.learning-rate}}' - image: gcr.io/kubeflow-examples/mnist/model:v20190304-v0.2-176-g15d997b - volumeMounts: - - mountPath: /mnt - name: create-pvc - inputs: - parameters: - - name: batch-size - - name: create-pvc-name - - name: learning-rate - - name: model-export-dir - - name: train-steps - name: train - outputs: - artifacts: - - name: mlpipeline-ui-metadata - optional: true - path: /mlpipeline-ui-metadata.json - - name: mlpipeline-metrics - optional: true - path: /mlpipeline-metrics.json - - container: - args: - - --image - - gcr.io/kubeflow-examples/mnist/web-ui:v20190304-v0.2-176-g15d997b-pipelines - - --name - - web-ui - - --container-port - - '5000' - - --service-port - - '80' - - --service-type - - LoadBalancer - image: gcr.io/kubeflow-examples/mnist/deploy-service:latest - volumeMounts: - - mountPath: /mnt - name: create-pvc - inputs: - parameters: - - name: create-pvc-name - name: web-ui - outputs: - artifacts: - - name: mlpipeline-ui-metadata - optional: true - path: /mlpipeline-ui-metadata.json - - name: mlpipeline-metrics - optional: true - path: /mlpipeline-metrics.json - volumes: - - name: create-pvc - persistentVolumeClaim: - claimName: '{{workflow.name}}-my-pvc' diff --git a/examples/kubeflow/pipeline/clean_text/.s2i/environment b/examples/kubeflow/pipeline/clean_text/.s2i/environment index bf867a009a..1edcfa1db0 100644 --- a/examples/kubeflow/pipeline/clean_text/.s2i/environment +++ b/examples/kubeflow/pipeline/clean_text/.s2i/environment @@ -1,4 +1,4 @@ -MODEL_NAME=RedditClassifier +MODEL_NAME=Transformer API_TYPE=REST SERVICE_TYPE=MODEL PERSISTENCE=0 diff --git a/examples/kubeflow/pipeline/clean_text/Model.py b/examples/kubeflow/pipeline/clean_text/Transformer.py similarity index 83% rename from examples/kubeflow/pipeline/clean_text/Model.py rename to examples/kubeflow/pipeline/clean_text/Transformer.py index 2813c5469f..8fe9d4e26a 100644 --- a/examples/kubeflow/pipeline/clean_text/Model.py +++ b/examples/kubeflow/pipeline/clean_text/Transformer.py @@ -2,7 +2,7 @@ from html.parser import HTMLParser import numpy as np -class Model(): +class Transformer(): __html_parser = HTMLParser() __uplus_pattern = \ re.compile("\<[uU]\+(?P[a-zA-Z0-9]+)\>") @@ -10,7 +10,7 @@ class Model(): re.compile("\[(.*)\]\((.*)\)") def transform(self, X, **kwargs): - f = np.vectorize(Model.transform_clean_text) + f = np.vectorize(Transformer.transform_clean_text) X_clean = f(X) return X_clean @@ -23,7 +23,7 @@ def transform_clean_text(raw_text): decoded = raw_text.encode("ISO-8859-1").decode("utf-8") except: decoded = raw_text.encode("ISO-8859-1").decode("cp1252") - html_unescaped =Model.\ + html_unescaped =Transformer.\ __html_parser.unescape(decoded) html_unescaped = re.sub(r"\r\n", " ", html_unescaped) html_unescaped = re.sub(r"\r\r\n", " ", html_unescaped) @@ -31,9 +31,9 @@ def transform_clean_text(raw_text): html_unescaped = html_unescaped.replace(">", " > ") html_unescaped = html_unescaped.replace("<", " < ") html_unescaped = html_unescaped.replace("--", " - ") - html_unescaped = Model.__uplus_pattern.sub( + html_unescaped = Transformer.__uplus_pattern.sub( " U\g ", html_unescaped) - html_unescaped = Model.__markup_link_pattern.sub( + html_unescaped = Transformer.__markup_link_pattern.sub( " \1 \2 ", html_unescaped) html_unescaped = html_unescaped.replace("\\", "") return html_unescaped diff --git a/examples/kubeflow/pipeline/clean_text/build_image.sh b/examples/kubeflow/pipeline/clean_text/build_image.sh new file mode 100755 index 0000000000..e924e511b3 --- /dev/null +++ b/examples/kubeflow/pipeline/clean_text/build_image.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +s2i build . seldonio/seldon-core-s2i-python3:0.6 clean_text_transformer:0.1 + diff --git a/examples/kubeflow/pipeline/clean_text/pipeline_step.py b/examples/kubeflow/pipeline/clean_text/pipeline_step.py index 2c9662c4fe..5bef1baa9b 100644 --- a/examples/kubeflow/pipeline/clean_text/pipeline_step.py +++ b/examples/kubeflow/pipeline/clean_text/pipeline_step.py @@ -1,13 +1,13 @@ import dill import click import dill -from .Model import Model +from .Transformer import Transformer @click.command() @click.option('--in-path', default="/mnt/raw_text.data") @click.option('--out-path', default="/mnt/clean_text.data") def run_pipeline(in_path, out_path): - clean_text_transformer = Model() + clean_text_transformer = Transformer() with open(in_path, 'rb') as in_f: x = dill.load(in_f) y = clean_text_transformer.transform(x) diff --git a/examples/kubeflow/pipeline/sklearn_spacy_text/.s2i/environment b/examples/kubeflow/pipeline/lr_text_classifier/.s2i/environment similarity index 62% rename from examples/kubeflow/pipeline/sklearn_spacy_text/.s2i/environment rename to examples/kubeflow/pipeline/lr_text_classifier/.s2i/environment index bf867a009a..1edcfa1db0 100644 --- a/examples/kubeflow/pipeline/sklearn_spacy_text/.s2i/environment +++ b/examples/kubeflow/pipeline/lr_text_classifier/.s2i/environment @@ -1,4 +1,4 @@ -MODEL_NAME=RedditClassifier +MODEL_NAME=Transformer API_TYPE=REST SERVICE_TYPE=MODEL PERSISTENCE=0 diff --git a/examples/kubeflow/pipeline/lr_text_classifier/Transformer.py b/examples/kubeflow/pipeline/lr_text_classifier/Transformer.py new file mode 100644 index 0000000000..6a650dbb78 --- /dev/null +++ b/examples/kubeflow/pipeline/lr_text_classifier/Transformer.py @@ -0,0 +1,14 @@ + +import dill + +class Transformer(object): + def __init__(self): + + with open('/mnt/lr_text.model', 'rb') as model_file: + self._lr_model = dill.load(model_file) + + def predict(self, X, feature_names): + prediction = self._lr_model.predict_proba(X) + return prediction + + diff --git a/examples/kubeflow/pipeline/lr_text_classifier/build_image.sh b/examples/kubeflow/pipeline/lr_text_classifier/build_image.sh new file mode 100755 index 0000000000..f7dab89e9c --- /dev/null +++ b/examples/kubeflow/pipeline/lr_text_classifier/build_image.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +s2i build . seldonio/seldon-core-s2i-python3:0.6 lr_text_classifier:0.1 + diff --git a/examples/kubeflow/pipeline/sklearn_spacy_text/RedditClassifier.py b/examples/kubeflow/pipeline/sklearn_spacy_text/RedditClassifier.py deleted file mode 100644 index f24abfb60f..0000000000 --- a/examples/kubeflow/pipeline/sklearn_spacy_text/RedditClassifier.py +++ /dev/null @@ -1,23 +0,0 @@ -import dill - -from ml_utils import CleanTextTransformer, SpacyTokenTransformer - -class RedditClassifier(object): - def __init__(self): - - self._clean_text_transformer = CleanTextTransformer() - self._spacy_tokenizer = SpacyTokenTransformer() - - with open('tfidf_vectorizer.model', 'rb') as model_file: - self._tfidf_vectorizer = dill.load(model_file) - - with open('lr.model', 'rb') as model_file: - self._lr_model = dill.load(model_file) - - def predict(self, X, feature_names): - clean_text = self._clean_text_transformer.transform(X) - spacy_tokens = self._spacy_tokenizer.transform(clean_text) - tfidf_features = self._tfidf_vectorizer.transform(spacy_tokens) - predictions = self._lr_model.predict_proba(tfidf_features) - return predictions - diff --git a/examples/kubeflow/pipeline/sklearn_spacy_text/__init__.py b/examples/kubeflow/pipeline/sklearn_spacy_text/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/examples/kubeflow/pipeline/sklearn_spacy_text/ml_utils.py b/examples/kubeflow/pipeline/sklearn_spacy_text/ml_utils.py deleted file mode 100644 index 08cb189de9..0000000000 --- a/examples/kubeflow/pipeline/sklearn_spacy_text/ml_utils.py +++ /dev/null @@ -1,75 +0,0 @@ -import spacy -from spacy.cli import download -import re -import numpy as np -from sklearn.base import TransformerMixin -from html.parser import HTMLParser -import dill -import sys, os - -download("en_core_web_sm") -nlp = spacy.load('en_core_web_sm', parser=False, entity=False) - -class SpacyTokenTransformer(TransformerMixin): - __symbols = set("!$%^&*()_+|~-=`{}[]:\";'<>?,./-") - - def transform(self, X, **kwargs): - f = np.vectorize(SpacyTokenTransformer.transform_to_token, otypes=[object]) - X_tokenized = f(X) - return X_tokenized - - def fit(self, X, y=None, **fit_params): - return self - - @staticmethod - def transform_to_token(text): - str_text = str(text) - doc = nlp(str_text, disable=['parser', 'tagger', 'ner']) - tokens = [] - for token in doc: - if token.like_url: - clean_token = "URL" - else: - clean_token = token.lemma_.lower().strip() - if len(clean_token) < 1 or clean_token in \ - SpacyTokenTransformer.__symbols: - continue - tokens.append(clean_token) - return tokens - -class CleanTextTransformer(TransformerMixin): - __html_parser = HTMLParser() - __uplus_pattern = \ - re.compile("\<[uU]\+(?P[a-zA-Z0-9]+)\>") - __markup_link_pattern = \ - re.compile("\[(.*)\]\((.*)\)") - - def transform(self, X, **kwargs): - f = np.vectorize(CleanTextTransformer.transform_clean_text) - X_clean = f(X) - return X_clean - - def fit(self, X, y=None, **fit_params): - return self - - @staticmethod - def transform_clean_text(raw_text): - try: - decoded = raw_text.encode("ISO-8859-1").decode("utf-8") - except: - decoded = raw_text.encode("ISO-8859-1").decode("cp1252") - html_unescaped = CleanTextTransformer.\ - __html_parser.unescape(decoded) - html_unescaped = re.sub(r"\r\n", " ", html_unescaped) - html_unescaped = re.sub(r"\r\r\n", " ", html_unescaped) - html_unescaped = re.sub(r"\r", " ", html_unescaped) - html_unescaped = html_unescaped.replace(">", " > ") - html_unescaped = html_unescaped.replace("<", " < ") - html_unescaped = html_unescaped.replace("--", " - ") - html_unescaped = CleanTextTransformer.__uplus_pattern.sub( - " U\g ", html_unescaped) - html_unescaped = CleanTextTransformer.__markup_link_pattern.sub( - " \1 \2 ", html_unescaped) - html_unescaped = html_unescaped.replace("\\", "") - return html_unescaped - \ No newline at end of file diff --git a/examples/kubeflow/pipeline/sklearn_spacy_text/reddit_clf.json b/examples/kubeflow/pipeline/sklearn_spacy_text/reddit_clf.json deleted file mode 100644 index 66872421f7..0000000000 --- a/examples/kubeflow/pipeline/sklearn_spacy_text/reddit_clf.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "apiVersion": "machinelearning.seldon.io/v1alpha2", - "kind": "SeldonDeployment", - "metadata": { - "labels": { - "app": "seldon" - }, - "name": "reddit-classifier" - }, - "spec": { - "annotations": { - "project_name": "Reddit classifier", - "deployment_version": "v1" - }, - "name": "reddit-classifier", - "oauth_key": "oauth-key", - "oauth_secret": "oauth-secret", - "predictors": [ - { - "componentSpecs": [{ - "spec": { - "containers": [ - { - "image": "reddit-classifier:0.1", - "imagePullPolicy": "IfNotPresent", - "name": "classifier", - "resources": { - "requests": { - "memory": "1Mi" - } - } - } - ], - "terminationGracePeriodSeconds": 20 - } - }], - "graph": { - "children": [], - "name": "classifier", - "endpoint": { - "type" : "REST" - }, - "type": "MODEL" - }, - "name": "single-model", - "replicas": 1, - "annotations": { - "predictor_version" : "v1" - } - } - ] - } -} diff --git a/examples/kubeflow/pipeline/sklearn_spacy_text/requirements.txt b/examples/kubeflow/pipeline/sklearn_spacy_text/requirements.txt deleted file mode 100644 index 021017680f..0000000000 --- a/examples/kubeflow/pipeline/sklearn_spacy_text/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -scipy>= 0.13.3 -scikit-learn>=0.18 -spacy==2.0.18 -dill==0.2.9 diff --git a/examples/kubeflow/pipeline/sklearn_spacy_text/sklearn_spacy_text_classifier_example.ipynb b/examples/kubeflow/pipeline/sklearn_spacy_text/sklearn_spacy_text_classifier_example.ipynb deleted file mode 100644 index 1d84c72425..0000000000 --- a/examples/kubeflow/pipeline/sklearn_spacy_text/sklearn_spacy_text_classifier_example.ipynb +++ /dev/null @@ -1,1064 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Reddit classification\n", - "\n", - "We are wrapping a logistic regression model that receives the text output from a tfidf model that stores 1000 features.\n", - "\n", - "## Dependencies\n", - "\n", - "### Training\n", - "* Spacy\n", - "* Sklearn\n", - "* Seldon-core\n", - "\n", - "### Seldon\n", - "* Sklearn\n", - "* Dill\n" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: scipy>=0.13.3 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from -r requirements.txt (line 1)) (1.2.1)\n", - "Requirement already satisfied: scikit-learn>=0.18 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from -r requirements.txt (line 2)) (0.20.3)\n", - "Collecting spacy==2.0.18 (from -r requirements.txt (line 3))\n", - " Using cached https://files.pythonhosted.org/packages/cd/70/65504a011d7b262e73cfe470c36ca245a1f8e45b3b6661081289ffd72009/spacy-2.0.18-cp37-cp37m-manylinux1_x86_64.whl\n", - "Requirement already satisfied: dill==0.2.9 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from -r requirements.txt (line 4)) (0.2.9)\n", - "Requirement already satisfied: numpy>=1.8.2 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from scikit-learn>=0.18->-r requirements.txt (line 2)) (1.16.3)\n", - "Requirement already satisfied: ujson>=1.35 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from spacy==2.0.18->-r requirements.txt (line 3)) (1.35)\n", - "Requirement already satisfied: murmurhash<1.1.0,>=0.28.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from spacy==2.0.18->-r requirements.txt (line 3)) (1.0.2)\n", - "Requirement already satisfied: cymem<2.1.0,>=2.0.2 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from spacy==2.0.18->-r requirements.txt (line 3)) (2.0.2)\n", - "Requirement already satisfied: preshed<2.1.0,>=2.0.1 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from spacy==2.0.18->-r requirements.txt (line 3)) (2.0.1)\n", - "Collecting regex==2018.01.10 (from spacy==2.0.18->-r requirements.txt (line 3))\n", - "Requirement already satisfied: plac<1.0.0,>=0.9.6 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from spacy==2.0.18->-r requirements.txt (line 3)) (0.9.6)\n", - "Requirement already satisfied: thinc<6.13.0,>=6.12.1 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from spacy==2.0.18->-r requirements.txt (line 3)) (6.12.1)\n", - "Requirement already satisfied: requests<3.0.0,>=2.13.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from spacy==2.0.18->-r requirements.txt (line 3)) (2.21.0)\n", - "Collecting msgpack<0.6.0,>=0.5.6 (from thinc<6.13.0,>=6.12.1->spacy==2.0.18->-r requirements.txt (line 3))\n", - "Requirement already satisfied: msgpack-numpy<0.4.4 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from thinc<6.13.0,>=6.12.1->spacy==2.0.18->-r requirements.txt (line 3)) (0.4.3.2)\n", - "Requirement already satisfied: cytoolz<0.10,>=0.9.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from thinc<6.13.0,>=6.12.1->spacy==2.0.18->-r requirements.txt (line 3)) (0.9.0.1)\n", - "Requirement already satisfied: wrapt<1.11.0,>=1.10.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from thinc<6.13.0,>=6.12.1->spacy==2.0.18->-r requirements.txt (line 3)) (1.10.11)\n", - "Requirement already satisfied: tqdm<5.0.0,>=4.10.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from thinc<6.13.0,>=6.12.1->spacy==2.0.18->-r requirements.txt (line 3)) (4.31.1)\n", - "Requirement already satisfied: six<2.0.0,>=1.10.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from thinc<6.13.0,>=6.12.1->spacy==2.0.18->-r requirements.txt (line 3)) (1.12.0)\n", - "Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from requests<3.0.0,>=2.13.0->spacy==2.0.18->-r requirements.txt (line 3)) (3.0.4)\n", - "Requirement already satisfied: idna<2.9,>=2.5 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from requests<3.0.0,>=2.13.0->spacy==2.0.18->-r requirements.txt (line 3)) (2.8)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from requests<3.0.0,>=2.13.0->spacy==2.0.18->-r requirements.txt (line 3)) (2019.3.9)\n", - "Requirement already satisfied: urllib3<1.25,>=1.21.1 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from requests<3.0.0,>=2.13.0->spacy==2.0.18->-r requirements.txt (line 3)) (1.24.2)\n", - "Requirement already satisfied: toolz>=0.8.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from cytoolz<0.10,>=0.9.0->thinc<6.13.0,>=6.12.1->spacy==2.0.18->-r requirements.txt (line 3)) (0.9.0)\n", - "Installing collected packages: regex, spacy, msgpack\n", - " Found existing installation: regex 2019.4.14\n", - " Uninstalling regex-2019.4.14:\n", - " Successfully uninstalled regex-2019.4.14\n", - " Found existing installation: spacy 2.0.16\n", - " Uninstalling spacy-2.0.16:\n", - " Successfully uninstalled spacy-2.0.16\n", - " Found existing installation: msgpack 0.6.1\n", - " Uninstalling msgpack-0.6.1:\n", - " Successfully uninstalled msgpack-0.6.1\n", - "Successfully installed msgpack-0.5.6 regex-2018.1.10 spacy-2.0.18\n" - ] - } - ], - "source": [ - "# Let's first install any dependencies\n", - "!pip install -r requirements.txt\n", - "!pip install seldon-core" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "\u001b[93m Linking successful\u001b[0m\n", - " /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages/en_core_web_sm\n", - " -->\n", - " /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages/spacy/data/en_core_web_sm\n", - "\n", - " You can now load the model via spacy.load('en_core_web_sm')\n", - "\n" - ] - } - ], - "source": [ - "import pandas as pd \n", - "from sklearn.model_selection import train_test_split\n", - "import numpy as np\n", - "from sklearn.feature_extraction.text import TfidfVectorizer\n", - "from sklearn.linear_model import LogisticRegression\n", - "from seldon_core.seldon_client import SeldonClient\n", - "import dill\n", - "import sys, os\n", - "\n", - "# This import may take a while as it will download the Spacy ENGLISH model\n", - "from ml_utils import CleanTextTransformer, SpacyTokenTransformer" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
prev_idxparent_idxbodyremoved
087568877Always be wary of news articles that cite unpu...0
173307432The problem I have with this is that the artic...0
21571115944This is indicative of a typical power law, and...0
316041625This doesn't make sense. Chess obviously trans...0
413327135201. I dispute that gene engineering is burdenso...0
\n", - "
" - ], - "text/plain": [ - " prev_idx parent_idx body \\\n", - "0 8756 8877 Always be wary of news articles that cite unpu... \n", - "1 7330 7432 The problem I have with this is that the artic... \n", - "2 15711 15944 This is indicative of a typical power law, and... \n", - "3 1604 1625 This doesn't make sense. Chess obviously trans... \n", - "4 13327 13520 1. I dispute that gene engineering is burdenso... \n", - "\n", - " removed \n", - "0 0 \n", - "1 0 \n", - "2 0 \n", - "3 0 \n", - "4 0 " - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_cols = [\"prev_idx\", \"parent_idx\", \"body\", \"removed\"]\n", - "\n", - "TEXT_COLUMN = \"body\" \n", - "CLEAN_COLUMN = \"clean_body\"\n", - "TOKEN_COLUMN = \"token_body\"\n", - "\n", - "# Downloading the 50k reddit dataset of moderated comments\n", - "df = pd.read_csv(\"https://raw.githubusercontent.com/axsauze/reddit-classification-exploration/master/data/reddit_train.csv\", \n", - " names=df_cols, skiprows=1, encoding=\"ISO-8859-1\")\n", - "\n", - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Let's see how many examples we have of each class\n", - "df[\"removed\"].value_counts().plot.bar()" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "x = df[\"body\"].values\n", - "y = df[\"removed\"].values\n", - "x_train, x_test, y_train, y_test = train_test_split(\n", - " x, y, \n", - " stratify=y, \n", - " random_state=42, \n", - " test_size=0.1, shuffle=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "# Clean the text\n", - "clean_text_transformer = CleanTextTransformer()\n", - "x_train_clean = clean_text_transformer.transform(x_train)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "# Tokenize the text and get the lemmas\n", - "spacy_tokenizer = SpacyTokenTransformer()\n", - "x_train_tokenized = spacy_tokenizer.transform(x_train_clean)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "TfidfVectorizer(analyzer='word', binary=False, decode_error='strict',\n", - " dtype=, encoding='utf-8', input='content',\n", - " lowercase=True, max_df=1.0, max_features=10000, min_df=1,\n", - " ngram_range=(1, 3), norm='l2',\n", - " preprocessor= at 0x7fce08047378>,\n", - " smooth_idf=True, stop_words=None, strip_accents=None,\n", - " sublinear_tf=False, token_pattern=None,\n", - " tokenizer= at 0x7fce080472f0>, use_idf=True,\n", - " vocabulary=None)" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Build tfidf vectorizer\n", - "tfidf_vectorizer = TfidfVectorizer(\n", - " max_features=10000,\n", - " preprocessor=lambda x: x, \n", - " tokenizer=lambda x: x, \n", - " token_pattern=None,\n", - " ngram_range=(1, 3))\n", - "\n", - "tfidf_vectorizer.fit(x_train_tokenized)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "# Transform our tokens to tfidf vectors\n", - "x_train_tfidf = tfidf_vectorizer.transform(\n", - " x_train_tokenized)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "LogisticRegression(C=0.1, class_weight=None, dual=False, fit_intercept=True,\n", - " intercept_scaling=1, max_iter=100, multi_class='warn',\n", - " n_jobs=None, penalty='l2', random_state=None, solver='sag',\n", - " tol=0.0001, verbose=0, warm_start=False)" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Train logistic regression classifier\n", - "lr = LogisticRegression(C=0.1, solver='sag')\n", - "lr.fit(x_train_tfidf, y_train)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "# These are the models we'll deploy\n", - "with open('tfidf_vectorizer.model', 'wb') as model_file:\n", - " dill.dump(tfidf_vectorizer, model_file)\n", - "with open('lr.model', 'wb') as model_file:\n", - " dill.dump(lr, model_file)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "import dill\r\n", - "\r\n", - "from ml_utils import CleanTextTransformer, SpacyTokenTransformer\r\n", - "\r\n", - "class RedditClassifier(object):\r\n", - " def __init__(self):\r\n", - " \r\n", - " self._clean_text_transformer = CleanTextTransformer()\r\n", - " self._spacy_tokenizer = SpacyTokenTransformer()\r\n", - " \r\n", - " with open('tfidf_vectorizer.model', 'rb') as model_file:\r\n", - " self._tfidf_vectorizer = dill.load(model_file)\r\n", - " \r\n", - " with open('lr.model', 'rb') as model_file:\r\n", - " self._lr_model = dill.load(model_file)\r\n", - "\r\n", - " def predict(self, X, feature_names):\r\n", - " clean_text = self._clean_text_transformer.transform(X)\r\n", - " spacy_tokens = self._spacy_tokenizer.transform(clean_text)\r\n", - " tfidf_features = self._tfidf_vectorizer.transform(spacy_tokens)\r\n", - " predictions = self._lr_model.predict_proba(tfidf_features)\r\n", - " return predictions\r\n", - "\r\n" - ] - } - ], - "source": [ - "# This is the class we will use to deploy\n", - "!cat RedditClassifier.py" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['This is the study that the article is based on:\\r\\n\\r\\nhttps://www.nature.com/articles/nature25778.epdf']\n", - "[[0.82767056 0.17232944]]\n" - ] - } - ], - "source": [ - "# test that our model works\n", - "from RedditClassifier import RedditClassifier\n", - "# With one sample\n", - "sample = x_test[0:1]\n", - "print(sample)\n", - "print(RedditClassifier().predict(sample, [\"feature_name\"]))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Create Docker Image\n", - "Using the S2I command line interface we wrap our current model to seve it through the Seldon interface" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "MODEL_NAME=RedditClassifier\r\n", - "API_TYPE=REST\r\n", - "SERVICE_TYPE=MODEL\r\n", - "PERSISTENCE=0\r\n" - ] - } - ], - "source": [ - "# To create a docker image we need to create the .s2i folder configuration as below:\n", - "!cat .s2i/environment" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "scipy>= 0.13.3\r\n", - "scikit-learn>=0.18\r\n", - "spacy==2.0.18\r\n", - "dill==0.2.9\r\n" - ] - } - ], - "source": [ - "# As well as a requirements.txt file with all the relevant dependencies\n", - "!cat requirements.txt" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "---> Installing application source...\n", - "---> Installing dependencies ...\n", - "Looking in links: /whl\n", - "Collecting scipy>=0.13.3 (from -r requirements.txt (line 1))\n", - " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", - "Downloading https://files.pythonhosted.org/packages/72/4c/5f81e7264b0a7a8bd570810f48cd346ba36faedbd2ba255c873ad556de76/scipy-1.3.0-cp36-cp36m-manylinux1_x86_64.whl (25.2MB)\n", - "Collecting scikit-learn>=0.18 (from -r requirements.txt (line 2))\n", - " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", - "Downloading https://files.pythonhosted.org/packages/90/c7/401c231c445fb6fad135e92197da9c3e77983de169ff1887cc18af94498d/scikit_learn-0.21.1-cp36-cp36m-manylinux1_x86_64.whl (6.7MB)\n", - "Collecting spacy==2.0.18 (from -r requirements.txt (line 3))\n", - " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", - "Downloading https://files.pythonhosted.org/packages/ae/6e/a89da6b5c83f8811e46e3a9270c1aed90e9b9ee6c60faf52b7239e5d3d69/spacy-2.0.18-cp36-cp36m-manylinux1_x86_64.whl (25.2MB)\n", - "Collecting dill==0.2.9 (from -r requirements.txt (line 4))\n", - " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", - "Downloading https://files.pythonhosted.org/packages/fe/42/bfe2e0857bc284cbe6a011d93f2a9ad58a22cb894461b199ae72cfef0f29/dill-0.2.9.tar.gz (150kB)\n", - "Requirement already satisfied: numpy>=1.13.3 in /usr/local/lib/python3.6/site-packages (from scipy>=0.13.3->-r requirements.txt (line 1)) (1.16.3)\n", - "Collecting joblib>=0.11 (from scikit-learn>=0.18->-r requirements.txt (line 2))\n", - " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", - "Downloading https://files.pythonhosted.org/packages/cd/c1/50a758e8247561e58cb87305b1e90b171b8c767b15b12a1734001f41d356/joblib-0.13.2-py2.py3-none-any.whl (278kB)\n", - "Collecting preshed<2.1.0,>=2.0.1 (from spacy==2.0.18->-r requirements.txt (line 3))\n", - " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", - "Downloading https://files.pythonhosted.org/packages/20/93/f222fb957764a283203525ef20e62008675fd0a14ffff8cc1b1490147c63/preshed-2.0.1-cp36-cp36m-manylinux1_x86_64.whl (83kB)\n", - "Collecting ujson>=1.35 (from spacy==2.0.18->-r requirements.txt (line 3))\n", - " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", - "Downloading https://files.pythonhosted.org/packages/16/c4/79f3409bc710559015464e5f49b9879430d8f87498ecdc335899732e5377/ujson-1.35.tar.gz (192kB)\n", - "Collecting regex==2018.01.10 (from spacy==2.0.18->-r requirements.txt (line 3))\n", - " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", - "Downloading https://files.pythonhosted.org/packages/76/f4/7146c3812f96fcaaf2d06ff6862582302626a59011ccb6f2833bb38d80f7/regex-2018.01.10.tar.gz (612kB)\n", - "Requirement already satisfied: requests<3.0.0,>=2.13.0 in /usr/local/lib/python3.6/site-packages (from spacy==2.0.18->-r requirements.txt (line 3)) (2.21.0)\n", - "Collecting plac<1.0.0,>=0.9.6 (from spacy==2.0.18->-r requirements.txt (line 3))\n", - " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", - "Downloading https://files.pythonhosted.org/packages/9e/9b/62c60d2f5bc135d2aa1d8c8a86aaf84edb719a59c7f11a4316259e61a298/plac-0.9.6-py2.py3-none-any.whl\n", - "Collecting thinc<6.13.0,>=6.12.1 (from spacy==2.0.18->-r requirements.txt (line 3))\n", - " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", - "Downloading https://files.pythonhosted.org/packages/db/a7/46640a46fd707aeb204aa4257a70974b6a22a0204ba703164d803215776f/thinc-6.12.1-cp36-cp36m-manylinux1_x86_64.whl (1.9MB)\n", - " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", - "Collecting murmurhash<1.1.0,>=0.28.0 (from spacy==2.0.18->-r requirements.txt (line 3))\n", - "Downloading https://files.pythonhosted.org/packages/a6/e6/63f160a4fdf0e875d16b28f972083606d8d54f56cd30cb8929f9a1ee700e/murmurhash-1.0.2-cp36-cp36m-manylinux1_x86_64.whl\n", - "Collecting cymem<2.1.0,>=2.0.2 (from spacy==2.0.18->-r requirements.txt (line 3))\n", - " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", - "Downloading https://files.pythonhosted.org/packages/3d/61/9b0520c28eb199a4b1ca667d96dd625bba003c14c75230195f9691975f85/cymem-2.0.2-cp36-cp36m-manylinux1_x86_64.whl\n", - "Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python3.6/site-packages (from requests<3.0.0,>=2.13.0->spacy==2.0.18->-r requirements.txt (line 3)) (3.0.4)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/site-packages (from requests<3.0.0,>=2.13.0->spacy==2.0.18->-r requirements.txt (line 3)) (2019.3.9)\n", - "Requirement already satisfied: urllib3<1.25,>=1.21.1 in /usr/local/lib/python3.6/site-packages (from requests<3.0.0,>=2.13.0->spacy==2.0.18->-r requirements.txt (line 3)) (1.24.2)\n", - "Requirement already satisfied: idna<2.9,>=2.5 in /usr/local/lib/python3.6/site-packages (from requests<3.0.0,>=2.13.0->spacy==2.0.18->-r requirements.txt (line 3)) (2.8)\n", - "Collecting wrapt<1.11.0,>=1.10.0 (from thinc<6.13.0,>=6.12.1->spacy==2.0.18->-r requirements.txt (line 3))\n", - " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", - "Downloading https://files.pythonhosted.org/packages/a0/47/66897906448185fcb77fc3c2b1bc20ed0ecca81a0f2f88eda3fc5a34fc3d/wrapt-1.10.11.tar.gz\n", - "Collecting tqdm<5.0.0,>=4.10.0 (from thinc<6.13.0,>=6.12.1->spacy==2.0.18->-r requirements.txt (line 3))\n", - " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", - "Downloading https://files.pythonhosted.org/packages/45/af/685bf3ce889ea191f3b916557f5677cc95a5e87b2fa120d74b5dd6d049d0/tqdm-4.32.1-py2.py3-none-any.whl (49kB)\n", - "Collecting msgpack-numpy<0.4.4 (from thinc<6.13.0,>=6.12.1->spacy==2.0.18->-r requirements.txt (line 3))\n", - " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", - "Downloading https://files.pythonhosted.org/packages/ad/45/464be6da85b5ca893cfcbd5de3b31a6710f636ccb8521b17bd4110a08d94/msgpack_numpy-0.4.3.2-py2.py3-none-any.whl\n", - "Collecting msgpack<0.6.0,>=0.5.6 (from thinc<6.13.0,>=6.12.1->spacy==2.0.18->-r requirements.txt (line 3))\n", - " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", - "Downloading https://files.pythonhosted.org/packages/22/4e/dcf124fd97e5f5611123d6ad9f40ffd6eb979d1efdc1049e28a795672fcd/msgpack-0.5.6-cp36-cp36m-manylinux1_x86_64.whl (315kB)\n", - "Requirement already satisfied: six<2.0.0,>=1.10.0 in /usr/local/lib/python3.6/site-packages (from thinc<6.13.0,>=6.12.1->spacy==2.0.18->-r requirements.txt (line 3)) (1.12.0)\n", - "Collecting cytoolz<0.10,>=0.9.0 (from thinc<6.13.0,>=6.12.1->spacy==2.0.18->-r requirements.txt (line 3))\n", - " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", - "Downloading https://files.pythonhosted.org/packages/36/f4/9728ba01ccb2f55df9a5af029b48ba0aaca1081bbd7823ea2ee223ba7a42/cytoolz-0.9.0.1.tar.gz (443kB)\n", - "Collecting toolz>=0.8.0 (from cytoolz<0.10,>=0.9.0->thinc<6.13.0,>=6.12.1->spacy==2.0.18->-r requirements.txt (line 3))\n", - " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", - "Downloading https://files.pythonhosted.org/packages/14/d0/a73c15bbeda3d2e7b381a36afb0d9cd770a9f4adc5d1532691013ba881db/toolz-0.9.0.tar.gz (45kB)\n", - "Building wheels for collected packages: dill, ujson, regex, wrapt, cytoolz, toolz\n", - "Building wheel for dill (setup.py): started\n", - "Building wheel for dill (setup.py): finished with status 'done'\n", - "Stored in directory: /root/.cache/pip/wheels/5b/d7/0f/e58eae695403de585269f4e4a94e0cd6ca60ec0c202936fa4a\n", - "Building wheel for ujson (setup.py): started\n", - "Building wheel for ujson (setup.py): finished with status 'done'\n", - "Stored in directory: /root/.cache/pip/wheels/28/77/e4/0311145b9c2e2f01470e744855131f9e34d6919687550f87d1\n", - "Building wheel for regex (setup.py): started\n", - "Building wheel for regex (setup.py): finished with status 'done'\n", - "Stored in directory: /root/.cache/pip/wheels/74/17/3f/c77bba99efd74ba1a19862c9dd97f4b6d735e2826721dc00ff\n", - "Building wheel for wrapt (setup.py): started\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Building wheel for wrapt (setup.py): finished with status 'done'\n", - "Stored in directory: /root/.cache/pip/wheels/48/5d/04/22361a593e70d23b1f7746d932802efe1f0e523376a74f321e\n", - "Building wheel for cytoolz (setup.py): started\n", - "Building wheel for cytoolz (setup.py): finished with status 'done'\n", - "Stored in directory: /root/.cache/pip/wheels/88/f3/11/9817b001e59ab04889e8cffcbd9087e2e2155b9ebecfc8dd38\n", - "Building wheel for toolz (setup.py): started\n", - "Building wheel for toolz (setup.py): finished with status 'done'\n", - "Stored in directory: /root/.cache/pip/wheels/f4/0c/f6/ce6b2d1aa459ee97cc3c0f82236302bd62d89c86c700219463\n", - "Successfully built dill ujson regex wrapt cytoolz toolz\n", - "Installing collected packages: scipy, joblib, scikit-learn, cymem, preshed, ujson, regex, dill, plac, wrapt, tqdm, msgpack, msgpack-numpy, murmurhash, toolz, cytoolz, thinc, spacy\n", - "Successfully installed cymem-2.0.2 cytoolz-0.9.0.1 dill-0.2.9 joblib-0.13.2 msgpack-0.5.6 msgpack-numpy-0.4.3.2 murmurhash-1.0.2 plac-0.9.6 preshed-2.0.1 regex-2018.1.10 scikit-learn-0.21.1 scipy-1.3.0 spacy-2.0.18 thinc-6.12.1 toolz-0.9.0 tqdm-4.32.1 ujson-1.35 wrapt-1.10.11\n", - "WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", - "WARNING: You are using pip version 19.1, however version 19.1.1 is available.\n", - "You should consider upgrading via the 'pip install --upgrade pip' command.\n", - "Build completed successfully\n" - ] - } - ], - "source": [ - "!s2i build . seldonio/seldon-core-s2i-python3:0.6 reddit-classifier:0.1" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "reddit_predictor\r\n" - ] - } - ], - "source": [ - "# Remove previously deployed containers for this model\n", - "!docker rm -f reddit_predictor" - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "812a02932fb6d61eb90727f99df051a67720a14de59504bbd808f1159fcda65e\r\n" - ] - } - ], - "source": [ - "!docker run --name \"reddit_predictor\" -d --rm -p 5001:5000 reddit-classifier:0.1" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2019-05-21T05:18:10.089008100Z starting microservice\n", - "2019-05-21T05:18:11.567254000Z 2019-05-21 05:18:11,566 - seldon_core.microservice:main:154 - INFO: Starting microservice.py:main\n", - "2019-05-21T05:18:11.568744400Z 2019-05-21 05:18:11,568 - seldon_core.microservice:main:185 - INFO: Annotations: {}\n", - "2019-05-21T05:18:12.629109700Z Collecting en_core_web_sm==2.0.0 from https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.0.0/en_core_web_sm-2.0.0.tar.gz#egg=en_core_web_sm==2.0.0\n", - "2019-05-21T05:18:13.675815500Z Downloading https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.0.0/en_core_web_sm-2.0.0.tar.gz (37.4MB)\n", - "2019-05-21T05:18:22.124982300Z Building wheels for collected packages: en-core-web-sm\n", - "2019-05-21T05:18:22.125493500Z Building wheel for en-core-web-sm (setup.py): started\n", - "2019-05-21T05:18:24.199642200Z Building wheel for en-core-web-sm (setup.py): finished with status 'done'\n", - "2019-05-21T05:18:24.199964600Z Stored in directory: /tmp/pip-ephem-wheel-cache-d7p16zav/wheels/54/7c/d8/f86364af8fbba7258e14adae115f18dd2c91552406edc3fdaa\n", - "2019-05-21T05:18:24.513275700Z Successfully built en-core-web-sm\n", - "2019-05-21T05:18:24.513295200Z Installing collected packages: en-core-web-sm\n", - "2019-05-21T05:18:24.579380500Z Successfully installed en-core-web-sm-2.0.0\n", - "2019-05-21T05:18:24.893582100Z WARNING: You are using pip version 19.1, however version 19.1.1 is available.\n", - "2019-05-21T05:18:24.893610900Z You should consider upgrading via the 'pip install --upgrade pip' command.\n", - "2019-05-21T05:18:26.083684000Z --- Logging error ---\n", - "2019-05-21T05:18:26.083710200Z Traceback (most recent call last):\n", - "2019-05-21T05:18:26.083714300Z File \"/usr/local/lib/python3.6/logging/__init__.py\", line 994, in emit\n", - "2019-05-21T05:18:26.083718000Z msg = self.format(record)\n", - "2019-05-21T05:18:26.083721100Z File \"/usr/local/lib/python3.6/logging/__init__.py\", line 840, in format\n", - "2019-05-21T05:18:26.083724100Z return fmt.format(record)\n", - "2019-05-21T05:18:26.083726900Z File \"/usr/local/lib/python3.6/logging/__init__.py\", line 577, in format\n", - "2019-05-21T05:18:26.083729900Z record.message = record.getMessage()\n", - "2019-05-21T05:18:26.083732600Z File \"/usr/local/lib/python3.6/logging/__init__.py\", line 338, in getMessage\n", - "2019-05-21T05:18:26.083735600Z msg = msg % self.args\n", - "2019-05-21T05:18:26.083738400Z TypeError: not all arguments converted during string formatting\n", - "2019-05-21T05:18:26.083741300Z Call stack:\n", - "2019-05-21T05:18:26.083744100Z File \"/usr/local/bin/seldon-core-microservice\", line 10, in \n", - "2019-05-21T05:18:26.083747200Z sys.exit(main())\n", - "2019-05-21T05:18:26.083749900Z File \"/usr/local/lib/python3.6/site-packages/seldon_core/microservice.py\", line 189, in main\n", - "2019-05-21T05:18:26.083752800Z logger.info(\"Importing \",args.interface_name)\n", - "2019-05-21T05:18:26.083755600Z Message: 'Importing '\n", - "2019-05-21T05:18:26.083758300Z Arguments: ('RedditClassifier',)\n", - "2019-05-21T05:18:26.083774500Z /usr/local/lib/python3.6/site-packages/sklearn/base.py:306: UserWarning: Trying to unpickle estimator TfidfTransformer from version 0.20.3 when using version 0.21.1. This might lead to breaking code or invalid results. Use at your own risk.\n", - "2019-05-21T05:18:26.083778100Z UserWarning)\n", - "2019-05-21T05:18:26.083781000Z /usr/local/lib/python3.6/site-packages/sklearn/base.py:306: UserWarning: Trying to unpickle estimator TfidfVectorizer from version 0.20.3 when using version 0.21.1. This might lead to breaking code or invalid results. Use at your own risk.\n", - "2019-05-21T05:18:26.083784100Z UserWarning)\n", - "2019-05-21T05:18:26.083786800Z /usr/local/lib/python3.6/site-packages/sklearn/base.py:306: UserWarning: Trying to unpickle estimator LogisticRegression from version 0.20.3 when using version 0.21.1. This might lead to breaking code or invalid results. Use at your own risk.\n", - "2019-05-21T05:18:26.083789900Z UserWarning)\n", - "2019-05-21T05:18:26.083792600Z 2019-05-21 05:18:26,082 - seldon_core.microservice:main:226 - INFO: REST microservice running on port 5000\n", - "2019-05-21T05:18:26.083795500Z 2019-05-21 05:18:26,083 - seldon_core.microservice:main:260 - INFO: Starting servers\n", - "2019-05-21T05:18:26.084624400Z \n", - "2019-05-21T05:18:26.084636400Z \u001b[93m Linking successful\u001b[0m\n", - "2019-05-21T05:18:26.084639800Z /usr/local/lib/python3.6/site-packages/en_core_web_sm -->\n", - "2019-05-21T05:18:26.084642700Z /usr/local/lib/python3.6/site-packages/spacy/data/en_core_web_sm\n", - "2019-05-21T05:18:26.084645500Z \n", - "2019-05-21T05:18:26.084648200Z You can now load the model via spacy.load('en_core_web_sm')\n", - "2019-05-21T05:18:26.084651000Z \n", - "2019-05-21T05:18:26.100898500Z * Serving Flask app \"seldon_core.wrapper\" (lazy loading)\n", - "2019-05-21T05:18:26.100924900Z * Environment: production\n", - "2019-05-21T05:18:26.100930600Z WARNING: Do not use the development server in a production environment.\n", - "2019-05-21T05:18:26.100936000Z Use a production WSGI server instead.\n", - "2019-05-21T05:18:26.100941400Z * Debug mode: off\n", - "2019-05-21T05:18:26.111993300Z 2019-05-21 05:18:26,111 - werkzeug:_log:122 - INFO: * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)\n", - "^C\n" - ] - } - ], - "source": [ - "# Here we need to wait until we see \"Linking successful\", as it's downloading the Spacy English model\n", - "# You can hit stop when this happens\n", - "!docker logs -t -f reddit_predictor" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Success:True message:\n", - "Request:\n", - "data {\n", - " names: \"tfidf\"\n", - " ndarray {\n", - " values {\n", - " string_value: \"This is the study that the article is based on:\\r\\n\\r\\nhttps://www.nature.com/articles/nature25778.epdf\"\n", - " }\n", - " }\n", - "}\n", - "\n", - "Response:\n", - "meta {\n", - "}\n", - "data {\n", - " names: \"t:0\"\n", - " names: \"t:1\"\n", - " ndarray {\n", - " values {\n", - " list_value {\n", - " values {\n", - " number_value: 0.8276705633548711\n", - " }\n", - " values {\n", - " number_value: 0.17232943664512895\n", - " }\n", - " }\n", - " }\n", - " }\n", - "}\n", - "\n" - ] - } - ], - "source": [ - "# We now test the REST endpoint expecting the same result\n", - "endpoint = \"0.0.0.0:5000\"\n", - "batch = sample\n", - "payload_type = \"ndarray\"\n", - "\n", - "sc = SeldonClient(microservice_endpoint=endpoint)\n", - "response = sc.microservice(\n", - " data=batch,\n", - " method=\"predict\",\n", - " payload_type=payload_type,\n", - " names=[\"tfidf\"])\n", - "\n", - "print(response)" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "reddit_predictor\r\n" - ] - } - ], - "source": [ - "# We now stop it to run it in docker\n", - "!docker stop reddit_predictor" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Run in kubernetes cluster" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "NAME READY STATUS RESTARTS AGE\r\n", - "seldon-core-redis-master-0 1/1 Running 0 59s\r\n", - "seldon-core-seldon-apiserver-d8fd4cd68-5mzzt 1/1 Running 0 59s\r\n", - "seldon-core-seldon-cluster-manager-67c64974b6-d8cfb 1/1 Running 0 59s\r\n" - ] - } - ], - "source": [ - "# Make sure that seldon is running \n", - "!kubectl get pods " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# If not running you can install it\n", - "# First initialise helm\n", - "!kubectl create clusterrolebinding kube-system-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:default\n", - "!helm init\n", - "!kubectl rollout status deploy/tiller-deploy -n kube-system" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Then install and run seldon\n", - "helm install seldon-core-crd --name seldon-core-crd --repo https://storage.googleapis.com/seldon-charts\n", - "helm install seldon-core --name seldon-core --repo https://storage.googleapis.com/seldon-charts " - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{\r\n", - " \"apiVersion\": \"machinelearning.seldon.io/v1alpha2\",\r\n", - " \"kind\": \"SeldonDeployment\",\r\n", - " \"metadata\": {\r\n", - " \"labels\": {\r\n", - " \"app\": \"seldon\"\r\n", - " },\r\n", - " \"name\": \"reddit-classifier\"\r\n", - " },\r\n", - " \"spec\": {\r\n", - " \"annotations\": {\r\n", - " \"project_name\": \"Reddit classifier\",\r\n", - " \"deployment_version\": \"v1\"\r\n", - " },\r\n", - " \"name\": \"reddit-classifier\",\r\n", - " \"oauth_key\": \"oauth-key\",\r\n", - " \"oauth_secret\": \"oauth-secret\",\r\n", - " \"predictors\": [\r\n", - " {\r\n", - " \"componentSpecs\": [{\r\n", - " \"spec\": {\r\n", - " \"containers\": [\r\n", - " {\r\n", - " \"image\": \"reddit-classifier:0.1\",\r\n", - " \"imagePullPolicy\": \"IfNotPresent\",\r\n", - " \"name\": \"classifier\",\r\n", - " \"resources\": {\r\n", - " \"requests\": {\r\n", - " \"memory\": \"1Mi\"\r\n", - " }\r\n", - " }\r\n", - " }\r\n", - " ],\r\n", - " \"terminationGracePeriodSeconds\": 20\r\n", - " }\r\n", - " }],\r\n", - " \"graph\": {\r\n", - " \"children\": [],\r\n", - " \"name\": \"classifier\",\r\n", - " \"endpoint\": {\r\n", - " \"type\" : \"REST\"\r\n", - " },\r\n", - " \"type\": \"MODEL\"\r\n", - " },\r\n", - " \"name\": \"single-model\",\r\n", - " \"replicas\": 1,\r\n", - " \"annotations\": {\r\n", - " \"predictor_version\" : \"v1\"\r\n", - " }\r\n", - " }\r\n", - " ]\r\n", - " }\r\n", - "}\r\n" - ] - } - ], - "source": [ - "# We'll use our seldon deployment file\n", - "!cat reddit_clf.json" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "seldondeployment.machinelearning.seldon.io/reddit-classifier created\r\n" - ] - } - ], - "source": [ - "!kubectl apply -f reddit_clf.json" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "NAME READY STATUS RESTARTS AGE\r\n", - "reddit-classifier-single-model-9199e4b-5c49c85c7d-mjvrh 2/2 Running 0 62s\r\n", - "seldon-core-redis-master-0 1/1 Running 0 2m14s\r\n", - "seldon-core-seldon-apiserver-d8fd4cd68-5mzzt 1/1 Running 0 2m14s\r\n", - "seldon-core-seldon-cluster-manager-67c64974b6-d8cfb 1/1 Running 0 2m14s\r\n" - ] - } - ], - "source": [ - "!kubectl get pods " - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "31203\r\n" - ] - } - ], - "source": [ - "!echo `kubectl get svc -l app=seldon-apiserver-container-app -o jsonpath='{.items[0].spec.ports[0].nodePort}'`" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WORKS!!!!\n", - "Success:True message:\n", - "Request:\n", - "data {\n", - " names: \"text\"\n", - " ndarray {\n", - " values {\n", - " string_value: \"This is the study that the article is based on:\\r\\n\\r\\nhttps://www.nature.com/articles/nature25778.epdf\"\n", - " }\n", - " }\n", - "}\n", - "\n", - "Response:\n", - "meta {\n", - " puid: \"9359cpdudo3b6i6cv82ktsl4pe\"\n", - " requestPath {\n", - " key: \"classifier\"\n", - " value: \"reddit-classifier:0.1\"\n", - " }\n", - "}\n", - "data {\n", - " names: \"t:0\"\n", - " names: \"t:1\"\n", - " ndarray {\n", - " values {\n", - " list_value {\n", - " values {\n", - " number_value: 0.8276705633548711\n", - " }\n", - " values {\n", - " number_value: 0.17232943664512895\n", - " }\n", - " }\n", - " }\n", - " }\n", - "}\n", - "\n" - ] - } - ], - "source": [ - "host = \"localhost\"\n", - "port = \"31203\" # Make sure you use the port above\n", - "batch = sample\n", - "payload_type = \"ndarray\"\n", - "\n", - "sc = SeldonClient(gateway=\"seldon\", seldon_rest_endpoint=host + \":\" + port,\n", - " oauth_key=\"oauth-key\", oauth_secret=\"oauth-secret\")\n", - "response = sc.predict(\n", - " data=batch, \n", - " deployment_name=\"mymodel\",\n", - " names=[\"text\"],\n", - " payload_type=payload_type)\n", - "\n", - "print(response)" - ] - }, - { - "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.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/kubeflow/pipeline/spacy_tokenize/Transformer.py b/examples/kubeflow/pipeline/spacy_tokenize/Transformer.py index 0ad6e5aca1..d724bd9c3f 100644 --- a/examples/kubeflow/pipeline/spacy_tokenize/Transformer.py +++ b/examples/kubeflow/pipeline/spacy_tokenize/Transformer.py @@ -1,6 +1,8 @@ import spacy +from spacy.cli import download import numpy as np +download("en_core_web_sm") nlp = spacy.load('en_core_web_sm', parser=False, entity=False) class Transformer(): diff --git a/examples/kubeflow/pipeline/spacy_tokenize/build_image.sh b/examples/kubeflow/pipeline/spacy_tokenize/build_image.sh old mode 100644 new mode 100755 diff --git a/examples/kubeflow/pipeline/tfidf_vectorizer/.s2i/environment b/examples/kubeflow/pipeline/tfidf_vectorizer/.s2i/environment new file mode 100644 index 0000000000..1edcfa1db0 --- /dev/null +++ b/examples/kubeflow/pipeline/tfidf_vectorizer/.s2i/environment @@ -0,0 +1,4 @@ +MODEL_NAME=Transformer +API_TYPE=REST +SERVICE_TYPE=MODEL +PERSISTENCE=0 diff --git a/examples/kubeflow/pipeline/tfidf_vectorizer/Transformer.py b/examples/kubeflow/pipeline/tfidf_vectorizer/Transformer.py new file mode 100644 index 0000000000..25bc4f9857 --- /dev/null +++ b/examples/kubeflow/pipeline/tfidf_vectorizer/Transformer.py @@ -0,0 +1,14 @@ + +import dill + +class Transformer(object): + def __init__(self): + + with open('/mnt/tfidf.model', 'rb') as model_file: + self._tfidf_vectorizer = dill.load(model_file) + + def predict(self, X, feature_names): + tfidf_features = self._tfidf_vectorizer.transform(X) + return tfidf_features + + diff --git a/examples/kubeflow/pipeline/tfidf_vectorizer/build_image.sh b/examples/kubeflow/pipeline/tfidf_vectorizer/build_image.sh new file mode 100755 index 0000000000..6e4e2ad259 --- /dev/null +++ b/examples/kubeflow/pipeline/tfidf_vectorizer/build_image.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +s2i build . seldonio/seldon-core-s2i-python3:0.6 tfidf_vectorizer:0.1 + diff --git a/examples/kubeflow/pipeline/tfidf_vectorizer/pipeline_step.py b/examples/kubeflow/pipeline/tfidf_vectorizer/pipeline_step.py index a57d5b35bd..d0b147f76b 100644 --- a/examples/kubeflow/pipeline/tfidf_vectorizer/pipeline_step.py +++ b/examples/kubeflow/pipeline/tfidf_vectorizer/pipeline_step.py @@ -33,6 +33,7 @@ def run_pipeline( tfidf_vectorizer.fit(x) with open(model_path, "wb") as model_f: dill.dump(tfidf_vectorizer, model_f) + elif action == "predict": with open(model_path, "rb") as model_f: tfidf_vectorizer = dill.load(model_f) diff --git a/examples/kubeflow/seldon_production_pipeline.yaml b/examples/kubeflow/seldon_production_pipeline.yaml new file mode 100644 index 0000000000..3b16ee600c --- /dev/null +++ b/examples/kubeflow/seldon_production_pipeline.yaml @@ -0,0 +1,49 @@ +--- +apiVersion: machinelearning.seldon.io/v1alpha2 +kind: SeldonDeployment +metadata: + labels: + app: seldon + name: nlp-example + namespace: kubeflow +spec: + name: nlp-pipeline + predictors: + - componentSpecs: + - spec: + containers: + - name: clean_text + image: clean_text_transformer:0.1 + - name: spacy_tokenizer + image: spacy_tokenizer:0.1 + - name: tfidf_vectorizer + image: tfidf_vectorizer:0.1 + - name: lr_classifier + image: lr_text_classifier:0.2 + terminationGracePeriodSeconds: 1 + graph: + name: clean_text + endpoint: + type: REST + type: MODEL + children: + - name: spacy_tokenizer + endpoint: + type: REST + type: MODEL + children: + - name: tfidf_vectorizer + endpoint: + type: REST + type: MODEL + children: + - name: lr_classifier + endpoint: + type: REST + type: MODEL + children: [] + name: nlp-pipeline + replicas: 1 + svcOrchSpec: + env: [] + diff --git a/examples/kubeflow/test/test_pipeline.py b/examples/kubeflow/test/test_pipeline.py index 9d80a6d08e..e0073b5a5e 100644 --- a/examples/kubeflow/test/test_pipeline.py +++ b/examples/kubeflow/test/test_pipeline.py @@ -18,22 +18,22 @@ def test_pipeline(): with runner.isolated_filesystem(): - # Test Data Downloader - result = runner.invoke(download_cli, [ - '--labels-path', 'labels.data', - '--features-path', 'raw_text.data']) - - with open('raw_text.data', "rb") as f: - assert f - with open('labels.data', "rb") as f: - assert f - - ## Creating test data - #with open('raw_text.data', 'wb') as f: - # raw_arr = np.array([ - # "hello this is a test", - # "another sentence to process"]) - # dill.dump(raw_arr, f) + # # Test Data Downloader + # result = runner.invoke(download_cli, [ + # '--labels-path', 'labels.data', + # '--features-path', 'raw_text.data']) + + # with open('raw_text.data', "rb") as f: + # assert f + # with open('labels.data', "rb") as f: + # assert f + + # Creating test data + with open('raw_text.data', 'wb') as f: + raw_arr = np.array([ + "hello this is a test", + "another sentence to process"]) + dill.dump(raw_arr, f) # Test Clean text transformer result = runner.invoke(clean_cli, [ @@ -83,14 +83,12 @@ def test_pipeline(): '--in-path', 'tfidf_vectors.data', '--labels-path', 'labels.data', '--out-path', 'prediction.data', - '--c_param', "0.1", + '--c-param', "0.1", '--action', 'train', '--model-path', 'lr_text.model']) with open("prediction.data", "rb") as f: - lr_prediction = dill.load(f) - print(lr_prediction) - assert lr_prediction + assert f with open("lr_text.model", "rb") as f: assert f From 3b8de402bab01a8980316e0a1b7f63543de27f2b Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Sat, 25 May 2019 14:58:44 +0100 Subject: [PATCH 11/22] Seldon graph working --- examples/kubeflow/pipeline/clean_text/Transformer.py | 2 +- examples/kubeflow/pipeline/clean_text/pipeline_step.py | 4 ++-- examples/kubeflow/pipeline/data_downloader/Dockerfile | 4 ++-- .../kubeflow/pipeline/lr_text_classifier/Transformer.py | 2 +- examples/kubeflow/pipeline/spacy_tokenize/Dockerfile | 6 ++---- examples/kubeflow/pipeline/spacy_tokenize/Transformer.py | 9 ++++++--- examples/kubeflow/pipeline/spacy_tokenize/build_image.sh | 3 ++- .../kubeflow/pipeline/spacy_tokenize/pipeline_step.py | 4 ++-- 8 files changed, 18 insertions(+), 16 deletions(-) diff --git a/examples/kubeflow/pipeline/clean_text/Transformer.py b/examples/kubeflow/pipeline/clean_text/Transformer.py index 8fe9d4e26a..6cd1ca8569 100644 --- a/examples/kubeflow/pipeline/clean_text/Transformer.py +++ b/examples/kubeflow/pipeline/clean_text/Transformer.py @@ -9,7 +9,7 @@ class Transformer(): __markup_link_pattern = \ re.compile("\[(.*)\]\((.*)\)") - def transform(self, X, **kwargs): + def predict(self, X, feature_names): f = np.vectorize(Transformer.transform_clean_text) X_clean = f(X) return X_clean diff --git a/examples/kubeflow/pipeline/clean_text/pipeline_step.py b/examples/kubeflow/pipeline/clean_text/pipeline_step.py index 5bef1baa9b..f4880b52c3 100644 --- a/examples/kubeflow/pipeline/clean_text/pipeline_step.py +++ b/examples/kubeflow/pipeline/clean_text/pipeline_step.py @@ -1,7 +1,7 @@ import dill import click import dill -from .Transformer import Transformer +from Transformer import Transformer @click.command() @click.option('--in-path', default="/mnt/raw_text.data") @@ -10,7 +10,7 @@ def run_pipeline(in_path, out_path): clean_text_transformer = Transformer() with open(in_path, 'rb') as in_f: x = dill.load(in_f) - y = clean_text_transformer.transform(x) + y = clean_text_transformer.predict(x) with open(out_path, "wb") as out_f: dill.dump(y, out_f) diff --git a/examples/kubeflow/pipeline/data_downloader/Dockerfile b/examples/kubeflow/pipeline/data_downloader/Dockerfile index 0caca3e8f6..b61a95757d 100644 --- a/examples/kubeflow/pipeline/data_downloader/Dockerfile +++ b/examples/kubeflow/pipeline/data_downloader/Dockerfile @@ -1,4 +1,4 @@ FROM python:3.7-slim -COPY . /app -WORKDIR /app +COPY . /microservice +WORKDIR /microservice RUN pip install -r requirements.txt diff --git a/examples/kubeflow/pipeline/lr_text_classifier/Transformer.py b/examples/kubeflow/pipeline/lr_text_classifier/Transformer.py index 6a650dbb78..eb688e4561 100644 --- a/examples/kubeflow/pipeline/lr_text_classifier/Transformer.py +++ b/examples/kubeflow/pipeline/lr_text_classifier/Transformer.py @@ -4,7 +4,7 @@ class Transformer(object): def __init__(self): - with open('/mnt/lr_text.model', 'rb') as model_file: + with open('/mnt/lr.model', 'rb') as model_file: self._lr_model = dill.load(model_file) def predict(self, X, feature_names): diff --git a/examples/kubeflow/pipeline/spacy_tokenize/Dockerfile b/examples/kubeflow/pipeline/spacy_tokenize/Dockerfile index edf57d2ca2..edea5efbd7 100644 --- a/examples/kubeflow/pipeline/spacy_tokenize/Dockerfile +++ b/examples/kubeflow/pipeline/spacy_tokenize/Dockerfile @@ -1,5 +1,3 @@ -FROM python:3.7-slim -COPY . /app -WORKDIR /app -RUN pip install -r requirements.txt +FROM seldonio/seldon-core-s2i-python3:0.6 +RUN pip install spacy RUN python -m spacy download en_core_web_sm diff --git a/examples/kubeflow/pipeline/spacy_tokenize/Transformer.py b/examples/kubeflow/pipeline/spacy_tokenize/Transformer.py index d724bd9c3f..3258ec3732 100644 --- a/examples/kubeflow/pipeline/spacy_tokenize/Transformer.py +++ b/examples/kubeflow/pipeline/spacy_tokenize/Transformer.py @@ -1,14 +1,17 @@ import spacy -from spacy.cli import download import numpy as np -download("en_core_web_sm") +# from spacy.cli import download +# import importlib +# download("en_core_web_sm") +# importlib.reload(spacy) + nlp = spacy.load('en_core_web_sm', parser=False, entity=False) class Transformer(): __symbols = set("!$%^&*()_+|~-=`{}[]:\";'<>?,./-") - def transform(self, X, **kwargs): + def predict(self, X, feature_names): f = np.vectorize(Transformer.transform_to_token, otypes=[object]) X_tokenized = f(X) return X_tokenized diff --git a/examples/kubeflow/pipeline/spacy_tokenize/build_image.sh b/examples/kubeflow/pipeline/spacy_tokenize/build_image.sh index d6a6078a2d..683bb6e617 100755 --- a/examples/kubeflow/pipeline/spacy_tokenize/build_image.sh +++ b/examples/kubeflow/pipeline/spacy_tokenize/build_image.sh @@ -1,4 +1,5 @@ #!/bin/bash -s2i build . seldonio/seldon-core-s2i-python3:0.6 spacy_tokenizer:0.1 +docker build . -t seldon-core-s2i-python3-spacy:0.6 +s2i build . seldon-core-s2i-python3-spacy:0.6 spacy_tokenizer:0.1 diff --git a/examples/kubeflow/pipeline/spacy_tokenize/pipeline_step.py b/examples/kubeflow/pipeline/spacy_tokenize/pipeline_step.py index e30ac49208..515ee09d95 100644 --- a/examples/kubeflow/pipeline/spacy_tokenize/pipeline_step.py +++ b/examples/kubeflow/pipeline/spacy_tokenize/pipeline_step.py @@ -1,6 +1,6 @@ import click import dill -from .Transformer import Transformer +from Transformer import Transformer @click.command() @click.option('--in-path', default="/mnt/clean_text.data") @@ -9,7 +9,7 @@ def run_pipeline(in_path, out_path): spacy_transformer = Transformer() with open(in_path, 'rb') as in_f: x = dill.load(in_f) - y = spacy_transformer.transform(x) + y = spacy_transformer.predict(x) with open(out_path, "wb") as out_f: dill.dump(y, out_f) From 7eaba08a7a0e3f1b04683addbe7bc7274b2a18a3 Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Sat, 25 May 2019 17:39:52 +0100 Subject: [PATCH 12/22] Finished end to end pipeline, starting documentation --- .../kubeflow/deploy_pipeline/pvc-access.yaml | 16 +++++ .../seldon_production_pipeline.yaml | 71 +++++++++++++++++++ .../kubeflow/persistent-volume-setup.yaml | 27 ------- .../kubeflow/pipeline/clean_text/Dockerfile | 4 -- .../pipeline/lr_text_classifier/Dockerfile | 4 -- .../clean_text/.s2i/environment | 0 .../clean_text/Transformer.py | 5 +- .../clean_text}/__init__.py | 0 .../clean_text/build_image.sh | 0 .../clean_text/pipeline_step.py | 7 +- .../clean_text/requirements.txt | 0 .../data_downloader/Dockerfile | 0 .../data_downloader}/__init__.py | 0 .../data_downloader/build_image.sh | 4 ++ .../data_downloader/pipeline_step.py | 0 .../data_downloader/requirements.txt | 0 .../lr_text_classifier/.s2i/environment | 0 .../lr_text_classifier/Transformer.py | 3 + .../lr_text_classifier}/__init__.py | 0 .../lr_text_classifier/build_image.sh | 0 .../lr_text_classifier/pipeline_step.py | 0 .../lr_text_classifier/requirements.txt | 0 .../spacy_tokenize/.s2i/environment | 0 .../spacy_tokenize/Transformer.py | 5 +- .../spacy_tokenize}/__init__.py | 0 .../spacy_tokenize/build_image.sh | 0 .../spacy_tokenize/pipeline_step.py | 7 +- .../spacy_tokenize/requirements.txt | 0 .../tfidf_vectorizer/.s2i/environment | 0 .../tfidf_vectorizer/Transformer.py | 8 ++- .../tfidf_vectorizer}/__init__.py | 0 .../tfidf_vectorizer/build_image.sh | 0 .../tfidf_vectorizer/pipeline_step.py | 0 .../tfidf_vectorizer/requirements.txt | 0 .../__init__.py | 0 .../pipeline_tests}/test_pipeline.py | 10 +-- .../pipeline/spacy_tokenize/Dockerfile | 3 - .../pipeline/tfidf_vectorizer/Dockerfile | 4 -- ...{requirements.txt => requirements-dev.txt} | 0 .../kubeflow/seldon_production_pipeline.yaml | 49 ------------- examples/kubeflow/test/__init__.py | 0 .../{ => train_pipeline}/nlp_pipeline.py | 2 +- 42 files changed, 126 insertions(+), 103 deletions(-) create mode 100644 examples/kubeflow/deploy_pipeline/pvc-access.yaml create mode 100644 examples/kubeflow/deploy_pipeline/seldon_production_pipeline.yaml delete mode 100644 examples/kubeflow/persistent-volume-setup.yaml delete mode 100644 examples/kubeflow/pipeline/clean_text/Dockerfile delete mode 100644 examples/kubeflow/pipeline/lr_text_classifier/Dockerfile rename examples/kubeflow/pipeline/{ => pipeline_steps}/clean_text/.s2i/environment (100%) rename examples/kubeflow/pipeline/{ => pipeline_steps}/clean_text/Transformer.py (92%) rename examples/kubeflow/pipeline/{ => pipeline_steps/clean_text}/__init__.py (100%) rename examples/kubeflow/pipeline/{ => pipeline_steps}/clean_text/build_image.sh (100%) rename examples/kubeflow/pipeline/{ => pipeline_steps}/clean_text/pipeline_step.py (77%) rename examples/kubeflow/pipeline/{ => pipeline_steps}/clean_text/requirements.txt (100%) rename examples/kubeflow/pipeline/{ => pipeline_steps}/data_downloader/Dockerfile (100%) rename examples/kubeflow/pipeline/{clean_text => pipeline_steps/data_downloader}/__init__.py (100%) create mode 100755 examples/kubeflow/pipeline/pipeline_steps/data_downloader/build_image.sh rename examples/kubeflow/pipeline/{ => pipeline_steps}/data_downloader/pipeline_step.py (100%) rename examples/kubeflow/pipeline/{ => pipeline_steps}/data_downloader/requirements.txt (100%) rename examples/kubeflow/pipeline/{ => pipeline_steps}/lr_text_classifier/.s2i/environment (100%) rename examples/kubeflow/pipeline/{ => pipeline_steps}/lr_text_classifier/Transformer.py (79%) rename examples/kubeflow/pipeline/{data_downloader => pipeline_steps/lr_text_classifier}/__init__.py (100%) rename examples/kubeflow/pipeline/{ => pipeline_steps}/lr_text_classifier/build_image.sh (100%) rename examples/kubeflow/pipeline/{ => pipeline_steps}/lr_text_classifier/pipeline_step.py (100%) rename examples/kubeflow/pipeline/{ => pipeline_steps}/lr_text_classifier/requirements.txt (100%) rename examples/kubeflow/pipeline/{ => pipeline_steps}/spacy_tokenize/.s2i/environment (100%) rename examples/kubeflow/pipeline/{ => pipeline_steps}/spacy_tokenize/Transformer.py (89%) rename examples/kubeflow/pipeline/{lr_text_classifier => pipeline_steps/spacy_tokenize}/__init__.py (100%) rename examples/kubeflow/pipeline/{ => pipeline_steps}/spacy_tokenize/build_image.sh (100%) rename examples/kubeflow/pipeline/{ => pipeline_steps}/spacy_tokenize/pipeline_step.py (76%) rename examples/kubeflow/pipeline/{ => pipeline_steps}/spacy_tokenize/requirements.txt (100%) rename examples/kubeflow/pipeline/{ => pipeline_steps}/tfidf_vectorizer/.s2i/environment (100%) rename examples/kubeflow/pipeline/{ => pipeline_steps}/tfidf_vectorizer/Transformer.py (52%) rename examples/kubeflow/pipeline/{spacy_tokenize => pipeline_steps/tfidf_vectorizer}/__init__.py (100%) rename examples/kubeflow/pipeline/{ => pipeline_steps}/tfidf_vectorizer/build_image.sh (100%) rename examples/kubeflow/pipeline/{ => pipeline_steps}/tfidf_vectorizer/pipeline_step.py (100%) rename examples/kubeflow/pipeline/{ => pipeline_steps}/tfidf_vectorizer/requirements.txt (100%) rename examples/kubeflow/pipeline/{tfidf_vectorizer => pipeline_tests}/__init__.py (100%) rename examples/kubeflow/{test => pipeline/pipeline_tests}/test_pipeline.py (86%) delete mode 100644 examples/kubeflow/pipeline/spacy_tokenize/Dockerfile delete mode 100644 examples/kubeflow/pipeline/tfidf_vectorizer/Dockerfile rename examples/kubeflow/{requirements.txt => requirements-dev.txt} (100%) delete mode 100644 examples/kubeflow/seldon_production_pipeline.yaml delete mode 100644 examples/kubeflow/test/__init__.py rename examples/kubeflow/{ => train_pipeline}/nlp_pipeline.py (99%) diff --git a/examples/kubeflow/deploy_pipeline/pvc-access.yaml b/examples/kubeflow/deploy_pipeline/pvc-access.yaml new file mode 100644 index 0000000000..6d70221c85 --- /dev/null +++ b/examples/kubeflow/deploy_pipeline/pvc-access.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Pod +metadata: + name: busybox +spec: + containers: + - name: busybox + image: busybox + command: ["/bin/sh", "-ec", "sleep 1000"] + volumeMounts: + - name: mypvc + mountPath: /mnt + volumes: + - name: mypvc + persistentVolumeClaim: + claimName: nlp-rhx4j-my-pvc diff --git a/examples/kubeflow/deploy_pipeline/seldon_production_pipeline.yaml b/examples/kubeflow/deploy_pipeline/seldon_production_pipeline.yaml new file mode 100644 index 0000000000..5ae20cc4b8 --- /dev/null +++ b/examples/kubeflow/deploy_pipeline/seldon_production_pipeline.yaml @@ -0,0 +1,71 @@ +--- +apiVersion: machinelearning.seldon.io/v1alpha2 +kind: SeldonDeployment +metadata: + labels: + app: seldon + name: nlp-classifier + namespace: kubeflow +spec: + annotations: + project_name: NLP Pipeline + deployment_version: v1 + name: nlp-classifier + oauth_key: oauth-key + oauth_secret: oauth-secret + predictors: + - componentSpecs: + - spec: + containers: + - image: clean_text_transformer:0.1 + imagePullPolicy: IfNotPresent + name: cleantext + resources: + requests: + memory: 1Mi + - image: spacy_tokenizer:0.1 + imagePullPolicy: IfNotPresent + name: spacytokenizer + - image: tfidf_vectorizer:0.1 + imagePullPolicy: IfNotPresent + name: tfidfvectorizer + volumeMounts: + - name: mypvc + mountPath: /mnt + - image: lr_text_classifier:0.1 + imagePullPolicy: IfNotPresent + name: lrclassifier + volumeMounts: + - name: mypvc + mountPath: /mnt + terminationGracePeriodSeconds: 20 + volumes: + - name: mypvc + persistentVolumeClaim: + claimName: nlp-rhx4j-my-pvc + graph: + children: + - name: spacytokenizer + endpoint: + type: REST + type: MODEL + children: + - name: tfidfvectorizer + endpoint: + type: REST + type: MODEL + children: + - name: lrclassifier + endpoint: + type: REST + type: MODEL + children: [] + name: cleantext + endpoint: + type: REST + type: MODEL + name: single-model + replicas: 1 + annotations: + predictor_version: v1 + diff --git a/examples/kubeflow/persistent-volume-setup.yaml b/examples/kubeflow/persistent-volume-setup.yaml deleted file mode 100644 index 82e55c4090..0000000000 --- a/examples/kubeflow/persistent-volume-setup.yaml +++ /dev/null @@ -1,27 +0,0 @@ -apiVersion: v1 -kind: PersistentVolume -metadata: - name: task-pv-volume - labels: - type: local -spec: - storageClassName: manual - capacity: - storage: 10Gi - accessModes: - - ReadWriteOnce - hostPath: - path: /c/Users/alejandro/Programming/kfnotebooks/test ---- -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: task-pv-claim -spec: - storageClassName: manual - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 3Gi - diff --git a/examples/kubeflow/pipeline/clean_text/Dockerfile b/examples/kubeflow/pipeline/clean_text/Dockerfile deleted file mode 100644 index 0caca3e8f6..0000000000 --- a/examples/kubeflow/pipeline/clean_text/Dockerfile +++ /dev/null @@ -1,4 +0,0 @@ -FROM python:3.7-slim -COPY . /app -WORKDIR /app -RUN pip install -r requirements.txt diff --git a/examples/kubeflow/pipeline/lr_text_classifier/Dockerfile b/examples/kubeflow/pipeline/lr_text_classifier/Dockerfile deleted file mode 100644 index 0caca3e8f6..0000000000 --- a/examples/kubeflow/pipeline/lr_text_classifier/Dockerfile +++ /dev/null @@ -1,4 +0,0 @@ -FROM python:3.7-slim -COPY . /app -WORKDIR /app -RUN pip install -r requirements.txt diff --git a/examples/kubeflow/pipeline/clean_text/.s2i/environment b/examples/kubeflow/pipeline/pipeline_steps/clean_text/.s2i/environment similarity index 100% rename from examples/kubeflow/pipeline/clean_text/.s2i/environment rename to examples/kubeflow/pipeline/pipeline_steps/clean_text/.s2i/environment diff --git a/examples/kubeflow/pipeline/clean_text/Transformer.py b/examples/kubeflow/pipeline/pipeline_steps/clean_text/Transformer.py similarity index 92% rename from examples/kubeflow/pipeline/clean_text/Transformer.py rename to examples/kubeflow/pipeline/pipeline_steps/clean_text/Transformer.py index 6cd1ca8569..b4a5c4226b 100644 --- a/examples/kubeflow/pipeline/clean_text/Transformer.py +++ b/examples/kubeflow/pipeline/pipeline_steps/clean_text/Transformer.py @@ -1,6 +1,7 @@ import re from html.parser import HTMLParser import numpy as np +import logging class Transformer(): __html_parser = HTMLParser() @@ -9,9 +10,11 @@ class Transformer(): __markup_link_pattern = \ re.compile("\[(.*)\]\((.*)\)") - def predict(self, X, feature_names): + def predict(self, X, feature_names=[]): + logging.warning(X) f = np.vectorize(Transformer.transform_clean_text) X_clean = f(X) + logging.warning(X_clean) return X_clean def fit(self, X, y=None, **fit_params): diff --git a/examples/kubeflow/pipeline/__init__.py b/examples/kubeflow/pipeline/pipeline_steps/clean_text/__init__.py similarity index 100% rename from examples/kubeflow/pipeline/__init__.py rename to examples/kubeflow/pipeline/pipeline_steps/clean_text/__init__.py diff --git a/examples/kubeflow/pipeline/clean_text/build_image.sh b/examples/kubeflow/pipeline/pipeline_steps/clean_text/build_image.sh similarity index 100% rename from examples/kubeflow/pipeline/clean_text/build_image.sh rename to examples/kubeflow/pipeline/pipeline_steps/clean_text/build_image.sh diff --git a/examples/kubeflow/pipeline/clean_text/pipeline_step.py b/examples/kubeflow/pipeline/pipeline_steps/clean_text/pipeline_step.py similarity index 77% rename from examples/kubeflow/pipeline/clean_text/pipeline_step.py rename to examples/kubeflow/pipeline/pipeline_steps/clean_text/pipeline_step.py index f4880b52c3..606a4ec481 100644 --- a/examples/kubeflow/pipeline/clean_text/pipeline_step.py +++ b/examples/kubeflow/pipeline/pipeline_steps/clean_text/pipeline_step.py @@ -1,7 +1,12 @@ import dill import click import dill -from Transformer import Transformer +try: + # Running for tests + from .Transformer import Transformer +except: + # Running from CLI + from Transformer import Transformer @click.command() @click.option('--in-path', default="/mnt/raw_text.data") diff --git a/examples/kubeflow/pipeline/clean_text/requirements.txt b/examples/kubeflow/pipeline/pipeline_steps/clean_text/requirements.txt similarity index 100% rename from examples/kubeflow/pipeline/clean_text/requirements.txt rename to examples/kubeflow/pipeline/pipeline_steps/clean_text/requirements.txt diff --git a/examples/kubeflow/pipeline/data_downloader/Dockerfile b/examples/kubeflow/pipeline/pipeline_steps/data_downloader/Dockerfile similarity index 100% rename from examples/kubeflow/pipeline/data_downloader/Dockerfile rename to examples/kubeflow/pipeline/pipeline_steps/data_downloader/Dockerfile diff --git a/examples/kubeflow/pipeline/clean_text/__init__.py b/examples/kubeflow/pipeline/pipeline_steps/data_downloader/__init__.py similarity index 100% rename from examples/kubeflow/pipeline/clean_text/__init__.py rename to examples/kubeflow/pipeline/pipeline_steps/data_downloader/__init__.py diff --git a/examples/kubeflow/pipeline/pipeline_steps/data_downloader/build_image.sh b/examples/kubeflow/pipeline/pipeline_steps/data_downloader/build_image.sh new file mode 100755 index 0000000000..b1d08cc5bf --- /dev/null +++ b/examples/kubeflow/pipeline/pipeline_steps/data_downloader/build_image.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +docker build . -t data_downloader:0.1 + diff --git a/examples/kubeflow/pipeline/data_downloader/pipeline_step.py b/examples/kubeflow/pipeline/pipeline_steps/data_downloader/pipeline_step.py similarity index 100% rename from examples/kubeflow/pipeline/data_downloader/pipeline_step.py rename to examples/kubeflow/pipeline/pipeline_steps/data_downloader/pipeline_step.py diff --git a/examples/kubeflow/pipeline/data_downloader/requirements.txt b/examples/kubeflow/pipeline/pipeline_steps/data_downloader/requirements.txt similarity index 100% rename from examples/kubeflow/pipeline/data_downloader/requirements.txt rename to examples/kubeflow/pipeline/pipeline_steps/data_downloader/requirements.txt diff --git a/examples/kubeflow/pipeline/lr_text_classifier/.s2i/environment b/examples/kubeflow/pipeline/pipeline_steps/lr_text_classifier/.s2i/environment similarity index 100% rename from examples/kubeflow/pipeline/lr_text_classifier/.s2i/environment rename to examples/kubeflow/pipeline/pipeline_steps/lr_text_classifier/.s2i/environment diff --git a/examples/kubeflow/pipeline/lr_text_classifier/Transformer.py b/examples/kubeflow/pipeline/pipeline_steps/lr_text_classifier/Transformer.py similarity index 79% rename from examples/kubeflow/pipeline/lr_text_classifier/Transformer.py rename to examples/kubeflow/pipeline/pipeline_steps/lr_text_classifier/Transformer.py index eb688e4561..1a314f79c4 100644 --- a/examples/kubeflow/pipeline/lr_text_classifier/Transformer.py +++ b/examples/kubeflow/pipeline/pipeline_steps/lr_text_classifier/Transformer.py @@ -1,5 +1,6 @@ import dill +import logging class Transformer(object): def __init__(self): @@ -8,7 +9,9 @@ def __init__(self): self._lr_model = dill.load(model_file) def predict(self, X, feature_names): + logging.warning(X) prediction = self._lr_model.predict_proba(X) + logging.warning(prediction) return prediction diff --git a/examples/kubeflow/pipeline/data_downloader/__init__.py b/examples/kubeflow/pipeline/pipeline_steps/lr_text_classifier/__init__.py similarity index 100% rename from examples/kubeflow/pipeline/data_downloader/__init__.py rename to examples/kubeflow/pipeline/pipeline_steps/lr_text_classifier/__init__.py diff --git a/examples/kubeflow/pipeline/lr_text_classifier/build_image.sh b/examples/kubeflow/pipeline/pipeline_steps/lr_text_classifier/build_image.sh similarity index 100% rename from examples/kubeflow/pipeline/lr_text_classifier/build_image.sh rename to examples/kubeflow/pipeline/pipeline_steps/lr_text_classifier/build_image.sh diff --git a/examples/kubeflow/pipeline/lr_text_classifier/pipeline_step.py b/examples/kubeflow/pipeline/pipeline_steps/lr_text_classifier/pipeline_step.py similarity index 100% rename from examples/kubeflow/pipeline/lr_text_classifier/pipeline_step.py rename to examples/kubeflow/pipeline/pipeline_steps/lr_text_classifier/pipeline_step.py diff --git a/examples/kubeflow/pipeline/lr_text_classifier/requirements.txt b/examples/kubeflow/pipeline/pipeline_steps/lr_text_classifier/requirements.txt similarity index 100% rename from examples/kubeflow/pipeline/lr_text_classifier/requirements.txt rename to examples/kubeflow/pipeline/pipeline_steps/lr_text_classifier/requirements.txt diff --git a/examples/kubeflow/pipeline/spacy_tokenize/.s2i/environment b/examples/kubeflow/pipeline/pipeline_steps/spacy_tokenize/.s2i/environment similarity index 100% rename from examples/kubeflow/pipeline/spacy_tokenize/.s2i/environment rename to examples/kubeflow/pipeline/pipeline_steps/spacy_tokenize/.s2i/environment diff --git a/examples/kubeflow/pipeline/spacy_tokenize/Transformer.py b/examples/kubeflow/pipeline/pipeline_steps/spacy_tokenize/Transformer.py similarity index 89% rename from examples/kubeflow/pipeline/spacy_tokenize/Transformer.py rename to examples/kubeflow/pipeline/pipeline_steps/spacy_tokenize/Transformer.py index 3258ec3732..51de9b68ac 100644 --- a/examples/kubeflow/pipeline/spacy_tokenize/Transformer.py +++ b/examples/kubeflow/pipeline/pipeline_steps/spacy_tokenize/Transformer.py @@ -1,5 +1,6 @@ import spacy import numpy as np +import logging # from spacy.cli import download # import importlib @@ -11,9 +12,11 @@ class Transformer(): __symbols = set("!$%^&*()_+|~-=`{}[]:\";'<>?,./-") - def predict(self, X, feature_names): + def predict(self, X, feature_names=[]): + logging.warning(X) f = np.vectorize(Transformer.transform_to_token, otypes=[object]) X_tokenized = f(X) + logging.warning(X_tokenized) return X_tokenized def fit(self, X, y=None, **fit_params): diff --git a/examples/kubeflow/pipeline/lr_text_classifier/__init__.py b/examples/kubeflow/pipeline/pipeline_steps/spacy_tokenize/__init__.py similarity index 100% rename from examples/kubeflow/pipeline/lr_text_classifier/__init__.py rename to examples/kubeflow/pipeline/pipeline_steps/spacy_tokenize/__init__.py diff --git a/examples/kubeflow/pipeline/spacy_tokenize/build_image.sh b/examples/kubeflow/pipeline/pipeline_steps/spacy_tokenize/build_image.sh similarity index 100% rename from examples/kubeflow/pipeline/spacy_tokenize/build_image.sh rename to examples/kubeflow/pipeline/pipeline_steps/spacy_tokenize/build_image.sh diff --git a/examples/kubeflow/pipeline/spacy_tokenize/pipeline_step.py b/examples/kubeflow/pipeline/pipeline_steps/spacy_tokenize/pipeline_step.py similarity index 76% rename from examples/kubeflow/pipeline/spacy_tokenize/pipeline_step.py rename to examples/kubeflow/pipeline/pipeline_steps/spacy_tokenize/pipeline_step.py index 515ee09d95..10905decc8 100644 --- a/examples/kubeflow/pipeline/spacy_tokenize/pipeline_step.py +++ b/examples/kubeflow/pipeline/pipeline_steps/spacy_tokenize/pipeline_step.py @@ -1,6 +1,11 @@ import click import dill -from Transformer import Transformer +try: + # Running for tests + from .Transformer import Transformer +except: + # Running from CLI + from Transformer import Transformer @click.command() @click.option('--in-path', default="/mnt/clean_text.data") diff --git a/examples/kubeflow/pipeline/spacy_tokenize/requirements.txt b/examples/kubeflow/pipeline/pipeline_steps/spacy_tokenize/requirements.txt similarity index 100% rename from examples/kubeflow/pipeline/spacy_tokenize/requirements.txt rename to examples/kubeflow/pipeline/pipeline_steps/spacy_tokenize/requirements.txt diff --git a/examples/kubeflow/pipeline/tfidf_vectorizer/.s2i/environment b/examples/kubeflow/pipeline/pipeline_steps/tfidf_vectorizer/.s2i/environment similarity index 100% rename from examples/kubeflow/pipeline/tfidf_vectorizer/.s2i/environment rename to examples/kubeflow/pipeline/pipeline_steps/tfidf_vectorizer/.s2i/environment diff --git a/examples/kubeflow/pipeline/tfidf_vectorizer/Transformer.py b/examples/kubeflow/pipeline/pipeline_steps/tfidf_vectorizer/Transformer.py similarity index 52% rename from examples/kubeflow/pipeline/tfidf_vectorizer/Transformer.py rename to examples/kubeflow/pipeline/pipeline_steps/tfidf_vectorizer/Transformer.py index 25bc4f9857..7d8120fec7 100644 --- a/examples/kubeflow/pipeline/tfidf_vectorizer/Transformer.py +++ b/examples/kubeflow/pipeline/pipeline_steps/tfidf_vectorizer/Transformer.py @@ -1,5 +1,6 @@ import dill +import logging class Transformer(object): def __init__(self): @@ -8,7 +9,10 @@ def __init__(self): self._tfidf_vectorizer = dill.load(model_file) def predict(self, X, feature_names): - tfidf_features = self._tfidf_vectorizer.transform(X) - return tfidf_features + logging.warning(X) + tfidf_sparse = self._tfidf_vectorizer.transform(X) + tfidf_array = tfidf_sparse.toarray() + logging.warning(tfidf_array) + return tfidf_array diff --git a/examples/kubeflow/pipeline/spacy_tokenize/__init__.py b/examples/kubeflow/pipeline/pipeline_steps/tfidf_vectorizer/__init__.py similarity index 100% rename from examples/kubeflow/pipeline/spacy_tokenize/__init__.py rename to examples/kubeflow/pipeline/pipeline_steps/tfidf_vectorizer/__init__.py diff --git a/examples/kubeflow/pipeline/tfidf_vectorizer/build_image.sh b/examples/kubeflow/pipeline/pipeline_steps/tfidf_vectorizer/build_image.sh similarity index 100% rename from examples/kubeflow/pipeline/tfidf_vectorizer/build_image.sh rename to examples/kubeflow/pipeline/pipeline_steps/tfidf_vectorizer/build_image.sh diff --git a/examples/kubeflow/pipeline/tfidf_vectorizer/pipeline_step.py b/examples/kubeflow/pipeline/pipeline_steps/tfidf_vectorizer/pipeline_step.py similarity index 100% rename from examples/kubeflow/pipeline/tfidf_vectorizer/pipeline_step.py rename to examples/kubeflow/pipeline/pipeline_steps/tfidf_vectorizer/pipeline_step.py diff --git a/examples/kubeflow/pipeline/tfidf_vectorizer/requirements.txt b/examples/kubeflow/pipeline/pipeline_steps/tfidf_vectorizer/requirements.txt similarity index 100% rename from examples/kubeflow/pipeline/tfidf_vectorizer/requirements.txt rename to examples/kubeflow/pipeline/pipeline_steps/tfidf_vectorizer/requirements.txt diff --git a/examples/kubeflow/pipeline/tfidf_vectorizer/__init__.py b/examples/kubeflow/pipeline/pipeline_tests/__init__.py similarity index 100% rename from examples/kubeflow/pipeline/tfidf_vectorizer/__init__.py rename to examples/kubeflow/pipeline/pipeline_tests/__init__.py diff --git a/examples/kubeflow/test/test_pipeline.py b/examples/kubeflow/pipeline/pipeline_tests/test_pipeline.py similarity index 86% rename from examples/kubeflow/test/test_pipeline.py rename to examples/kubeflow/pipeline/pipeline_tests/test_pipeline.py index e0073b5a5e..ae00c59706 100644 --- a/examples/kubeflow/test/test_pipeline.py +++ b/examples/kubeflow/pipeline/pipeline_tests/test_pipeline.py @@ -3,11 +3,11 @@ import dill import numpy as np -from pipeline.data_downloader.pipeline_step import run_pipeline as download_cli -from pipeline.clean_text.pipeline_step import run_pipeline as clean_cli -from pipeline.spacy_tokenize.pipeline_step import run_pipeline as spacy_cli -from pipeline.tfidf_vectorizer.pipeline_step import run_pipeline as tfidf_cli -from pipeline.lr_text_classifier.pipeline_step import run_pipeline as lr_cli +from pipeline_steps.data_downloader.pipeline_step import run_pipeline as download_cli +from pipeline_steps.clean_text.pipeline_step import run_pipeline as clean_cli +from pipeline_steps.spacy_tokenize.pipeline_step import run_pipeline as spacy_cli +from pipeline_steps.tfidf_vectorizer.pipeline_step import run_pipeline as tfidf_cli +from pipeline_steps.lr_text_classifier.pipeline_step import run_pipeline as lr_cli import sys sys.path.append("..") diff --git a/examples/kubeflow/pipeline/spacy_tokenize/Dockerfile b/examples/kubeflow/pipeline/spacy_tokenize/Dockerfile deleted file mode 100644 index edea5efbd7..0000000000 --- a/examples/kubeflow/pipeline/spacy_tokenize/Dockerfile +++ /dev/null @@ -1,3 +0,0 @@ -FROM seldonio/seldon-core-s2i-python3:0.6 -RUN pip install spacy -RUN python -m spacy download en_core_web_sm diff --git a/examples/kubeflow/pipeline/tfidf_vectorizer/Dockerfile b/examples/kubeflow/pipeline/tfidf_vectorizer/Dockerfile deleted file mode 100644 index 0caca3e8f6..0000000000 --- a/examples/kubeflow/pipeline/tfidf_vectorizer/Dockerfile +++ /dev/null @@ -1,4 +0,0 @@ -FROM python:3.7-slim -COPY . /app -WORKDIR /app -RUN pip install -r requirements.txt diff --git a/examples/kubeflow/requirements.txt b/examples/kubeflow/requirements-dev.txt similarity index 100% rename from examples/kubeflow/requirements.txt rename to examples/kubeflow/requirements-dev.txt diff --git a/examples/kubeflow/seldon_production_pipeline.yaml b/examples/kubeflow/seldon_production_pipeline.yaml deleted file mode 100644 index 3b16ee600c..0000000000 --- a/examples/kubeflow/seldon_production_pipeline.yaml +++ /dev/null @@ -1,49 +0,0 @@ ---- -apiVersion: machinelearning.seldon.io/v1alpha2 -kind: SeldonDeployment -metadata: - labels: - app: seldon - name: nlp-example - namespace: kubeflow -spec: - name: nlp-pipeline - predictors: - - componentSpecs: - - spec: - containers: - - name: clean_text - image: clean_text_transformer:0.1 - - name: spacy_tokenizer - image: spacy_tokenizer:0.1 - - name: tfidf_vectorizer - image: tfidf_vectorizer:0.1 - - name: lr_classifier - image: lr_text_classifier:0.2 - terminationGracePeriodSeconds: 1 - graph: - name: clean_text - endpoint: - type: REST - type: MODEL - children: - - name: spacy_tokenizer - endpoint: - type: REST - type: MODEL - children: - - name: tfidf_vectorizer - endpoint: - type: REST - type: MODEL - children: - - name: lr_classifier - endpoint: - type: REST - type: MODEL - children: [] - name: nlp-pipeline - replicas: 1 - svcOrchSpec: - env: [] - diff --git a/examples/kubeflow/test/__init__.py b/examples/kubeflow/test/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/examples/kubeflow/nlp_pipeline.py b/examples/kubeflow/train_pipeline/nlp_pipeline.py similarity index 99% rename from examples/kubeflow/nlp_pipeline.py rename to examples/kubeflow/train_pipeline/nlp_pipeline.py index a7e38f751d..280fd953d7 100644 --- a/examples/kubeflow/nlp_pipeline.py +++ b/examples/kubeflow/train_pipeline/nlp_pipeline.py @@ -31,7 +31,7 @@ def nlp_pipeline( name='my-pvc', resource_name="my-pvc", modes=["ReadWriteMany"], - size="2Gi" + size="1Gi" ) download_step = dsl.ContainerOp( From 88c99a2fc4f039cadaa8b7dc2774b354a0f252c9 Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Sat, 25 May 2019 20:04:06 +0100 Subject: [PATCH 13/22] Added initial notebook --- .../kubeflow/img/k-pipeline-dashboard.jpg | Bin 0 -> 153978 bytes .../kubeflow/img/kubeflow-seldon-nlp-full.jpg | Bin 0 -> 160812 bytes ...ubeflow-seldon-nlp-ml-pipelines-deploy.jpg | Bin 0 -> 76452 bytes ...eflow-seldon-nlp-ml-pipelines-training.jpg | Bin 0 -> 59522 bytes .../kubeflow-seldon-nlp-ml-pipelines-zoom.jpg | Bin 0 -> 82143 bytes .../img/kubeflow-seldon-nlp-ml-pipelines.jpg | Bin 0 -> 108525 bytes ...ubeflow-seldon-nlp-reusable-components.jpg | Bin 0 -> 64039 bytes examples/kubeflow/img/pipeline-view.jpg | Bin 0 -> 66986 bytes examples/kubeflow/img/upload-pipeline.jpg | Bin 0 -> 96098 bytes .../kubeflow_seldon_e2e_pipeline.ipynb | 1047 +++++++++++++++++ examples/kubeflow/requirements-dev.txt | 1 + 11 files changed, 1048 insertions(+) create mode 100755 examples/kubeflow/img/k-pipeline-dashboard.jpg create mode 100755 examples/kubeflow/img/kubeflow-seldon-nlp-full.jpg create mode 100755 examples/kubeflow/img/kubeflow-seldon-nlp-ml-pipelines-deploy.jpg create mode 100755 examples/kubeflow/img/kubeflow-seldon-nlp-ml-pipelines-training.jpg create mode 100755 examples/kubeflow/img/kubeflow-seldon-nlp-ml-pipelines-zoom.jpg create mode 100755 examples/kubeflow/img/kubeflow-seldon-nlp-ml-pipelines.jpg create mode 100755 examples/kubeflow/img/kubeflow-seldon-nlp-reusable-components.jpg create mode 100755 examples/kubeflow/img/pipeline-view.jpg create mode 100755 examples/kubeflow/img/upload-pipeline.jpg create mode 100644 examples/kubeflow/kubeflow_seldon_e2e_pipeline.ipynb diff --git a/examples/kubeflow/img/k-pipeline-dashboard.jpg b/examples/kubeflow/img/k-pipeline-dashboard.jpg new file mode 100755 index 0000000000000000000000000000000000000000..4b961b3b5f16f744842db119ce3730cbd7a5bec1 GIT binary patch literal 153978 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

kc~d-z3G?bm-Qe} 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 literal 0 HcmV?d00001 diff --git a/examples/kubeflow/img/kubeflow-seldon-nlp-full.jpg b/examples/kubeflow/img/kubeflow-seldon-nlp-full.jpg new file mode 100755 index 0000000000000000000000000000000000000000..40097aa2d0f8e9324c398d0d4461b2e4d3aef34d GIT binary patch literal 160812 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𝔩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 literal 0 HcmV?d00001 diff --git a/examples/kubeflow/img/kubeflow-seldon-nlp-ml-pipelines-training.jpg b/examples/kubeflow/img/kubeflow-seldon-nlp-ml-pipelines-training.jpg new file mode 100755 index 0000000000000000000000000000000000000000..b441bd286063ff33973a9891e6620237f6381035 GIT binary patch literal 59522 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 literal 0 HcmV?d00001 diff --git a/examples/kubeflow/img/kubeflow-seldon-nlp-ml-pipelines-zoom.jpg b/examples/kubeflow/img/kubeflow-seldon-nlp-ml-pipelines-zoom.jpg new file mode 100755 index 0000000000000000000000000000000000000000..0608839b89d51a9acab845b5e166adb202c3eebc GIT binary patch literal 82143 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ΨUS^5lqf=SbAsh;Dry4=ppyo*OtkzOMTwsWg|oYa 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 PS-|w|f0!;}|2F=2gN|;6 literal 0 HcmV?d00001 diff --git a/examples/kubeflow/img/kubeflow-seldon-nlp-reusable-components.jpg b/examples/kubeflow/img/kubeflow-seldon-nlp-reusable-components.jpg new file mode 100755 index 0000000000000000000000000000000000000000..bc1d9649eb41cfa9e34c2afb8e142b6046535aee GIT binary patch literal 64039 zcmeFa2UrwK*Dl&5$sm#>M+uT7X9iS~hzKYs2ty8%b94q!M2P|-3d$fsR0NbDnIR)0 zIZ9>-N*+L9U;?Mzdw+X>-=EI*-t+v=z2~Q)XR2#fSJ!%Lb@f`SYE>VN9nAtKFX`y( z07OJYfDQNu9L;eZY6rVI0f3<)a25an3g84l4G@DVA@IPC=oCN#ris8mfJpk!{0Brb zzonT#n&KE&fb=&SfTDSY6CelkXuxAL0ASGJTme%Q;C{RvBXEqsF#^X393yay!2d`D z%w0Vlyn_6Auex~od+};JxcYnf@=BkRJSQoA?wqu=q_l#pk{s~&sASGbE32H7SCNtD z1ryTJD(B7tz==mB|IkVpI3JPznLd}2{9BsjCs9huU+HY3zqFgbG#AQ~Kbz-RbNL@B zq{mDjBXEqsF#^X393${20{^OQoKsMdQ2_p}UeG08pGbL4Jaaf}EV3 zl9GaohKZJjnwo~~6eB$o7dsC(7ds~>ub`wbFTc0|C#Q&_sQ5W)IXO8VVP$nC88t~+ zIhmh@5K&T6(ooZ!rlmbC!^g=d^UK>&BfvlbsDT<35g$OzKt#eobkqv)fVCt8y-PnG zOn+=d#3ZC-C&(!%si;AMijyG6BqYS7BxGcypxcP(4){Aj%0PCCPg?5)qp>YHzYmj4 zWb#W2f%6}lm`(c8g0gnLQIu3Htf$%7&j<;Nh@O>`S5Q<^R=IFdTSr$<|B~so>t^OR zZd%woI667IxZd{j4+snj4hg+`FZzDWgNLyxsgKj1q(6O@k&~O3|El2io42K9oP?d=U``fjbEUDH)&iiBnp}8KLlGb+g6gl2Z*}@8O8=Yd z_7|uG3kB*@+BcX)$aDN=iU89=oY5QT$~nu5l!+5jlnxh2OPOVe^`>)g&-1j!KE~uM zEVFw|D(DN2enhxz-{q!bn)OK?U2OxdS8vtcbcKcYPsle`Z{KA8s-gMvYwUZPcTD)f z^;PYT_znJH$sB{==>gGuB8!3?WmKQ&aPBK(6VLm|)=gU#%|0Gpux!lV+_u~|F({*~ zjn+!F-0Ru4)Y-NV6Oo7(>+RcyumewG0g-ItKR-wX=?a)Up~eS&MAdh6zv(RQ^1J{z z(uZLF|C>w$O=hVIRV&plR$8HDN{Zx*+p6}(%v!=cm%6J)ey}{@c$P0|Cef@#8vh}8 zE1l0fVjlBhAVL=9MP(stMDt3jbh5){BE0FNruW0d`K9*Iu&v8caPrd2T^!=RIvp|- zUt+sz5mLSpFn8~UAtL#Tj%bO3cz{34m4?XEHu+ZBYbBd`0lpKI^NXmL7ttx!Aq-7w zrSIuX#9SAQqwGl6O~?;RW#F|LK)Bo7%_3VD>zl@s+^1XZ%mUJk<3s>Yp0kynVFApc zGi~f=Z!~Y|2Q7RMJ?SR8|B+nDB=Z4R&p8niU$)$;XrYIdIxB3JL+mi0kqAcL!=#>s zt`&$1peXek_kFSm`KzQswh~y4|?xFJK4bSxw4`IDxkCwLw536rlvXK(g+fJ7`qlYKoPhG$lRC~>y zoR)2+RwO-DrDRRX^_}=#7P(GsNc0@V&cTxUbCy$^*7*Cn^JX?^$H(jzmbnap5zN)f zN_>^xd9yToOh78;>Wbow$Iym}>(jF`9o%gcZ|5`@9{CAyF1@t~mPCDCVryHhZ^^T^ zlyAMPk6%l1@UZROl&S{$bVI63+L*mCr#0pAv{nIuSKlmd!{siw& z?0`SOOV<4Z;HyOcAjQAU<071Aq#6F}*U-N`E z8x!DQoUBRq``2&B#+qboOvMp0BA;@;6UW*xIb0=5*3kx-t`g~JvjU%T`P2HybRhGK zJ&?$-unZfX?QQrZp?m^~*+vkmE4Q<0GV8YtADDEV#+E*3j}jGfuv;x~0CYx4;aTNC zgMa?Dx30+GHyX~Qk%Oxv?<`@5Y|rK^4uVZ7r|u^DVfs!q!waF=`RcTQ-=;*}nTy@* zES(%xJt~8S!zs~1H_lg`u@oTZ3R$+&0VLmDf!rY%;9am8%*`4wo8Ww}tWNx1j;I2Z zAns)R+0do1Oo@2f^M@R&sY|VETuEoEm&XfVy&;WQt9bmP`l@}CeB*pzpv3(IyNNL2 zuadrX-#TaGNgjnI-qs6HbxjSO_;SMMi`5ZOa_LrXjiR`>1ctCxDF4-HR#%)LWV5oZ zP218bO{7U8=*;{){i6vp5{K&AqO5L(krcAk`J@HaVKMzd4)!J21o1cbiJEaWlmC1GPwqznj3Xh zhg_;5KQwp_C*Dc&v+~y<5#9K!p>}?2sGXzP=NrAD`@Ng=0(% zt0$`c;&)%YQ0dIkOL(WF)G1PXf>qteN{3kEg)=YFdajL%W2ouN4;3Fh`Yby*?Afk& zFj0(`9|1{vgfw+O_3n{&!)7*`x5Zb}=VC@)OQ!RGoQL~QetS|(y%KmPhhIg!fM6FC z{v7cf>>-A4k9V#wN_xI}%-!QFQnlvx75@4Nh-5Fb@+Xk`_M)7)U&oypEPU#c2K z;3D9=e5#NkK61Qgw5;K@jZdfW-KHiqJuYFFT+>t`)IzUtjnB_Z4 zdZ~itfME0uc?>{$swQAY(nUKlq+^y@#3ja1&SVc$B)9mz#=yW zovfP=m8bYR53ea)kMlkPIvS4v|06)!l!%b>ji<40esa``KH_s&%-|e z`p~f`sZvXLZyjX6F?a3B%+4k~9xVc3&s5^DEnrtjrP1ke1ZZr*XNV(&aw7P!64lDv z{9uPl#^dl21cL$m;l351GC?w#zib|67OOZ4eulxTf~tx2J$y2*dBs2bYB;n_A8fIh=1rG_p-u z2^zQNF|5zSGF;ERkKIqLsNK|*eZRZc`P!P`I1};QvxEED5kO@_50^=Ayh3fCbROP( zANkZ1Ob7lD#)$xK2lqD^qryT@LGn)!Y_k~S_x2%kn&cBpopTT=KLXR82Cs{_`fh;7 zE3+SRmJHXL$XIzB`0YDI^=jqLscOm|)lgIf8S?4+rz<`aqdfEHXTAh32rI3xkYoCQ z${nt1%1>PNnvju5xOB%K$q1s?m&1fTr@^+jAj5T(!mNL$0F4<172(A-NPALc_jg44 z`y+rI%u~#PK`(({YQl?}M99pabdEt^CKIW`JyUpWE9BL2WIwyJWb%pe&A!O_K4FVxr3H1x_f`%pJ~Wd~u11}&9Zuu8Cpw}+#@EpM=g zyQiN@usZ*5rK^DHpV?CU8fv}{PAVoBb^f3LkJS19s7p{#kYtdoq?fO=l(e$4veY>l zDH$0FkV3*Q#M9q4Si;j!;Ew_>I{MlBx_bM&dU^8xEYQ}@E5Ki!KOn%>LB+||N#4%E zL0-bnR@Om6TH3)@!q!1nTEanA)uX+K?izo~Ppu~PZ%_NH9LI~c{*D?y%}9xJ@)9!g*M54mf0~y6bkgrMYEnO$`zK~K ze$N5%15@BDxY~7_MJJ;FpMxrRx~3UqaxQh>xY~ z7_MJJ;FpMxrRx~3UqaxQh>xY~7_MJJ;FpMxrRx~3UqaxQh>xY~7_MJJ;FpMxrRx~3 zUqaxQh>xY~7_MJJ;FpMxrRx~3UqaxQh>xY~7_MJJ;FpMxrRx~3UqaxQh>xY~7_MJJ z;FpMxrRx~3UqaxQh>xY~7_MJJ;FpMxrRx~3UqaxQh>xY~7_MJJ;FpMxrRx~3UqaxQ zh>xY~za6f>A~qa7!7z;=FdpN#h;b5P;-CNEMhgCuQT&X(CZi%JKS4o5MMFbPMNLgh zcj_c99RnRT^+}eK42(?7%*-_OtfyI+PM>08X8J8+oCG|Fl#G&$jFO3#nwII8x8EYh ziD*azNQn54BgTP>|KCT9<4tp7!Eo{aPwbZf3z58RvVT{ZlqXTR^Vb%NuaEja=k&AxC1%vNku;Hc3}z1qXYMuhX1_G_guqN8iWWbdRq zx1`+80&vuYH+aamiSe@hB4tISEH*~nR3z|@ms1kLLx%GBC1xy+=S)L@@b$L37*@5Dg_q4H0-TnQhiq8TfRAEV+kjZB9fE z*OM3cyormI1+&hclMXSXuZThdU9OTZzzar=9*WX~xg&!8HF>X0)y^pz2ttV_~Z%`VKI45nDDegcD z#1zwO?5^{m-$G_zP7!1=0$>#le@DuN!UF^6_VBYP5H@P-Ys>}vkf>D`?FYJ$i&NQf#L?HB0{#K`Yac?%n z5lW2k}mm@%vKw5)BFWd@W3dHr*V(xkSQU+7Ma6LpU1`1Nh8VoF*{#xI~G>yH33 z(XEc=+D(Q70@0wmL&m5cmaFu@lef|)d@=q~NOG?@Y){qa2YhV;s}tOn5TuYxE`E8VWZwlsh1T<+w7WR;iC0H7ZBVf6m>MB7(eu@y^AI`Yxbmt9L6X(^B zbcWsw-AvpaTc|D@v^VC;lXxiUAqM@&>l%9uPqkntVlUyxBf1c zm$sanrOJyBQWu{PxIW(?>Em>cAMKo>fY0Vv!plmce@MkZxinZXnJu9oV;or!wD{XUdb-0#HRPgL|=kax*N! z!p2ot2=0uEpikb*B*B;Qf(~!*dr6>lJPK&rVDYZ(Ma9(x7Aq{W`NL^L25OA$zNI>i z%#IrOI0^DQf;`+1C!>kN^D&K;HG~%^X|=6e9dmfY4Y`T*7c!suI}`G3QDYeHNrLN*B7mN3^+wNQ}jFJ;m*@$@Rty`DGeX+ zHj9Q0SoE%~qRm9Zc|!J}oU4cTEIboeN&U*51D6FEs?LrXzjxrt&_=z7%x2A$mn3M2 z2`AN&Z<*n}Gz2k_Yr&Fv+k6pSCs5A?FTD-aOQa_IzPxI!wMA!!FM`Y#WO1VNbl0s< zVs5fdcq52Cg@cfe4zs!$7Nf?U)jmD zfR&Ue=q+B!P|)|o*G_a*PG8rqv#&b^s~??&rG0L*w}+-ds9;jCF|b~(B@f4qT9C0B zLh1H%hS%4>Sd3&kJ$<L@G*dF#(zvsZx z^ze1>N37?seae6So|Aa&8=Fe|`lVGvaU59mgEua(zpfrKvF^oUqK^Q2MX!4ut&lA* zWEpG_pS))P-$mH&1cgjPGxxWBkUY_MYB`>)E@!#zI7uBCQXc_hVD$KMx%u*?5&zv> z${^&@XT(-sJw!mUwKDYvCdjlp5?77-_(X38Shu-%x3?Z<3j1;dFdYFN$nn~i!}f|< zWE_mAv|?bB>~YsS*Fa-s-^lHk;yePhL&?y$SyD$pviS|+g0Di$gt?M-Bt{sy{%w~2 zt5{=}NPjpqFF4htc4${CgxV!=WIHGOp(%}Hh78@cALOxo&dS35u>8-2PPq!?oc#(E zbL|K~U)@AudS~OqZcf0rOB>Sgk8z4y9W5}95q``!R6S2y#!#j04{QRr$bi!N9&kO% zvYB$K>W3%2#X&ED#}KXmiKLkTA)mSO;RsmxeAu-YgxSr84M1s&)V$^j4KH=*S7*5S z$CxE5eWT?_v%Bc4GOv+<>0MJg-W##Vud-cDHmIWu4wgW;@nm(Psg*M z+d~{Q3%DDv4OEu8ZY&UHQ})LQ&B<7BB$i@_ z7)iTy{)U3aT5{!nsrjy~(J=T3IzfA>c|~kWWBaQoZ`Hl~i8sDp5O~9-MJ_Nlnh6^^ z0?K-lu!iC6BjK!Xp001af|k2hZd5CzKcG(&<|@7Pe&bzBz4y!q`ljAkBvAun*R0Wl z!;g{07OtBKEStKuRT+A7?oXn$#HGf`THdY95B88tk!FpW;wD$dcDM?iA|*iA*zA-QmL@O4lv+b%Bm(woS+xIJ#N z<$(xWG;d<2I*~ioF_H8LjAdxVPlZ@Gxv{x z+iimZj>Dd6XXX>m5RbX-ec0q6VP)vzUKA&Bcw=Ugmzw%X7JV&#q|g%AkvFHLE_KLr zxg^|IWpt@vz3i=U5?G~NXxX=WKi)i9!fIES*4N%ZU%pw(_-H!j^F0Msa`Ji)U91#g z^3e0?I2U4_B-=1oL|US|bw_=pW%9FohT&KTuDthUi4{HtZeyjmcV`P+%pwVAj&egj zfS%fHc_?2vJ7GglDC?U3(zD*5AK1wWRC^3FrRnt?O0~tB+@@0)F61&_Ps83a!17@% zTQb(N=u+E4VQ<1m80CVF00*oX>2v|!baS#$NMmyfS6|u#rNdo8M;DDHwzOJv4Hpfd z_{3e+>sznXK3=!cBIVvq-AbCHzYkLhS04`NKuz#`{5~G#;Zan2;}&P$hmUllraL5e z2Onwi;$-s(jga!7M$2k<0y!?M@*{dewob+Q!MzW8L=R`R7jIqcPAq=?Ol_U{d7uxX z3m4<)fZ7`*Q09YAR7QL}fezy}tNVb!kAZ6q;>b`5teqL-ci6P^Sj8Q$oqWo4ugh~T z?ScbIiVS^8I5R$HR|=GXCWst7mZ1D}@^&CQX<4U4=lFh#&L$Jt!f1*fWiIrIWhx zekxIyxCSylxOW|2qUMH9H6Csd4%b9`CHNar=Vg3)KQMcvxG90-i_7O57iuYP#-;=F zuQW>rkVJ?18QzXf)3kd;M6=ml-OVLah%@zgR{d;Ik3s=aq zA6O;NV)jE8eWR~m`{yX=AFm}|c>bu~$69d?I%d9CjM1In?ax10>lHA&f? z)fX(&7q`1<&D(51Nt|}7a!To23G=P436&?)kc2&f)F+t*cM!9%hnUK_&1jrQPH%p2 zOiPV*<*OcrPB*wSXFs@pNxR#zkgA7h+3lXg* z?Q&6(|utcqQ! zware+4b8=^2aU;~QuRO*0>b z8)=2F4r*|RUq?&Dh|5z)2KZ6cm2IZFSba@5@>K%7eav|Reb+`;l*5JwR$lZD9sz5a zQU^PC33w^YHFWbM$+7txqu93q^T8hM1bEkKF*y=cF`OlMA1LAaXdk51D-!7X(g7_cwhoh$F_@ui2Y*#uU!-ms?sVx*)rwH4H|gX#{`A2M$x@b}X_M_q8s zgHlLrykBX&oOxw#J9)_AleDvq3sRh!dOppqq9n0!kev7MVD{$H4as9T{H-BttN&o zS>1J#t_nDKDE9~_ox&5dgRvx>0*#^Sw0*EU?Rgq!#h`&hU?JZgGq?;cTB=f)s&~ zhuNk3Rkl&3t4dUhU(h}38t1W~)cEH_ok9_+pT*+;9?~_HEjw?6Cycguw;&JRwLQ0` zOL7Z8)jZG9;L0!7sakWNC*Y0DMtNCPM)X5{s`ED6!81X`i;wjV=lHk%wq|U;TSv zr<-Ez4iS;=b@E`5F|i)j{oq<`?i07EGUCT1TDr<;=r&-+`{sjkMAOE%c;Ylzk+J2p z0tQFGy^b~uS=ZN$>*H6l-%n1>5pO)(<64*(27L7kH6$^x@S7#BDzO+us|DZSb3G6L zxH+==5w07Qsjib6CMxk!I(Gn76|scj2A&tD?c?x=rV}x!xk>g)?XLXw;-t}TBaF?e@I~r>aM>@xTwVbB=_}0F9}6n zqsgxK?(K?nNNJ%Ip8GNv&;&R&ycvp0muWZx)~n@D1_-uBqRU7D`gBhP{D5wFA97W31xc)tF1 zuc#Zh?1Q=mwL^r1uC{EHQPwi)`~IQey9V<;mg?xKp{L)zlxaNf$A zmO>&K57n5@y2g+6db7!$wSE3hA0o<+f!SapeNZJBeVoqf*)w!RjbB@2)hdjXjjsAm|tAe@dZ}uSr7trl`FrMByFN^`sWXXI6Un!JBm-qCM z28&Gu(e`@#OpV?q*dQ*&^nbSp2`-xp!xU-`$RRP8!>{KmWJGFA<*iWDc2A#_Tt?VV zUy<=97yPY_W&glh;3w8G7YV&Sd=&#y_gMCCINAuEF9@FJDy8JP(xCQjH0ctM@(-_4 zZsxrnACqgW2_L5>*cu_9b9@)$(rxpD>~}`@lJI#NLbxz|ju1WzMzVrLC&@=u;sjx0 z31~Fw_?a6EY%U`*pYv1c2Dq|clUBTj&n6OxMkLzyV+n$od8@5!cki?pakbUCiN7## zPZ5Qdyt{|6u4n^wPM%!o$#5;qCdx`%akXrE;-SN%jewmq)hSwtKmcJnB_QQS6hdi?bK)z=T0ulbX_f8#*nLjEeGFugXw$iUtC#6oITrG^nc5_}99%#542 zsPsh6Qwt8j1cR>=dJ8Syo^ET7x_0>_zJ2mt@!e<}ibk74bUKdNs97Z@0qMS~E@fb( zf+a98*XkXdX(iqcyh?6jCIjr2IAd(tF~S6DzWF;+dc+(O)}Nj05+zyvKYC9oLvETw z%!=p}j61;b05Uk{Cg)pjQ8{@XGa!n_yfKR2jt;_ZuwNm1NyQ4%(6($e-r-+_89OZ5 zW5G0m<1V#(wrHaV!kIlobLH$#FL#J%Tr2T|vSC%%VPQ(I;a*blP;@@rafaPZVdsFo zei6BM<@vR_hJK%?EmAe2A&}V<4d56+RQTm1fC%m?l`vDbK3^UfSc#m-;Q!=(S=a_* zVw*Cyg>NrHjPDa<823J7#L!nbdvje%d02v@b-zU0_oj0kItU2k>x#}I>wPLGa5bq$ z`)Zx|q-AdMBY^ZC`qj(Xq;Y$cb!1`N!tGF4lx@|$U0v3bj&PDTSJ*g$LM|x@f;NQ{ z2QymL)RhiYBoLqehA{Hi9}=DrqsVnS_^I7r5Y|VKQK0rC;mjU$Fp@XP?z3PikT-+ z8G;2db{Niqk9SJk8T74AKeEN|?zh$+8$_qNn5XFK4ZU^XFA;pCD6$i#x3~KJ)Z#+A z;wP->-T?mXJESB1J(=KpS}X-9iSy78F5~`RuAg}tWzeAf_4Gkf$>(aaNFIq``aNPy zGSiA}$q zq;>@Q3J)itN5!xs7U{GZnzbM zs6l5D7?F;6oYia^0_)XsZfpfRYcj!?*gn(kO!6-5MhwrCM3yYHh^Ne`qlj@Y1*4sV znb8*G8PDA=aStLMF~0;nVL9a1Qor_Q6Uy*?PvI~f$70m3VD7CO;Og@-M5amRzCJ^F zm-pw!UD8t&`^8}ws_K4rL9o&7WkugF8e|y4d7BI!@h9SRB#ij)H=94K^vitc1jw{X z9I3pDrz}&TO19H8$?y=YVmHUT1((jdjA@)OitSq=V~IIp69@15U?2iLoZcDPluDh^h$CkZ{FM(bK&$F#o%zq^U6y`xJw6<1g!Y#h*8 zUTf)gCn33KFy$SjraRH+rp^_4Va1{pEd|p7~md7 zf1Y9%@3s@OXV8mN7ubv5%rrpa&webfBv6)Mb#HGsy~Pn@5=(CcW1Ad{-p$w8HlPL+ z#_W2xJo0(0=$H$3G$Y)8Pw+9P0~@b&=1rQ(dXcIeAfUSpl=T%${& z!fo^z!OiB)ILOI5?RhTHW|u4HQcl9&Q~j2a_7 zj)`SvR(G$xZkjn|wAXD;oERH4me5WTVtwNvg2%6*9yU{a&TU5${f$6v>I7fmIs&Sm zyb~?Fevf6GKrxbs3{u`5+|hlF11+>D1DrSpx<%5`aBeW%7`2*k;ldE#kWK6oYWSrq z|09(`)a0pZYj3TNd>hyl&uNV_!Ciaz(86oq&|T2~hTY zi;#5jS2I<&C!XibF91(5R&{#q=3QHQNAGJAQ6>wDX#5z|8wX z2=vem0l#$wd_|zl+u&d0_9~LVVZ=0)8-hF7%lzZc55wE&x|CKb*^5oj%g!pM3F-*h zF+X-!>U6cm7a%?8BjZRR3^0nOEpo$q=kDmXY(1&UxzPCTPjtMQ=9mq4)3Y-k~O(+GM_MZ%lV0|Md#LWtZV6#(kMJ4(WuJ zk}vvsF>~>ca1ccE3_2Z?|D^7ef3s z*o^?b`)0g8H-_-_;}Ekv+k4BHbf?o?lepZCl29- z89MdW(e`W8d|=QWlu@YF-?YeoTAqx5$10EcdlvamyDsW)Azkyg4DxKc?bun|O>{l( zdbTS&6epx{wm;KQ6X7`!Kz4s=lY-U1_x+|Yn-WQi;myD2XFB%i9eebSJ$lC;z5kaU zJXF16$6{NjOkZ+HLWz9S2y(IO+1Xg zx<29EJ)ing`Jt2Rboq3{PBi9(1U$C;`7Wz}8fg<1b;%}elK@}Aqy5)TY#eLx zuk*0;@^c~>naaTz_%QvoQ|f>x|EDvIa-VwMy7m~HnX+HZo8g$JSwG4Kuz?uxAwPoSZ?-c)r)@m`7AeDm(y zZ?zU;54f=eiV3vB&egD|6>#>k=1s(hrZ<-5dX(7g`Z5iTB19--`q{WC7sMm|upYPK z?v#V#y-vruDcc z{hez6@oC*|cq#pQ{w!kLvhmQaxWxHY@P-JBx>3u%thnF7XCNs03QcnAC&wN|U`)+C zFWeWOgCoPLVa(<&whA5;$xS88PAn7bDyHV?XYY$|`1Lu^(B(yThd|nUF+#mf^obS~ z?PYgfS_L~>*1%=vucD`#$IHJMiTBH>Sw39&_$75HV+qCyy1Il2#Nm(;fuZ8HfD*P& zMzIe12b(E+%#okIcz2wt+BK&scpm#EY(MOl@ue3}_S6aqlx?$K4B<|g#Vy9YXIqAM zmq!lQQY~B_>Cv&>91RoYb+p$T;GOC@0xmhXJAz}NO*rB8BjD7?VA54ge~_C|y2 zAX}xYrX#sq)-ksw zB;L(sFxY)(xqi^s>LAPr(Y4lm8y8z>SR}wSIxA|`9E8aW@51`EL!6Q0tFwrXs%uSo zw?Ngo8B+2^N&CSD$HdTq%q3mCx5an(Y}TGH&JI(yRj_v#85a)YAGXx)TS(Ruvn8_D zEhDQW=V@a!AB2?au3_g8(;2MJ^ki)1f05DAr%B*fiPCaZHf>?p zkRwpyIQuk+aPs}()N_b(E}l!eH}dNoLl&I^gF@J@YuSC#=Or2hyw8eaKcw7IIM`76 zm{uJ+egsH>5@g47pf9{G+#5E7mr8tz>1Xc-Me!cSr1)hzmO;aejc28#a1|a6FNNM~ zV8FR=A=|iwjYl>>=ND@T!s}yw7HdV)muHS%qGo4&c0_n&xn=c#$58AK3{5}`onqW2 zB-Z&dc;1(irNR8AStTCMCs^T92bT8{D;m-zL zZMchQPLWL=8vKMx*VLc|t*KYx3|l-8)g)$*fH-UF$`G6uny@z2&FNNSR7S2(njPRJ zI!~iXV6`8w|F&m^FR3HL8U{m*>iXrw3?QdM#P*H=x?7hEgFJWvg_DmQlGFvSYJDOn zJ*ht8XjLV^JK7094VirkA%>lEW4zs+0}X~4XI&87!B{VPn3?DbclxKC={2ojO1a`^ z%7S|C;Xehwf{X9-K-t$K4c)hderSbo1jK2EVtS?F?8th$@r|2nKa_;b8tTKj3OR31 zMR`*vSA=C8m=Y-c&?T)f{w>y4$T(xWf`{|#;PDWhOwNd?K7Hv7S0?W8Qk49KNu4lz zjWjf96q}+M=dxaBJU-MZm^XMm5iW)bYs)&_i}#IHn)g}ff4|gF7t2&pnRxoDHaqZ! z9Uy+aMs7P1JD@S|yYl0JQTWT_P*0c_#`znFVPEiT_z)ZX$CMY;4mLbfmY9IO8qPHw z&h^IqV}roDigk8p^}9_b9tr%=LLuEsccQm8HT_qfW)-h>`Pbq8Nya0YZKEGiJqC&y zj5a4VA1w%{Ejhc}rwW^d+11yoroVhw4fi{(KKjk~IpSlQ_Q*^WgjmgI%d*|#)f+T? zjx}k``EDzMR!v{%x$yJFgtD&N{15BHk!PZ+<{lN?av&6f4jNsY4d|e`0*UH40t|{) z_B)Kmgy%{+He)k%Th(uSxLw*3dd~MHLmaKmHS>5bSN7eb1{5;r?6vjAZ`9T$TV1o@ z%ty^|@sT+zhF-WLe&GG$~njA0isoLm6gVg0z9M9HZ`{z}B zbhu0&IIhOM3FQMX$pKE%9jPe6vP&X=WQ{kZV05vv82j0h##Ll=1{a|uU=Dk)Hles= z>0xn16^&qv;HBrDN(UO*L&!44wf?!Jul9{W)(q(Uy`tC4m8{#hB_u1vO}+^FU*tVK zpAd+W#wmBI{dkj*E4rF%u)|UJl4<|)fjNN+f`zQY*oVuL#tr5kr1Z8oF#2bjW6wdB zSw5W;cH{}OTXf)J=l5$iPlGqf!-R#~;S+_Z%7l^5^7-QLe%2Ma=e$HSmL@{)PM+wY z_dcPy41F6k@_yRFz(Y-6j!`sWKAA*J^fX`Oiu8Cx5dOsxV9OH&Ez@l+3Tuba){SZm zzq9PRJ$`5Ri^;g<#qGRWJ8G&bDr3#b^^RLvuEwzL^1ZUkFK-)g{xe36hmaAZOo;{* zBcYAJ-$m}98a{Lt(ri@vR%wBL1_#4Z$RX>>tQ}56yS*3#)ZI1I7bE&HDm-HCK*VlG z_Wd`!^Q}9gx|cp=euZwC30d!oYIz<3U-q5l(X6e#6V&Z9Wzh9r;TV|Es>ua3^j6tS z-e)50Xl+C9@fDQj(m6nL_WZliF-cPr@piaW)vfS+B%tRu%F@oT@8| zOED1BI+voygWbB6r{=Md=inVIS7BmeMcrS(I{Kz48>fdx#QF=4_`^>vvll<=st%wQ z!{kRq4jsg{!DV+#x*_BCty!lqV6Q?(hmj(0=7>|bZ>{lIudCUs&N&y%uJlcxZu#nZ zYFD)5WXNgnd(Um}fRj}T6r*UB?L&hH6$p+St*yy!C-U9xufV=bxpyZOGD7uWy)&iG zEj(Y}js&0~F#=`C>UdqhLMv6H5bs=aS^?j;dgONNx8mpXuZh1ZsHi!$`FXy+*Cs~o z2zY+2y#Gf5m1bI6bWW^j{6A}cKhytbwZBYZt%-~Pg)8P;*>vpNJXG-J^}hV7EbXmk zOxRU}(>_8SgWcW9)%KBP{KhUP^t_(VGNh>1%t^@`(durMogefR7xX&aHMf2q^%-j; z#uYpHRpN_wWq_;o@Q1tm^a3w8zW){*_^NaNj&gyirP3@aLYW%D;D*Lo49F>!BV=1x zEzYd3_Y^KdHat;P6?!&PFLFZ-y~hNEJ3q~`uel{wWwzZ#jifTy*Eu(?=U7+lw%bqE zL{wFR!nz6?_X>favVla@MclR>CHzx_vk8WO^CmXO>J68Z2vv@ z(*3U3l~?)+b%%ZA0zUbe45K&;je-*|*)a<0bbHf#jmX|JJGU$<%3lWlxRJ8#S9NEr zX+@QNzF1B4?JeBR0X0MJcUvwap=b6oHB#92y46NmQnZ!X#xJ{h$wcY+NH;afkM;et zQS?7PZJ4SWTwv;eZ6FL0eVV+TC7gt6Pkz;A%Yo7GIJJk`2FId%xwdav6xC^N%*y%R zdhVgT-SnxQ-uBj=Rt<45qOvI0&`Zs}asFb1!FOryo!23IPG2JhV5H~K-aaXcH0#C9 zzqhQ;vVmdhMjttC(44x$w|S>%lxx6)`H^>Z>aSh_3~de?R>!R}LsQafX8w|M%0xvRPs;_h(2(ScuB% zxYQ82LcZ1lcSR%<7-b^i+6} z+~!>^cy7mAhO)!S~B6@!1cRT!(hQY-@-IgHX$d{2bE{nJgdQxczItq+F4 zI3e8LLS3a-RK9<#$}~#=V$Pq>At04H97 z7TTT+d_!ZeCTk`E@PVR>K)d#3ZyN$52hP_3r*cHQN#W^W;O)^=04i8kSIXX51jBV3 zhNTv_#ocXEmQaT8CIqy_yQ3FoiM^FkRd}BHm}vPIMwd%C&WNl;IrUV?)SL_=68r6${0`+K7qhT2WFo< z5j;yjh&zPehsLTIy~0Sf)I6zwH;GTuAIuKREKGUsm;TNUCluFKI1E#@@5P=lf#<^P0i3wd?%m0lNlh z!;FEpS`~Ku$2hq3!9T5T;Eo7nbq+C0~<9NE#I$4v}O$X>ic;sGzC=vHy5-4 zkNIfkeDD@o-^9~^jtK%ed{3S=60%?gJ;eST*?lOMT>?)FRLgRH^YACxw?E0`;LWNb zN5BOIB>0-;8GM3Azfl@o#Of&moj48e>jvXLX2EDDdtIDBCE|yy+Yx{PO}DX;DJI{N zMd~s}aQT7WLpJbE!_k5FlM6V6AGkxf?*TsoNRU|eiJZjixR-%;|K=Jz|5~=Czwu|} zW63W@7+o*Occ)P>d{gxZ_>lXrWxILCDx2HXN<-$j>Oh&ygdPEnn}qhHe?6(FMr0BC znbk@7U+dfduT0BVYI7DIoL_7GH}(Bl_9n{fWElO&UGO!}zg^PSDg#34Ra`+&a>Fnr zKz65a1(UuYADh>QR!VlKtMpG3ju+I4v{V$DWR8y-V+cA5aPSMpZk9Hb3bRFz0V%w zd^+R(zzA!smAPitn&q0;^}l{IH`EAta1{i&Ggj$#usI7P@E6g;+O)+uH=NQgV%-u6 z!Eghm1MmCT;^#xKEROmY5fYlsg-$GO|6MeD-R3VB1Dke|024GI34@98%?1T zxK5j-2*(7Q|3Set`}mvjfBq(hKYmm3-)}Qs-N~eN7!dNi#sVgN7)7za)e&eeXBDS( zB02c$KyTI`y6vtsj#@iL9FYDeH3rm>bCBWoGN5%E0J}KXi08$~R8Yz`|04RZvw~w| z1j;HW+(9BR{J^u&7|v@Nm2xYX5rqc(yScl)98vP-!=_B?{@m(;2Io;{g1bAIi9rWD z-uS$dBljW+k9Y#dc=}i^J8Wa}r(V&hQh;}G{lVvdH5W>XC6#O>xm_&d`oP&GnC*6;ocIb)Emg7cp;0C&a%zQb*>c8u`$ zRf{8iV5E`PKme@@aUKu)TbUvy3JgA%`2T+Q#J`m}_BmeiLfUys31oQm_vqsGdvy7G znNC`YS+Dy3n_rZt@eP>D|MnAp{Jm7;_gY1k0=r&ws@(qhEcYj>iaYF%Tf_+rhq4h9 z6AU?k?4NAjtbc;mfWZt_)xXBG`{RzC%yJTV$PKbI2svgvG4RFY5L6%lsbKqeTmMY; z6^hA|$hj`j%k{Z#(DE-hO<}EO*B?VPlUvl&V{@*ADK}TB)fp&5e_p-b1y_uyT=_-x zsihQnVxV&;IPm#>8*xPWi)cEogkue6}YhG_l2@RhyB|T^7Ge; z#Z#(4{T zi>aH^A2oN?Ek1*ykq^3p%bsbUj!&scS>@a-TdA+|FPe$(wrRh(%tR@ctz5oYr&brl zwZI6w@5=es4;3U`%o``3Y_qYt+PA~!H}#GS#`Jdf<3+*0mO7#up<5b%I8HuM@a=Uj z*y4IV``!FeIRl!qX%L-Xmnt^a|0#o;e<)1^TI zFXX!oYUn&J=Pa?gys+La)?%Ly=Lz&QPQub2xa1Rs?9!d?Hd#gwV!R4}qBv-O_q>O$ zf_9?3NiP?$f~r|$CWP&9?i>T}M;10Do~3%s%(EK6Vm1ouQ?zI6Ear=e{hr>@i>@f- zT0*Gm!^$c3Y?g+iQXg6bsbcs25S`hynE5I`ps27AGdH>H1O0@tc2LskvuJNdnp^$| zcCMk-<(i#dxct%+oH74(yd~)7J$M~Ka|3#GTkoQ@id3QI+3fmb3IDknOx^$Mt;1-N@5Ok)Ps?5w0s7h%$_TE{S z!2O(oeS-N5!Jxth%4s!~(L*&LfmyV`7VPT+MrB>x5_?&i|DYjj@Pq>Ojl_cUtf0CJ zym@-RrNvndk&-Bm%Mz)^3&4H|i-z+yJ#p~@^Kb88B=wJ?l9Kdmn>i_O)O^ZZ+AEwx zyk66C3!7}XQB#Ra?l9+R!OTj$>0nr8RB=60V-j5Q`24L}1;*U?E|Y#BSXzPEgrt;D z2M}8_az+NRVao&i6fp}i-Ze;`AHs~Syou3X``VY|y-vEGA#>%Ge}o%;9liQCzE@&^ z3?~)jf#voa$h81L+T;?!#p=8Wi9cJ@-|+!V8AB-$<-Xs)mB#q ze|UtYbmemy1{VfagANb}5Jx;rPUAV)E#xJ60v2qyMjsa55S`$iQ#}=vThy%@P zv$rOWt~G-5TnZPoLG#LkS7~ij-o=eqM9a4gEy`XidR+lC;SUe(@Q62GMGt~^u3b{P zqyD4pM=tD4o>j&qN)P+-)wf`Up+X4Rs9t-u)p)uFBlyzb1p)%94o4gwkZ$?|T0k3H zo6lgxB;nqOlzgrX6@-dIFA?pnwH}NEPBgMlcGW*%S;_5(mE1J98U{iUDwK74`&PuVjjQL`mx|q z6OiyJX3tDnQGD;=D*9w;OrDxjkPV*LJ4+J|Gd>>(M4T31E@bKQDyZ7Mm@Y zn3&6XdfMJ?_a@UWZKAqOb;X-0@3yz|4RKqxP_=Z5{#u3GdL(~(RvezyV%!K%N&jhI zyPL|kB2I4bK(?AE2=DvMI{my6(fm5&MVL>YW4PHK|DKie3-Ui*E+_2?6Pkewrd4mFebYh3rKGz9Ea+s-k6I|5J z;L=e8EIhy>m31-GZZJhl$K)%|WE|p@K_t(=+CBFW-=o}QK)ySBV&vE&@)biUL7VJR z&S&v=%rl6I#yQ(0jrCj^k4x&MJ+7irY1$BaL-eGdaj1ym#a{hpPh%;|vD`*z_sThV z2^2=)X#7C{;fb;FMG1#M#2(zj(R4-wr^zi-4bu@6%&hUrn`@4!Z zY^(fNaP5YP=!w>N^WNhQhLG1wl9^RdG=#qSd>8IC?Nxi%eq_QM3bU4@LB1XDK{dUOSRQ4Bcq>KI^)`1yz>mkG&$d?=pwC zn1vk;K4ex25?ETeKDACDt3_n2v~-qmN3lMr&f01rg}vWpeP`FN zvfG?7A}ya@+7fkY(*?R2bRV-hLYhO3%T&S)lz@4l8vF5#)aoLKJzJVwh|7!P>R7N|UAm3q z>Vtl^I044lF9OqoFY}K|KPLIfMpeY%bjPP!8qXj9;wDs0@eshB?#NVPC|4 z1^Ug5R?NInfr1U+tP9_xr;W1JQw8U%Y774mOs*PnSU{_ljFnQY8l5wh#y4p46 z?XYyKuTBWXi?;6fcWAF=yK}}^TO6pat>(E|Im48Y&U_A7(nSooBHgA5yetOM0ilw* zU+x#t-9FDc2HRm%O6-uiKgJnB&au0c;G$kopXBK}8YyW<@=S|vmPpOM9+ucOe+7f+ z%v78EEp34|@$%(@^Jj3#vkr;u9QT!HSGu!&-ELz$S><4~mMk>)VaaM!X6ERl8u(CA z@X1=j1872tV~Ky)$R=qnS;gg+XEA5&IuY`3Ug~1xmVGPkMf1y069yTMqr7(H^^o4U zCP`7)u|!v{d(g-{Z*FjJRb$jxL+FYk^;Pu6qw-5j91}4i4217T0yrven(EpgI~l?D zXHJ2Po$uzU?BbLzr86k{(@*8gA0!{VKn69=G{-+`$kAdLsQpEh6rKy2fKTkle8w~* z8~yXkve`yq=iGWcGdr;6CnoC`mv`>#Q_c!g9B+b{0H@4jt_jN9XHZc}sK}WLn6{V z;i-f8To1V(q=T_fDBPD4L!V#j5PG$K#enkx6^r`*g-Ww%^oexE!NFM6rwbG;^QkRe9w75`@#RyGbV zi|Q-+d|(}FIL=z*e~ZKS!S`Mx50dY6gH8iE9d6e)&8c%bjUF87C)sc0m20aX!w2oB~}#D$~GO!OM8-x?Wi>5mR^TYe-#J~3Qm z$%+8i9d?5fAfM1VYM-6}t^y)0qilApe(d7hJu`z2iOz`df~UPz7ET6QGf%=lJb1JF zBrb`Vv)LTp5OInm&2-GGtIZHedSvaKmrJiLEywgmkiy~OUyj5(fXgiL(J!J|+1|#A zu!ViK-vSIvuT*@EKE7`>m+0kc4wWk_ulFhBj?nKZ$a;TJ}b?|PYJxz01jqNr1ve@Yg{=gly^X1k#JL@%arvm1NM5kb{-1>?{o z7I!CD2z__sR(BaVf!{hwwBCpf9Q(*;*5CHBqv%=?fB#Cxvs%U8W6sQ{!JY-1M-2TQ zJw*#93!P*mCdx-uWid%zo$ODP6!ovDW&;Q+Pwh>yqXx71&YhipeIFkzY}E7_ib`0k zKK;X6>c^Lpvx!9ZIU^6%4bYs4Y?#ETAPY1(WBY*j6609YsCP-3D+Acf$SPc+O(KVn z#MaI*T40IsU6>_hAg3Wbk-4T2XVDAB zNXqKjXSd^bJFoi}lL}ohnin2#Va2s~FVMQWhy?S?0qatkeJ0;8F2l5=JO1F&D+Hw*?9*zeE zmiyUs&Qlw1!@hfw`=Cb#$H_lZ(krLD(L74Gf6p_*Ci{Sm%f>WdAsXsUc{9i_``$Rb zt7=4w(WT6Iy}_r#)0Vt*Z`yuxpGWZiTPxA`)>^L_-|v{(Z|h~cxzIcLI{HfE*0z-7 zwk+uJH^*A;Y)-qiLm1}$GUZ2SI$i845V>#;6Y zFFUKI?8rqKDAdoSvq2*g9js&6H154e*%t^#gJo%$1KUp*^+fywoYduG zOrqi~XZSA3u+7M~8P^nGiP2ZnQIr6~$_zfd>zzY8SZZ5lYB*~?;8+p`-3jm4s3t*2 z7=2V=EWUG9PPbFDvf4M0w^hw|^0X)MZW$ccAn*0;R5H6kzvZw8G}npwzoV8WEO#g z0q>o4Z6KpbB5zU3vsnDY&zmlD#s+X_%k%c{>wiQ_jS6OhoQ9hO?!9Bm7+;G#WL70NadL~8XUybU zdBx;y~D(J+{I#vJE8Zu1O0|x&pd4gZ^d=j zdtY#O;(bfD*BUjK{K|m!Md+(QK#U=bxTS&xD~&CVu~}U0&Yho`pQJrmZUM*Y*SzPO zkEJr>^QCMNmsYa*XT+Yx7YioHgD4=|KxA+>c*k3$FUa^8(cA9!oHKe^V4-ZLPUMcD z_deHYLtJaJDqDY*W!|n@Uk`8Fz56si-GpxKvOP04W(kFp#;mnZgCc|EFQ?9f#$0xJ zU1>X!`%2`8`0{Vgb@i6U-dQZ`xzXg8*|^_suLOiM+OsP0Pouudh%X)%MWnl(5(vmao+(Rg+2)f9B( z@J`dMI|-voCTjk?dqJ7XnaZDQUe0lfG z)P2EJ?#g=Hs(|NZ4;}-$b*XWy1PL;|a}(51D)&O*)G=G!g-n*yBy#Bkg zDX&cZhYt8C2PS^_+-$`$cFf;{<3gbh#$AYewYRgGswVRMp`W6R2Y9OU-zltoUIopS zOAYK2wOVU{hX~AD3pepblqpQxnS2T2z^RGE(WbGm zV*QoNcYk`p&a|U;@-vjeUDGY8WK-}#T)g2N3cP>>S%%BV*w0O&B~usEw<+@=_F1IC zIP~X~+b)m!h`&XU&kj5311Ud>i=koGk!$*g^&wP#8e88^-NFXnD~1>OyVx-K3Mq+{ zc6l;(N+2>BE9~{jF0ioymBc{W0-pJ(T}|gnGTOA5xjAQMZfa^Oy%_(Qs!up!h?``# z_<-(J{)J&vOpoCrbCjKvOLXU;JzLx@0IyPN51$Hr3NjxWz!i}Kfdei z9)hz>R4?@6E;dT5Y2!>#!8&SKmMrhWJs6gJxN%I^Ocg5JYW*11?iyDdA?3^+pT3x^ zDgV2Q|uP(Aw(S zWvU6+GyxeIhYa6nfEl`x(E`XNHYUuuYK^w{a*cA|24^qgzke&CCt3{sPG8o@Pq_|o z90(E)rxxMPJU^Lf4Tty24_){*6>4GepOP+6PrU!2>%snx{#)NGp{!7rlqK1V>jbIM z9T$<}-E3~P@WwZ4+#B1g5qkR1w|FQLiojx6-%~w{>v%!Taj2_XIS((NeM^f%%<8c& zqJE6;h1`g&1X=~ucO{yH(SfIf!jT(FlT%`BJVcqCQqwIVKc9sm+KX)5-%R!_P3H(Yc`UToJA#2hQfJG+DH9jRjRN>v3zjJJsPJW zmb6a}N3^uZckU$!v1S;`47jn_>ic}S!p^1mOt7|Y9YGXC{%KP};k-P>YeGWmjk-WN zT&*$XYnz~Rt&yD-S)gGk!xi~3NsW$H2!^=TV7ha+^oUn=NUJf`sGxq-yYEbtmv2Fs zKUwgy(e*pFbo#br-#%)e-4D5Ql<6FM_+?@gHR(@jNPHEfcm^NgXNApHtHQ6R9@UYs{M7Gr6n2_~ZmFb69 zUlI{rXf#$S{2sqk(&cwXP)r2Wsz(BVwJvkiEZWr9y|6DF^gG^{_>0K>7`_4LApMs# zq6>g8Qlk(t_es;HJBSp(x#NJDvJ`R7mDIq}1j#u#ED!vK*ym3?J#G9$B9OZV559aj zyf0C`bgtHIE{-v1`$ZH}J&EIgg2Z#pb0AU8W3Gpe{WZ^fUT%r>Bkwx|P2Rm+{ot9| zFca4rb5VS5%z_fmagq7rRtF1ji#p|w=s=-g7L1WG(}8CCmcM`CrQkeEs$JbMNZw4&36>7OBOZ2rtG zIsTBP(m5LPdl$gBD`z!rsLS4(cI->VnJ=bTmVJ00Hi49=iM6UQhL#uDxD=a|RStfg zYpeQ{Bu2@Idd--UV#xBTnC+uJe^dw^PO@`)B?4ZK)09Vg$IH4+9+JyzL#UzuF|n(2aI_%&bD~JXyj(0X-Lg2!+QbNvxyE?=F2>7v%tLRtYb#mkH;CPD#@S4 zjjyLY*#64?oS?YaTm7U-!(~`r+sw3 zS)sCp>1<0e8LPzO9H%oQ@tL!M714v5dPI~tAF>Hlh_`RXEH7yWR?s?#3N4t=_Shb& zscd^q79^?kO3q}(>GnSVaO~R3ZJ}g}zmHL0i=F69lc5;q#A*wEZ&=QFK^{PV`$271 zZU5|-hZF%9VkVQ@ji1JT$=lH9%P3d;1a%HGUlq7{5HYK=|Db3f=lz9Y9e3Bo!p|*` zl7puc^Q<_xLR^Ik_FjpnOQAWr;Pga0FfcZqA`#RB1H-TAcD?Cx{qBCW@)$v>D%&_r zE_*VF#Wd-lvN(?tf4GWBHs9M)z&JA$6lT)K@g1JU-`i9(Y3neXy`1sLor%omN{R+j z|D<$NS`0<`T3C~8lZ9y%PmP)ZQCie&4cwbitxXtN#)zrhFe`sq+C#jX_}Ixz2;~+k z%qtTtsews&U1X>UpkRe-Xn zu9mx4gVqX}t#%gH3GXa2WW=D85A8Bch%U zVyXnPoR$V|3_;i1<;Q-)sbRm9*xPxvsPE}A&%#Ca1aQ8p z>Q9j8UVXwXH8o(#z;_p~S-p-)jW+ZsR=x8;T=MqPYa{bpINQZvL`1U-rhYbU8K6i$ z{wOi+4F)gKc=tET2Mi)t>Uoc=6qmN1ex6BgS&@i2gP0A;o~OXlmvNf8xMXc49O`L| zbfGaR&C=1UtB*rvIwWv9BvRZO%FNVb+k<>9< zWA@<+L|jLudQDzckEYxJiBJ@c?BVG&=$mHxe;a+qc5rLi0C35SC?O;lnifu+?S6o$W_i!(KMIeW4`?M##H zPEXpTSXvj~O@D}PNHmtXWNz&`z%t&DZG}-ff?yD>Ze$yxNMrqEceGmI<*$ucj+!)T z_{x49q|7~yZAF8AW;aoFVHki;leYUN`se$xwFj7O%|f?K4L3wFlCxYdt7&wJ{iu2` zu{?fva#9+L(@Di0VjIgt#`C?H0F_l#xe400LlXp+rGw`X{-pO3)whceRSv(*bKnBSVr5wU+>FL5pf7&lW!dJZ z9AoXC_66A_fgTkdJk+vDeO!5B86g?_kx0f53+bqcogiI$R3Wk zv{F5GO!Y?B*7EwpX}z>K5ccOU zB8D{)w}=qR2|TYO3aZ%_z>~8yNBX}^!WRTWG1&q;(HdHxV{d8Aa-pVmc_xyt6)SGY<(E56oEmo5*5J|#)5`~C^OrEqU70j#Vv%0aJeRA@3O=T4(S?ni zym6!!UGhBHk7T_VgdCa|Su_{N5+?>p+7#f7q=M0VH~iK#hxOOAV_OMKqcV=O{UPJt zp8j+&WlxHZa59~T`Zfsnnbl-mrUmvzKt%`RxvSEc8{ula`O-5mw~8}^L4qQebrP*z zB4nsCGfDMh?vzq>N`2<6hNCdFZsga-8CuZX3vx*$Q&dkiZn#Hdw#!&Cq>C{mv zQLp+kB*sbwFO?3FJIp_wLx+ZMu1HPi#nZ+oP(PyViAVI5ag@=OraH zmm}Wm<>B?R+dl}<*k9QNk#OES zJCCX1nkQH1AQSfpicS3AWcTmlJPEBezlcungXcv4x2MVz+s@TDwmm?wHGF182jYy@ z4e?Wcf*Q-RVAg~y!aR|s*pvuKD`A$^<#sRG*b5}FsBV30t%71d+XKm)W4}217_Vk} z7H#UM9-jt}xsZ3l$JE%hyV}Xh)RvJRlDN@!^{&2euKPEn-FRk&G3jmw8I zOOoj6!84Dm9zp#q-wdw#O?wc&VVULar+>r2&_-{ihIW{{w?hmdVnh2iHd&M11;HYG z$+n_JSMxZs8ZFuxTd8NBl2vwX$E`!(w5lWs>b~?T4=~{VjK7KVMm2jd+pAzG!+%2U z?%5}5RsVqI*2RCgVe~?m?Aqn!&_NAHkGWGq!s4+yV32aNm_h89BoWi93ulx@KYp5N z1(7;WR5>*~YY1~ypG}{xH2tQ#JH-C+^+@xQe57{mh|6arAJom8L%n*|$V3Dt_)sb( zI{$6)vbWFaQ4#sw_A@iMmW`{3;wux8y`&cZSa&OWNOLWxq)L}2wMPXaT_Ev+%1;^3 zh|@K->hoeZ=Uon1V{Jo{p)2of*}I1Inoc8<<%i;|37)!#0}rPh3D+>4@k4PHc)Y!L;j~PvYqF{7T=X-nVxe0SqaK&hp!GL>i(CYX{zren7s!h#=kfY6;;G@- zp}DB&4>oHjw>by0Z&SRfZqmdow8@B8S5{+b!@bNx2KzEif;BZGR>dEF3W~k^w#mIq zobG4Y3eD0BgX!d8v!Rrh8(R!R9m_cR{LT4?6P%;vY}jYM@%esl78%FjEisa|f#2gi zdT;tzKi8UN(O|a>kmg(Joae=HqD)L=Z)7QH!LcmRqMGz#ztrHn$L6)L>{B|I5dy2- z!FvU!xb}0)=-Q9275UCVjHq+bBko3Z%4hJ#Z~%>Pr#hZpF+KEI>zieIdfiIG-A^CU zUz~Etn>e7jU>LJfTZ0H8YJ%Kr+69?&yQa&|$LDQVuYtdh9dBH!bznxh8B5rHGi7Fz z!Fd)IgmP;aU(M`H-LY9Z3%=()E|R9U{=y`k4G4|E)0}4>YTcV3+Fz~=UY=~3fQw7r zDh_%Y+i}{CLoal>@#X0)w=~E;RYFFNkY5A2wI&g;Er6CEqN8TIKU><2YT6H8`aWjx`__%l zmHdlxH&1-yS4dqrgsLy5qXU`MS~am0r|q5D+$mE0=yQr0<=Q6fmE{dGF-}dfn>{T$ zM=9=-ahgr6XPFu*r`eh$>%KG|Q$3$I_KnrN__ODrY+T0|xV#E1QvhUKOR4i;!F8O;$^k z2^kCFJ7n@|BR@%9p7hS*de7REgjCr3M81Pf{K>y*@(E9`Su-(#gkpIz))GWCLmBj& z(G!j8N-AS~-X;j*Euop|&3Fcr56dcx`ya{;#qU>_a-A54ZWH)%o+#NUZZIfDN+8cK zNmAdg*33pTV*RPcg%?ynJe2I+o0k%3xQWu&z&^>E%33jfWvua_l@3RPI3rS&aN|k2 z`zxOcrssKI4iUv4%`z5pIXbMFWpuSWX?Q-q|HU@4g;Z zPIW+#0v3hJM3Og5`h6dgp*NS0E9Nt<-bL_WO6j&{`a@ zVTUUEXT{VW$}SpevL)f$u1P%UbaX%(1t>IwBdhLVO3QkoeNlf0hCaA4e?vSo}kH zTDxHZ($|g;NZkz>HV6x*04w9bC=dlM2}sj7HVB8A@pmvJpaM&cHikQWJ?lenviCMF z@LYH#^;Vj@j}Kwz?_CkChIaAQ!iy$oo}P1+beE`q z9GDB7DX8=124a@lCbU&(BZAb>0)<;o#9q+SY}tDX8dp>JsPkwkw#y1u%D?TPW^wG1 z^Co^#F}Vl0_rhhaVfB;G)1ZE`kC9#rH7bxJW_k4p2bq!W{)26AwtnkfwR5!LK~H(a zu_kN`cCyXS`?;~QE~-_e30tbfp^MRE;cJ^ zV?^QCFfDPGRn=oj;-rkJFx`{F*q0U}4}E&zRifd^KpH+?j(j{J76qd6s~3sYr0n#W z77O)aycVZ0qFyVOmJyTrBKG)-{$;-vSpgPHHoMBA9bWsQoLugG>0?ujPdM6)SvcNA zVH9q5C#Z%Y_%PqoB$V+I{r;3HzCgDkS1TbU3(X%+Aj3v9T0ytwZw|wo!J5;~hse94Pf-FmKJZ#gD}~-D0P0_WJ640xZ@XNxge|x z@2Hc00?YOcQKjW{N*gRQ-<&>}dnqlt39#wd0xH5?r4;8$QhSXK$<@Bqh>A@o^$t)@ zEo>iyIWt|g3hfMU7W5X1f9Ic4VLvHTO-ed}D7$s?Pi0%g5cpbJ#t$th=NxI@@m7L| zuFLb)+Bg|d%@{e!P4vdMzQtozmj;q4dv}iNeg={pDvcq#W}Vb8&SVbp1|3BkR^=v_ zJn#5QoNMiFey0HUqseh;D6D$pbgr=UY9&hA&Ih?848+e@bSzt5+?Qxd{Y4}sME4=* z1J}zLBG99dq3j1uxLcSrv|CJB5_6zdVp|28GikSNkiMLsqUei4dO2&vecQMbl8)YO zMGHr*Z!Ic4s#HEJ7SQk_L2$*1=~<`>&SY_j(y#Ei_qr|kFiKnp8H4z z{$_>E>C(KuF2jL9RAQYoOhf3#_$~CX&q6>tHV`t7MevK!RgWL_^JE@*DKntGhlU^z zoRUrX434kupu?P_3CmYhB2WFZ%5-K%p1D!VX@Kk^N#6N%lKU!ch`(p&Qgq0 zTN~NAcOB1*v46FK$^r+wFfGGLa-kW>1?S$@%$LKXqb_( znN6E9OKDz@*YQx%g5y_p*9nULA%XZb$9L(oX_Xk1+|6N9uP+ z&uBGi8YJ^JzMiK_r}9MED2CbGOi_GreKFix!me!NlrN{i)MCiS%EeYRS9ZFBz4o;Y zIKAe9f6|Q$zLQan2^!;C!`GXYPR_Yj15K|7DB%-^0R6}>qVp0nrwNXH$oFl)FHQM7 zp#cdEJh8`sO2q|0beq3Z(ML}aC+|`(eIpZ z&?DlDoQxh@?rb)!gk_9BTV=V-k}g&XLL(e6%1yG+df<>&OPh8k}wYh*z2;W-Oufw*jwI$tGIz<63DoLqvJ&BHb0+OBhc(o3O6 z5+t_hiEO|lrb~1GOh_lr!v9;)(_?`Ku`B=(O}jMDyXPl#{s@>}_(deXWiDjDcm@IC zwQx}xfPX?9{k6V2Vo;jDBOpBPd8tv?wjOKNEsh?kk_x+X;(&tz9n|e(bM^_5EdFj5 zcFb5qpW=j1gR$ezEn#;a)xNc9d{?s#C5zj_USz3uooC` z-zs$)WV0bK(_n`8S90&$9i%lRiO0CvP`8NQd2G6N$Mb0pGcX2|ZKWA2ML~boFDN%< zk7|wauqJWY=>xN_k&WWJxW{FJir>}nlXvPnebX$i0^316^>U-!sJ3vhd7876;hJkJ z4lXsq%oNNCeymX(Xz!6nz;3Ft45Og**S8F^O8Me#e`i{^B6pj*6Sa zgzKhHnpX2Sp7|2M0T^*=@y45<%6wzbo1?2aXky}`?`6e)nPp3^>2yBaqdWN?8YI+d zpYgYbf0}WB3kYsTe!}=YnpT(28is{KS3+-D$yim{v0Zo>fPJS{-lAZE5$BJTk;2+l zE+&SbUQG;k@IE(b@78ZY2Fcy7McG6>3G;X4ap6fg;Jo*k=!rk))vicvGN5Ng@&vKv zcjv7W?$^3J1=CKXj?5deR;RPdJW~_a2tuYXxkBcOS$Czf>qAI3YFL2O(u8;AUkhFHIiTto^bqUO3AohSJ%xj)5^CrLWZ^SK~{;3>5If%m}l9K|}MS zr5(za<)JkNc8_aJ#FBZe)V*Qf+5(C!jfMJ~#IQh`!cCkJ>bv(Xk+oQnA*#*OK+{aM z0c%MC>baRmH`=3D6_mpqz8Dadt6mXl1a&1c%mZ+0pVJpNw!~!a#wsT2j(d@wi;k>b zV@D^ z6~^~(187@T@gWf8`wt9|3Mc!!cNR{h|1Z(BSO3&H{?D}hB0mLZ_a(jpco!nA->SX; z{11t?Mf{t~7eyck1+$&MADfGU33~??=~JNu!IM;_0QrOqr{4JcN&!Nh{`Oz}2kSAkZ6SBC zq6O${35cT2)3lVMo}ZB0P61AXHjkr>CBYwtQ=VVlsV~9nVU*ffgzH9ky%}9p+{&B> zb13qxpcYf}&6TVl?CK(3WY~Tu(^s@gZY;fJc8q}YIu70OD4j(aELObH9@2%yK8`^4 zY5!ou%niU{NeVYdm#8k+Dkxnby7gU*54l$It*f)*l^3_{&4KcEt6JSmwOFMjh^TzS z$UR@>qg1wtl)-IR$%gDX>f7}N@b2CO`F3E>=^$Q|H>P)^!D4EnJ;1BMJXPxC!_0Kg zid!OCN6X$_J`;AA#eL5#PYi!+GEVX_rfQ>BKf@q$PUAh2A!{5yo_xjOfO<^3to=UQ z{W~XQa!ahoCwU`D?_YPFvbfotN#kWl@w{k$N|SXK{S-7kTirOD$xLcs$-C#*`djR< z_xHy$p0`fD_TlKc2M0tx3yZv}?JBT9X5*Xr3uaC}1~ege0P)J_`g$Jw_p?gk@6y|Q zlKMl=Y=}OdCSvWU!-1_6RF7Mh_ql8QO%c_yugYD6&SG7hPF3!j1Xk4Ga&$jhJSp%0 zIv35yxTAG(_p*+gR&yGiHF?T;mK0HjOG;P()9{qBgNL7!q@TBB@%Ya*?ZUaXUa8It z(b^}roDXy-3bis^^N*dSKl)U*`n50Sgh_czmrWOhqi0QwYChI7*p>KN38zBeSiaj? zRZOB%45}yPXJ7i5r6wCOPe0=AD8em$mr*ix1U>wV=*LuExU;pr14?-;>@iuD4H3)Z z!HY{JpVNdJQ@+EbMix-i&8f|cCX!sxZK+#}rLwpb!|s>+y{mpc#a#R0&rqu|QCz3I9c8K4H=O zU^S;x6R)f%b1i@+Msl_+5>BK)F1yU={bw>Pf(YnB|B(z^ z;q_mfEN_tgohj?4r9eIG^k40gChrfB#eihFItZ}q;5Ec@Do&E{4GB5D!yW#=m(hm1 zy{6a2X(55qyFA1HqI8P1>_`BD*;kKvO$bUr81gHGFjktPssCFs2KhrU_FyH*#cgTq zP&xo|Irw4>SDE_7N-5jLImYgJrlw)|xdg9{TI2I7lfHM~SxZYV(lZ-gHPEIvyqJH3 z+~vpPMDbBTQM-3(<0#-Kd6C6te7WOLzQx=YL+5UuKS#1Fxoa)$EtLlf2SU#A?_aDj z)|W_WVnD4j56368#)bRR@13z52VrNN(tMD|$RE{oiwzO?^(BkDjv4I@=-$1)EHIQC z_@e=SlHL94gc=y!%&6Bi%9(KO`d(Ncn8*1?W&E|cr26OX zA8$@uC&13jGL0i2JPH;M?>D?y!l%%pQo9$mJrEM3j(ucOusvZU;*Pn*Dfc>5d zZbNcLUJGWw17yAuPi%e9&%$0;TQ(j<9Gu}iEUef}{+0T?0JCIFUr zB@X@{V0%nC#^!HZ#Ang3U$fwa zHOSwsV!bB!#Xx>$W5?mSISV7{@X6-dy3w`$0+q`iN^f8K&2YQ#neOA6sblf4s3x85jfNc*aVpf1X&ec1C#B@lkEXEOd z+*<$komUcx5MypYEE+CGdrnUHi}<31zh8$~cl#3+LbS-cj(Y zN}Q~fE!5FCtE;iXDQRQk>gqf*5V{zM2DYvZtl44OdDp#Uwtu|(iurF!q2Dwg=*Vm7 zL}m;>J{E{l|CzZcyo{4BdNM*H66`uH_HKDUw`n@YD3*!5$)hU=c)$sxgir!202u(7 z0$t6CWh3@k+xEjTG06mK=Av`rLx3CrtO|c~LBf@Qmm+r#0l)%)Zk9o&Qtec3+kP_P z|G)GBxgS{e)dy$r^ zqUGKI(;5_nDcd=PxPU=8S^yFPz>VT-&#!vt-~p}KmOS4E!lrmY|=({Z2=v+r5hM21M}Ph z=s^E^_HWhJ+7`$;*u%;levxj^F$QY=_p?Bg@0uZmN&tKkV3XwHBf6oJW8A0HaTe4N z6sYvSod#OHjSJA~v+My*3K07n3na70pW&YeJ0-pZstmAe{`QlAYC(WX|M@ikqtb+n zAtG7e-!Vw}JwhUoum$DE>HGX5`pNL;!_fZ;A)0nLg&9XRw=~v8GvC_L*}Kk2zr^f! zn}?6jGf|kzK+}UWI)8~h8_KLYnwrtPq2E%5RRY#3|KyjI0NGpLW!4DwV*4VfY@p@6 zqixSQBCiEZLN#-&`;83R_?E4UMOf-J{hUi)rQC)t(8G8ix;ybU2_h}u^ezFLK8`fp zS66Uy(NL94*VUiE-#3#bgl7L99R9%cXg5I4iKXO#AnO7^8QQUQ9Bljm`)@8|L0!6hA&`ffzE$Fa&JN!(lDksxI=r z6r6FQPsh4&1Z;~6t{D~%gix*{8O#dzs-{f3T__GxCu45EI2ONHSt8!U9`*5kYDD~P zEz{M1G7|xQlty8#8qZA)G>LGL(rroEn%1!g~=2PhZs z@t35OcYQd}rsse;Q$xj0Sp>M)=ya{n@#xGC{(DyZU zoF9Iy71b0zbFbU>vosBTy?W3?J@*d`Ag~9tx=bdg+#$dLJm`?PEXyd&eBFhs2OXP8 z=_FRuQ1l*AU!Abp$rwE!rV#LX6-%x(<{~Uwz4=m-sGSU8T|Nk503P4-` z?!NhO+w%Iq?Zfa_Xz*V?FK~6k0rYE5_`hx9@Xx;YuXfgd_rJ<-a4hQIEAsC?CGFp= zTAcO|V6*RuokM^Lx&mP!LY1R1c|oqfiNA77;h3XOH4oA1iA9;2{IL2ZyQiOrJ>)%J zlJqdoy-dp}ipaxFIFaVvchEzxK}bsmW|x<3WxDMF_|w2n56im8orpC_};^ z(rQP*wm}0PR5;8bpa>BH0Rh8ci#86eVN@Ax3}8b70){by1Cv3fND=}lh#?7T2qeV2 z?R!4ldq3S%b-tV`{(-mZtyO!iXRW>0^NagON}cvqMojdrcRN_k4YiSD9a7Tu!G8+* zZ=R!tKpqyx#kl#H)X?Na~N!ByY;VHt~-A_SFNh4~{qVX~P`VR)mA^OUS;riqvj&TAcKH zVWGyPzu~`d$MWCk5U?@Ee7LFpx8wLs%EJEbj!PSYlg$eYt+!HEjYgt!R(xajMM}Dt6kg+$-QC;tH z?6X@$NCVrsQFH>J#eb7vt;UPYNM;uF62Y7bP!7nNMBwY;5sQ5Q6sUM}va#ZKZv6iyfj590soNKCH z_hq&zi1tRgA<{;K9&b&!7P*YcPL|l_-`br(D2@J%y7)9)k$$gfH&X8o-H?S3l5gc` znRs#5Xm@Yfo4vXsvBl01SODRk=H$zRW$}41==@!%%*<#H^JwuJq}y}zt@v@Is5h`&4}9OCMT zpm}zbSUkDgF-V-y89(VL@eI2_b053wQkjrspmCi6Nx0#!hf2fXi~=N&@Fm@QR}P!X zyN*n)-Cc1f-!*(<{%*2}gI8o}MYO?KXc1!>ECvA<_F%IT>SI7PcQyXx9$SNea}TiG zMY$Qs;QhJN&Zb<&DWZB5rc8v$zK~w^)X077JH)2XPM7k^0Z!_4dGOLPTL*BvEFP zhLNSn;c`3!*uQK|{*uAJxJll&D{*ZAM`t%Eyd4S*%5mPnHWr26tbu9bNk`=UV@JuA zLCTL7X}tlOUJZ)_9+!UDS6@em2+F+o-1m1L>!v9VnkYh0j5LG_!nSOC zijM@uwtYCT*OD3_aGV&m42s^=5Use+pcta{jh1GUiPUY({Ol5R6#2c#kGl3C3;Cux zQpKK8bG&9Q(0D90dU;0CcMe?TanM4muMm=Vp6urYoZ$ogrz7`_vUT_9hI3xVwI6N>dvB6)JH$Z|-D}UbMe3FOVGN0EX z-?_X1omkRbOZ5>*i#aJzBZIc$H@3R*`YZyC%tUIp*NW1zowlij0mqfmyZoJDI-Qyo`tsaeXNM2GX zRr`?3jVE3P8yY%*;#I43b+89y#5NQr)gHqk9Jx(QU28F9^yOI4|14Q1wB(em?KfxKqZeZxKL}&!z#k;}vEqoJO9`6KE1Uy?GX8@mq*vjs6{< z=l(n%x{o&dBdcRlhFBtQr@Jk_YJE8ovM~#2bSsg&Rtmt@Mm!8Y7Tr6L z;Q;tdjoVY_6sbnWpa>WXQ}2`#J3*eZo9AznzhQpS(EjpFt5)z}%;Wuj=Pfs(qsE4O z?Jj_7?~-)7DCg^d^?Jv%i@>zlWwk@xnh8c>H=N|}8#y@4?e1a)5VQKjqtKjIk8&`1 zk2Xg$Ycu^41468F?oT9!m38PD_&_5(;|e4jD@3zxxji{D5BQCHsE>AZ_;~G&-A~F` zzolZwCzsP)9v>tN*BUqmL3px!D^cT=N@=j1(M*R`dj58QFQakKLADz3qQ(4`Svrvr zq^?Mb`Ue~&suTKocQ)RtPI(`Ina$&;JN%j!rdZIvp;Sl$IL=~H^?c7Wqdg;S4c96s zs93kqChCiulPa0pVSUB2v~b1ddrgM$De^phW1DbZM9hupn{LSPZyxsGbQBUEAE}>J z3@elNEgUiLvPE>Y;J_@WGk}-5OZpW;V;+0KV8LL(u9@EVnFaDuvx zU`#uh3Y2OjahmH&6eqboHIL4q+d0n^&0zZ$L9V?59&4 zk$Kw*Ifq`KN0 z%phjnbtIHGqGHawc*0Bx8PHC-uxQ^3848Q&(Pf)~l2X#`?>@H;Y@^21X3P(TRK1GBzPR3) z(IWYFXhBL5=BL53WNws5639>^O84Hm{o@bL#gUOGXQijn_fPA!&j=w^&L*J9o0ol9 zjT4b_skQu_yTz0MpOZCK=gJe^r@tZ}e z`m!(#Zh7qEitG4X>ZhdF&xNo0go~_BFvqwhDcg($7N8Boj~_aOgmsW{rtiM7XB8&W zoF*(TiJ+Zg5j5j-pCVw-YDZLhhxdqUN~*GJYrZchrkHiY_dn-`R3V=fFiO%yM9g1p!V2Eoz6JM6cKjR zH?vHl(MHS`7d7Qx-nu$oSI6t>cwHT@tK)TbysnPd)$zJI{!dZIKZo?QEw28*CPSbB z>G_|tH&wXUzVH7wAcKmF_THL3qTnByXX}2I!5wmv<1P~G-(Ov^w(?^eC&udUw?67n txN>?X7+P23)FFo;bwoO#9o#Ab?O*|D2PrAcy?bvetXj2dt#`du=wb9UKzLtTP8z_#zyKbB z{{Zw1z%Au$VF~~W3IHbn0O!GH`~W8S=^}VhgBKw4!o>g;-@5nn4+bU{HqJTR^A|4SfiIL00+<+BSeV#YI5^nY;M*SHa{!wNhxiKr?Q&alg=~WDXb$?>D^+v{^Z5W3m3^LD5x(m$L zRkp~Uyy(41<L&y8W$dKlSX-b?oK;r=I=Nv0wW&3gBa5fP;rc1VDft)x$7&Ai*R= zhif(K?ELZjvj^V)1Zkm&p*{Y z(zl(d!V~jQSy!B;lN;pT%i*u~PS76fFQYZ9#mFDsoObemCeC49341-;xBsSUF~K6T zjoW3c_|0=sV+PgGh6Jrx<)Yf9d(Zdj_J+4AIX4Q^L)cU!I&Jd!>g~&mV!no;{4ujM z?>K2nU(y~1+x6rkd$QO6D;L)Hk>TVxJD+v-VAY)_W96{T*@5A*rB3gixXaOs8$};B z>JzGsmMzm!U$)Qyk_1Ktol-yp&1>(rtW%6K@|MP`<@3x<+O4Ry*gBg%52#$tLTeQ4 z(ZE)?Ic!fw+yo7{m!Sc={HGtryN1r7caszOIBQ^7G279J8NV52H(m2dh{v%b>wS0@hz5ox zAFGUy;y6O^9VUe9Q5=bSgPt~@Mr04RFBjc!Qer%#3v~l5L-WUG=t}(^wyB#T!~(}! zS4S8&fg zDKd)rX>KaPPG2+79b@ZoX45})poE4iL}eQ#uVtODRlIXRsgOd~)}rWIak} zU_eN&k-RPK?)Ab=-+){6sSyBudZ9Q`z6Fd(l2bm{Iep=A!T`a#KCd+eofD?BDJ3qQ zoXGMy@wWRZ?xUHh#fIU_nRUGS^J7!Hoca?-y4pw3JoA`Znxd_;fLw$^dp&&iMob6I zPO$V`lVm%06TZ2sTzw@)X(#5!`i{E^$NXl;OFPn_(g>0sg?!Yo>aW& z&a1Y$QI%z}rE6a5DijuPV}VnSoaMs77$%heFkjJ@6Y0FQ;)?sS+1I_(AvF~ZSeA0u zU9gZ`!@Tw-i#d2dr&I^#^K3uwDHokoZgByTMF`coQEAa+}xj_Y#XA zDxPVaPA!(A0iSHWP=3Q1SX#`&5b9jO)>MO`G5m~SmZ4{l!E9%{=t+W;*@u%y z>X$6*Tph-B5C`6~?E74uLZfaSkk5j;s-9HgZO8SI%Qu($CC)|78eTLfI=a(-$qiAs zqVsl$LKCw~t3D?Kn}dp(jlSAGH)i0BXJ(9#*kE~dKDK0|#D+DMe9FkVwwpGuVq~P8 z1;e{c92MTF+}UBsBi<4GD5)LMcXDzZl~+qWCg)(8s(%#7Wk@vfg*8awMs90b%!`!v z%Ve(+KEd$CDAxp{BT>F$4~fiA>Nc;Z0}Cokoa`+@CcVG22phOGY*5ufc^G@T~Sy?2QLvbRsrnM`$Fq!)OAU zMI?%1%TML16fFz7`)#TdC+fQ-V2Xx2qJ}ii8WNVX&_F&LzLdV=yqmWUHKj?e_H8q& zt5J@BwHtTJ4YKj;c}kuBrqZCgOvkivvBk#iKqa_HI`v(Gz!b;LFCr3lx}q&XXCnDW z{!OC}&8Y_`24x4@Jo{v2jzn!2`6eHn8L7h2cteR4>2e{g6#&pNDB0h{9r~^AP*s| zzBWbtKw1M0yi(3ROF7LLTXab@pDLm$T6C|0+}{bYREg9cvMJ#xs@<4bWK4*A_rbFy zk3;=!&4LN+n6DG2rXbrNY{)faGYD%V%}fql6?ys7GWBh#`rmZ{$hrMwpKta*5Q@nO zB>|Vb+&9UA?7&Cj^NiD>eu3;*$@Euz47T+X(&mh89c+kMoX(Bhj&_i$pO2>f06g?i z)In6+ZA0okx%-*Rf*LfH#z)h~xSHNyadY?Rx#1Iq%fPqb)9E5X7MxjEd`g|&Czroa zqo@Ic7lbV4ISDOvaArlDaW`UkT~}vME|Ft3HXU>QlpM(M8eD~e|5vU9eToApYNSUH zsfr>tWJ8n|j=LB>nkaJh8%w-qM%DbB^YHAt4N?Jm{199pOI9Z@pn(YJ%;qW17<4%; zul;y1C_m~gjCs;ohi7u?{S0iY6Sgme1{TE7Kxr=;z#l^cs)i_4*r}CU6e+60@EC^8 zm#vIAPN4bCLxvy!Zm2?8W{3+72v7U0zIF37^Fsp-H_*Vq5E^*9i5ipnu|*qd%KPnT zp!10FB#r)GHo)TrY}fO=WR^_XqO;8p#S}w-tiWJFib1d7Z0aS!UoHJ6Q=3!abv-mt zubu#1rb7c`7O<@@!+pV@M|r5C6P1gU+0D#6S%5B{5qhYE*?iq*I5OiqiG}XOgYTQ8 z0lyb$AS(k6a7-afYbpaJe^LYnwUn`4aTyd<2P!@BECYHl3Yqx;TeUy~?M`UGs=zuq zEMF64Q-?dqesI=J^xIOxeyG55ESsikO!vI_+S)s-?Yt z{+`uR$dife!TlqQfyr1<2oK6=L8wI{Z&7 zav=Rthr`aU|56O7!@rhqF!37|X8uiUf7|)8-%hr_+WGUa{3Xx7^mFX5dGzbr`j=h$ z!^Pt-`}wO+^}l;PBKzG!-RjN+H-k&kYX`kmzajQ)pkSL*+E?zdu4P8Q#s&5TcFeW| z9hyM{y~;zWYO^Vn8n&TRTX;!qoEBi55js0dqwB&}5yj*u#JwZ(MM*TmGXCnG^cbPWjN82OK$2x;aDna*Ct?Wb{9;=*%9)N*Uq0mKk zmdhDb-+;puW=6Bf9wiJZ(m%YguA%`A&y?cE_qUomJepM~XF_1>cOOUhWK)|G!zrXt5$Ki+A}T5QTb@cP;ZOxsr4h=)(T ztaS86rTbY1adOfM<2Q)SB5k|h8DaY~Z!A5gI~a0Zj%e;}&0hYJ!-fBnKuPLi_G=2*6jz!Rb zW>I9zAuPdi;Hg-gvo*rFtTM#JPn~^v?uz&7CCX=alDNt6hny$yo0b5r4Hp#P?& z{T8tO>gK4>rig4^BGMYN8MdO2u#KL=7qsLfZpqc|u)~wO7R57A5S{9{^1)MRWN?n{ zp|xb!i|BY)7e1!vy&u#nW}|B$O8JVjtOEy?my*g7b{GUul;a~}+_|qlWY0w?X5=|U zfpCgK@xYufU-GWTg=pvI*(&{qYFp5UQN9<$Gc>M8^wOvY#fwOb6}#*axG@ZOC0V&i z1X)J6Jw|>qL=er>A?k2_f~{NEn)H2|bxy{3vz%P$LxY4=mubeD6X&^WCjmD!AKZ=gF`|=a$sk<~I6%7X=JquRuc6mCt&7AT_MubW>5_!hCEUHD{Dh*pThRS3- z7^t)f-amb}Ah5#4?{>AKjDJkwV$S6|*JZDL@i~m?AJlS8=g zl+~;q^6?&?wpO#{Pp(~XpwG1GTgCKE3Z;7N+<-sRr&B53k*K^CeZ*q6YuF1y16hF8ny8_DR^1vRV-| z2cmqo%K0}mC*Q_!J1sw?V5O2QEq64b0LsYJH5}5@keFb`=Bso)cwd~rI^u8Ekh3-k zYL&J!L~*#|q5qz>H*dDw?}Ay#)kI0PXVZf3sKjJcz1x}q`Ts$73ira+ zeYl&Ae_(%OZ@>nAI638Htqy+JGoNG4BsjxM=zQXl8>-H6>V(7cMM;kGU|ig)*+bfJ zWpGjZEcj=$U{t~c;* z6tnb&DXRwj{&GY69G4n3ov82YU3$oPlfU&Ve;LZze`<)1c zxUhAs$NIr_h0M{rOJk)&O1qqi1-MDmhxzHrnrH_w61q^e^re566|$kQ)NsuR zaKK~FMdT&m$qJn-CGxo#9myE%<>t{l5Ng?zFE~b17QV5bw`6hUnwT7Mp?O=|-SGCv zu{5JFoE1Au>Zpw@3$sia=WX%ldOA6|=WZU@R!P_{vl|XgqJi!$g0&qqz_@ia#VPyf z&gkNa(F>Gu7G0atrAA9;PC0Mn0&u#Yt8WJ;*qSKqa}bUP^}WS~0y<*`La;=}aQ{h_ z%eU6gv(dk-6g#yc@<_czd@5H`tcLNV;!}hM?rITxODX3|=X+bp7MI54BOT6{nsTl~ z;8yOz2~{$-+NHwIM|O6zkR$mL3b>VVOnXSd`!}-rb&S`RE|ouefk!(}AGNxYt|dcO zY&)XM?db1NnR_3b4cp|Lq`?JR*VvXGaf&o^xZ_JVd9kszJEwdJz4ub=iXM?f@K@29 zqhNeHXLk$sC(uCRwCzx=Us0}ekZ$PeEEnJUepq|J{>U@@^G`Gc5VG%Ng~=BJ7D zG&NuYb43Gu88Ddv86Pmw)HI?V*ZEA8mV;`oM>E54Sw}iYP-Qh%KWhCA8pv^rvk#A4 z)}mF5q1N{uleNyZ$`ELpmo@g)b$97%2yb61yALU-D;ThpK{_e!-Sq9Zc9g{N**6towV;9OLprwktLd_3EAfdeMLT^b8i%e+S+Hn&TD(_FjB(?n zqI!P&ic7Pl|EFr>BQrE`fz!E6IZ@a5b*ONysq|YBJnP47;P4oSw1{-N!VXOQPi}DM zwG8hb*o+r!+-zxU>1d&K%nc(r;=A9={Y*nwUaaF(kh2V7p2I7kh#Mg~mq%xPJ+8WT zFmIFBoryO;`cS<>E_cHnE^yoOs?IZrk`d>sgm9YttgK+3W;2RBRzk(}wVZ=>pU$cZ zQ%}%>5&Y#Jq1ZMlU%3?=kj=9R`JAgjX(UodgL)#< z8AW3o*zyUciw694@D#J2YMx9?$BOZjXGp*j+~Hp%NFVR80}-y5ah14ow{c(b3WYor z%j6T>*XrR`p0XgCpm_layxJZG(Qoi>(ka=J_NEUp$uP8tj*T6;qBUPzCa25&q9wdp zk&QGjV;^aWbfFlin5ns;z|e3|dVTf!>WjvVua)I*TKo7}66Dxur!gM_WEtw~_NP3& zy;k-eH@Oi55ue5y3qP_&`T`dV)g~qyi@~+wP5po4lo&n?8x6EUwhoam5g-WxzVP^n z4J8Lk7`9Gfg$9zN%h-W$*{(l%VMPAy%0%1j%dA4;rMffEGJ)h!519oS$&?+?XAs$E zh@w3SYX=>er2$VhyHyD2_M{{#A1nX$>R%H0RRU6g$?r9hi=Ym&qj)BP1|C(}AW2Iq zKrdS3!RWvn1#SWD!q}@53pvJZ6o>r-p=-CO{j}gxA@O%Vv8pA=(m5xK5NkCwt}ahd zJ-nU&v}>@$?Y*h?sFv}p<)<{K0`nAx`r3>d`@(x~8Vm1u6P+VddxY@-SIus`&XVE1 zgW&UY+e(>>*Y|~3A31;VPS>Sy2=Ro!chs+w5f7hQk-e1TR^?X0V=1nh{egtW4?vOe z*!E9y>pYN=8^CGW9Ob7h^=T)zZU21vGOkEw=lVH$BFO>|x*{F&hlC3mt@wXAyyU9c#a{hZ(DmQ#6l;U)IK2UT3oA4%PRenOmGH~Uyarcj40_M zT_$g_F*>$bn}5<<;o)Pf4VfGX;uHx9P`TDnpp#H>exb6uytK@6?Hycx?UiY$%H2|L0F_uWq_Upl+OOv5KYc^{qJ?oh)oDnU+3ps?IL-9##j|L9HCj?!eyPdYdih0rmxE?$_uNPALR)Va~#;71rYca&w z7k=+?l(7izc7`SaS$)Gy93Qh%EZyg*c=^_kHzYTvFHdDWw9M(v5Ed0G&b^8giPEJl zJY>Uy=&4%TUe!+y>iP3E(HS4@fz1-b&$<>n?@(W(1FqmJ*+#y6{*}Lb zV7AD3+p!FrqUS~`*{s`>vg=J3`2C+!B^bSHmAEK}= zu9>~P8Zkb3KYaY|i-%d_D ze4SiIUF>OF6#>7-SikhB8@p77tv}Gi3h96bn5L4w}gMTyx$m> za5}-7(n1aH(yhzManXAW@l-aqk9)APGY+KV4yH<>W~0a)k=?VXsYLzZPNl&;r0c&0$V{k9YGGMJ~v3D;B?wJkwrYoY;)6_N{Gnq|yTr{j3G z;k-K!UXIe0VHbBS1k1|S@vODv89y~3?l0ihm~5ULQf%yP?Y#6kq>je1KiF0c_NiJQ z4crCO*>%Qh(8tbID1VSa@Uk^WOX~KdPz(yBkhX?%h;WH2q5;;mUE$e2!Qm@fN&N_; z5M$zOmWzOGZ((TdzPMx0UGC2f__l5Qmzc8wJ#R0$%_cj@umLX`NNR*mf98xHlG%PB ztlS0(OsNRa<-@aRO=?NMjjeY7gN_v(EF2RJ%->gyIXi_O^Bu?YkdBvqJX`K?CFm;e z@*YrqG3m3L!m|t!1@dDJ66v;Ul{$7F?2d_^mO9+#N#(hMU9iBb*{G<7~au(`Xs~gR;omRZuc?+etFzdIunC8++ zgYngl!J+B>Hb#JYoJ>D2&+JPN(LSxmXh5CjOPcEP`7dXjqnT0{KXQ6|0n-;B{89~_ zl<>DE3V?0>h^wsdt?@s#0prK^JN()+um1=BAVZp7+C-^B=|bCncUcKQs+MpMwho<= zIb+{pMFU2t6UfXhqFxmjVl+^Q20R$HQd(n>VW-Pzz!#8_lAD)DwIKJP^coRdn)t>|c1qYNc7zBk4hI>uQKYUgXWXFUJKS6;Y!4VOdcp#Jc@kWFF z<3%*^IOud24NTulJX2@*;j>n<7Z>u^TGakq*Ld@ztlg(pyCL`BsjsmSV5ezdM|+Vg z4>CaDtR*$^z6sX1=>0od|6l%F-U3x?c&K?C8<foX(9IRCZKr)cyO($976Im8Hr3fr$%*&Svm?ym${uA+cT(RG+!?}>(X&?W;BOk)= z5|-RVNwA!#vQsKck$V0A#bxExRon+*s7lz^0d<~?lVj+F;i5U_;B7Y(o6He;3%84% zHUfwUVcKh1tN9s5$h34l?e~jiBvGlX@7^_eKMfkd5`3lXz3X_BHum0wq@XVng7J{ z2;=_f`tyl#Ju0)<5v!DU_rm$wDUs_-Y~$)ty}I4e+PtIE(f#X9@6SOe=Z;mM?U9z6 z?wal@BghA1Oa*W~Ymn^yC&y^u3&Z{~w2lt)IyY}2{Cw0|vGjQ0`6p8jG7^e9g&C{Q zS0&9uSOR5V6VT@P>Fq5m>U0FvKW|Buh#RK}Pa_Tpel+dvi}UaWfY70qjzUI9Y($9A zYhb^d*7CwCB@e;LN|GW~`8H{QA1;hbQ)jMnd+DkhXke~SF-^eR7o-bd{)j%t&U^9K znc^ir_@J6qaK^CT3)#DJiv$^jN?<*UIpgqb0#n!^TeJmQpWAzjtoGO2utI3R3v_#G zD@RZX$L9M@%DUm+q~V#<8D}RchVJ(p_EQR^a16MU33L#OqyUW{ZY6&$@xP>kZyizu zJ)1e$jM5br!ttml75jB9dwJAdigRcnKMeGZe@>46keB^;EZI-*{v%8Mr(x4S3sqpn z|9+Ng{4P29?r(AIpNo&qTmP&mi6D)cKEi|JEk0<2e`{lgPy{E-i6?{^s)k39wPfh> z9WO!4R*+MT|CB-}^v%gDo!Pv}f=n4t$w516er z)^9H#3=#4x6G!1Z36KBe(mFRrwrrVdv65SxTN;k6nI$Z#qq6c^GMDi0FCb%qlgCiN zha$g(*;!V#z730&Xt)%XnUYp>H?R9@|6UjcQIhrqZ|WoXlh=kF%%y8mFEyUiq5(W{ zDZ)b*+Fjj*^QEy8rX*Pnvn=o-1jDGn1LITLL`Yl5*()O&@q8bV0;%M9a20Me+=76k z#qmv0f4BL9O9T>zs)V3kSxOg09-)D?6g03b4F(zi9E|x6%KXFMDx=VX7~~+zG&#!( zGSq=uMFZDwk!Suv3;w88|IT+y?*B3ZPiIU{jy4PNl6PUH>{7~ysBk1&#Gu?Wz%T&p z?rbJz6PY0bM2x!MqJhH!DCi&l_4sdMp;f7VKZPA`l)h7qx;OCl&zNfv6hH&|;F#PY zUA065xJY|NXLX;3;0L_UYC#Emyj8Sa-9PzC346tN&7HsD;>h3==j zaeS9L+?=Mh9Q3bhTjk}ZQE*69aL`!M+;z#4w{nOVI1w@EP%f^Jl{PUq(*&WH>f3YMpf*3%av|UK zs2ppreDp?ciFf4P-bK4z5`=++QL0?Fb6S2eAO5(rXCIHKrDa(09Y%`F9ljVc*jQcQ z;v1z}?D1qxVJjgNMKj1VCO2?JSd;k6y+<63WD?CHY#-0eb&6{sHwf;bpy5;6&K=UQ zZPv*EoIa22;mo%18|{t8*^fUrJ%7R9WMS~M((^-mr7yB1M<7~Ry#1B;Kybp#@{UW_ zEFk0#7gBpzBJlP@@@%e@T%yG%+~l76BG+BfU2}VG|JBi2Lx@AFT<%?3;mZf%nU2pf zcSyH}*FyKX%#Yt5LYb?AR6oUjnY!y?#rhFD?p4%-N0(tYY#)@t?W?LptPu`ea)>1C z4neydCZot`T&(Q^eg!^_uzTB=HX>)5iwkQjyvA0_$UB&ua}MVT>4nX(`S!@j-EP7=}*PI6Hu<|XoMT7=?h)`Z7T zUCEccJQPIfEal4!BX*`#ilX6s`;n=ut%(}AnB`(&1hr9Hm5t^o2H%2(&?!VxZnU=7 zYG+~X>AB^Mw8vu>)J1i(pDR5-wmGD8)`J03(Sw;v7jyn9uvXRR82xR!CK=?eERN}cM_ji2KNzT~ zGYBCl0;hvA$07Kdt%)sJBhR6+Z$s7zQImpRV#DwzQ?Iqg?tOicOC6NZUa6w5-T5loIexK{NO78=r;e+=YP{S&)&)6evZqMFzB0g)X`9B)8UY- z6F}xo)I4cqOzU0p;_1vo2fB}OdskJ1)#uk8-fA*f&8_gIHu?MQTg)OvLY@SlF5W3& zg@s+IsUeSbd~fG=?PkpSMleXVsXiV%CQ(-jUO9VOA0pd5BihdSuIgRb{&@%@3tVn3 zJcoqOw!=^;2GrHh++|W~r+QPn&5+Y0=uxcXuaCTVdewip4J+wH1L8(#0OpSd0zTr| zt1JHIn_Q$_qb0~9S=Eegn(?t-2-s=iCN*NboB{W`v7DV~8HaLiK?6_%kVPUhx`+l6 z_|d>r0~%=T!KviT_{}%H2NkfTVCW%uB*L~JhIL@ZxBHjSpWYsl$T?b7Ah9!ac2Xtc zJ1Y%l&RC=gYazve_v#5{H1SBT$cKpTGa1(KcJs>&v{aF0nay<)A9>qk4sS@1%lpuH zKKR&!E3e&l2HgkI$USBi*3)+H*-$ps-e^6a6IDXO3?~(NTGz-}K<7VtT19j}(jB%@ zuq#CNi?HqfzC+vnlz&@2n3lV%XTxuE^V#-t&uRh&rkXBRxHGfi9XY3bh1q2;lZB@2{_YJG8@vzTp|`GLWgG!bfnh-aM0DrdF&6&hgN9q z%0Q;5?;eAm+TI^chTnhp2a|*BJ{r*O7c7~`dP)vYVb~c}SAk->)N&VU+=;m=( z%eI-@ipmSJNlVZoRD5m!DOWR3LBroxe zq|B1c8FK;?Xnfzm0v7`awCsn;@jYl4vQhad+ns!%Kh717&^>xGHFG??V$J)g_;rVa z_;YE|>QGXGMmSD)Bf;g{9Db8WQ{AInl%p>^eQz`5vBDZQFE_EruJ-OzopwO4KTw=* zVMwzlheyM0T{IlGb(=u8;a-f& zdn?ep0v19TMiQN5H4W7~Bz||-IdJn-vJsFi{$rGc%*wERzzO);=?@sJyB zf%hO&)&+ahnlcs^Hb&1%50qrE*{@|$`(o{6W#(SG^CON>VH04uqv!xRH9-R@DwVMd zwXD!Ki2-oybqp%xKCo*3Lu}GGAkL8Tl*A)t9cEIw%4b0VZpSB1`N$2tfp!Z!)1q8Rq4k;`pm%-65dZ0O*OE`Vz6^mMP;VzDdHW>!}h+{QoFglrjD)!Er0?vU&&=;-6Q}7tmIk`N*@0J68#%``z~F z&(>|ieOganck#C{(_&_b4@y7^6nF2jLDz=P-Xq>>`ddm$42jE4^XN$2Z*CWpM=;4} z#!?w+2H}@e?#8FmPL~eUt#V}-9(iXaQn#f(jI|q$iKV%jH|8EgKy8h;7;rHs;YEH{ zn5tC#I>j2&9-KkF%LNicXSTCq7X+OtWQ%*!2W+Uv91BHdz0P->J4ba*gtAV2Z%!n) z^e8b`F74g42iNKS3meJd$)yR4G`_F+Hkr>iJazvOLwyO4+l1oYpL_NNKOa@Qq2=m=nq?lag_b6Yf)Q_5v zwxTOIS!p+7sW|<(RE7o&DtWl1`uB8gm>-nLk|Jl%X?N%F&nMouMhy({%!M7tK-a}U8fB3Z zuIe9wKuQxMV}@TI*OUd$G7qxeYS!zGyCdEUY7y!oS)*KLRWb`{ah2MkEKQ16Ye*QJRCG`u^<;A0>d872O^s}zPZMsI{EN!MJ zEH0k`LT9G5?AZJyvos4~;gi&tARYW`k;t7fwHFTo78Is;&eWYMXS3TLw+w3oGK6NM z9>1_+7QlqrZ!|l9X-VgJb|##(G6Z|pzo#z=U&D6U(n*#iP%g*c)npDF)rydv4Nl24 z5yNHdukFPB=2ah&?%!Mfy0_KkLs?0*9Qy*VHz=<(JWSjS0$~uAEaBFnkGz~Y`ax9x zt<%P}Aq(r58kEg=bC5jUQ$dDrUih@~fjQ)x_xmOFIzeLsiBDr?Xqd!YbB{$)^=Dmq zAlw>DS}CjT3++-;PQ;PXt%R;gxCenk#OOez4c@4<3b89fV_+#{CYc#Z+N#s0lq zB^>4%1Sv96RLc95Tbc&CXN>%6{3v;QCks3HGQY-^er}!xKP~RO*@*M*ul1RfjKadg zWoh}ayjw8SzL)V!+df`k&qRIi@Gn(i-sglAfqTQgg$cDd45mIm`TXt|fr!Ac^&V(9 zB^ucDmKpi@v-gkb#gd%zSJD4SAh#$b|8>IcKP^DLtosEG?D9j09YJGYlAr$DsaY8d zBG++jS7b~baF?|%0uE$m>yA^qn-t#^jJ53S6r980IOj=e|9U6c2AVO+ZRixH7nibz z=P!3*pLL<#)rN;(K3*J9PyBw9vL5|&d6*?GQ(@w4`G%{}Wjb_-@o@3gPAt6}V-~n_ zYGw;`uJ(wbFoi#?MnKR?WG|1CM!SHQ&qVn>Tlt$RF{ia2*NZj(R`p=tzPIJqYW`f` zvSq$J66N~DaH~=2C)AWHx(70!X#f7%=RdZMnj+g5;j@P`T{Tu_*fAs>MocZFvf3ZQzW^^3 z?Cpc=G}&$*P^AtI`cs&`U#cYc&!0F7(yxkC8+=ARkrbv7YR9bOWi@c!f-5V1=$QZ4edN3rVZ@vZFZlH;3gszX$>HF({Ma*)k2s4u;% zE65u096RHvxmPUWLEq7+GGgIGXemq%mnU|C$JV@Tb3S4do7V<3m>KG2HzQ+rp%+%^ zSt`r=Z0uXMHIm#G$7%ZQt_!{W#JfdC^|@+?lwcNDWVWW^dkrdmf=IF3eRKWAIWCMP zuM1@lT8GD*!gwMFV(Iff=`c6X#56}(#5QVJ%*tw5-M|fQ9a3a*qIW%azK`jXmG5Vg z1x90A9RuOg?W;k8(Vk!~@>RkL!b(L~x6sM%X2PBMPge+&n9JWxzr^%5fGuUDCLSVS z^3& zhI={9B7N1-HMguE&q~D^j4(|t=z-gJD=KW;8tnAh5)vYyQy`u3qWIokBnnw}q@u(1 z(_W+}W&2=6m^dB4o_Y53BjxW6@s3bdK3-X2L!R1frF@qOASWgB{e@p!ior_8@OO16 zVZT-L{60wRyZwENrw3Crw}}7um&%TX`>(jv|JK>1SE@iSNKW!?yT{+M>q^&ta0M|s ze&Z$%@k~RH-@(?!?9jmHA=O(r;0a?ss7f}}D~^HhiPVpms2BO%-BNUqVq5N&RF_m% zB+SZMt6Sf)R0twwA?%s+MkzzIp$#Fr5;+-k}KO9KDOC1 z>2*1y66;>1-X=70Tve3&V_l+ivC~XPPP5WQ10jvk5R3AX&!Ld(DhYG$(Yr3Mio{){ ztm~vH`U*Oy6N#prKjWPq=h4F@6cMTENuuk)jY`d*UR@|Bhg5gXA=KehLyAY-35i2C zD|FD;?#ii0rv06R1&F-VaLPK;er$m#sxRF$-OmOk#9BmI2TP;*9Ps415celJ`nu%3 z^xd0qG|LQpyb}h)vz@P^`qgv`@Qz7RW9<)!Te7DfE{HedvuHkMrX_0saQQ=Eo6k&h zl})N*N^Yg)=;{TNgPip6voS|+W(}hJuQw$P)FR5;W?!$t_H&TjAW9PxvtM>bQf)|L zo=06ifGDjN=t`}C( zud3=!jWx4XLrk#CHu6|`t(nCgjJU!>CDrFOK5fx|j1Z3EiDf%u>BwQnZy?0ME89SB zh}s`!ff9)US(N8QEZm^F;IWLeAqs4>^Z`yY2tH*vACF*w1N&JkBBKJ^yFCBJtvQJ; z9Lq4`Wq%!1D|KGd!1b^qmlTj1PPyN5b1l@ed%c$C$X~uEp?+j9$G^6>ImW)fgOU8m z-CF**AJ;{!=!~tv(rONd$Mec5 zuV6UHg5_Fn`s0_=#sx#PbCczkVSWkB1AB2+q6b#IaIs6YD?Rd7f@$fGxgX{>JV9Vf zy~JQKo=zC8H1sN=bibRndPq1r)@I{=NOAX6+N~wZv+Id!tvdFHgbx5PA4>)+Fx(-j zEjSrF>%NQ2%oNC;3Qn}YL8Q6!D98yY$`hhLAa1-E#XWn=M-Cp}mWT=z0>iG4(6&3< zHb`*cT~4|6EeiQ%!#&Q6NnAAWJ_yxN207(%5c+ZQ7Gn(b{+3Sjcj4Z5_e`xcacuz& zI6&WLX8%GR>%qxR%C{s(G4$9tST=@F7x|`#KLH8><7wh^P->W#ysrg4B&Wy)uQcO0$E;aw8^@_Fu(R;oH%d(;MkLS1?fVc zV^%Oac@(MA%M|+9F1-amQjC4LUgnc7XlPD6T+ zv~=zR2>Uf-oN=|X9(l}C%@4BlyNjOi#tW8OA>YRI$XYXpbx!)&nzwvyAJbic=)n*D z-3f9>R;jtfg-dVrLd`dM9I)DquWHplJD)@m^@Qv$XTlx`)am;U?2B@>i95_JmBOpp zj9v_(xJV523QJ%WA=J07bbV>hET6k+O>pPArRdt1gsYJarEp?r*GV_4p%=H!`&l+K z{J9pSDi)-^0P$-TF(piu1#1Q0p)x?aX;#?(^lYV&qBx=mLTewJJ> z`>M-Xv_WOT`X^$iFFGIcorWX1m)KwW^Ol|uuqlO~2PDHu1d`q<*XI+0r2W&Xt^Plb4-)FxsG&p&Yq_T?|fpe|#6K9?t) z#HDHp!kfEY-%^A1A^jjf=O!4y&wy^}5@g2cNU0<+J)70)ws^;5vg&+&Co2|&Y8f`6 zU9iyywS!vGt%>bgT9x-+_;gG7(}Ugm9m>Vh$44PEVnJDm88}e_ zX?WXC>c!b>^6OSr#$Rx+$O%FXeH#k)7wz5tcm&9U=3tkc{p3{d55T1ZS>IO=CooJD zg7}@Zv~z2>U~Eg6yHJu|lTFss$0o7Nf|mFK3KbZ2%pDplp&snR!op>WAe=JyE$e#5 z{)^CZ@d_A@OuNJ^%m!K_9f%cZd+V5+iMj?&9aJ(e%q=oiRk}OtT)d_fqeIh7 zw88YYMIc(r5yI))ypBD`;Tp!%t~iUpcA29{e+rNPzUudd zrf*fzjaj=Jr_THim2s>g|2*YQ<%ApFM{te!E$im4NlUSy4vS~8a9yqHyc_KKnB~n& zaS@GJ!Cn=cv3oWg;C!o2i~x68(W`>S*agD+4I!unPqd-4*%eADhR49X4xa^Ut^31tTbV5Hvcw+*U$K z*>x9+8`xPp?rA|p1U%MlL;Z3Hd{t|rYU3Pc+2Z8;=i&v|poQ7RSMM3)jNdRGrJa6k zH~B}xN^ggws>qz&K*lUQgUe0@d(JCp0t)v zAyeP5MJ~*B?7R)$=oXn+<_{dsJo~n0?0CwfNPiJJ$2Vx^7X=FYb;!Q~Ie%BjPvFeo zjn_{=&JP;$OD+E^$_@nT{wo>nzjZu+6aSSA^kB$#RM>u?eMyjnD_E?ARehSc2_oU1 z-QRY=CE6j6V4EW#<0|X__9JZr*6mB({?!t8*)Ga@E;JB_mvLn`4JvM~B}8TDl{FR| zvsES{KZE^85tqRauQ(&CJDch^T;~P z8FrMaL4d;=dcr=W`nx}?XP+9^ux-H^jMBQUB+op_nYG(BA)`98bXT_IvhO`gZ?9;%by02z3o?8q8AG71s6 zice~-NkxmOTemc9ktC070=HY4*53A;Qt?}yxoS!?tGA)-<@tEqyw2Kj-*6YKj!?IBz68hzuAjlZhDJ^EwC#kox6VnMA zVTwRL9>WsjzDI7L{W7`*z;_?4@|cs&ZQ7w@&>;CgCnC2B z;b6F>B&*sQ-?w(GW8HbHS1$3yCqp}LMsy*Qh;uE7qM|144yI@lND;RXZH^_kg()wp z{ZLbAcFK0yeRX8mr3h-JSz-uK)$IZ(Yj~CPuL>MIY;1^A(#4$eWb&(%-^vI+u6Z2d z)8Wsh?Vd-T%A+RdwycM$_qlm8*M<>Fkt|IKk$e+^2YONd*a(heajghj7xCyJ&5o$E zDmvBCMfBJ(a#sU)K&hWziV3{Wxy9e)mYWS64$xxYDypcZcxlrmMkj(wECAxw0|bs{$~Zbe-$^<#9je3I`Abh zL00SCu+iif4nH&PUnN0XFtcIumc_wU_m?+IGJe0BGJn(kA}ThSlWM_4~HC#OWbpQ3} z!D?tGuY@rW3{KLbAED`{g%eKno^+OV>SSp(HIJUnz71BWFRP5SeKt@c>)cn4Y@MTtMYiiXt-qi_o= zQ!ZJbPn3stzIKUH!`Qpbu5`3)bmnx}V{)jX7uBO?c}hwyqNthX-rlwiO4cl?zF&2} zYdru6Uqohs-n7jrU!^%dReg0ejx&Ns?cJQ|$H02WE*H`vb%W%fhF@tHC1gj|N%?YX$N$RE`-Dy-UIxk`3*>rSm!++y1I!tbZ1 z4lYsy;r3xTGs==?`%)Zb+a-Pbp(-W@xaa0D+7s~wYV$4R+hGMXOm7~44!kiHb` zuvw2?N5`=lcvaEVQrzZA@BZm`ent52WDHm9&?56x{Bb7>ier>&fXe*@1+vS*JWHO! z|C0XAtBJUzknvQ0gV}zot9p}^+rdIUy42paztXG$M!WbPrD|pU+u|_>0 zLdUGCs+OYX_o8RcUQ>Vxi2KrC?$ymCfY+pCmzZ(FF>7LNl3qww-zWW~Xocz}ruh4+ zSn@E&wl-cr#jBD|V)8MkB8*|}Y1&4%r}Hih4t54O&vl(6f!0p+H8cyf|C#v%EgAnd>Su3vUdk9C5nH^l8Fq0K<@v{+EI>{hx7W4NW=ek z$_*9;CJf2%d;j5k{uzk*$16=yLGaoCEkkEyWqAK9{KCI_w*Rwj0e|xhpt|%r-k}^z z5c~#|ihiZ4BL1-etNkb7`Im_G53`&i3w)Qo#5M?=)~aap6DY?XfL(KdOdN1b2J-#0 zA-&tPr4;~sxG`b4zp*(=M^w?;XYN+|)Hh-EqE1dio}E8oN0kGx8Rzmk9QX1k_zAR= z+;X|o^39v~QpJklTViT5>r>k~8gr)CF8VfDYhh%vCkla7AqKn#Y)hKD(51F5_4#%O zY`aZiQm5e@5&LHPBchTZ2CL$cehcnWjRk#!&F*W@m6@MF=LI=sl{Mp*?<&fxBVWDH z$qRmND?s0T)>f$jBv-I zYyx5g-P@W*@kr0!)2Hom?Wo?D#qH7~tVMWsIqJgJ9`(iA_v$BJ+?$nhpEN&&uezP{ zO0iPU6_J{%UxUvn!|dkn+=|D4Jz^!mn+FJ$|Ka}^0k|~%b~3M+VJ>4uh>Hkdt|5SZ z)8Fe7e)tTN4s^Xnn%?m$I|!_SWAFsDP;0<-Ey^fj`SX4M zUytyA@ZkPGHFQv95a>Uv1omrf`Pb#Pz}mUjUXmAEL6s!h)q~#6=F*^m-jRS|Goxm)qO_YzoIm62&omJSWj| zk37e^9FZjC20NODhz9j!VxeUDGd2AxXT53Rs*J`1z2ItmM^&?enMMv7i>IBdbRFb9 z7@iAXhZ8ujOY2CVrMebqrggaK<2R)yWoQq7HM5mr>yYg$>-Y*IMk_vFjJk{nrg6cP zT4=ia3H0NE94yR$o>3KlND+<8^}`t z(82$x+ouK$e*j#xuI42FE3kU}%PK%*{5xWS^&>x^3SbueK<@c}j8^3RtdJ=-Ut6X8 zxXH7q2}J@JpvMXD$ntV%Stj=-PCh0IXr5lK*{XW(Vj`n;@xPy~sfM3MvJet~ns z1l{~s&(Xj5+kf)p&;8qtb(5N6Rj{L`>2&wOsA@t6Ge6l#UH=rCfOzM{aPMHVS>+ts zm69@~!V3=+;tjcDD+=>B&XG<)5Z448$CXM`U^ zMcIA4nFh_w9_d>7w|!{n&&w3k4)t)|tzdTy2(Kv(7FD^8_1uGcc{uwcD)DJ5d5glS#NHLnxF zoU>X8q@f}GtNZA0H_yNSJ_1m`kwtA+HKk9|V4YqIvd)@(t6ZN$&1gmQ-FDfbt+Xqf zjt@^Oj!>}U)UZ`|h?@HwxJtohpmyI+vEZ$$cRMaMiHQDp6mNQQDvtsn6P?R%ekjv#`Z68U7r6bNR z!DfGI*QoB4zXyq^2jDB=%~(uXvGyZB1ymGe)zyn%w0ixOY>8l6*HMyHMT?ei3HCg2 zEy-)fGpi@ao1Fq?1>8^<)wcCN5I_V%s`wKbzJxKoRAwuvbkr!D716IXH~ z*M>aYym_2^n)v;)T{a3pXf>b<(bYo2`3o0@%btZDc5p@^m=4-;w)jhCz+gS#Xec@kpV|=15C5_7r&7Y&kW0SNG~FxcQcdM*ND&Ct{Sai{)RA5el2JjzeoFtbIz+*&5TVZ{I+$ZQ`HA z5qu)~B&T_vf3`% zO(b6#`pbeXPuv1MNO4|n6&MiysUdrrx;eo!la?yqUBa#YM8>^q;#WI1d+AQM185*~yIoyE&p4Mj87teP#<)muD8$c)%ytd# z{lZ>uUQve5t zj=$y2azJ+Y3$GagNQg;)wg2V%gNO?d_WoGM-!=W2>-FO=%!pSv5HC)%KUk=lN0S`i zwVV&OBu+yA!5Zn$$^6fu*Z*5n#xJ4Q4+7;sAKU-V>;L#{;`;B|L~0)aUJv;fIA4Kh z5)}`LQUJG1>&_HbG-wDY^T+@sgqETQRv^mBi3HMG01dx1EN^9kt2@PT>LsdKw8n5`*k0ozm6}6&#LPD>pn7n9e)HN6f5QT zef)6vFq!fIc+(A3-hrzzM)`-o;I^$KiV}yCKfBw8`S*qS|G&D{e$8NiSiUy9^ z3|w6{X*aLbfFd#A=|F+}P4D6w5Uct-vHsPA@0V?AKPFv3b@>l~-k;drKQg`ly#AYM z$DhnpvkMnxa<^+-RI5+shcTr`+c9uVENwxA=UEFeT`>zGG~$FAV!Zkma!3 z!MH&lChBi$VYf;Z)sCR@LEAiK;*Y+rgKmDVl%3eb7*!LQle(*$ zQz{d2Krftu)4=|x%LkNj>jtUuMOTiTPKSX}=G@I8C$r5l&w}@3yWjPQ_pJnQfaHio zRI25+F13@+0a_m1cY3G6mqT0MFB7w)pIa?$NZAI>*(EP0uMzF4JJApXW(F*tENU2j zmi-)Az|!T43gRtkkv!qklha`z?zn(<`xi4Dn#7tdPrfl9?Z(4XG^AXI3Vd|h(X3|3 zGv)sDi7jTdk zJG>bcn6OZ@+4BHY6Zz^p7yWi#9yS)p=x`O1dAa=StBE(oDMXbV7<$mG=cVdKX3?}C z0h2CY*L_`msA!1|VgMWRoQ}eNQDvL;F;p{aTuUl7hYG7c1jPpuJ~+*f8*78IgMGZ? zo={Ue9qCq7oFOyXVUHKo1qv14Wn_v{v9j8_nR|G`G4`Mb6nU44{ajXy@TcF@PpTijxlCxaX1(mmt>TcIz0}UfztG6=^)+2+hwghjO|qUbYLM~C z%rolbHOL@E)x7`@*3{C}G#~TW3G`vXn%0`E&cFG4M6Hv+=hd8Iv6Xcfh?&~ELrEQe z7F%gB6j|dX?nWx9xKb)jan2b9;8Xd()j0IuYW(}hV8h~%63Tzc`5$G$M6hfcgQU7J zm=>;*MfimT8D&14Ck@RlL&uHUo$tA86{nau8@PQ9Dzf__qu%`$YyvSeJEBb>YtkU? zWjsR);{8R-gzA1+wo!ij=FYV3eE0o!GCP0mj#7^u0eXNm>&W<1aWgN(^_GAJ7SNTm$&-A?LvD^_12Ux`-2 zNDl>Fi(~SRScKhfi3v-FM{`Re4(#hXQ9`f?Gr|tZYc(IDVW#z5`-RHldM(as)6#t> z@RHM{>Fus2_4b$0&3R21i7g!YC?~-u-arA|BDP==kJ}N-s-~$5Xgprxy>V4#H~QW| z#Y^HolY_|e6X@|pP2OqIRgj_Z)KfM%B)*!H4%IG5riQ7rl~t~2PxuQ+KbNx$XFrCV zF1+sl!20^1Jzal^6=5G8wmuLxP3T^1Nri4g{CYn*Ne~okz(AKivo(TLU<5%ZARfh0 zF)76OALfjIIwSlG@A;1onSTtQL0?ogG(JjZQMJ*|Y?XXD&&VkUvZMj=+5IFD_rjqk@=?!D$B~KdS2C}VN$ltuUM%T4}0@*YCVjR{W0#ZDo z_o~AInBjLa#3I9&WIvPE0pd?V<-hnLV+&&Js_EtdCn@ol>|<__G{*2e0S3}z$i5Cd zCd?bHc@RikkO<@ec!rH#|EuTrI#xa5&DV6MR_fU;yfflx<>{7_?uUA>??v(>zg7VM z%jI7a$MP~VYfqa88D@p>E=Xv_#dQGr-xgjv%3e6SmZoQpR%HxbdIH^)`l_2$j|aR6 zCEg2%g+LPZq)u*!9S)8Q8}QDfb-*ELaGvn_N4grnSdfq3PEe#3vDbGCEgG%bHCLlB zjhBhfDdSbzqrCfl2bksRR`bH2?kbp#L+5s53$`?iDp+P&-m1CwJW?3K{Xoul1XG|r z4fF|g++MZFiAZQ(xBYg?V;3ouPUkbf7L?BsRQZ{_#-$b#yDPv9OH^4*LGpcHDQXEe z*&)P1^2R!^*NWMkJ=p6}qp`4Y7o{lann_Z`2bC?C62hb2$|jxS@43M$)h}m}dW_3y z4UKO*tRO-mAW&Pky(xt*G?t_T-&~iXtk&3M_LF!@rs7W^M^_tdi(pl z=E1oMhR-YFCz9NFtMwa#0@=TVL9Rot{4u&)q78|=PC*x#rFAieso2$YFGyd#&~pW$ zXI{xE?FSuS84Z6%&32#*emI_URDHy?pdtCuP56Bu49Pc^D$iGVAEx!j5Ak1HpO%Ra zWU`l+B>EMI#oRBidk&lvXB1F|uxjYDi140}QrAgwC4rOmLCMR@BnOc&ZJb|k1pK|q zD4Z)~h?z^{za-Kz^v654xnR7%=K|5oWowUDdc;?1ur8?XBIhNbn2%^xf~kfa;w)3$ zL*ySVx(1Cw7w=j$~>jsg^gs@SnHdPin+?ZGCdzqRs2udPL)r_Zfnc1!X>asH%D9KXH{;>z~qP&TYiU?UJ|@zG^@ zQDN{r6Wy+2ut$LUv|&2T6{L2|9t~-yOans(aib-$8Y8K{P@;bSD#U;o+q!&%U+3a+ z;a2oEOn_Y~f!!w=UY>bCE}bNS)TNM5_?v)rUD&Si*dcvmOqdxP5uM3`ulOri`r$@V zW>?r+@b|gdp8Bk5CCr(!LiX*n))e(yjD=6YQ>DagRfqoKyO!1d_@;N|QSU-@NtxJZAP!wEx!0q2Fre* zT3wphT^+fEGTX31h(!7jUyV^&?Fx|$Js z$6G4aB+5EkqJ75-LJ!I1J6~O``@#pzj(Y9!mPw3n1TK#6Ok&9O7JB+P7zxV@toFKW zpS1SuDd@R=k{K^)?scQ>Wp8^iXGQ+?3+KFsvNz1GMC%&ops-tx1&+Hm`w~=@ikiDI z($l}MdI}|-A*ox|jq4)s&{0S7av#2mK*S=Lq`VAU#=9fA_Wn@%`N=&O->Y2;4|AP3 z?b1*3x0sQV6!UrNT0I7;mTxr$8!(f@o*+VYX@u%>k0Ocm%@O#>)LbNtJwh1<;@rKT zh%F+8$C0AX@C{2gr-IAeu-W{SP`XX&vKC;js~jnxq~yN*{OTf~NNtl!pGLYg|%jM0k)Z$`;_xx*d?j}Pd0r&el?ov}LF zFDgO89AiYf?3?xIG2d&@G?U$zU3{aW5O*+hDDc4Y|vd#gErp8D{HWS7FZJso2&Ole1eC81?z zg@IF-2p5Cv+wD!E24}q-A*Rc%*qbW@(5$dR7&WxB{Tn6Ahjdv8oAsDbY?e;SD0$r1 zYFOjqSu*~Fj{P{*|4TlN|C(+4BS4(<-&nW*H$?Y;0uBB$cPeRk_1oM4d1rZ%@DJ;N z;)!pvYLKj7I;y>Eg7+o_`{e%1=N=aj!vZhy$8(|rM0vnvO)9J3(ebM2Z0@q5tfDSx zr+Fl@EAs8Evo{P=HKRRe@t*pqrPCgaNq)!48?c62f6S_(6PGH=M@G_1gbFbqUTy}X z`de6>=pIRe1ZnfJM_{9H=SgF@jcC~3t;E<8>=r=7Eam}Fkc(T6P|06kWdZ@jW1^xH z&7|^xX_?Sm2-NIA1IEQk#rR2>7<^Lcy2|8LRLQ)!)qbOZ4c36F3y0!;xyBb&aShS+ zr|9o+8M~An(j<2ck8lFAKXyT_ae4xl)>B1z0IjOBJpoT##r?{j;@lO7aLv0t3))Bm zGb>Gv;%o?%OPn5=1w(?=-i_#UK~#gyGysA!zblM91N72pij|X%<;j5HKxjOHqr)jf;#%!MAOuVQJ+r5|~;a1gS3Y!_pvgCl* zPT3H3B^q>$de42-ar9VAE=Haeg}0!0jr3a*8J8L&b?!~7TfSbaJ6t$QDEw?B_@r@o zA35|SXLSy2bq%q%hs8h~3uV~2QD@uG8S5-@HYJFo`L^1v{h~26tNxR-3yxdN& zHbT@IR$C-x(PKTZ_}ciykcsP69|vkJ*kK0(Ne-J-1Oh-CvD4yxjGF;t!6+!s(ELeW zf7B8#;a13|Pf-sWPl~dx`rM9^Mh88){k{WiuW$OZ5bm3`^I=>X;wtA0c8AW4MV7YK85F|e;UYEsC`3k+WLs1lT-K7Pk^a-K1*JMr?E zv(gpk`*R6adC7N=UBr@;ud|aP#BQpHw?Y=f+f~W6l9cNnoveysh+TXpvmx~c&9uRy zf_CNPG*ehZiK_4z$j86StoFvG=*uzk^Hj4Wlk|+#qqO5_MyHZYcvZ1ks6jFt&?zcq zZ0NUB0)(GDX>HwRW@eW2^d#F-ut+F!Qmu}B6TlTyG#U-M4H&Nr6Q{YX9dbu1h0;f# zX!qP0CGm~S*>){R#Je+f4_=M$pEdE1Ef1R+SiyBMJ&Sy$qMqJ`LuvvG8*UDesP%lz zfAcS*D(i_X-cHf6SEIIPMtywunC#cy2jgT<-WW}Y_o=^hBQ>BTP7WUcES0{h)mIhy zcgPQKRYpBh(XWnt2O>56u2ktTv0C&*d1w@L8zYP%zuz`2+Vx~D$DZ>XpdU~pH2O2F zRlNIVMs9{_X^8~~duo8UZkK#2Kf60sbBWPuu~qgtV(4NFY=VerQSNW;`6L~=@|WvY z2IECcCTjKsf)Qc_s;%9j-}R5JKa`|DQ#^}PAg9t#SoaA@cDEN`0+?p$HH`tg8fzcR zJluHeV9DtTK*x}tHo`C}gN6XDx}u1hl*fv@@?iv=q!3?D-jFjg@0S^0Y8nD|a?oR6 z;-M%a2xT#XE@8>x2+z1ybAE#`P+k6WENcFYl>Ycy#t2}^xBUEMsCxSQdL@kUZ(sR8 zpRtgBPtGQOU;T$X4Uwa;I9DLFG9Iuig)L6;uv_QimuaVs{faHf^L7S-FrRDPNVY2} zUo7w2Rp@f9e`7sp^w)5{PmLF~+l-E3W$GIfIq6nLo$x4PRgv;C zw3yYST0stpLsRcxqh{x6EL_QUT^uS|2(v0?bYr?aqxC0#@}@X6=0hWPXuRDia|LV( zz-;&f@bJ&9K3?U>usR<#j`x&_;K#Z+!ziOlfX^^tV!rV3C%ItAJl7F%;_eabQKRoL za)@Aj-R0oRb*NE-shQTEN4GNGQWZS+IF^EmzxNR&QacY`-ShRn*0ZZ9;lxF=l_|&T z7v8Y6!H)h0y{+>OU2=pI9Ek%i?oSsEKd})Y2ULsNuid}kSLszM>v{q-#`MWdpYHsU zlDD&0xL_7#&W|7K7(n$AGJN6u%9h>l_8Y4BS{@?Y8Xm5$NM(J8bKDKtl6l&!ZDy;r z{%Hn8Ds&xZFErOZvejU!{@$j;xgI_l2d78Fm=ibl)p3`5&o0^shUeGDRPsnVnK2%T z!y?Ton!Le60anww@*xdx0Y~(7>pgEfvGeQ5YSo8o7VEQuZ7|czAT|Vx29I{SP< z9Hg}8wU=%R8NRX*PMq$rH)l4BV;2=S1bQ;pa5+0!(ukaLt~8r5yBp-^^D5ZCJPH}J zm|}!tHid{`)|hhmylQ{KiKO9h0K?|q-i7b$gOb~e=*+nIajnNw(Z9**aT-|psv^3`21FbH>8sygdyNs!G(T=-TS$_7t5T zPv(%-4+wfgU9=vlb3uZa*I@m7_d-@{@@BXJu~-;`)X~|9Yvz89YJGU}xCHsUkI4pi z^>><5VmlBzd$PA+HwZs+PB0QWtyntF`igbdSjrziT36Yqor~$~e!n9rQL9xqUh%ge z)v>mzt>#oKh?f}=3E~NpL(IdP8I?x$5U*|?X{51%&xs$Gt{^!xP9QfDjYy8< zm-gqPZZv#r%OrD*071EFs!o5;gHXB$2SMM%Rw>VZ!fddCYb`214BD*cezj-Im6XCq zar}{^h8PzI{+$ZP7pocab@bK>#A|mGYfpG78Z+{P%pe-E?*+&U0DUfw)j@LR9{@OF=t%=_myI@QXuSSuy7pdtCmV z1&d;jjmYstsDls$yX1uZW>o3(mya(z7-Jb&-D0KUY2Q|HrS$Mz3^j=3Qll-x!hT_! zR}dr&-3+a#QE41GsLGq_eGzDqNWwnbWk1l_it<`7l^0U6laMnSxzu6iNfJ!`MIE`BFcDBo2qP@9} zgB*5v9HgMvJRg+WmY)wgJ1V(9~II7Y2gYs4>m3!flAYw)(WCX86+d5^34x1KOcK$D{X9TJxjOtdJ)z^?AAK*L$&xnn^o{560ba^cQW@g6k8xa zUX&Ar9W6!ng`w7(vj>WJ1_WTr0v6RjyOy^cmWe_4TeemiZokXJP5j@v8J59oBm8Hx z@LA0-x!Qx6gXlpb_9T>MLkMF6MeKj1)&i7RmMS7x>B$nygL8tnyw!&BESnFu&>Tx24{bz>Ux>pVbjL2yM9*DzeZMH${R8pl z7ii)4ZeR+(2P)~v%0Re_C8s<-l$+aY%0OAE0i)*n2-}F%w}rd3Z8*nsH`V{+xb*?X z+;b@>-bm4OL}S#}NAB3Iuw31+$*L;tQ1v_3kf!h4_Dwna9irH3MzqR-m;v(+kdRa} zNBqT}iL~}XI~1gws;g8?*XFT|XXKe{)Lt$=mufMfA60aO)qPL4q;+^YMrP;cMOawo8c|8~5lKtmc605A+>6>B6UZJ7a|Dr< z23c{_e2xZFfRkwPgqf2=N?xIUKO@InI==#1Vo_KY-CH{LXSm_`Y7q$?3=!sgsDBjY zfP%K{vGI^#pki{mW=f(lY`H)>RHEgIWYyQcu@4u~DAoWfd!W6EQs?;a!h;IMJ)qF? zAatRjsN(VI2B*xfecj9xucSP3f(DfWf~x9cm5rjU&-B>|#a<4%wSnaU6g;J6he)U^ z$^JcClw80>r~7(jeEdw#2C_xgk$tZ#}vhByyKP3 zJ(^_2FfWp}6na{@U<7HIYp+e`pU%E#FBjwWf+l)v0R1q_kL#dMcxsq2)DNt)!dziP zEZ+ohD&RqdzQQNir_ZFhcPy5;c$|$kK^JY zk`j|OO&^d?+Cb+zdi4D_j6R{GKN2JOJ~V%BGRy_d{Q@^y>%;@42_8Eyl0EDsmWEa* z=behT=yT+6e(u`OCOZ)}fzhIvL6?AqdpiXXV`JT;87*A!a|)2=qsvnaY+egXj3Z~a7lri&ty;1btDWk4!|y5{tm)Wu*~&#ne>F5#KBe{@pt={h%vVzcV<=N%d!ZzTG8^jx4$-A zVhY|zYKZBL$k5O5Zaoe_f+1Ws!CZQ#yB*6t1!2#2$emm0=Ar?gkcpSY1NEdHMO!`= zxjaY9?d@U~KM&5 zD=}*3w!-*cfBc2I6(mx@YTYBInxK189&gTmv0>FQxY-Axo1qt^4&X5E zD_+Hlg89UsIL%Q8y(+C5{%rj=z%<>%g6$dekQ66%@J8(0O9^U+VM^RqLce4pl}GN>Vum6mBQ zRic}xJ}Mbzsw*2SZskn9^7?HM6QP2REW{r~zr@tMO#~X^apWtN&HhVl>_1;G|10G8 zSIhs2z4c#x{-168C!S82N-qPA{a5YVbR;9g6ukLE9+TdNnLgsN;Iu+n6f`=`Vy>kh z;2^GrJKpp0NlraSy7vga}er*v7Wg8blh*!-@xW zR?!5!^-GHh-tc8r?U$m~Uxmcdpeg4L)&n}9vyyUos z>4f@8gt#huAdUg>rY3`$?88$kzUcb!fYv{9epc9UulIWDOpl$Xr3Oknl7QcJ+HWew z2pv+H$U{UVa^2~CoxaVTlU9fvJWP>!%OZ5**=&|DXUp@A*FVh? zyMIrl5Bm@?$SYFnIu>#jQ@!8 zWudBbf|U#WK{myNJlF;2k@)+3DGYY%yVkt6>(|Sv&GXy;fD!#x(^sJ!rz>WA#gKK{ zc+bu-x90T(vENwH=--T9g>B59=Er}-#an0Y(dftMfSFH50fDxeI%Pya z!e(YqL(AJN3&|Db1~z)ZfRzpKbDp2~*GkcUt9l7B-8ES1==`F|tY|)oYGZOM1zSDY zT6C_;r;E`}hftUC==+j`W;w~>0M7MlwKxi6>$7e1ta{lLfty=o4S^+pxl_zm@v2Z} zuX8~6kai%OdyQXRSX?KB>+YA>6ZegnDCuy!n*4qS%PZn*DA13souY<5p3Fu)2O7>{VsH^g4`9M~w~IY+ND`x!iY@^7#oQy%B@9`;=sk zm^%F4#6Kfxkw^q_yHy@hO2k3$DB2w2)jjRcMsa?k$>kNL094uv0kbR;?w57ee1@g( z1Q=yNj+Lq}Q&#UulqSf_e9aVh1tmq;8oIP#De-W3v>g8c+WnT7sB6Xr>6cG{#|sOK z&uOkErP?is-?-rs%pBEWY4sgD7d=#4$RNSqF`-q;o%LReO~@k(J2=^xJV`uoT@G|_ zEXERB1z2d=1Dc;gc;)gmI8sblGz*pTcnAv(84;V&PO+Tl+PEcU>DivK7ugGJ6x{`A zd*U4UT&dpKWhs0N#Cj(BD6f^o|8I7B{{m+Eb7k)jzkhB251b%OLe?T)p|y>*b2 zxl;T?ocpaKz!imGUQ;3{&}-OtZ|IAH&eCJ5vwcd2!7{AucC0i`C|V)w&k21Vzqh!qXHVhS{yfjhCM$T1SVS9&mkS5Ud!am^8)sy3;5V z!x`V{dDu0H_Y#E@8)3SH6U5oOZ7ysWhEW?UR2UN2~#iD3-o!lp^ch|zqACb2nbW%Pi5rL z%mSU*x@UtM+uCU(8`9DG_k|>j4{imA-F0B|Q;b%nZkzaTQ~`DKz5&M9{;f{J%;eA$ zp9Gxh1~=1z#|K#Ij_W5PF-PY?v%?n6*DJL! zh8X4?sJ1)^^pdyBA!n>bD|?8gL4(ax?*inQ*>4>e-?2YlmAUn9BggAzZT;{mU!uT_ zX%XmnWn%2aWKCCDfOP;v#Et%VTaZ`D3A;8}d0dyEPLYa|NdlxyMS8MOE}_%voB0K^ zd>h{qs_pJL_5EVBhXQG=j-uUWUW+Gip%8z)(_m40>^c1M!c-{L?HeQB zddPVv|CiC2gDM?aI?Ea8j>5bsxyJj$s_#53ekU=vv)e3w^CfO!HLwd!S?Ib1-WqBH zWhrE|EI@t8*$OtSj(nUoSGa;ZeZocOJ`2RmVEkBc8_60fR?Wpbc?}yM|E8~4dEZ#u z+XI7{MB8uPF9{?4o7IN@bh{e9YrB_m;9GRTzN%KGVdUz&7^Igicz%_z4M<+i|w$A=FIO3W& zs>CbbB#`BF7JfGE`CQUY2=8y z2D18Ukf?LRTe1LJv_5juwCH2VcnPnJ!^%GYKAA>m?@8u~AKiN2P|Jcd3Uc^m;4aWi zc}oxgdB_qi9O6|}6et`+z9#1x!qI@-V0=13V4OICxwujtvMeTHLWpIYs}V&T*b-iA zW2f#DEbbQTr_T)jWvM#M;4ll9)bV>7if^HFhS&T;YN;GyXnZVgtTeCARVP%6fd@(Q zlC*r7>x`Z?7bkA(peSHVWS|kFxMew7DWZAu?is=5(u5QnJ675OC^-4GHTOj8ctc2Z)(FZeeGDRL;Klb zU@geM2={U!77Jisj>LGF%eNe>bjDcSq)pH+M4Z`s{oNP+`MMs<~42o|;8zirIi&2*{Uu8lrguxbzPQ z9Q=GDI?gaFt{kLm0o7tGRfy_neCDG~6&_UPkhbzZTV~t{+gEtf=Jlb)6>fwP!AWop zK>}PGDyEH{f>`pD1F-B8?@-b3x@d&(*7eY}p}kzD(8rrW>`3exaYOL*m@?Fodqnej9F)l3xbU#BK0d8ySmp#AGOC-$8>$%Hgr+`BrSxmPy}cCS zZ|C*|(RapsrlFygrwP(5ez^KyV%bH=(+N#%5ob>9G_h3s2KRFsVl`An>(U0Vl}r_? zlu>gjk+=@GsV9kklk)w0!Dv9R@O$5e-`1%UOw`*k;iWJTc@3ublstnUk^sA#Fu+9@ zWP=HHy_E|8t{OFLJ$CPt8Tf6e{AsSs-~`MtIgz_suEu?yM(4%pvpOj6I8sDX z!x}hQC3YN=qLXdkn^LG^U$++?n|8r)W5e*k^MKhJ5R~*??`%=;&gJgaEzUg$z^5hx zynzITMPz<^(~pPnKi)3Ch#Y0YFoRD~2YsK(94oW9jBcmK-w6ouHURya*SGL8uW>i8 zv(F{yxD6>nz9htrE#|P1kXVp^1hz&zb|g zb~U%jM(+I&|DS*1;IIg%x^Rg_5=CESm$up3oneBYe_`qHt5o!#E`Q|#{h?K|biDXT zttXGsr&VJa<$OudJ;Y+3h1VEOi{6H&+W$Mb>S;*>0ix3-0At&1m;% zcS{51dbgEZ!CPT7)v->}V6#>jo%y?4du6|n+o_y1H;UbPo{q9ChenA{^XgPk30&ND zVy-p93(TR~cSj?W#a0*AAw6YX;Aog$olf)!rjV2@RQC}gOJM`-^czdBnd!(jlK8tl z>~a}$de>HF@>hi6X`6iavZ{H+eD2CEb(0GZ?F1zk?}j&?)Nn48AzN*8+C-c-u#N2E z198?7#hNs+6CHlL6>WA|Z&xQDqJVVjq>zQtafCKtlLyD;MBR2%MEJx# zdD*2CRL#slIk|ewRya;D$<+Hu0;{QNpsXH?V2OHB9?uvTI@o2;qgVbWsk0_+2OsKY zf8bAK4PVE3eQh-JninP+^()L~HGy`iDrsXb4zi_qO@#M%7+s+?vw41-hG9*koE9^W zd^rP5wE|jZ+}W)17z6Mtn`Ske56q$-hUgOa9|Y~nWWFMM%9vOgaA3=>ysK(NAP8+Y zFQ{M_A67>C=uGZYw=$Wyq-tm~sY?ad$3H`9BwyUDN6&fvWGjE&a1Hj|xbFC&6ReR9 zILEfIm9O!0@mE0#jc6Kg@eK*Wpd`hKeb!)sDsv3nbQH{5QT?oBlx0GcOJ4cPQa)>~ zj0&|5Y&645YHP`^RgMr%sm%gnK_;uE@zfNq9htgg;si4j8zpn7+gB>B2`(dmfV|1{F2@NTRJ(q?4~@LY{GCJE-Orth%vDL%Zl1MgdN3MVaae4 zX7R7?9I?twgv5f~h$G|gj_Kq0q88eCBRfJcEo&eNrz08u{eDA8zNl!t_@K#*0(En2 zXiDOO1`n_FK%Jo>X+EiMAq*V4=;OQ+25UMef>*JNlr?n`T_*{j9jyx6kt==q^$w9h zO(I4MSK-oS6Cc{0SRwQJL@g!}zPVR5@Li(|75)bz=JGHiCYlyEPWy+mbUBdh7eUxQ zlZHsPl3en|h=lp%kUb@H&6FI7$wiTnFeZ#|+~WbvD4%3lpVX}&P>qOj$!A*P-UH?N zn9vRz+{(B?RbKCRb1k`i+zw+&4y%ChY-n-UZ9%^dEV}xHfbM?W|5}R|o)dh8;F|ta zl7?9heP=Ygp)ty`mLR6HGF#q+gbVre_3~jCqvum$hG14#hOCNMw@B0VlX(IO+sAFZ z`&}T?sASOVok5W0sLI<$mq}~OMG6H>yPhx-o_1@(5EOLfOTOl44PCy0X*(&5uBq{B zJ(>d)_5#=u{gqEdO)?}BdK}5YJIOQ#IqLVh?DUW3qLX(?G0hK}>_%mO< zn^p$6d{uy{c3u>91c7Uy{zFa4p1ovT;^0hm%}8NDm?(TXB8XSUK zIJmpJ=I-j(<5p6g>Q`0wcE3CBct03p>tXG+*Iw(JbAI!i^ZpOLp#$UyAVTY4o{t2? z6DKK;pO3wEH5LmKo2WBYgO8czou?&6qx3^jMCwbfKPgxlpKbC)ysA0AmXu8opnCTY z3lX3Y$Y}_0gw3z>O@7_Zy<7F4IO1p6;&+byUT&LS|Ip{%aHhh1;ot{IYlC{8k-NO9 zNH@g8!Y^sfc8Oz1pY))8@n#^Q*J_E{?Z?GoHS==sQ#!tRv($26oICVY&6&_JY~VqZ zd5a9Mko16*?Fqh5?TKh-4McFz{sHV2bK9`$ZY=q^H6@?hTkG1ViaRz)8i23$`4hPo?j1dhB5K+U${i3h_)ur2nOJl*U-eq&R6d%P0T z$PRtJl~S3f@*N`NJZ>I$R_aFdn#N`iyCda?wLA+~Ahyd)L%V{!Z9H-H$aB6ZwjC&S z-$1JV=4oUDAL&?}T^w@otBTL{=tWFd>5ZyASS$%CA3(ADT~7-Nvgd>fMXgcN%O?9M zAj0*K1iO^UeA24xyEn00dqhYTQFGAQ}*BWaxX(D%Ln^?MXj?+>nh~~|{9`43%M-tZM0~m7^_c?ew$zLR;nWz-Cjkn6X zvZ&?~$YBoFVNmq2P4^}GB2=^6j@PUMKAE)9HQIU>`#c!tsKv|Gx`?;o5vs(4Pvy1H z(vKvzG08bD=TFlKQ8pDI0zT2nS^9)uSB?3ZlO1YEb03!HO0f_mf9;^o0LUao;Lj1J zkuUqK^~eqtxQ@PFbTHpb8q)9hEV7o@jCTN04Mo!1}fJg%-b{mfR4>QiKL+xFo(p^^Jvh53UgTE8p89sfa!D(`kiCbPc-nj z$UIV_%DS=6F&x^ZlwamY>PckmLCWKYa_Wb5myB0gUZPtweNdGtEtopN>g2|69N zMcmeG6;P-;BWDvl_4&fG=sq-9$4EQ_i;9gE%m`XeS(tY@$&=+BT54h$+F+)1P=eN~ z>Y-b3No*UElS2l9f4*HA*rlr~+Ph9`_jU1AR?Q@cHm(_+-T>LN^C9$xD!D9m>g#%W ziEpKmHZ(%X{|e)AhFb)D_p}_IZW`CtFKVT|CCD=-4n9@5fo#Q@;iP&oU6uFcmF^kU zk9@lC-+x=nmHV-^E;>70Ti-BGS?H7vBGs3ZRMbs%w=f?AxihDlK45)46~$C@KNGUt z%c!P|=oTI7cFJuX>`88?Y+V}RylI8NX%Ms2s(8jY)BPgH47oW>+iYqD#jojTB+=Q# z{Q}P(ACQDivb1EID5fep2mEq-8Mp2IQxwp>%n(11@7opDKqna~edGhwadBhXj z0KtZe%D0&mDe-6mdw>_-2jk}salminaam1eN@3w&w#ecAr z-}l%3N}>6&tRF@0niq9~Gf{0YAcaS@LF}u5P==73xn~Ztvmq@j3}>%nMJmjB?zzsF zTLKhO!L_x_RcWU`>B9MjZZR`{Gj+l0}C@7-}EX z&(dtfaFFF(huTyfWpP@By=nz|#aZ54CE3r}X%ru5-b+vFxe1SpdQQ%7onh1}sj7UO zAVPC5?Ze$cb_Ctvsk_O}%S)aSPJNQrnLxgJ%hT}`Q%;BTLm6TDn3q<}UaZ&DanIZr z&lSb1q5C)OGb>r2E1gXZjPAa}e%wBalmlnM_3A!{>aeP8V{L;aiYQsjh=-Su5sMJ> zl4lB|uiBa;Uq31X6jVR? zp>tg*IcT3f=TGX96y%~G_bg#3cZz=D&pnW>*=O^m8J6EsP60x1tMGwCs<#;E8}Saf ztO;-neqkC+HNLnoJT+jx|2a4&@JnlHhrE7!u%8K8MUHHu*ZRF%o?!yDx|4 zjf2gBalADG7a&^lh~L`8JZ+TDTsz{-D(jyF(8Q(IEhyX|ONtIcFqYo%mIxJ!;W9oU+%X-Wy_;ZDdg01P zN{6=F{1P0otl27S^5v(9^}ZG;ok5v}{h*e34`EX*keqoOu>vtxIp z`{Mwj^-5X<&mLTp(HW9lP>`pheS+~GlW4Ch9}dJxh3QBw{kj#0^sbQRyS|$J<%o?d zd(o{ti}=UX@g$MkE7+`GXJvLTq9xQtSaDKy=mK@1LnNb>y*PW(#R@a&0Y)N%FR}J4 zzq*9hbw)6T2uJLxHdNJ@cf{HfPq$Kolt;Y3*{N-7b{T!# zXU#s1vrNAyf{}OM%EMmDiVwdmgt9xe(w3j)v^sUTEh5j+=qohxURjT|7yR7?L3Ujx zyW3CTR?iGmYy6c=mRIPy@%Q|MTUv0Q(kP4+`X*$z7*vR|H+y1=IP4PH^$#LQu**X% z-GA{k@_uha{n71zEAQrK-|!u!cJ?le+J|zUK}VsQS>mU2m)gI$5MLu>++mplZ+vJv z-#Z`r?>&k<;8$4mnwpDy{#~r%)a?MlpyM`fLYUPnF2IF21w`D*esLjo)Hb1kyWj0w z-ZX*N!`1CA6(Ap;lbr%pFb)lx_*un!WF#|gp4^Bu{(46!z|cP#k-T;qQ^|4)dny6Z~f%)1LTWlS})-J~WU z2d!-od72rBG0}>xU0;nWE3{R(ceXW$8fG#5R$Jderd>E(*u0YsyL+|H^mn*M$I6qf z+9uVfX)&bzV}^zu64o)KOM`ZBoU;r+aW8zuxJ3 ziEZ8Qs>>st=q5N)&)B!?9bmKoAJem~N9eu59XlJoAV;(1zLiyQJHoCuA^m>L5 zdj?jdG*eU)P(owL$!Gtv&-N;bt4%zLo^r+~)Je(_X_;1tjcq_u0N({)zk3K4%X%;L(YvG~BB1cGOYbZ1gpLVh^y}^}v^?)`8E2V21!~ZTT zRc{2mq?q0Ogn+y~GW(od)fLxT!pffF&FCIl7aM}jW0#}xkig4L?i@<{5^>CEmaq2f z#i>{Cgb4DFTF`0bDyX|ijLu>3ZwMO^G>l6YWm!Hl1;)FHnC1*H?I4w7`W1Kx8(fUq zyh7oXdW2NWt+EsShB&t$LrX6L%s3w7!3sv(I;-P=`BlZyKdt+smu!@Q?pbb1Aw~b&5xNTwhqaco!tRWb_f=c+BQNNN}s80=tnD@0-PH@sT2-eN;A)g(+`JwG>U8KnkgCWP0p_>(k4b z$1Q1J^@a!Cwc@)F5_6D~+0fdu^)DSSPIxnx{po-=eNzIQCY%6M>ctvtIu&swycWMfLg?vNX}PmnJI;;Q zj@31z;IfkfHt7?xqZ7;+3SRyPt&Dy%49X6>lU{sy1g7tfq)Q_|*SQb)y+$T>^{ErA zfvWl~%U0|6QtwFD(#=wVwwj+#4hbVo?%CsfkTr_AbU!Kd!!d}s$e2kHFJmRaUVA+- zy@kaLTe)U1UF7gH3{u%B4u5~mkVhGj7N-~XFic2c;N5n9R&~6&p{uPuLelCC^M>QJ z@TR1g&r5kHkQKsRpISS%Kut8Yn&8Gx+ANTlah8V)SDS%wfVX$4;KSu&!8J4Qkzr_k zl{%_&#pua}Jz@-X8ClU+KfgDh0ErNf;`eG6tZcx*a0CX1c8;NK;*iDg;^x-7y0Nse zRuuty1vK{wBy4l(9$jOc?p7NK0g7N+ZoKUzEThu-E(UJ-3(clf?P=>~PDQ?#rc89W zF%LK8qIGf*21EGHo@$6QkBh%D-obq&<;4|9Lf6Bghqn}};X2|n9k-$5q@Gz5JoAiM z|6T@KH0!#R@W9~6db)=S5inh1e+P*F#b7wP8z>mATp$40aT=&&iWA*VE4Sh*BU$Vz zsH?H7Z*#CM?3om406x&P2yh7j{s9sk)SWZ@B996Dxnutj+&LN>({uvskPht@H$LGM z5@y*bS(dEH8W)lku(fvM-_M-0Rjnc1^Oan^uO8T*OptP;@F|D>_(}%u!XRDAZHa9`)fG3zqU4`bw zW~=1z_%P5&yWWgy#2wt_ znOKLprR>4dZlkjV)J!CJ9+lD3yJn=sHowON$czfQH(jUTm-3e93b$AqS|iIIm#y|x z-#{z>o=90iL3XE$Yk3TkUPiVN+7k7$!B!Ls zc$mju#seikRO%oUm!p@tfJPwwHxSV&{rcQ2phUe=<8(^bK=?6-aJ#Zgat)G~?^M#( zNHC%|`Z@&__BxZyZIY%03M$pWDB%oO&vFK|uz={Y$z|V1m>ov}lzVg9c+uf-MaoGl zzJsrGB{?HG@#Xq>5w=2*jJv&NYvLSR2eQN^dkdd{a!d3Z1 zb2FI2e^;$g+HaH*vyn*08nkR0w82gqN#TwqG57465QZeO@F z75bwWW(fJkj8*I~JJamdpqFLKw=aq&RRVFb%|DDt5c4*g9b!428E}b9D#^9UK~|bR zO&T>W8$Xl^sh-%oegk|*wo<^9_XAq|EBn8LFy$o`N7ILnO&bK~F+;{*L`T`1p`-+> z<)58OnW)&eN5gi#7MVl%HXpQPQBUy|Xvzkaee8sEBw&_dLUna49*d(u%vw7u58*`4 zJUi7CI?9%)#Zh+gxlL7PM5T>Bl&fx3uPO*^)CTP{?m>F02i6vB)YQ8-Wk!RH)#$*q8RN!Zs{ff91WlaRMqHLRZ+B_hAl5e<}99H^8BBAhNeEBAOYFo3uM*7;a z|0x*nN{;#VPGfbbkYzO=SKG4!6UAX>ISv*n54fF)r>VD38%&!pdq`_KYVLMg9x+S# z1-M;XF}NChoVeTpBuX&>4QR(p)Y11u#xCxCiDWlBqy$m~fCTk~;F4omDc?t7I$Rj_)~0KcWu zK~i;~ErZ&IOJ%95hv6sR!8lz6sE#1-F7Ipjyrml!u`$e+mnXOvvy&DXs<>blH}h%R zWN*$z=p33G+gO#mtXvZ5NU^~DO?&%tB%--5_oB~*!_}>C9WvqPi8^q=!suGeOj@W= zKyyAL<`IUMBnht5$w1Y+smpC3`hg6HVtl+t7kN))l(%q2qry|!U(>H!Q|*gC(ltMy zt9C-D_FgCdT(@2E**8#7m8$irpV`h%nqF0%hX5(9ZSAWL+w<@ZfkHD8eY~vefIBrXYeJnJeF>jyeP1k;7N{IewXwzxd0M7+_=()i0-o-{9cz$>d zAO|V5zp1G%{DQfPE-m^B9W@HhOR|b!w&aMXo-2wc8mDPLaAWRh1W>ta$pT9K;$_^T zxpUmQm}s6e0W3VdqKKfPT7-NFyJ|-xVznv zym~ZW%49`K1|B zMiJdFAa946ijdp(5o}}hLktDTM;C-%H>sWa09XWz@B~OL`Uc8kkcalzr7$)YoRA69 zLsk@qZhfOMq}5hi{;ccu`|E%1hRywhFz=s1z~7$xf56c**lIdh07~a+o`NrB@r@NM z02ej^upR&%3dG>E=*KI;frN5~isv@R?9cX#7+bMmrzsppu!pVIm}&X(RqBIjwF*ZW zO17VzdtY5OQ*_vBY>9_ZEUK3gr!OZ`bdu*4sz8gjn@Sivt1Nvd8U-UU*qI`fX#;2s zs!COP2WRlG!Y*2kXqp+GPd_{>Ks%?F_g44*vVR8KC7DQTyq$JVqdV2gXGT{NiSA(b z3}N7+9$(LIthud$G7ry@(*XY8w+k7v4_DS58!l8r1o7chbQ~ZKitN(xRjG zLSHf;7a%lGIJmU86)Y(277~v)!cK=OvFkrHOY=^*S_gNVmsGk<;=JCnleule4c@wO zRysm`aE^XD&>n+z*&luvrV5*`s+1V&KE-lPVPKtz^vZQ9feS-+amSEt^mo8gxbpd# zLi2A&ry~Dvk0=zJOOCzIwmc8~KSNdd+0U7if6yrSIoly0QnUE;+U^6l?Esv`>@}3?P;X9t&;#jcR?DYAKYGzqdMXRaIh?#PKmgt#b#vn_$Cfg}^ zQ~Y}y5ZkP%?$e22sXo>iqh|aVmZ)eA$sX*7?jhb71h|31_1f&I7s)h37UomlNc8$_ zEnOB3^kTwA&aOqRxk?XcQX`C06Z$HzB%aG;SF zxSuaoRa@bEvqG@1vmUuJ?21KJ0clmN%lnhfq*C|6=fW2Kshf3n;#v`JeAjl!oza(! z(YCjh^eph~2HwpTc3*SlOm}ni)UYMLjS!EGB$`ff1igYI@P_kTrUHk zkb8aidn4p$+t8gyx16**TenBwK=1U5eSh39Qru6;zY&`|z{l^KYQkkoa#PuMM8_8=M2wn|pQx*I0lzr*q>95R+!V26w3)-YTAh<39;# z8@BNrqmA(FtCIuXo{S&wCFtkrZz4QIaRyUg^L&{}FRfT4ynL{ca!wlw;JTrd$KODM zLSg_4vrD;tA8JUrrWtyHz}XaiOSoz=q@?`)e_kK(1Fw^0gXilcZ+V0&LXS#1uf3Bs zd%l5Ck64TfU!H%w^YfMC2K~*?1+2d zQEvt7Oy!fH(+vev9*yAD{n;!Giecf?i2U@R7%~(PexF!^wE0t9HtJ}m0gR0^$Wz}8 zu(f&4>tzC$*4LlCuo@9Ncu(5ZZfA#1r)o}%LTDw3c#I`yk3wTp5>nnB_0pk;x;oA) z*{c&P7Znv|V^MNJDRIql`MqAT;Umk`?#r1jpkh|4Ji4hgp?wLee!=(Herg5D(30lN ziN{B+FyZ3XftbbN;yuL)$Bd!ah`#U%zToh%2=}5Sdzxh`ImCT6M>~hN!UU`Ow2c09 zH)no;WZ8@Q)^=t{-)w!UJG=vRBL#{=%ABx`0J*_vqbY339gn-0aksMR9$zDNuM1)qIq^Cv)|D`5Sb%tj-j&H z`yvHLW|a(w-oqv{$h&e`Pd7Pw;+#eDh*R7?zbL!Pg8R#J!%>>FYGvns&PsXG&^>pd ztk)$cE8ug`@ooLKquh6Op#EWM{DX-A|MvCfzcPIP?7cr9?zw-*@zm5x`~Bf1m6G|B zg~R-}#R3k&6JHs^tal(|=^j+Z5cQZ)ofsGWa@DDv=T9b}q=%Bw0=qv5%YI{({}$r? z`>pi9;$!=(_xz4;PA;TfI*!r?{!KB1J9IH7fimpP>Qluq%CE&!d|aNatOVywcLe8@ zt0Ui;UVYgZ65NgmtPwcuDU*#sQp`OmV6LgIN$1zMMQ-;0VuPKDTJ}+%b=|!H^O3lf zQJqiWxQk04$Gai(1_#+ydQ$pB-&eS$Y@H@C!-t)%F#CF!r44q@tb0ZUc4_KT)?PjF z9WJ^-SA&H6qOcHX)&}as%{rf|_{4C+6bkXLI9#r-SDw={eT5qieHJy(qB8~8;VcO3 zHCgd=EhPI!?N0I;XJ1s{S55ft9^VLT@3NE!mV~V`t6}kef>BwvygxPfm&Qi91e>V9Xggd;YqV_}t=`uRereg~?qdzS=VK?vIz62}& zCWqx?qcg~d7|gn)%$jhhpr?V%1swTGzXZopHfma->kO)5LRFi@TxFr1n~z#ZW0`lMgCm z(JS@C#^;|j?$t*hVY+83N!{ye-k7-QC%^612M=~M1%>J0vnGU3Rcob|r@9Yaz z+TNSDK`bIMwjQ>l3vk@-!wq(?c;z!#rKv`aO5Lv=X=a3FH3`FVcDa+c>^4=?Uv`t2#@09Lv zZV+n4I(z0`6eKm-6|R(37N_28SykpGW|T!H@qt9k9v|6shQA=m1?H+MidE^$98?)= z5yFqr4I?HAu1B7}lHH^cOnItAh!%`F9hi_D;q3VMcKawyK9P+GDJkDtal1-X^rY5R zc`=5=8Of6PT?iEPW45y&mUr}r|3wH631KFZ6gs=&0}xhqg-OY{&0W#A=>?T916 ziP#3D>RP3tIL*?~5I@0&_ENiehJ5yyhoGYlNbhBDU<+C;E zhLz9bOU!-*>5I|8{EaMSCkPI`9>i!e;p!aXEhmaU2GVC_RSARBA| z=Vv8a#hI@)M!3bLSHYB{kYajYNg?1xPT%Q%YBKAzTa=y*KZBQxkD5zDTv5DZIkK(D z{8&ZA_MZ6@e$qZ9CoL%K4gGv>bEnuyde!Jlv*TV>%xa@FSgbhnPW#;@%8-jr4SLC3 z|E9{3D3nI4w9*BHcW%*6H_>sdn_#+Y4Cy%!>gr!P#L9qsiqu`>>Bx zA`eOa_G;FuOozXZto|Ou_Lt-T;;3s>&kr>l|LR)(m+$*uYbO2Ho%XNX|6dlp{lSO- zS6BMKa^LTvgP&;C|Ctc=&#wI!@eJig!1+AV*PGA&|5v@!bSyKzLjPNQ`_J}~5^kg~ zL)WB6f9OTFUQ3K=4JR+tN9tr*H8r)&hyAoqT+prsxj(rd-C`KcG7q09lT^pZS2sim z1)FyptSE&xcrftxvmeQo)YBErnGQ{hTIa;2*C`M03(9OfCOpxk0EJAx@Vh3oV{&Ki zTdqO2%xxI`QutoaK)0oHwiTr@$#mSRrIyC*c(QRo(f!gmt+h`x{`3|QZ%Hd446;MC zAoHRTAP^pl^AURP6;wSE#EhT~iFXsvs4Nq#>C!N@tV)GVw+HQRbb<~hV5Nm_WcjGu zz4(HzSR+hOq;Tx$59Ry3NT_fnto^3X8=slLNk;25dZ_zX^FKHEJY}v=@m?d7ekrHn z5vrF(e}?AB;jtN4@pEdxy3_>cH@V{1&psdCIsW7>Xc|#H!Fs6LV>4_R?$fb!A#J`$ zL%W|^U5AcC16#2Q{-U)*o}=5rekIQZ=8HKKtg0B%t>n?SqlhIN1!cgQrXl4_E4(?^ zY_oEQEYiH`U)|e|P?4AreDhTK3^}I&ZDjShP+Jt4RlTQw&+*KTDQZhlL}e3j&%AFC z2jsmMzG5=RO2f#4-lf!rtsoK+e(L0xArGoVB!N1eVCYwgABKfkK|6#9UvQ**DedbJXZI?A#j{|nr$DkKA$zu9Y#u4u^i?5XO>C7r; z4pwbvr8b=}>Au_4)eF;cw(M!3*;u<#8U+GcXRWHDVB->GFU~v$u7jGKCP|m-TZ*BK z(U|s<*a1g55XsZ&RwB!e=@hYXgRBMDf=>+wN*Xf)x5+VOdSUXu&YV{4c76KOPK+A0 zkk=81vq~~fdJ3-bzHQ=7L_x?&At;Q;S^689Ask1>?SH+j?P!CHAv>qcsmuBNGUzTs8 zNxp{F@l%E~f{p}j51r$$>W|xHp!*rqlYEwB(=^Ld7odjfZKVAk7Pq1h#9O)8ID4ii zYBiAgcJ#Wa+Q;+|W?qTmIXb-Kz0j2eOqZgh>!6tOSbg>B4BC}`1_tBy4*VIRq!V;-%0sfe_OcPH90B|F_Q{z(LvASev)Ga#i6oWt_ZP zdlS0ju!8YF#^a_}&!V8rTDdH}el>0;zBcK$NH$jy_my_r&|+JcbqCV@v9(5#nOps& zrwv1*Ot4HZ`;;^C)9U>3Qjs`;zb)5HCoCJ$__T>j2l0seG04%-Gx_TP21c*s;-fbO zr#kw&q^7~rVpB@Kx+@*KcRx}`I2?4Xy;hj`yk(9qSguMD zoI!PwQh>lcYBnF_e&tA=1Pj*eRNxw#?O3O(ygCcOcy}hC<`NtfM($O2coU;VcF!*@K&e}?w| zcJ6nx$9}FX_?NLa;D`GM9~*}3V+D=!fz?Ukm%AnO$av@%X06&>j&u`67*cRdfg8$= zy$sdX)Oq1&3_k8@BD>C8k#efa2DM%rK|}3OJ*T#K>_g>Jc!aIF;Q)#m%|UgQlk4CI z7R4*$<`JuCcVE|sJbf{X8@1KE{GQ8Y#J7kpnrz_fk%7+{7PCtRs^h}yMBXHMl)I+!#J&x{(g^4fmlLFyPqvz@zQ6fq4+A!CrW$bOENk7 zj%>0=2()?KX#Bg0vb!#j5X^Hu+p3`7shwvbihn>MpGajA?qtI#e zM&ldO7j(>|9P)1U3|_V=DVzr(>;?hUrnJV?X5T=v_olp}&otAF)ccHc-_>A=b6UUA zk8{?3>vsLgy1Q#Y#>GC<*ELV!YR6GV^#ZBnD*BDIgI)=h?MZq-f6p8purf2MI|EwQ zYQuf4#s>}4MWhjK^QCG&TnHePXo~=995=CHo`=9#$xH>H@tw%O<3x(T@g@HUAa20Y V{k8hfcWlC+1@ivHG1PC9{{iIyzs&#u literal 0 HcmV?d00001 diff --git a/examples/kubeflow/img/upload-pipeline.jpg b/examples/kubeflow/img/upload-pipeline.jpg new file mode 100755 index 0000000000000000000000000000000000000000..6fc1241ea09cb7f16a66c78d428bd7913df345ba GIT binary patch literal 96098 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 Qs)R8E+RD-xB=rBA02rK=1.15 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.24.2)\n", + "Requirement already satisfied: six>=1.10 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.12.0)\n", + "Requirement already satisfied: certifi in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (2019.3.9)\n", + "Requirement already satisfied: PyYAML in /home/alejandro/.local/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (3.13)\n", + "Requirement already satisfied: google-cloud-storage>=1.13.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.13.0)\n", + "Requirement already satisfied: PyJWT>=1.6.4 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.7.1)\n", + "Requirement already satisfied: cryptography>=2.4.2 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (2.6.1)\n", + "Requirement already satisfied: google-auth>=1.6.1 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.6.3)\n", + "Requirement already satisfied: requests_toolbelt>=0.8.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (0.9.1)\n", + "Requirement already satisfied: kfp-server-api<0.1.19,>=0.1.18 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (0.1.18.2)\n", + "Requirement already satisfied: setuptools>=21.0.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kubernetes->-r requirements-dev.txt (line 3)) (41.0.0)\n", + "Requirement already satisfied: requests-oauthlib in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kubernetes->-r requirements-dev.txt (line 3)) (1.2.0)\n", + "Requirement already satisfied: websocket-client!=0.40.0,!=0.41.*,!=0.42.*,>=0.32.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kubernetes->-r requirements-dev.txt (line 3)) (0.56.0)\n", + "Requirement already satisfied: requests in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kubernetes->-r requirements-dev.txt (line 3)) (2.21.0)\n", + "Requirement already satisfied: google-resumable-media>=0.3.1 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-cloud-storage>=1.13.0->kfp==0.1.20->-r requirements-dev.txt (line 2)) (0.3.2)\n", + "Requirement already satisfied: google-cloud-core<0.29dev,>=0.28.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-cloud-storage>=1.13.0->kfp==0.1.20->-r requirements-dev.txt (line 2)) (0.28.1)\n", + "Requirement already satisfied: google-api-core<2.0.0dev,>=0.1.1 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-cloud-storage>=1.13.0->kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.11.0)\n", + "Requirement already satisfied: asn1crypto>=0.21.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from cryptography>=2.4.2->kfp==0.1.20->-r requirements-dev.txt (line 2)) (0.24.0)\n", + "Requirement already satisfied: cffi!=1.11.3,>=1.8 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from cryptography>=2.4.2->kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.12.3)\n", + "Requirement already satisfied: rsa>=3.1.4 in /home/alejandro/.local/lib/python3.7/site-packages (from google-auth>=1.6.1->kfp==0.1.20->-r requirements-dev.txt (line 2)) (3.4.2)\n", + "Requirement already satisfied: pyasn1-modules>=0.2.1 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-auth>=1.6.1->kfp==0.1.20->-r requirements-dev.txt (line 2)) (0.2.5)\n", + "Requirement already satisfied: cachetools>=2.0.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-auth>=1.6.1->kfp==0.1.20->-r requirements-dev.txt (line 2)) (3.1.0)\n", + "Requirement already satisfied: oauthlib>=3.0.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from requests-oauthlib->kubernetes->-r requirements-dev.txt (line 3)) (3.0.1)\n", + "Requirement already satisfied: idna<2.9,>=2.5 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from requests->kubernetes->-r requirements-dev.txt (line 3)) (2.8)\n", + "Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from requests->kubernetes->-r requirements-dev.txt (line 3)) (3.0.4)\n", + "Requirement already satisfied: pytz in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-api-core<2.0.0dev,>=0.1.1->google-cloud-storage>=1.13.0->kfp==0.1.20->-r requirements-dev.txt (line 2)) (2019.1)\n", + "Requirement already satisfied: googleapis-common-protos!=1.5.4,<2.0dev,>=1.5.3 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-api-core<2.0.0dev,>=0.1.1->google-cloud-storage>=1.13.0->kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.6.0)\n", + "Requirement already satisfied: protobuf>=3.4.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-api-core<2.0.0dev,>=0.1.1->google-cloud-storage>=1.13.0->kfp==0.1.20->-r requirements-dev.txt (line 2)) (3.6.1)\n", + "Requirement already satisfied: pycparser in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from cffi!=1.11.3,>=1.8->cryptography>=2.4.2->kfp==0.1.20->-r requirements-dev.txt (line 2)) (2.19)\n", + "Requirement already satisfied: pyasn1>=0.1.3 in /home/alejandro/.local/lib/python3.7/site-packages (from rsa>=3.1.4->google-auth>=1.6.1->kfp==0.1.20->-r requirements-dev.txt (line 2)) (0.4.5)\n", + "Building wheels for collected packages: kfp\n", + " Building wheel for kfp (setup.py) ... \u001b[?25ldone\n", + "\u001b[?25h Stored in directory: /tmp/pip-ephem-wheel-cache-4b2ca_6e/wheels/ae/bb/02/32b1356ee756181099d8f1b0950ac6567cb2b38e71b48f02e8\n", + "Successfully built kfp\n" + ] + } + ], + "source": [ + "# You can also install the python dependencies that we'll need to build and test:\n", + "!pip install -r requirements-dev.txt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Create project\n", + "Kubeflow's CLI allows us to create a project which will allow us to build the configuration we need to deploy our kubeflow and seldon clusters." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "!kfctl init kubeflow-seldon\n", + "!ls kubeflow-seldon" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we run the following commands to basically launch our Kubeflow cluster with all its components. \n", + "\n", + "It may take a while to download all the images for Kubeflow so feel free to make yourself a cup of ☕.\n", + "\n", + "If you have a terminal you can see how the containers are created in real-time by running `kubectl get pods -n kubeflow -w`." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "time=\"2019-05-25T18:24:21+01:00\" level=info msg=\"reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml\" filename=\"coordinator/coordinator.go:341\"\n", + "time=\"2019-05-25T18:24:21+01:00\" level=info msg=\"reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml\" filename=\"coordinator/coordinator.go:341\"\n", + "time=\"2019-05-25T18:24:21+01:00\" level=info msg=\"Ksonnet.Generate Name kubeflow-seldon AppDir /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon Platform \" filename=\"ksonnet/ksonnet.go:369\"\n", + "time=\"2019-05-25T18:24:21+01:00\" level=info msg=\"Creating environment \\\"default\\\" with namespace \\\"kubeflow\\\", pointing to \\\"version:v1.13.0\\\" cluster at address \\\"https://localhost:6445\\\"\" filename=\"env/create.go:77\"\n", + "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Generating ksonnet-lib data at path '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/lib/ksonnet-lib/v1.13.0'\" filename=\"lib/lib.go:148\"\n", + "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Successfully initialized the app kubeflow-seldon.\" filename=\"ksonnet/ksonnet.go:505\"\n", + "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"App kubeflow-seldon add registry kubeflow URI /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/.cache/v0.5.1/kubeflow\" filename=\"ksonnet/ksonnet.go:621\"\n", + "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 6 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 22 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 9 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 35 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 49 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 6 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 4 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 4 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 9 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 14 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 6 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 17 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 8 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 12 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 4 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Creating Component: ambassador ...\" filename=\"ksonnet/ksonnet.go:207\"\n", + "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Args: [ambassador ambassador]\" filename=\"ksonnet/ksonnet.go:208\"\n", + "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/ambassador.jsonnet'\" filename=\"component/create.go:92\"\n", + "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Creating Component: argo ...\" filename=\"ksonnet/ksonnet.go:207\"\n", + "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Args: [argo argo]\" filename=\"ksonnet/ksonnet.go:208\"\n", + "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/argo.jsonnet'\" filename=\"component/create.go:92\"\n", + "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Creating Component: centraldashboard ...\" filename=\"ksonnet/ksonnet.go:207\"\n", + "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Args: [centraldashboard centraldashboard]\" filename=\"ksonnet/ksonnet.go:208\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/centraldashboard.jsonnet'\" filename=\"component/create.go:92\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Creating Component: jupyter-web-app ...\" filename=\"ksonnet/ksonnet.go:207\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Args: [jupyter-web-app jupyter-web-app]\" filename=\"ksonnet/ksonnet.go:208\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/jupyter-web-app.jsonnet'\" filename=\"component/create.go:92\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Creating Component: katib ...\" filename=\"ksonnet/ksonnet.go:207\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Args: [katib katib]\" filename=\"ksonnet/ksonnet.go:208\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/katib.jsonnet'\" filename=\"component/create.go:92\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Creating Component: metacontroller ...\" filename=\"ksonnet/ksonnet.go:207\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Args: [metacontroller metacontroller]\" filename=\"ksonnet/ksonnet.go:208\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/metacontroller.jsonnet'\" filename=\"component/create.go:92\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Creating Component: notebook-controller ...\" filename=\"ksonnet/ksonnet.go:207\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Args: [notebook-controller notebook-controller]\" filename=\"ksonnet/ksonnet.go:208\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/notebook-controller.jsonnet'\" filename=\"component/create.go:92\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Creating Component: pipeline ...\" filename=\"ksonnet/ksonnet.go:207\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Args: [pipeline pipeline]\" filename=\"ksonnet/ksonnet.go:208\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/pipeline.jsonnet'\" filename=\"component/create.go:92\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Creating Component: pytorch-operator ...\" filename=\"ksonnet/ksonnet.go:207\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Args: [pytorch-operator pytorch-operator]\" filename=\"ksonnet/ksonnet.go:208\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/pytorch-operator.jsonnet'\" filename=\"component/create.go:92\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Creating Component: tensorboard ...\" filename=\"ksonnet/ksonnet.go:207\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Args: [tensorboard tensorboard]\" filename=\"ksonnet/ksonnet.go:208\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/tensorboard.jsonnet'\" filename=\"component/create.go:92\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Creating Component: tf-job-operator ...\" filename=\"ksonnet/ksonnet.go:207\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Args: [tf-job-operator tf-job-operator]\" filename=\"ksonnet/ksonnet.go:208\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/tf-job-operator.jsonnet'\" filename=\"component/create.go:92\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"deploying kubeflow application\" filename=\"cmd/apply.go:35\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml\" filename=\"coordinator/coordinator.go:341\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml\" filename=\"coordinator/coordinator.go:341\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"namespace: kubeflow\" filename=\"ksonnet/ksonnet.go:109\"\n", + "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Creating namespace: kubeflow\" filename=\"ksonnet/ksonnet.go:112\"\n", + "time=\"2019-05-25T18:24:34+01:00\" level=info msg=\"Applying services kubeflow.ambassador\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:24:34+01:00\" level=info msg=\"Creating non-existent services kubeflow.ambassador\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:24:34+01:00\" level=info msg=\"Applying services kubeflow.ambassador-admin\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:24:34+01:00\" level=info msg=\"Creating non-existent services kubeflow.ambassador-admin\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:24:34+01:00\" level=info msg=\"Applying clusterroles ambassador\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:24:34+01:00\" level=info msg=\"Creating non-existent clusterroles ambassador\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:24:34+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.ambassador\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:24:34+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.ambassador\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:24:34+01:00\" level=info msg=\"Applying clusterrolebindings ambassador\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:24:34+01:00\" level=info msg=\"Creating non-existent clusterrolebindings ambassador\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:24:35+01:00\" level=info msg=\"Applying deployments kubeflow.ambassador\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:24:35+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.ambassador\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:24:35+01:00\" level=info msg=\"Component ambassador apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", + "time=\"2019-05-25T18:24:41+01:00\" level=info msg=\"Applying customresourcedefinitions workflows.argoproj.io\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:24:41+01:00\" level=info msg=\"Creating non-existent customresourcedefinitions workflows.argoproj.io\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:24:45+01:00\" level=info msg=\"Applying clusterrolebindings argo\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:24:45+01:00\" level=info msg=\"Creating non-existent clusterrolebindings argo\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:24:45+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.argo-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:24:45+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.argo-ui\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:24:45+01:00\" level=info msg=\"Applying services kubeflow.argo-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:24:45+01:00\" level=info msg=\"Creating non-existent services kubeflow.argo-ui\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Applying configmaps kubeflow.workflow-controller-configmap\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Creating non-existent configmaps kubeflow.workflow-controller-configmap\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.argo\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.argo\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Applying clusterroles argo\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Creating non-existent clusterroles argo\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Applying clusterroles argo-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Creating non-existent clusterroles argo-ui\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Applying clusterrolebindings argo-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Creating non-existent clusterrolebindings argo-ui\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Applying deployments kubeflow.workflow-controller\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.workflow-controller\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Applying deployments kubeflow.argo-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.argo-ui\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Component argo apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", + "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Applying clusterrolebindings centraldashboard\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Creating non-existent clusterrolebindings centraldashboard\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Applying services kubeflow.centraldashboard\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Creating non-existent services kubeflow.centraldashboard\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.centraldashboard\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.centraldashboard\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Applying roles kubeflow.centraldashboard\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Creating non-existent roles kubeflow.centraldashboard\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Applying rolebindings kubeflow.centraldashboard\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Creating non-existent rolebindings kubeflow.centraldashboard\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Applying clusterroles centraldashboard\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Creating non-existent clusterroles centraldashboard\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Applying deployments kubeflow.centraldashboard\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.centraldashboard\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Component centraldashboard apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", + "time=\"2019-05-25T18:24:59+01:00\" level=info msg=\"Applying services kubeflow.jupyter-web-app\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:24:59+01:00\" level=info msg=\"Creating non-existent services kubeflow.jupyter-web-app\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:24:59+01:00\" level=info msg=\"Applying deployments kubeflow.jupyter-web-app\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:24:59+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.jupyter-web-app\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:24:59+01:00\" level=info msg=\"Applying configmaps kubeflow.jupyter-web-app-config\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:24:59+01:00\" level=info msg=\"Creating non-existent configmaps kubeflow.jupyter-web-app-config\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:24:59+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.jupyter-web-app\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:24:59+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.jupyter-web-app\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:00+01:00\" level=info msg=\"Applying clusterrolebindings jupyter-web-app-binding\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:00+01:00\" level=info msg=\"Creating non-existent clusterrolebindings jupyter-web-app-binding\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:00+01:00\" level=info msg=\"Applying clusterroles jupyter-web-app-cluster-role\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:00+01:00\" level=info msg=\"Creating non-existent clusterroles jupyter-web-app-cluster-role\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:00+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.jupyter-notebook\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:00+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.jupyter-notebook\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:00+01:00\" level=info msg=\"Applying roles kubeflow.jupyter-notebook-role\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:00+01:00\" level=info msg=\"Creating non-existent roles kubeflow.jupyter-notebook-role\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:00+01:00\" level=info msg=\"Applying rolebindings kubeflow.jupyter-notebook-role-binding\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:00+01:00\" level=info msg=\"Creating non-existent rolebindings kubeflow.jupyter-notebook-role-binding\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:00+01:00\" level=info msg=\"Component jupyter-web-app apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", + "time=\"2019-05-25T18:25:10+01:00\" level=info msg=\"Applying clusterroles metrics-collector\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:10+01:00\" level=info msg=\"Creating non-existent clusterroles metrics-collector\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Applying services kubeflow.studyjob-controller\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Creating non-existent services kubeflow.studyjob-controller\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Applying services kubeflow.vizier-db\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Creating non-existent services kubeflow.vizier-db\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Applying persistentvolumeclaims kubeflow.katib-mysql\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Creating non-existent persistentvolumeclaims kubeflow.katib-mysql\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Applying clusterrolebindings studyjob-controller\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Creating non-existent clusterrolebindings studyjob-controller\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Applying secrets kubeflow.vizier-db-secrets\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Creating non-existent secrets kubeflow.vizier-db-secrets\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Applying clusterroles vizier-core\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Creating non-existent clusterroles vizier-core\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Applying clusterrolebindings vizier-core\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Creating non-existent clusterrolebindings vizier-core\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.vizier-core\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.vizier-core\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Applying services kubeflow.vizier-core-rest\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Creating non-existent services kubeflow.vizier-core-rest\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.studyjob-controller\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.studyjob-controller\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Applying services kubeflow.katib-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:12+01:00\" level=info msg=\"Creating non-existent services kubeflow.katib-ui\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:12+01:00\" level=info msg=\"Applying clusterroles studyjob-controller\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:12+01:00\" level=info msg=\"Creating non-existent clusterroles studyjob-controller\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:12+01:00\" level=info msg=\"Applying clusterroles katib-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:12+01:00\" level=info msg=\"Creating non-existent clusterroles katib-ui\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:12+01:00\" level=info msg=\"Applying clusterrolebindings katib-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:12+01:00\" level=info msg=\"Creating non-existent clusterrolebindings katib-ui\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:12+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.katib-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:12+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.katib-ui\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:12+01:00\" level=info msg=\"Applying services kubeflow.vizier-suggestion-random\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:12+01:00\" level=info msg=\"Creating non-existent services kubeflow.vizier-suggestion-random\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:13+01:00\" level=info msg=\"Applying services kubeflow.vizier-core\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:13+01:00\" level=info msg=\"Creating non-existent services kubeflow.vizier-core\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:13+01:00\" level=info msg=\"Applying services kubeflow.vizier-suggestion-grid\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:13+01:00\" level=info msg=\"Creating non-existent services kubeflow.vizier-suggestion-grid\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:13+01:00\" level=info msg=\"Applying configmaps kubeflow.metricscollector-template\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:14+01:00\" level=info msg=\"Creating non-existent configmaps kubeflow.metricscollector-template\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:14+01:00\" level=info msg=\"Applying services kubeflow.vizier-suggestion-hyperband\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:14+01:00\" level=info msg=\"Creating non-existent services kubeflow.vizier-suggestion-hyperband\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:14+01:00\" level=info msg=\"Applying clusterrolebindings metrics-collector\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:14+01:00\" level=info msg=\"Creating non-existent clusterrolebindings metrics-collector\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:14+01:00\" level=info msg=\"Applying services kubeflow.vizier-suggestion-bayesianoptimization\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:14+01:00\" level=info msg=\"Creating non-existent services kubeflow.vizier-suggestion-bayesianoptimization\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:15+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.metrics-collector\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:15+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.metrics-collector\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:15+01:00\" level=info msg=\"Applying customresourcedefinitions studyjobs.kubeflow.org\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:15+01:00\" level=info msg=\"Creating non-existent customresourcedefinitions studyjobs.kubeflow.org\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:15+01:00\" level=info msg=\"Applying configmaps kubeflow.worker-template\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:15+01:00\" level=info msg=\"Creating non-existent configmaps kubeflow.worker-template\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:15+01:00\" level=info msg=\"Applying deployments kubeflow.vizier-suggestion-bayesianoptimization\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:15+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.vizier-suggestion-bayesianoptimization\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:15+01:00\" level=info msg=\"Applying deployments kubeflow.vizier-suggestion-hyperband\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:15+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.vizier-suggestion-hyperband\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:16+01:00\" level=info msg=\"Applying deployments kubeflow.vizier-suggestion-grid\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:16+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.vizier-suggestion-grid\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:16+01:00\" level=info msg=\"Applying deployments kubeflow.katib-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:16+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.katib-ui\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:16+01:00\" level=info msg=\"Applying deployments kubeflow.vizier-core-rest\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:16+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.vizier-core-rest\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:16+01:00\" level=info msg=\"Applying deployments kubeflow.vizier-db\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:16+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.vizier-db\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:16+01:00\" level=info msg=\"Applying deployments kubeflow.studyjob-controller\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:16+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.studyjob-controller\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:16+01:00\" level=info msg=\"Applying deployments kubeflow.vizier-core\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:16+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.vizier-core\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:17+01:00\" level=info msg=\"Applying deployments kubeflow.vizier-suggestion-random\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:17+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.vizier-suggestion-random\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:17+01:00\" level=info msg=\"Component katib apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", + "time=\"2019-05-25T18:25:30+01:00\" level=info msg=\"Applying customresourcedefinitions compositecontrollers.metacontroller.k8s.io\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:30+01:00\" level=info msg=\"Creating non-existent customresourcedefinitions compositecontrollers.metacontroller.k8s.io\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:30+01:00\" level=info msg=\"Applying customresourcedefinitions controllerrevisions.metacontroller.k8s.io\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:30+01:00\" level=info msg=\"Creating non-existent customresourcedefinitions controllerrevisions.metacontroller.k8s.io\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:30+01:00\" level=info msg=\"Applying customresourcedefinitions decoratorcontrollers.metacontroller.k8s.io\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:30+01:00\" level=info msg=\"Creating non-existent customresourcedefinitions decoratorcontrollers.metacontroller.k8s.io\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:30+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.meta-controller-service\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:30+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.meta-controller-service\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:30+01:00\" level=info msg=\"Applying clusterrolebindings meta-controller-cluster-role-binding\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:30+01:00\" level=info msg=\"Creating non-existent clusterrolebindings meta-controller-cluster-role-binding\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:30+01:00\" level=info msg=\"Applying statefulsets kubeflow.metacontroller\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:30+01:00\" level=info msg=\"Creating non-existent statefulsets kubeflow.metacontroller\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:30+01:00\" level=info msg=\"Component metacontroller apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", + "time=\"2019-05-25T18:25:37+01:00\" level=info msg=\"Applying customresourcedefinitions notebooks.kubeflow.org\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:37+01:00\" level=info msg=\"Creating non-existent customresourcedefinitions notebooks.kubeflow.org\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:42+01:00\" level=info msg=\"Applying services kubeflow.notebooks-controller\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:45+01:00\" level=info msg=\"Creating non-existent services kubeflow.notebooks-controller\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:47+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.notebook-controller\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:47+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.notebook-controller\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:25:57+01:00\" level=info msg=\"Applying deployments kubeflow.notebooks-controller\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:25:58+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.notebooks-controller\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:00+01:00\" level=info msg=\"Applying clusterroles notebooks-controller\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:00+01:00\" level=info msg=\"Creating non-existent clusterroles notebooks-controller\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:00+01:00\" level=info msg=\"Applying clusterrolebindings notebooks-controller\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:00+01:00\" level=info msg=\"Creating non-existent clusterrolebindings notebooks-controller\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:00+01:00\" level=info msg=\"Component notebook-controller apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", + "time=\"2019-05-25T18:26:08+01:00\" level=info msg=\"Applying services kubeflow.minio-service\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:08+01:00\" level=info msg=\"Creating non-existent services kubeflow.minio-service\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:08+01:00\" level=info msg=\"Applying deployments kubeflow.minio\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:08+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.minio\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:08+01:00\" level=info msg=\"Applying secrets kubeflow.mlpipeline-minio-artifact\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:08+01:00\" level=info msg=\"Creating non-existent secrets kubeflow.mlpipeline-minio-artifact\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:08+01:00\" level=info msg=\"Applying services kubeflow.mysql\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:08+01:00\" level=info msg=\"Creating non-existent services kubeflow.mysql\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:08+01:00\" level=info msg=\"Applying deployments kubeflow.mysql\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:08+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.mysql\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:09+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:09+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:09+01:00\" level=info msg=\"Applying rolebindings kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:09+01:00\" level=info msg=\"Creating non-existent rolebindings kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:09+01:00\" level=info msg=\"Applying roles kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:09+01:00\" level=info msg=\"Creating non-existent roles kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:09+01:00\" level=info msg=\"Applying services kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:09+01:00\" level=info msg=\"Creating non-existent services kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:10+01:00\" level=info msg=\"Applying deployments kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:10+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:10+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.pipeline-runner\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:10+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.pipeline-runner\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:10+01:00\" level=info msg=\"Applying clusterroles pipeline-runner\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:10+01:00\" level=info msg=\"Creating non-existent clusterroles pipeline-runner\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:10+01:00\" level=info msg=\"Applying clusterrolebindings pipeline-runner\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:10+01:00\" level=info msg=\"Creating non-existent clusterrolebindings pipeline-runner\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:11+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:11+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:11+01:00\" level=info msg=\"Applying clusterrolebindings ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:11+01:00\" level=info msg=\"Creating non-existent clusterrolebindings ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:11+01:00\" level=info msg=\"Applying roles kubeflow.ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:11+01:00\" level=info msg=\"Creating non-existent roles kubeflow.ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:11+01:00\" level=info msg=\"Applying deployments kubeflow.ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:11+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:12+01:00\" level=info msg=\"Applying customresourcedefinitions scheduledworkflows.kubeflow.org\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:12+01:00\" level=info msg=\"Creating non-existent customresourcedefinitions scheduledworkflows.kubeflow.org\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:12+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.ml-pipeline-persistenceagent\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:12+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.ml-pipeline-persistenceagent\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:13+01:00\" level=info msg=\"Applying clusterrolebindings ml-pipeline-persistenceagent\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:13+01:00\" level=info msg=\"Creating non-existent clusterrolebindings ml-pipeline-persistenceagent\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:13+01:00\" level=info msg=\"Applying clusterroles ml-pipeline-persistenceagent\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:13+01:00\" level=info msg=\"Creating non-existent clusterroles ml-pipeline-persistenceagent\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:13+01:00\" level=info msg=\"Applying deployments kubeflow.ml-pipeline-persistenceagent\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:13+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.ml-pipeline-persistenceagent\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:13+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.ml-pipeline-viewer-crd-service-account\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:13+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.ml-pipeline-viewer-crd-service-account\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:13+01:00\" level=info msg=\"Applying clusterrolebindings ml-pipeline-viewer-crd-role-binding\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:13+01:00\" level=info msg=\"Creating non-existent clusterrolebindings ml-pipeline-viewer-crd-role-binding\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:13+01:00\" level=info msg=\"Applying clusterroles ml-pipeline-viewer-controller-role\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:13+01:00\" level=info msg=\"Creating non-existent clusterroles ml-pipeline-viewer-controller-role\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:14+01:00\" level=info msg=\"Applying deployments kubeflow.ml-pipeline-viewer-controller-deployment\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:14+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.ml-pipeline-viewer-controller-deployment\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:14+01:00\" level=info msg=\"Applying customresourcedefinitions viewers.kubeflow.org\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:14+01:00\" level=info msg=\"Creating non-existent customresourcedefinitions viewers.kubeflow.org\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:14+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:14+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:14+01:00\" level=info msg=\"Applying services kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:14+01:00\" level=info msg=\"Creating non-existent services kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:15+01:00\" level=info msg=\"Applying services kubeflow.ml-pipeline-tensorboard-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:15+01:00\" level=info msg=\"Creating non-existent services kubeflow.ml-pipeline-tensorboard-ui\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:15+01:00\" level=info msg=\"Applying rolebindings kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:15+01:00\" level=info msg=\"Creating non-existent rolebindings kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:16+01:00\" level=info msg=\"Applying roles kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:16+01:00\" level=info msg=\"Creating non-existent roles kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:16+01:00\" level=info msg=\"Applying deployments kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:16+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:16+01:00\" level=info msg=\"Applying persistentvolumeclaims kubeflow.mysql-pv-claim\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:16+01:00\" level=info msg=\"Creating non-existent persistentvolumeclaims kubeflow.mysql-pv-claim\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:16+01:00\" level=info msg=\"Applying persistentvolumeclaims kubeflow.minio-pvc\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:16+01:00\" level=info msg=\"Creating non-existent persistentvolumeclaims kubeflow.minio-pvc\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:16+01:00\" level=info msg=\"Component pipeline apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", + "time=\"2019-05-25T18:26:25+01:00\" level=info msg=\"Applying configmaps kubeflow.pytorch-operator-config\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:25+01:00\" level=info msg=\"Creating non-existent configmaps kubeflow.pytorch-operator-config\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:25+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.pytorch-operator\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:25+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.pytorch-operator\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:26+01:00\" level=info msg=\"Applying clusterroles pytorch-operator\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:26+01:00\" level=info msg=\"Creating non-existent clusterroles pytorch-operator\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:26+01:00\" level=info msg=\"Applying clusterrolebindings pytorch-operator\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:26+01:00\" level=info msg=\"Creating non-existent clusterrolebindings pytorch-operator\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:26+01:00\" level=info msg=\"Applying customresourcedefinitions pytorchjobs.kubeflow.org\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:26+01:00\" level=info msg=\"Creating non-existent customresourcedefinitions pytorchjobs.kubeflow.org\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:26+01:00\" level=info msg=\"Applying deployments kubeflow.pytorch-operator\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:26+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.pytorch-operator\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:26+01:00\" level=info msg=\"Component pytorch-operator apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", + "time=\"2019-05-25T18:26:42+01:00\" level=info msg=\"Applying services kubeflow.tensorboard\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:42+01:00\" level=info msg=\"Creating non-existent services kubeflow.tensorboard\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:43+01:00\" level=info msg=\"Applying deployments kubeflow.tensorboard\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:43+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.tensorboard\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:43+01:00\" level=info msg=\"Component tensorboard apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", + "time=\"2019-05-25T18:26:58+01:00\" level=info msg=\"Applying customresourcedefinitions tfjobs.kubeflow.org\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Creating non-existent customresourcedefinitions tfjobs.kubeflow.org\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.tf-job-dashboard\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.tf-job-dashboard\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Applying configmaps kubeflow.tf-job-operator-config\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Creating non-existent configmaps kubeflow.tf-job-operator-config\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.tf-job-operator\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.tf-job-operator\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Applying clusterroles tf-job-operator\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Creating non-existent clusterroles tf-job-operator\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Applying clusterrolebindings tf-job-operator\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Creating non-existent clusterrolebindings tf-job-operator\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Applying services kubeflow.tf-job-dashboard\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Creating non-existent services kubeflow.tf-job-dashboard\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Applying clusterroles tf-job-dashboard\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Creating non-existent clusterroles tf-job-dashboard\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:27:00+01:00\" level=info msg=\"Applying clusterrolebindings tf-job-dashboard\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:27:00+01:00\" level=info msg=\"Creating non-existent clusterrolebindings tf-job-dashboard\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:27:00+01:00\" level=info msg=\"Applying deployments kubeflow.tf-job-operator\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:27:00+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.tf-job-operator\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:27:01+01:00\" level=info msg=\"Applying deployments kubeflow.tf-job-dashboard\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-25T18:27:01+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.tf-job-dashboard\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-25T18:27:01+01:00\" level=info msg=\"Component tf-job-operator apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", + "time=\"2019-05-25T18:27:01+01:00\" level=info msg=\"All components apply succeeded\" filename=\"ksonnet/ksonnet.go:192\"\n" + ] + } + ], + "source": [ + "%%bash\n", + "cd kubeflow-seldon\n", + "kfctl generate all -V\n", + "kfctl apply all -V" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Now let's run Seldon \n", + "For this we'll need Helm to be running, so we'll initialise it." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$HELM_HOME has been configured at /home/alejandro/.helm.\n", + "\n", + "Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.\n", + "\n", + "Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.\n", + "To prevent this, run `helm init` with the --tiller-tls-verify flag.\n", + "For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation\n", + "Happy Helming!\n", + "Waiting for deployment \"tiller-deploy\" rollout to finish: 0 of 1 updated replicas are available...\n", + "deployment \"tiller-deploy\" successfully rolled out\n" + ] + } + ], + "source": [ + "%%bash\n", + "helm init \n", + "kubectl rollout status deploy/tiller-deploy -n kube-system" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once it's running we can now run the installation command for Seldon.\n", + "\n", + "As you can see, we are running the Seldon Operator in the Kubeflow namespace. " + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "NAME: yummy-donkey\n", + "LAST DEPLOYED: Sat May 25 18:27:34 2019\n", + "NAMESPACE: kubeflow\n", + "STATUS: DEPLOYED\n", + "\n", + "RESOURCES:\n", + "==> v1/ClusterRole\n", + "NAME AGE\n", + "seldon-operator-manager-role 1s\n", + "\n", + "==> v1/ClusterRoleBinding\n", + "NAME AGE\n", + "seldon-operator-manager-rolebinding 1s\n", + "\n", + "==> v1/Pod(related)\n", + "NAME READY STATUS RESTARTS AGE\n", + "seldon-operator-controller-manager-0 0/1 ContainerCreating 0 1s\n", + "\n", + "==> v1/Secret\n", + "NAME TYPE DATA AGE\n", + "seldon-operator-webhook-server-secret Opaque 0 1s\n", + "\n", + "==> v1/Service\n", + "NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\n", + "seldon-operator-controller-manager-service ClusterIP 10.105.250.206 443/TCP 1s\n", + "\n", + "==> v1/StatefulSet\n", + "NAME READY AGE\n", + "seldon-operator-controller-manager 0/1 1s\n", + "\n", + "==> v1beta1/CustomResourceDefinition\n", + "NAME AGE\n", + "seldondeployments.machinelearning.seldon.io 1s\n", + "\n", + "\n", + "NOTES:\n", + "NOTES: TODO\n", + "\n", + "\n" + ] + } + ], + "source": [ + "!helm install seldon-core-operator --namespace kubeflow --repo https://storage.googleapis.com/seldon-charts" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Check all the Seldon Deployment is running" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "seldon-operator-controller-manager-0 1/1 Running 1 52s\r\n" + ] + } + ], + "source": [ + "!kubectl get pod -n kubeflow | grep seldon" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Train our NLP Pipeline with Kubeflow\n", + "We can access the Kubeflow dashboard to train our ML pipeline via http://localhost/_/pipeline-dashboard\n", + "\n", + "If you can't edit this, you need to make sure that the ambassador gateway service is accessible:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\r\n", + "ambassador NodePort 10.99.81.144 80:31713/TCP 9m13s\r\n" + ] + } + ], + "source": [ + "!kubectl get svc ambassador -n kubeflow" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In my case, I need to change the kind from `NodePort` into `LoadBalancer` which can be done with the following command:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "service/ambassador patched\r\n" + ] + } + ], + "source": [ + "!kubectl patch svc ambassador --type='json' -p '[{\"op\":\"replace\",\"path\":\"/spec/type\",\"value\":\"LoadBalancer\"}]' -n kubeflow" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that I've changed it to a loadbalancer, it has allocated the external IP as my localhost so I can access it at http://localhost/_/pipeline-dashboard" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\r\n", + "ambassador LoadBalancer 10.99.81.144 localhost 80:31713/TCP 10m\r\n" + ] + } + ], + "source": [ + "!kubectl get svc ambassador -n kubeflow" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If this was successfull, you should see the following screen:\n", + "![](img/k-pipeline-dashboard.jpg)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Upload our NLP pipeline\n", + "To uplaod our NLP pipeline we must first create it. This will consist in two steps:\n", + " \n", + "x.1) Build all the docker images for each pipeline step\n", + "x.2) Build the Kubeflow pipeline file to upload through the dashboard\n", + "x.3) Run a new pipeline instance through the dashboard\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## x.1 Build all docker images for each pipeline step" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will start by building each of the components in our ML pipeline. \n", + "\n", + "![](img/kubeflow-seldon-nlp-reusable-components.jpg)\n", + "\n", + "## Let's first have a look at our clean_text step:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Transformer.py\t__pycache__\tpipeline_step.py\r\n", + "__init__.py\tbuild_image.sh\trequirements.txt\r\n" + ] + } + ], + "source": [ + "!ls pipeline/pipeline_steps/clean_text/" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Like in this step, all of the other steps can be found in the `pipeline/pipeline_steps/` folder, and all have the following structure:\n", + "* `pipeline_step.py` which exposes the functionality through a CLI \n", + "* `Transformer.py` which transforms the data accordingly\n", + "* `requirements.txt` which states the python dependencies to run\n", + "* `build_image.sh` which uses `s2i` to build the image with one line\n", + "\n", + "### Let's check out the CLI for clean_text" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Usage: pipeline_step.py [OPTIONS]\r\n", + "\r\n", + "Options:\r\n", + " --in-path TEXT\r\n", + " --out-path TEXT\r\n", + " --help Show this message and exit.\r\n" + ] + } + ], + "source": [ + "!python pipeline/pipeline_steps/clean_text/pipeline_step.py --help" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is actually a very simple file, as we are using the click library to define the commands:" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "import dill\r\n", + "import click\r\n", + "import dill\r\n", + "try:\r\n", + " # Running for tests\r\n", + " from .Transformer import Transformer\r\n", + "except:\r\n", + " # Running from CLI\r\n", + " from Transformer import Transformer\r\n", + "\r\n", + "@click.command()\r\n", + "@click.option('--in-path', default=\"/mnt/raw_text.data\")\r\n", + "@click.option('--out-path', default=\"/mnt/clean_text.data\")\r\n", + "def run_pipeline(in_path, out_path):\r\n", + " clean_text_transformer = Transformer()\r\n", + " with open(in_path, 'rb') as in_f:\r\n", + " x = dill.load(in_f)\r\n", + " y = clean_text_transformer.predict(x)\r\n", + " with open(out_path, \"wb\") as out_f:\r\n", + " dill.dump(y, out_f)\r\n", + "\r\n", + "if __name__ == \"__main__\":\r\n", + " run_pipeline()\r\n", + "\r\n" + ] + } + ], + "source": [ + "!cat pipeline/pipeline_steps/clean_text/pipeline_step.py" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you want to understand how the CLI pipeline talks to each other, have a look at the end to end test in `pipeline/pipeline_tests/`:" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m============================= test session starts ==============================\u001b[0m\n", + "platform linux -- Python 3.7.3, pytest-4.5.0, py-1.8.0, pluggy-0.11.0\n", + "rootdir: /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow\n", + "collected 1 item \u001b[0m\u001b[1m\n", + "\n", + "pipeline/pipeline_tests/test_pipeline.py \u001b[32m.\u001b[0m\u001b[36m [100%]\u001b[0m\n", + "\n", + "\u001b[33m\u001b[1m===================== 1 passed, 9 warnings in 4.89 seconds =====================\u001b[0m\n" + ] + } + ], + "source": [ + "!pytest ./pipeline/pipeline_tests/. --disable-pytest-warnings" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To build the image we provide a build script in each of the steps that contains the instructions:" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#!/bin/bash\r\n", + "\r\n", + "s2i build . seldonio/seldon-core-s2i-python3:0.6 clean_text_transformer:0.1\r\n", + "\r\n" + ] + } + ], + "source": [ + "!cat pipeline/pipeline_steps/clean_text/build_image.sh" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The only thing you need to make sure is that Seldon knows how to wrap the right model and file.\n", + "\n", + "This can be achieved with the s2i/environment file. \n", + "\n", + "As you can see, here we just tell it we want it to use the Transformer file:" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MODEL_NAME=Transformer\r\n", + "API_TYPE=REST\r\n", + "SERVICE_TYPE=MODEL\r\n", + "PERSISTENCE=0\r\n" + ] + } + ], + "source": [ + "!cat pipeline/pipeline_steps/clean_text/.s2i/environment" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That's it! Quite simple right? \n", + "\n", + "The only thing we need to do is to run the `build_image.sh` for all the reusable components.\n", + "\n", + "Here we show the manual way to do it, but we recommend to just run `make build_pipeline_steps`." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/pipeline/pipeline_steps/clean_text\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "---> Installing application source...\n", + "---> Installing dependencies ...\n", + "Looking in links: /whl\n", + "Collecting dill==0.2.9 (from -r requirements.txt (line 1))\n", + " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", + "Downloading https://files.pythonhosted.org/packages/fe/42/bfe2e0857bc284cbe6a011d93f2a9ad58a22cb894461b199ae72cfef0f29/dill-0.2.9.tar.gz (150kB)\n", + "Requirement already satisfied: click in /usr/local/lib/python3.6/site-packages (from -r requirements.txt (line 2)) (7.0)\n", + "Requirement already satisfied: numpy in /usr/local/lib/python3.6/site-packages (from -r requirements.txt (line 3)) (1.16.3)\n", + "Building wheels for collected packages: dill\n", + "Building wheel for dill (setup.py): started\n", + "Building wheel for dill (setup.py): finished with status 'done'\n", + "Stored in directory: /root/.cache/pip/wheels/5b/d7/0f/e58eae695403de585269f4e4a94e0cd6ca60ec0c202936fa4a\n", + "Successfully built dill\n", + "Installing collected packages: dill\n", + "Successfully installed dill-0.2.9\n", + "WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", + "WARNING: You are using pip version 19.1, however version 19.1.1 is available.\n", + "You should consider upgrading via the 'pip install --upgrade pip' command.\n", + "Build completed successfully\n" + ] + } + ], + "source": [ + "%%bash\n", + "# we must be in the same directory\n", + "cd pipeline/pipeline_steps/clean_text/ && ./build_image.sh\n", + "cd ../data_downloader && ./build_image.sh\n", + "cd ../lr_text_classifier && ./build_image.sh\n", + "cd ../spacy_tokenize && ./build_image.sh\n", + "cd ../tfidf_vectorizer && ./build_image.sh" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Train ML Pipeline via Kubeflow\n", + "Now that we've built our steps, we can actually train our ML pipeline, which looks as follows:\n", + "![](img/kubeflow-seldon-nlp-ml-pipelines-training.jpg)\n", + "\n", + "To do this, we have to generate the workflow using our Kubeflow graph definition and then uplaoding it through the UI:" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "nlp_pipeline.py\n", + "nlp_pipeline.py.tar.gz\n" + ] + } + ], + "source": [ + "%%bash\n", + "# Generating graph definition\n", + "python train_pipeline/nlp_pipeline.py\n", + "ls train_pipeline/" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now need to upload the resulting `nlp_pipeline.py.tar.gz` file generated.\n", + "\n", + "This can be done through the \"Upload PIpeline\" button in the UI at http://localhost/_/pipeline-dashboard\n", + "\n", + "![](img/upload-pipeline.jpg)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python [conda env:reddit-classification] *", + "language": "python", + "name": "conda-env-reddit-classification-py" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/kubeflow/requirements-dev.txt b/examples/kubeflow/requirements-dev.txt index cac0f9189b..04792139b1 100644 --- a/examples/kubeflow/requirements-dev.txt +++ b/examples/kubeflow/requirements-dev.txt @@ -1,3 +1,4 @@ python-dateutil https://storage.googleapis.com/ml-pipeline/release/0.1.20/kfp.tar.gz kubernetes +click From ca4fc5e5c53222f29d4f0540b45a6e62d8a20579 Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Sun, 26 May 2019 08:22:26 +0100 Subject: [PATCH 14/22] Added step by step --- .../kubeflow/deploy_pipeline/pvc-access.yaml | 6 +- .../seldon_production_pipeline.yaml | 2 +- examples/kubeflow/img/completed-pipeline.jpg | Bin 0 -> 159205 bytes examples/kubeflow/img/pipeline-only-run.jpg | Bin 0 -> 42399 bytes examples/kubeflow/img/running-pipeline.jpg | Bin 0 -> 165414 bytes .../kubeflow_seldon_e2e_pipeline.ipynb | 239 +++++++++++++++++- examples/kubeflow/requirements-dev.txt | 2 + 7 files changed, 242 insertions(+), 7 deletions(-) create mode 100755 examples/kubeflow/img/completed-pipeline.jpg create mode 100755 examples/kubeflow/img/pipeline-only-run.jpg create mode 100755 examples/kubeflow/img/running-pipeline.jpg diff --git a/examples/kubeflow/deploy_pipeline/pvc-access.yaml b/examples/kubeflow/deploy_pipeline/pvc-access.yaml index 6d70221c85..012426c919 100644 --- a/examples/kubeflow/deploy_pipeline/pvc-access.yaml +++ b/examples/kubeflow/deploy_pipeline/pvc-access.yaml @@ -1,10 +1,10 @@ apiVersion: v1 kind: Pod metadata: - name: busybox + name: pvc-access-container spec: containers: - - name: busybox + - name: pvc-access-container image: busybox command: ["/bin/sh", "-ec", "sleep 1000"] volumeMounts: @@ -13,4 +13,4 @@ spec: volumes: - name: mypvc persistentVolumeClaim: - claimName: nlp-rhx4j-my-pvc + claimName: PVC_NAME diff --git a/examples/kubeflow/deploy_pipeline/seldon_production_pipeline.yaml b/examples/kubeflow/deploy_pipeline/seldon_production_pipeline.yaml index 5ae20cc4b8..b6873aafdd 100644 --- a/examples/kubeflow/deploy_pipeline/seldon_production_pipeline.yaml +++ b/examples/kubeflow/deploy_pipeline/seldon_production_pipeline.yaml @@ -42,7 +42,7 @@ spec: volumes: - name: mypvc persistentVolumeClaim: - claimName: nlp-rhx4j-my-pvc + claimName: PVC_NAME graph: children: - name: spacytokenizer diff --git a/examples/kubeflow/img/completed-pipeline.jpg b/examples/kubeflow/img/completed-pipeline.jpg new file mode 100755 index 0000000000000000000000000000000000000000..6e8ab4204fb8ef65dc372eac81bd74a3c9ecf969 GIT binary patch literal 159205 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%0AVUy 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 literal 0 HcmV?d00001 diff --git a/examples/kubeflow/img/pipeline-only-run.jpg b/examples/kubeflow/img/pipeline-only-run.jpg new file mode 100755 index 0000000000000000000000000000000000000000..0f3e491643061732b52eb7ba9c18517f35a30259 GIT binary patch literal 42399 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 Se$O!bGw9O4c)#c`6aNqPCfu+9 literal 0 HcmV?d00001 diff --git a/examples/kubeflow/img/running-pipeline.jpg b/examples/kubeflow/img/running-pipeline.jpg new file mode 100755 index 0000000000000000000000000000000000000000..564574e32e1090fa11df878cb7985e3fdcbb76e6 GIT binary patch literal 165414 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

IsH55v#9=RQ1iQ*hXO_5d05tzzUY&v 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 literal 0 HcmV?d00001 diff --git a/examples/kubeflow/kubeflow_seldon_e2e_pipeline.ipynb b/examples/kubeflow/kubeflow_seldon_e2e_pipeline.ipynb index ee2812585f..88c1360029 100644 --- a/examples/kubeflow/kubeflow_seldon_e2e_pipeline.ipynb +++ b/examples/kubeflow/kubeflow_seldon_e2e_pipeline.ipynb @@ -644,7 +644,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 38, "metadata": {}, "outputs": [ { @@ -1004,15 +1004,248 @@ "ls train_pipeline/" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Before uploading the image, at the time of writing we need to make some updates in the Argo images with the following commands below.\n", + "\n", + "(This basically changes the images to the latest ones, otherwise we will get an error when we attach the volume)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "deployment.extensions/workflow-controller patched\n", + "deployment.extensions/ml-pipeline patched\n" + ] + } + ], + "source": [ + "!kubectl -n kubeflow patch deployments. workflow-controller --patch '{\"spec\": {\"template\": {\"spec\": {\"containers\": [{\"name\": \"workflow-controller\", \"image\": \"argoproj/workflow-controller:v2.3.0-rc3\"}]}}}}'\n", + "!kubectl -n kubeflow patch configmaps workflow-controller-configmap --patch '{\"data\": {\"config\": \"{ executorImage: argoproj/argoexec:v2.3.0-rc3,artifactRepository:{s3: {bucket: mlpipeline,keyPrefix: artifacts,endpoint: minio-service.kubeflow:9000,insecure: true,accessKeySecret: {name: mlpipeline-minio-artifact,key: accesskey},secretKeySecret: {name: mlpipeline-minio-artifact,key: secretkey}}}}\" }}'\n", + "!kubectl -n kubeflow patch deployments. ml-pipeline --patch '{\"spec\": {\"template\": {\"spec\": {\"containers\": [{\"name\": \"ml-pipeline-api-server\", \"image\": \"elikatsis/ml-pipeline-api-server:0.1.18-pick-1289\"}]}}}}'" + ] + }, { "cell_type": "markdown", "metadata": {}, "source": [ "We now need to upload the resulting `nlp_pipeline.py.tar.gz` file generated.\n", "\n", - "This can be done through the \"Upload PIpeline\" button in the UI at http://localhost/_/pipeline-dashboard\n", + "This can be done through the \"Upload PIpeline\" button in the UI at http://localhost/_/pipeline-dashboard.\n", + "\n", + "Once it's uploaded, we want to create and trigger a run! You should now be able to see how each step is executed:\n", "\n", - "![](img/upload-pipeline.jpg)" + "![](img/running-pipeline.jpg)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Seeing the results in the Persistent Volume\n", + "The pipeline saves the output of the pipeline together with the trained model in the persistent volume claim.\n", + "\n", + "The persistent volume claim is the same name as the argo workflow:" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "NAME AGE\r\n", + "nlp-77bln 12m\r\n" + ] + } + ], + "source": [ + "!kubectl get workflow -n kubeflow" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our workflow is there! So we can actually access it by running" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "nlp-77bln" + ] + } + ], + "source": [ + "!kubectl get workflow -n kubeflow -o jsonpath='{.items[0].metadata.name}'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And we can use good old `sed` to insert this workflow name in our PVC-Access controler which we can use to inspect the contents of the volume:" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "apiVersion: v1\r\n", + "kind: Pod\r\n", + "metadata:\r\n", + " name: busybox\r\n", + "spec:\r\n", + " containers:\r\n", + " - name: busybox\r\n", + " image: busybox\r\n", + " command: [\"/bin/sh\", \"-ec\", \"sleep 1000\"]\r\n", + " volumeMounts:\r\n", + " - name: mypvc\r\n", + " mountPath: /mnt\r\n", + " volumes:\r\n", + " - name: mypvc\r\n", + " persistentVolumeClaim:\r\n", + " claimName: nlp-77bln\r\n" + ] + } + ], + "source": [ + "!sed \"s/PVC_NAME/\"$(kubectl get workflow -n kubeflow -o jsonpath='{.items[0].metadata.name}')\"/g\" deploy_pipeline/pvc-access.yaml" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We just need to apply this container with our kubectl command, and we can use it to inspect the mounted folder:" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "pod/pvc-access-container created\r\n" + ] + } + ], + "source": [ + "!sed \"s/PVC_NAME/\"$(kubectl get workflow -n kubeflow -o jsonpath='{.items[0].metadata.name}')\"-my-pvc/g\" deploy_pipeline/pvc-access.yaml | kubectl -n kubeflow apply -f -" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "NAME READY STATUS RESTARTS AGE\r\n", + "pvc-access-container 0/1 ContainerCreating 0 1s\r\n" + ] + } + ], + "source": [ + "!kubectl get pods -n kubeflow pvc-access-container" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "pod/busybox created\r\n" + ] + } + ], + "source": [ + "!kubectl apply -f deploy_pipeline/pvc-access.yaml -n kubeflow" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "NAME READY STATUS RESTARTS AGE\r\n", + "busybox 0/1 Pending 0 9s\r\n" + ] + } + ], + "source": [ + "!kubectl get pods busybox -n kubeflow" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Error from server (BadRequest): pod busybox does not have a host assigned\r\n" + ] + } + ], + "source": [ + "!kubectl -n kubeflow exec -it busybox ls /mnt" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "pod \"pvc-access-container\" deleted\r\n" + ] + } + ], + "source": [ + "!kubectl delete -f deploy_pipeline/pvc-access.yaml -n kubeflow" ] }, { diff --git a/examples/kubeflow/requirements-dev.txt b/examples/kubeflow/requirements-dev.txt index 04792139b1..c33d5b3fbd 100644 --- a/examples/kubeflow/requirements-dev.txt +++ b/examples/kubeflow/requirements-dev.txt @@ -2,3 +2,5 @@ python-dateutil https://storage.googleapis.com/ml-pipeline/release/0.1.20/kfp.tar.gz kubernetes click +seldon_core +numpy From d9520f381c375c3ef68ac86ebbabe4223bc745d2 Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Sun, 26 May 2019 08:23:55 +0100 Subject: [PATCH 15/22] nbconvert readme --- examples/kubeflow/README.md | 872 ++++++++++++++++++++++++++++++++++++ 1 file changed, 872 insertions(+) create mode 100644 examples/kubeflow/README.md diff --git a/examples/kubeflow/README.md b/examples/kubeflow/README.md new file mode 100644 index 0000000000..70f21c3031 --- /dev/null +++ b/examples/kubeflow/README.md @@ -0,0 +1,872 @@ + +# Kubeflow NLP end-to-end with Seldon + +In this example we showcase how to build re-usable components to build an ML pipeline that can be trained and deployed at scale. + +We will automate content moderation on the Reddit comments in /r/science building a machine learning NLP model with the following components: + +![](img/kubeflow-seldon-nlp-reusable-components.jpg) + +This tutorial will break down in the following sections: + +1) TODO + +Let's get started! 🚀🔥 + +# Before you start +Make sure you install the following dependencies, as they are critical for this example to work: + +* Helm v2.13.1+ +* A Kubernetes cluster running v1.13 or above (minkube / docker-for-windows work well if enough RAM) +* kubectl v1.14+ +* ksonnet v0.13.1+ +* kfctl 0.5.2 - Please use this exact version as there are major changes every few months +* Python 3.6+ +* Python DEV requirements (we'll install them below) + + + +```python +# You can also install the python dependencies that we'll need to build and test: +!pip install -r requirements-dev.txt +``` + + Collecting https://storage.googleapis.com/ml-pipeline/release/0.1.20/kfp.tar.gz (from -r requirements-dev.txt (line 2)) + Using cached https://storage.googleapis.com/ml-pipeline/release/0.1.20/kfp.tar.gz + Requirement already satisfied (use --upgrade to upgrade): kfp==0.1.20 from https://storage.googleapis.com/ml-pipeline/release/0.1.20/kfp.tar.gz in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from -r requirements-dev.txt (line 2)) + Requirement already satisfied: python-dateutil in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from -r requirements-dev.txt (line 1)) (2.8.0) + Requirement already satisfied: kubernetes in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from -r requirements-dev.txt (line 3)) (9.0.0) + Requirement already satisfied: click in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from -r requirements-dev.txt (line 4)) (7.0) + Requirement already satisfied: urllib3<1.25,>=1.15 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.24.2) + Requirement already satisfied: six>=1.10 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.12.0) + Requirement already satisfied: certifi in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (2019.3.9) + Requirement already satisfied: PyYAML in /home/alejandro/.local/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (3.13) + Requirement already satisfied: google-cloud-storage>=1.13.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.13.0) + Requirement already satisfied: PyJWT>=1.6.4 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.7.1) + Requirement already satisfied: cryptography>=2.4.2 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (2.6.1) + Requirement already satisfied: google-auth>=1.6.1 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.6.3) + Requirement already satisfied: requests_toolbelt>=0.8.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (0.9.1) + Requirement already satisfied: kfp-server-api<0.1.19,>=0.1.18 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (0.1.18.2) + Requirement already satisfied: setuptools>=21.0.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kubernetes->-r requirements-dev.txt (line 3)) (41.0.0) + Requirement already satisfied: requests-oauthlib in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kubernetes->-r requirements-dev.txt (line 3)) (1.2.0) + Requirement already satisfied: websocket-client!=0.40.0,!=0.41.*,!=0.42.*,>=0.32.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kubernetes->-r requirements-dev.txt (line 3)) (0.56.0) + Requirement already satisfied: requests in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kubernetes->-r requirements-dev.txt (line 3)) (2.21.0) + Requirement already satisfied: google-resumable-media>=0.3.1 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-cloud-storage>=1.13.0->kfp==0.1.20->-r requirements-dev.txt (line 2)) (0.3.2) + Requirement already satisfied: google-cloud-core<0.29dev,>=0.28.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-cloud-storage>=1.13.0->kfp==0.1.20->-r requirements-dev.txt (line 2)) (0.28.1) + Requirement already satisfied: google-api-core<2.0.0dev,>=0.1.1 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-cloud-storage>=1.13.0->kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.11.0) + Requirement already satisfied: asn1crypto>=0.21.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from cryptography>=2.4.2->kfp==0.1.20->-r requirements-dev.txt (line 2)) (0.24.0) + Requirement already satisfied: cffi!=1.11.3,>=1.8 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from cryptography>=2.4.2->kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.12.3) + Requirement already satisfied: rsa>=3.1.4 in /home/alejandro/.local/lib/python3.7/site-packages (from google-auth>=1.6.1->kfp==0.1.20->-r requirements-dev.txt (line 2)) (3.4.2) + Requirement already satisfied: pyasn1-modules>=0.2.1 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-auth>=1.6.1->kfp==0.1.20->-r requirements-dev.txt (line 2)) (0.2.5) + Requirement already satisfied: cachetools>=2.0.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-auth>=1.6.1->kfp==0.1.20->-r requirements-dev.txt (line 2)) (3.1.0) + Requirement already satisfied: oauthlib>=3.0.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from requests-oauthlib->kubernetes->-r requirements-dev.txt (line 3)) (3.0.1) + Requirement already satisfied: idna<2.9,>=2.5 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from requests->kubernetes->-r requirements-dev.txt (line 3)) (2.8) + Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from requests->kubernetes->-r requirements-dev.txt (line 3)) (3.0.4) + Requirement already satisfied: pytz in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-api-core<2.0.0dev,>=0.1.1->google-cloud-storage>=1.13.0->kfp==0.1.20->-r requirements-dev.txt (line 2)) (2019.1) + Requirement already satisfied: googleapis-common-protos!=1.5.4,<2.0dev,>=1.5.3 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-api-core<2.0.0dev,>=0.1.1->google-cloud-storage>=1.13.0->kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.6.0) + Requirement already satisfied: protobuf>=3.4.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-api-core<2.0.0dev,>=0.1.1->google-cloud-storage>=1.13.0->kfp==0.1.20->-r requirements-dev.txt (line 2)) (3.6.1) + Requirement already satisfied: pycparser in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from cffi!=1.11.3,>=1.8->cryptography>=2.4.2->kfp==0.1.20->-r requirements-dev.txt (line 2)) (2.19) + Requirement already satisfied: pyasn1>=0.1.3 in /home/alejandro/.local/lib/python3.7/site-packages (from rsa>=3.1.4->google-auth>=1.6.1->kfp==0.1.20->-r requirements-dev.txt (line 2)) (0.4.5) + Building wheels for collected packages: kfp + Building wheel for kfp (setup.py) ... [?25ldone + [?25h Stored in directory: /tmp/pip-ephem-wheel-cache-4b2ca_6e/wheels/ae/bb/02/32b1356ee756181099d8f1b0950ac6567cb2b38e71b48f02e8 + Successfully built kfp + + +# Create project +Kubeflow's CLI allows us to create a project which will allow us to build the configuration we need to deploy our kubeflow and seldon clusters. + + +```python +!kfctl init kubeflow-seldon +!ls kubeflow-seldon +``` + +Now we run the following commands to basically launch our Kubeflow cluster with all its components. + +It may take a while to download all the images for Kubeflow so feel free to make yourself a cup of ☕. + +If you have a terminal you can see how the containers are created in real-time by running `kubectl get pods -n kubeflow -w`. + + +```bash +%%bash +cd kubeflow-seldon +kfctl generate all -V +kfctl apply all -V +``` + + time="2019-05-25T18:24:21+01:00" level=info msg="reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml" filename="coordinator/coordinator.go:341" + time="2019-05-25T18:24:21+01:00" level=info msg="reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml" filename="coordinator/coordinator.go:341" + time="2019-05-25T18:24:21+01:00" level=info msg="Ksonnet.Generate Name kubeflow-seldon AppDir /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon Platform " filename="ksonnet/ksonnet.go:369" + time="2019-05-25T18:24:21+01:00" level=info msg="Creating environment \"default\" with namespace \"kubeflow\", pointing to \"version:v1.13.0\" cluster at address \"https://localhost:6445\"" filename="env/create.go:77" + time="2019-05-25T18:24:25+01:00" level=info msg="Generating ksonnet-lib data at path '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/lib/ksonnet-lib/v1.13.0'" filename="lib/lib.go:148" + time="2019-05-25T18:24:25+01:00" level=info msg="Successfully initialized the app kubeflow-seldon." filename="ksonnet/ksonnet.go:505" + time="2019-05-25T18:24:25+01:00" level=info msg="App kubeflow-seldon add registry kubeflow URI /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/.cache/v0.5.1/kubeflow" filename="ksonnet/ksonnet.go:621" + time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 6 files" filename="registry/cache.go:114" + time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 22 files" filename="registry/cache.go:114" + time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 9 files" filename="registry/cache.go:114" + time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 35 files" filename="registry/cache.go:114" + time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 49 files" filename="registry/cache.go:114" + time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 6 files" filename="registry/cache.go:114" + time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 4 files" filename="registry/cache.go:114" + time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 4 files" filename="registry/cache.go:114" + time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 9 files" filename="registry/cache.go:114" + time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 14 files" filename="registry/cache.go:114" + time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 6 files" filename="registry/cache.go:114" + time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 17 files" filename="registry/cache.go:114" + time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 8 files" filename="registry/cache.go:114" + time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 12 files" filename="registry/cache.go:114" + time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 4 files" filename="registry/cache.go:114" + time="2019-05-25T18:24:25+01:00" level=info msg="Creating Component: ambassador ..." filename="ksonnet/ksonnet.go:207" + time="2019-05-25T18:24:25+01:00" level=info msg="Args: [ambassador ambassador]" filename="ksonnet/ksonnet.go:208" + time="2019-05-25T18:24:25+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/ambassador.jsonnet'" filename="component/create.go:92" + time="2019-05-25T18:24:25+01:00" level=info msg="Creating Component: argo ..." filename="ksonnet/ksonnet.go:207" + time="2019-05-25T18:24:25+01:00" level=info msg="Args: [argo argo]" filename="ksonnet/ksonnet.go:208" + time="2019-05-25T18:24:25+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/argo.jsonnet'" filename="component/create.go:92" + time="2019-05-25T18:24:25+01:00" level=info msg="Creating Component: centraldashboard ..." filename="ksonnet/ksonnet.go:207" + time="2019-05-25T18:24:25+01:00" level=info msg="Args: [centraldashboard centraldashboard]" filename="ksonnet/ksonnet.go:208" + time="2019-05-25T18:24:26+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/centraldashboard.jsonnet'" filename="component/create.go:92" + time="2019-05-25T18:24:26+01:00" level=info msg="Creating Component: jupyter-web-app ..." filename="ksonnet/ksonnet.go:207" + time="2019-05-25T18:24:26+01:00" level=info msg="Args: [jupyter-web-app jupyter-web-app]" filename="ksonnet/ksonnet.go:208" + time="2019-05-25T18:24:26+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/jupyter-web-app.jsonnet'" filename="component/create.go:92" + time="2019-05-25T18:24:26+01:00" level=info msg="Creating Component: katib ..." filename="ksonnet/ksonnet.go:207" + time="2019-05-25T18:24:26+01:00" level=info msg="Args: [katib katib]" filename="ksonnet/ksonnet.go:208" + time="2019-05-25T18:24:26+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/katib.jsonnet'" filename="component/create.go:92" + time="2019-05-25T18:24:26+01:00" level=info msg="Creating Component: metacontroller ..." filename="ksonnet/ksonnet.go:207" + time="2019-05-25T18:24:26+01:00" level=info msg="Args: [metacontroller metacontroller]" filename="ksonnet/ksonnet.go:208" + time="2019-05-25T18:24:26+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/metacontroller.jsonnet'" filename="component/create.go:92" + time="2019-05-25T18:24:26+01:00" level=info msg="Creating Component: notebook-controller ..." filename="ksonnet/ksonnet.go:207" + time="2019-05-25T18:24:26+01:00" level=info msg="Args: [notebook-controller notebook-controller]" filename="ksonnet/ksonnet.go:208" + time="2019-05-25T18:24:26+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/notebook-controller.jsonnet'" filename="component/create.go:92" + time="2019-05-25T18:24:26+01:00" level=info msg="Creating Component: pipeline ..." filename="ksonnet/ksonnet.go:207" + time="2019-05-25T18:24:26+01:00" level=info msg="Args: [pipeline pipeline]" filename="ksonnet/ksonnet.go:208" + time="2019-05-25T18:24:26+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/pipeline.jsonnet'" filename="component/create.go:92" + time="2019-05-25T18:24:26+01:00" level=info msg="Creating Component: pytorch-operator ..." filename="ksonnet/ksonnet.go:207" + time="2019-05-25T18:24:26+01:00" level=info msg="Args: [pytorch-operator pytorch-operator]" filename="ksonnet/ksonnet.go:208" + time="2019-05-25T18:24:26+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/pytorch-operator.jsonnet'" filename="component/create.go:92" + time="2019-05-25T18:24:26+01:00" level=info msg="Creating Component: tensorboard ..." filename="ksonnet/ksonnet.go:207" + time="2019-05-25T18:24:26+01:00" level=info msg="Args: [tensorboard tensorboard]" filename="ksonnet/ksonnet.go:208" + time="2019-05-25T18:24:26+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/tensorboard.jsonnet'" filename="component/create.go:92" + time="2019-05-25T18:24:26+01:00" level=info msg="Creating Component: tf-job-operator ..." filename="ksonnet/ksonnet.go:207" + time="2019-05-25T18:24:26+01:00" level=info msg="Args: [tf-job-operator tf-job-operator]" filename="ksonnet/ksonnet.go:208" + time="2019-05-25T18:24:26+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/tf-job-operator.jsonnet'" filename="component/create.go:92" + time="2019-05-25T18:24:26+01:00" level=info msg="deploying kubeflow application" filename="cmd/apply.go:35" + time="2019-05-25T18:24:26+01:00" level=info msg="reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml" filename="coordinator/coordinator.go:341" + time="2019-05-25T18:24:26+01:00" level=info msg="reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml" filename="coordinator/coordinator.go:341" + time="2019-05-25T18:24:26+01:00" level=info msg="namespace: kubeflow" filename="ksonnet/ksonnet.go:109" + time="2019-05-25T18:24:26+01:00" level=info msg="Creating namespace: kubeflow" filename="ksonnet/ksonnet.go:112" + time="2019-05-25T18:24:34+01:00" level=info msg="Applying services kubeflow.ambassador" filename="cluster/upsert.go:73" + time="2019-05-25T18:24:34+01:00" level=info msg="Creating non-existent services kubeflow.ambassador" filename="cluster/upsert.go:92" + time="2019-05-25T18:24:34+01:00" level=info msg="Applying services kubeflow.ambassador-admin" filename="cluster/upsert.go:73" + time="2019-05-25T18:24:34+01:00" level=info msg="Creating non-existent services kubeflow.ambassador-admin" filename="cluster/upsert.go:92" + time="2019-05-25T18:24:34+01:00" level=info msg="Applying clusterroles ambassador" filename="cluster/upsert.go:73" + time="2019-05-25T18:24:34+01:00" level=info msg="Creating non-existent clusterroles ambassador" filename="cluster/upsert.go:92" + time="2019-05-25T18:24:34+01:00" level=info msg="Applying serviceaccounts kubeflow.ambassador" filename="cluster/upsert.go:73" + time="2019-05-25T18:24:34+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.ambassador" filename="cluster/upsert.go:92" + time="2019-05-25T18:24:34+01:00" level=info msg="Applying clusterrolebindings ambassador" filename="cluster/upsert.go:73" + time="2019-05-25T18:24:34+01:00" level=info msg="Creating non-existent clusterrolebindings ambassador" filename="cluster/upsert.go:92" + time="2019-05-25T18:24:35+01:00" level=info msg="Applying deployments kubeflow.ambassador" filename="cluster/upsert.go:73" + time="2019-05-25T18:24:35+01:00" level=info msg="Creating non-existent deployments kubeflow.ambassador" filename="cluster/upsert.go:92" + time="2019-05-25T18:24:35+01:00" level=info msg="Component ambassador apply succeeded" filename="ksonnet/ksonnet.go:171" + time="2019-05-25T18:24:41+01:00" level=info msg="Applying customresourcedefinitions workflows.argoproj.io" filename="cluster/upsert.go:73" + time="2019-05-25T18:24:41+01:00" level=info msg="Creating non-existent customresourcedefinitions workflows.argoproj.io" filename="cluster/upsert.go:92" + time="2019-05-25T18:24:45+01:00" level=info msg="Applying clusterrolebindings argo" filename="cluster/upsert.go:73" + time="2019-05-25T18:24:45+01:00" level=info msg="Creating non-existent clusterrolebindings argo" filename="cluster/upsert.go:92" + time="2019-05-25T18:24:45+01:00" level=info msg="Applying serviceaccounts kubeflow.argo-ui" filename="cluster/upsert.go:73" + time="2019-05-25T18:24:45+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.argo-ui" filename="cluster/upsert.go:92" + time="2019-05-25T18:24:45+01:00" level=info msg="Applying services kubeflow.argo-ui" filename="cluster/upsert.go:73" + time="2019-05-25T18:24:45+01:00" level=info msg="Creating non-existent services kubeflow.argo-ui" filename="cluster/upsert.go:92" + time="2019-05-25T18:24:46+01:00" level=info msg="Applying configmaps kubeflow.workflow-controller-configmap" filename="cluster/upsert.go:73" + time="2019-05-25T18:24:46+01:00" level=info msg="Creating non-existent configmaps kubeflow.workflow-controller-configmap" filename="cluster/upsert.go:92" + time="2019-05-25T18:24:46+01:00" level=info msg="Applying serviceaccounts kubeflow.argo" filename="cluster/upsert.go:73" + time="2019-05-25T18:24:46+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.argo" filename="cluster/upsert.go:92" + time="2019-05-25T18:24:46+01:00" level=info msg="Applying clusterroles argo" filename="cluster/upsert.go:73" + time="2019-05-25T18:24:46+01:00" level=info msg="Creating non-existent clusterroles argo" filename="cluster/upsert.go:92" + time="2019-05-25T18:24:46+01:00" level=info msg="Applying clusterroles argo-ui" filename="cluster/upsert.go:73" + time="2019-05-25T18:24:46+01:00" level=info msg="Creating non-existent clusterroles argo-ui" filename="cluster/upsert.go:92" + time="2019-05-25T18:24:46+01:00" level=info msg="Applying clusterrolebindings argo-ui" filename="cluster/upsert.go:73" + time="2019-05-25T18:24:46+01:00" level=info msg="Creating non-existent clusterrolebindings argo-ui" filename="cluster/upsert.go:92" + time="2019-05-25T18:24:46+01:00" level=info msg="Applying deployments kubeflow.workflow-controller" filename="cluster/upsert.go:73" + time="2019-05-25T18:24:46+01:00" level=info msg="Creating non-existent deployments kubeflow.workflow-controller" filename="cluster/upsert.go:92" + time="2019-05-25T18:24:46+01:00" level=info msg="Applying deployments kubeflow.argo-ui" filename="cluster/upsert.go:73" + time="2019-05-25T18:24:46+01:00" level=info msg="Creating non-existent deployments kubeflow.argo-ui" filename="cluster/upsert.go:92" + time="2019-05-25T18:24:46+01:00" level=info msg="Component argo apply succeeded" filename="ksonnet/ksonnet.go:171" + time="2019-05-25T18:24:53+01:00" level=info msg="Applying clusterrolebindings centraldashboard" filename="cluster/upsert.go:73" + time="2019-05-25T18:24:53+01:00" level=info msg="Creating non-existent clusterrolebindings centraldashboard" filename="cluster/upsert.go:92" + time="2019-05-25T18:24:53+01:00" level=info msg="Applying services kubeflow.centraldashboard" filename="cluster/upsert.go:73" + time="2019-05-25T18:24:53+01:00" level=info msg="Creating non-existent services kubeflow.centraldashboard" filename="cluster/upsert.go:92" + time="2019-05-25T18:24:53+01:00" level=info msg="Applying serviceaccounts kubeflow.centraldashboard" filename="cluster/upsert.go:73" + time="2019-05-25T18:24:53+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.centraldashboard" filename="cluster/upsert.go:92" + time="2019-05-25T18:24:53+01:00" level=info msg="Applying roles kubeflow.centraldashboard" filename="cluster/upsert.go:73" + time="2019-05-25T18:24:53+01:00" level=info msg="Creating non-existent roles kubeflow.centraldashboard" filename="cluster/upsert.go:92" + time="2019-05-25T18:24:53+01:00" level=info msg="Applying rolebindings kubeflow.centraldashboard" filename="cluster/upsert.go:73" + time="2019-05-25T18:24:53+01:00" level=info msg="Creating non-existent rolebindings kubeflow.centraldashboard" filename="cluster/upsert.go:92" + time="2019-05-25T18:24:53+01:00" level=info msg="Applying clusterroles centraldashboard" filename="cluster/upsert.go:73" + time="2019-05-25T18:24:53+01:00" level=info msg="Creating non-existent clusterroles centraldashboard" filename="cluster/upsert.go:92" + time="2019-05-25T18:24:53+01:00" level=info msg="Applying deployments kubeflow.centraldashboard" filename="cluster/upsert.go:73" + time="2019-05-25T18:24:53+01:00" level=info msg="Creating non-existent deployments kubeflow.centraldashboard" filename="cluster/upsert.go:92" + time="2019-05-25T18:24:53+01:00" level=info msg="Component centraldashboard apply succeeded" filename="ksonnet/ksonnet.go:171" + time="2019-05-25T18:24:59+01:00" level=info msg="Applying services kubeflow.jupyter-web-app" filename="cluster/upsert.go:73" + time="2019-05-25T18:24:59+01:00" level=info msg="Creating non-existent services kubeflow.jupyter-web-app" filename="cluster/upsert.go:92" + time="2019-05-25T18:24:59+01:00" level=info msg="Applying deployments kubeflow.jupyter-web-app" filename="cluster/upsert.go:73" + time="2019-05-25T18:24:59+01:00" level=info msg="Creating non-existent deployments kubeflow.jupyter-web-app" filename="cluster/upsert.go:92" + time="2019-05-25T18:24:59+01:00" level=info msg="Applying configmaps kubeflow.jupyter-web-app-config" filename="cluster/upsert.go:73" + time="2019-05-25T18:24:59+01:00" level=info msg="Creating non-existent configmaps kubeflow.jupyter-web-app-config" filename="cluster/upsert.go:92" + time="2019-05-25T18:24:59+01:00" level=info msg="Applying serviceaccounts kubeflow.jupyter-web-app" filename="cluster/upsert.go:73" + time="2019-05-25T18:24:59+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.jupyter-web-app" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:00+01:00" level=info msg="Applying clusterrolebindings jupyter-web-app-binding" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:00+01:00" level=info msg="Creating non-existent clusterrolebindings jupyter-web-app-binding" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:00+01:00" level=info msg="Applying clusterroles jupyter-web-app-cluster-role" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:00+01:00" level=info msg="Creating non-existent clusterroles jupyter-web-app-cluster-role" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:00+01:00" level=info msg="Applying serviceaccounts kubeflow.jupyter-notebook" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:00+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.jupyter-notebook" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:00+01:00" level=info msg="Applying roles kubeflow.jupyter-notebook-role" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:00+01:00" level=info msg="Creating non-existent roles kubeflow.jupyter-notebook-role" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:00+01:00" level=info msg="Applying rolebindings kubeflow.jupyter-notebook-role-binding" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:00+01:00" level=info msg="Creating non-existent rolebindings kubeflow.jupyter-notebook-role-binding" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:00+01:00" level=info msg="Component jupyter-web-app apply succeeded" filename="ksonnet/ksonnet.go:171" + time="2019-05-25T18:25:10+01:00" level=info msg="Applying clusterroles metrics-collector" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:10+01:00" level=info msg="Creating non-existent clusterroles metrics-collector" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:11+01:00" level=info msg="Applying services kubeflow.studyjob-controller" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:11+01:00" level=info msg="Creating non-existent services kubeflow.studyjob-controller" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:11+01:00" level=info msg="Applying services kubeflow.vizier-db" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:11+01:00" level=info msg="Creating non-existent services kubeflow.vizier-db" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:11+01:00" level=info msg="Applying persistentvolumeclaims kubeflow.katib-mysql" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:11+01:00" level=info msg="Creating non-existent persistentvolumeclaims kubeflow.katib-mysql" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:11+01:00" level=info msg="Applying clusterrolebindings studyjob-controller" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:11+01:00" level=info msg="Creating non-existent clusterrolebindings studyjob-controller" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:11+01:00" level=info msg="Applying secrets kubeflow.vizier-db-secrets" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:11+01:00" level=info msg="Creating non-existent secrets kubeflow.vizier-db-secrets" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:11+01:00" level=info msg="Applying clusterroles vizier-core" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:11+01:00" level=info msg="Creating non-existent clusterroles vizier-core" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:11+01:00" level=info msg="Applying clusterrolebindings vizier-core" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:11+01:00" level=info msg="Creating non-existent clusterrolebindings vizier-core" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:11+01:00" level=info msg="Applying serviceaccounts kubeflow.vizier-core" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:11+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.vizier-core" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:11+01:00" level=info msg="Applying services kubeflow.vizier-core-rest" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:11+01:00" level=info msg="Creating non-existent services kubeflow.vizier-core-rest" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:11+01:00" level=info msg="Applying serviceaccounts kubeflow.studyjob-controller" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:11+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.studyjob-controller" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:11+01:00" level=info msg="Applying services kubeflow.katib-ui" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:12+01:00" level=info msg="Creating non-existent services kubeflow.katib-ui" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:12+01:00" level=info msg="Applying clusterroles studyjob-controller" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:12+01:00" level=info msg="Creating non-existent clusterroles studyjob-controller" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:12+01:00" level=info msg="Applying clusterroles katib-ui" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:12+01:00" level=info msg="Creating non-existent clusterroles katib-ui" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:12+01:00" level=info msg="Applying clusterrolebindings katib-ui" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:12+01:00" level=info msg="Creating non-existent clusterrolebindings katib-ui" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:12+01:00" level=info msg="Applying serviceaccounts kubeflow.katib-ui" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:12+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.katib-ui" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:12+01:00" level=info msg="Applying services kubeflow.vizier-suggestion-random" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:12+01:00" level=info msg="Creating non-existent services kubeflow.vizier-suggestion-random" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:13+01:00" level=info msg="Applying services kubeflow.vizier-core" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:13+01:00" level=info msg="Creating non-existent services kubeflow.vizier-core" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:13+01:00" level=info msg="Applying services kubeflow.vizier-suggestion-grid" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:13+01:00" level=info msg="Creating non-existent services kubeflow.vizier-suggestion-grid" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:13+01:00" level=info msg="Applying configmaps kubeflow.metricscollector-template" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:14+01:00" level=info msg="Creating non-existent configmaps kubeflow.metricscollector-template" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:14+01:00" level=info msg="Applying services kubeflow.vizier-suggestion-hyperband" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:14+01:00" level=info msg="Creating non-existent services kubeflow.vizier-suggestion-hyperband" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:14+01:00" level=info msg="Applying clusterrolebindings metrics-collector" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:14+01:00" level=info msg="Creating non-existent clusterrolebindings metrics-collector" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:14+01:00" level=info msg="Applying services kubeflow.vizier-suggestion-bayesianoptimization" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:14+01:00" level=info msg="Creating non-existent services kubeflow.vizier-suggestion-bayesianoptimization" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:15+01:00" level=info msg="Applying serviceaccounts kubeflow.metrics-collector" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:15+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.metrics-collector" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:15+01:00" level=info msg="Applying customresourcedefinitions studyjobs.kubeflow.org" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:15+01:00" level=info msg="Creating non-existent customresourcedefinitions studyjobs.kubeflow.org" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:15+01:00" level=info msg="Applying configmaps kubeflow.worker-template" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:15+01:00" level=info msg="Creating non-existent configmaps kubeflow.worker-template" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:15+01:00" level=info msg="Applying deployments kubeflow.vizier-suggestion-bayesianoptimization" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:15+01:00" level=info msg="Creating non-existent deployments kubeflow.vizier-suggestion-bayesianoptimization" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:15+01:00" level=info msg="Applying deployments kubeflow.vizier-suggestion-hyperband" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:15+01:00" level=info msg="Creating non-existent deployments kubeflow.vizier-suggestion-hyperband" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:16+01:00" level=info msg="Applying deployments kubeflow.vizier-suggestion-grid" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:16+01:00" level=info msg="Creating non-existent deployments kubeflow.vizier-suggestion-grid" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:16+01:00" level=info msg="Applying deployments kubeflow.katib-ui" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:16+01:00" level=info msg="Creating non-existent deployments kubeflow.katib-ui" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:16+01:00" level=info msg="Applying deployments kubeflow.vizier-core-rest" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:16+01:00" level=info msg="Creating non-existent deployments kubeflow.vizier-core-rest" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:16+01:00" level=info msg="Applying deployments kubeflow.vizier-db" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:16+01:00" level=info msg="Creating non-existent deployments kubeflow.vizier-db" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:16+01:00" level=info msg="Applying deployments kubeflow.studyjob-controller" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:16+01:00" level=info msg="Creating non-existent deployments kubeflow.studyjob-controller" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:16+01:00" level=info msg="Applying deployments kubeflow.vizier-core" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:16+01:00" level=info msg="Creating non-existent deployments kubeflow.vizier-core" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:17+01:00" level=info msg="Applying deployments kubeflow.vizier-suggestion-random" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:17+01:00" level=info msg="Creating non-existent deployments kubeflow.vizier-suggestion-random" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:17+01:00" level=info msg="Component katib apply succeeded" filename="ksonnet/ksonnet.go:171" + time="2019-05-25T18:25:30+01:00" level=info msg="Applying customresourcedefinitions compositecontrollers.metacontroller.k8s.io" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:30+01:00" level=info msg="Creating non-existent customresourcedefinitions compositecontrollers.metacontroller.k8s.io" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:30+01:00" level=info msg="Applying customresourcedefinitions controllerrevisions.metacontroller.k8s.io" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:30+01:00" level=info msg="Creating non-existent customresourcedefinitions controllerrevisions.metacontroller.k8s.io" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:30+01:00" level=info msg="Applying customresourcedefinitions decoratorcontrollers.metacontroller.k8s.io" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:30+01:00" level=info msg="Creating non-existent customresourcedefinitions decoratorcontrollers.metacontroller.k8s.io" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:30+01:00" level=info msg="Applying serviceaccounts kubeflow.meta-controller-service" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:30+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.meta-controller-service" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:30+01:00" level=info msg="Applying clusterrolebindings meta-controller-cluster-role-binding" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:30+01:00" level=info msg="Creating non-existent clusterrolebindings meta-controller-cluster-role-binding" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:30+01:00" level=info msg="Applying statefulsets kubeflow.metacontroller" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:30+01:00" level=info msg="Creating non-existent statefulsets kubeflow.metacontroller" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:30+01:00" level=info msg="Component metacontroller apply succeeded" filename="ksonnet/ksonnet.go:171" + time="2019-05-25T18:25:37+01:00" level=info msg="Applying customresourcedefinitions notebooks.kubeflow.org" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:37+01:00" level=info msg="Creating non-existent customresourcedefinitions notebooks.kubeflow.org" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:42+01:00" level=info msg="Applying services kubeflow.notebooks-controller" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:45+01:00" level=info msg="Creating non-existent services kubeflow.notebooks-controller" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:47+01:00" level=info msg="Applying serviceaccounts kubeflow.notebook-controller" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:47+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.notebook-controller" filename="cluster/upsert.go:92" + time="2019-05-25T18:25:57+01:00" level=info msg="Applying deployments kubeflow.notebooks-controller" filename="cluster/upsert.go:73" + time="2019-05-25T18:25:58+01:00" level=info msg="Creating non-existent deployments kubeflow.notebooks-controller" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:00+01:00" level=info msg="Applying clusterroles notebooks-controller" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:00+01:00" level=info msg="Creating non-existent clusterroles notebooks-controller" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:00+01:00" level=info msg="Applying clusterrolebindings notebooks-controller" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:00+01:00" level=info msg="Creating non-existent clusterrolebindings notebooks-controller" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:00+01:00" level=info msg="Component notebook-controller apply succeeded" filename="ksonnet/ksonnet.go:171" + time="2019-05-25T18:26:08+01:00" level=info msg="Applying services kubeflow.minio-service" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:08+01:00" level=info msg="Creating non-existent services kubeflow.minio-service" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:08+01:00" level=info msg="Applying deployments kubeflow.minio" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:08+01:00" level=info msg="Creating non-existent deployments kubeflow.minio" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:08+01:00" level=info msg="Applying secrets kubeflow.mlpipeline-minio-artifact" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:08+01:00" level=info msg="Creating non-existent secrets kubeflow.mlpipeline-minio-artifact" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:08+01:00" level=info msg="Applying services kubeflow.mysql" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:08+01:00" level=info msg="Creating non-existent services kubeflow.mysql" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:08+01:00" level=info msg="Applying deployments kubeflow.mysql" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:08+01:00" level=info msg="Creating non-existent deployments kubeflow.mysql" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:09+01:00" level=info msg="Applying serviceaccounts kubeflow.ml-pipeline" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:09+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.ml-pipeline" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:09+01:00" level=info msg="Applying rolebindings kubeflow.ml-pipeline" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:09+01:00" level=info msg="Creating non-existent rolebindings kubeflow.ml-pipeline" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:09+01:00" level=info msg="Applying roles kubeflow.ml-pipeline" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:09+01:00" level=info msg="Creating non-existent roles kubeflow.ml-pipeline" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:09+01:00" level=info msg="Applying services kubeflow.ml-pipeline" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:09+01:00" level=info msg="Creating non-existent services kubeflow.ml-pipeline" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:10+01:00" level=info msg="Applying deployments kubeflow.ml-pipeline" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:10+01:00" level=info msg="Creating non-existent deployments kubeflow.ml-pipeline" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:10+01:00" level=info msg="Applying serviceaccounts kubeflow.pipeline-runner" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:10+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.pipeline-runner" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:10+01:00" level=info msg="Applying clusterroles pipeline-runner" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:10+01:00" level=info msg="Creating non-existent clusterroles pipeline-runner" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:10+01:00" level=info msg="Applying clusterrolebindings pipeline-runner" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:10+01:00" level=info msg="Creating non-existent clusterrolebindings pipeline-runner" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:11+01:00" level=info msg="Applying serviceaccounts kubeflow.ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:11+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:11+01:00" level=info msg="Applying clusterrolebindings ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:11+01:00" level=info msg="Creating non-existent clusterrolebindings ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:11+01:00" level=info msg="Applying roles kubeflow.ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:11+01:00" level=info msg="Creating non-existent roles kubeflow.ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:11+01:00" level=info msg="Applying deployments kubeflow.ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:11+01:00" level=info msg="Creating non-existent deployments kubeflow.ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:12+01:00" level=info msg="Applying customresourcedefinitions scheduledworkflows.kubeflow.org" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:12+01:00" level=info msg="Creating non-existent customresourcedefinitions scheduledworkflows.kubeflow.org" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:12+01:00" level=info msg="Applying serviceaccounts kubeflow.ml-pipeline-persistenceagent" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:12+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.ml-pipeline-persistenceagent" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:13+01:00" level=info msg="Applying clusterrolebindings ml-pipeline-persistenceagent" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:13+01:00" level=info msg="Creating non-existent clusterrolebindings ml-pipeline-persistenceagent" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:13+01:00" level=info msg="Applying clusterroles ml-pipeline-persistenceagent" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:13+01:00" level=info msg="Creating non-existent clusterroles ml-pipeline-persistenceagent" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:13+01:00" level=info msg="Applying deployments kubeflow.ml-pipeline-persistenceagent" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:13+01:00" level=info msg="Creating non-existent deployments kubeflow.ml-pipeline-persistenceagent" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:13+01:00" level=info msg="Applying serviceaccounts kubeflow.ml-pipeline-viewer-crd-service-account" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:13+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.ml-pipeline-viewer-crd-service-account" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:13+01:00" level=info msg="Applying clusterrolebindings ml-pipeline-viewer-crd-role-binding" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:13+01:00" level=info msg="Creating non-existent clusterrolebindings ml-pipeline-viewer-crd-role-binding" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:13+01:00" level=info msg="Applying clusterroles ml-pipeline-viewer-controller-role" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:13+01:00" level=info msg="Creating non-existent clusterroles ml-pipeline-viewer-controller-role" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:14+01:00" level=info msg="Applying deployments kubeflow.ml-pipeline-viewer-controller-deployment" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:14+01:00" level=info msg="Creating non-existent deployments kubeflow.ml-pipeline-viewer-controller-deployment" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:14+01:00" level=info msg="Applying customresourcedefinitions viewers.kubeflow.org" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:14+01:00" level=info msg="Creating non-existent customresourcedefinitions viewers.kubeflow.org" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:14+01:00" level=info msg="Applying serviceaccounts kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:14+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:14+01:00" level=info msg="Applying services kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:14+01:00" level=info msg="Creating non-existent services kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:15+01:00" level=info msg="Applying services kubeflow.ml-pipeline-tensorboard-ui" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:15+01:00" level=info msg="Creating non-existent services kubeflow.ml-pipeline-tensorboard-ui" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:15+01:00" level=info msg="Applying rolebindings kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:15+01:00" level=info msg="Creating non-existent rolebindings kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:16+01:00" level=info msg="Applying roles kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:16+01:00" level=info msg="Creating non-existent roles kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:16+01:00" level=info msg="Applying deployments kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:16+01:00" level=info msg="Creating non-existent deployments kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:16+01:00" level=info msg="Applying persistentvolumeclaims kubeflow.mysql-pv-claim" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:16+01:00" level=info msg="Creating non-existent persistentvolumeclaims kubeflow.mysql-pv-claim" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:16+01:00" level=info msg="Applying persistentvolumeclaims kubeflow.minio-pvc" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:16+01:00" level=info msg="Creating non-existent persistentvolumeclaims kubeflow.minio-pvc" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:16+01:00" level=info msg="Component pipeline apply succeeded" filename="ksonnet/ksonnet.go:171" + time="2019-05-25T18:26:25+01:00" level=info msg="Applying configmaps kubeflow.pytorch-operator-config" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:25+01:00" level=info msg="Creating non-existent configmaps kubeflow.pytorch-operator-config" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:25+01:00" level=info msg="Applying serviceaccounts kubeflow.pytorch-operator" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:25+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.pytorch-operator" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:26+01:00" level=info msg="Applying clusterroles pytorch-operator" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:26+01:00" level=info msg="Creating non-existent clusterroles pytorch-operator" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:26+01:00" level=info msg="Applying clusterrolebindings pytorch-operator" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:26+01:00" level=info msg="Creating non-existent clusterrolebindings pytorch-operator" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:26+01:00" level=info msg="Applying customresourcedefinitions pytorchjobs.kubeflow.org" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:26+01:00" level=info msg="Creating non-existent customresourcedefinitions pytorchjobs.kubeflow.org" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:26+01:00" level=info msg="Applying deployments kubeflow.pytorch-operator" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:26+01:00" level=info msg="Creating non-existent deployments kubeflow.pytorch-operator" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:26+01:00" level=info msg="Component pytorch-operator apply succeeded" filename="ksonnet/ksonnet.go:171" + time="2019-05-25T18:26:42+01:00" level=info msg="Applying services kubeflow.tensorboard" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:42+01:00" level=info msg="Creating non-existent services kubeflow.tensorboard" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:43+01:00" level=info msg="Applying deployments kubeflow.tensorboard" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:43+01:00" level=info msg="Creating non-existent deployments kubeflow.tensorboard" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:43+01:00" level=info msg="Component tensorboard apply succeeded" filename="ksonnet/ksonnet.go:171" + time="2019-05-25T18:26:58+01:00" level=info msg="Applying customresourcedefinitions tfjobs.kubeflow.org" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:59+01:00" level=info msg="Creating non-existent customresourcedefinitions tfjobs.kubeflow.org" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:59+01:00" level=info msg="Applying serviceaccounts kubeflow.tf-job-dashboard" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:59+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.tf-job-dashboard" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:59+01:00" level=info msg="Applying configmaps kubeflow.tf-job-operator-config" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:59+01:00" level=info msg="Creating non-existent configmaps kubeflow.tf-job-operator-config" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:59+01:00" level=info msg="Applying serviceaccounts kubeflow.tf-job-operator" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:59+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.tf-job-operator" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:59+01:00" level=info msg="Applying clusterroles tf-job-operator" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:59+01:00" level=info msg="Creating non-existent clusterroles tf-job-operator" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:59+01:00" level=info msg="Applying clusterrolebindings tf-job-operator" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:59+01:00" level=info msg="Creating non-existent clusterrolebindings tf-job-operator" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:59+01:00" level=info msg="Applying services kubeflow.tf-job-dashboard" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:59+01:00" level=info msg="Creating non-existent services kubeflow.tf-job-dashboard" filename="cluster/upsert.go:92" + time="2019-05-25T18:26:59+01:00" level=info msg="Applying clusterroles tf-job-dashboard" filename="cluster/upsert.go:73" + time="2019-05-25T18:26:59+01:00" level=info msg="Creating non-existent clusterroles tf-job-dashboard" filename="cluster/upsert.go:92" + time="2019-05-25T18:27:00+01:00" level=info msg="Applying clusterrolebindings tf-job-dashboard" filename="cluster/upsert.go:73" + time="2019-05-25T18:27:00+01:00" level=info msg="Creating non-existent clusterrolebindings tf-job-dashboard" filename="cluster/upsert.go:92" + time="2019-05-25T18:27:00+01:00" level=info msg="Applying deployments kubeflow.tf-job-operator" filename="cluster/upsert.go:73" + time="2019-05-25T18:27:00+01:00" level=info msg="Creating non-existent deployments kubeflow.tf-job-operator" filename="cluster/upsert.go:92" + time="2019-05-25T18:27:01+01:00" level=info msg="Applying deployments kubeflow.tf-job-dashboard" filename="cluster/upsert.go:73" + time="2019-05-25T18:27:01+01:00" level=info msg="Creating non-existent deployments kubeflow.tf-job-dashboard" filename="cluster/upsert.go:92" + time="2019-05-25T18:27:01+01:00" level=info msg="Component tf-job-operator apply succeeded" filename="ksonnet/ksonnet.go:171" + time="2019-05-25T18:27:01+01:00" level=info msg="All components apply succeeded" filename="ksonnet/ksonnet.go:192" + + +### Now let's run Seldon +For this we'll need Helm to be running, so we'll initialise it. + + +```bash +%%bash +helm init +kubectl rollout status deploy/tiller-deploy -n kube-system +``` + + $HELM_HOME has been configured at /home/alejandro/.helm. + + Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster. + + Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy. + To prevent this, run `helm init` with the --tiller-tls-verify flag. + For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation + Happy Helming! + Waiting for deployment "tiller-deploy" rollout to finish: 0 of 1 updated replicas are available... + deployment "tiller-deploy" successfully rolled out + + +Once it's running we can now run the installation command for Seldon. + +As you can see, we are running the Seldon Operator in the Kubeflow namespace. + + +```python +!helm install seldon-core-operator --namespace kubeflow --repo https://storage.googleapis.com/seldon-charts +``` + + NAME: yummy-donkey + LAST DEPLOYED: Sat May 25 18:27:34 2019 + NAMESPACE: kubeflow + STATUS: DEPLOYED + + RESOURCES: + ==> v1/ClusterRole + NAME AGE + seldon-operator-manager-role 1s + + ==> v1/ClusterRoleBinding + NAME AGE + seldon-operator-manager-rolebinding 1s + + ==> v1/Pod(related) + NAME READY STATUS RESTARTS AGE + seldon-operator-controller-manager-0 0/1 ContainerCreating 0 1s + + ==> v1/Secret + NAME TYPE DATA AGE + seldon-operator-webhook-server-secret Opaque 0 1s + + ==> v1/Service + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE + seldon-operator-controller-manager-service ClusterIP 10.105.250.206 443/TCP 1s + + ==> v1/StatefulSet + NAME READY AGE + seldon-operator-controller-manager 0/1 1s + + ==> v1beta1/CustomResourceDefinition + NAME AGE + seldondeployments.machinelearning.seldon.io 1s + + + NOTES: + NOTES: TODO + + + + +Check all the Seldon Deployment is running + + +```python +!kubectl get pod -n kubeflow | grep seldon +``` + + seldon-operator-controller-manager-0 1/1 Running 1 52s + + +# Train our NLP Pipeline with Kubeflow +We can access the Kubeflow dashboard to train our ML pipeline via http://localhost/_/pipeline-dashboard + +If you can't edit this, you need to make sure that the ambassador gateway service is accessible: + + +```python +!kubectl get svc ambassador -n kubeflow +``` + + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE + ambassador NodePort 10.99.81.144 80:31713/TCP 9m13s + + +In my case, I need to change the kind from `NodePort` into `LoadBalancer` which can be done with the following command: + + +```python +!kubectl patch svc ambassador --type='json' -p '[{"op":"replace","path":"/spec/type","value":"LoadBalancer"}]' -n kubeflow +``` + + service/ambassador patched + + +Now that I've changed it to a loadbalancer, it has allocated the external IP as my localhost so I can access it at http://localhost/_/pipeline-dashboard + + +```python +!kubectl get svc ambassador -n kubeflow +``` + + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE + ambassador LoadBalancer 10.99.81.144 localhost 80:31713/TCP 10m + + +If this was successfull, you should see the following screen: +![](img/k-pipeline-dashboard.jpg) + +# Upload our NLP pipeline +To uplaod our NLP pipeline we must first create it. This will consist in two steps: + +x.1) Build all the docker images for each pipeline step +x.2) Build the Kubeflow pipeline file to upload through the dashboard +x.3) Run a new pipeline instance through the dashboard + + +## x.1 Build all docker images for each pipeline step + +We will start by building each of the components in our ML pipeline. + +![](img/kubeflow-seldon-nlp-reusable-components.jpg) + +## Let's first have a look at our clean_text step: + + +```python +!ls pipeline/pipeline_steps/clean_text/ +``` + + Transformer.py __pycache__ pipeline_step.py + __init__.py build_image.sh requirements.txt + + +Like in this step, all of the other steps can be found in the `pipeline/pipeline_steps/` folder, and all have the following structure: +* `pipeline_step.py` which exposes the functionality through a CLI +* `Transformer.py` which transforms the data accordingly +* `requirements.txt` which states the python dependencies to run +* `build_image.sh` which uses `s2i` to build the image with one line + +### Let's check out the CLI for clean_text + + +```python +!python pipeline/pipeline_steps/clean_text/pipeline_step.py --help +``` + + Usage: pipeline_step.py [OPTIONS] + + Options: + --in-path TEXT + --out-path TEXT + --help Show this message and exit. + + +This is actually a very simple file, as we are using the click library to define the commands: + + +```python +!cat pipeline/pipeline_steps/clean_text/pipeline_step.py +``` + + import dill + import click + import dill + try: + # Running for tests + from .Transformer import Transformer + except: + # Running from CLI + from Transformer import Transformer + + @click.command() + @click.option('--in-path', default="/mnt/raw_text.data") + @click.option('--out-path', default="/mnt/clean_text.data") + def run_pipeline(in_path, out_path): + clean_text_transformer = Transformer() + with open(in_path, 'rb') as in_f: + x = dill.load(in_f) + y = clean_text_transformer.predict(x) + with open(out_path, "wb") as out_f: + dill.dump(y, out_f) + + if __name__ == "__main__": + run_pipeline() + + + +If you want to understand how the CLI pipeline talks to each other, have a look at the end to end test in `pipeline/pipeline_tests/`: + + +```python +!pytest ./pipeline/pipeline_tests/. --disable-pytest-warnings +``` + + ============================= test session starts ============================== + platform linux -- Python 3.7.3, pytest-4.5.0, py-1.8.0, pluggy-0.11.0 + rootdir: /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow + collected 1 item  + + pipeline/pipeline_tests/test_pipeline.py . [100%] + + ===================== 1 passed, 9 warnings in 4.89 seconds ===================== + + +To build the image we provide a build script in each of the steps that contains the instructions: + + +```python +!cat pipeline/pipeline_steps/clean_text/build_image.sh +``` + + #!/bin/bash + + s2i build . seldonio/seldon-core-s2i-python3:0.6 clean_text_transformer:0.1 + + + +The only thing you need to make sure is that Seldon knows how to wrap the right model and file. + +This can be achieved with the s2i/environment file. + +As you can see, here we just tell it we want it to use the Transformer file: + + +```python +!cat pipeline/pipeline_steps/clean_text/.s2i/environment +``` + + MODEL_NAME=Transformer + API_TYPE=REST + SERVICE_TYPE=MODEL + PERSISTENCE=0 + + +That's it! Quite simple right? + +The only thing we need to do is to run the `build_image.sh` for all the reusable components. + +Here we show the manual way to do it, but we recommend to just run `make build_pipeline_steps`. + + +```bash +%%bash +# we must be in the same directory +cd pipeline/pipeline_steps/clean_text/ && ./build_image.sh +cd ../data_downloader && ./build_image.sh +cd ../lr_text_classifier && ./build_image.sh +cd ../spacy_tokenize && ./build_image.sh +cd ../tfidf_vectorizer && ./build_image.sh +``` + + /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/pipeline/pipeline_steps/clean_text + + + ---> Installing application source... + ---> Installing dependencies ... + Looking in links: /whl + Collecting dill==0.2.9 (from -r requirements.txt (line 1)) + WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme. + Downloading https://files.pythonhosted.org/packages/fe/42/bfe2e0857bc284cbe6a011d93f2a9ad58a22cb894461b199ae72cfef0f29/dill-0.2.9.tar.gz (150kB) + Requirement already satisfied: click in /usr/local/lib/python3.6/site-packages (from -r requirements.txt (line 2)) (7.0) + Requirement already satisfied: numpy in /usr/local/lib/python3.6/site-packages (from -r requirements.txt (line 3)) (1.16.3) + Building wheels for collected packages: dill + Building wheel for dill (setup.py): started + Building wheel for dill (setup.py): finished with status 'done' + Stored in directory: /root/.cache/pip/wheels/5b/d7/0f/e58eae695403de585269f4e4a94e0cd6ca60ec0c202936fa4a + Successfully built dill + Installing collected packages: dill + Successfully installed dill-0.2.9 + WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme. + WARNING: You are using pip version 19.1, however version 19.1.1 is available. + You should consider upgrading via the 'pip install --upgrade pip' command. + Build completed successfully + + +# Train ML Pipeline via Kubeflow +Now that we've built our steps, we can actually train our ML pipeline, which looks as follows: +![](img/kubeflow-seldon-nlp-ml-pipelines-training.jpg) + +To do this, we have to generate the workflow using our Kubeflow graph definition and then uplaoding it through the UI: + + +```bash +%%bash +# Generating graph definition +python train_pipeline/nlp_pipeline.py +ls train_pipeline/ +``` + + nlp_pipeline.py + nlp_pipeline.py.tar.gz + + +Before uploading the image, at the time of writing we need to make some updates in the Argo images with the following commands below. + +(This basically changes the images to the latest ones, otherwise we will get an error when we attach the volume) + + +```python +!kubectl -n kubeflow patch deployments. workflow-controller --patch '{"spec": {"template": {"spec": {"containers": [{"name": "workflow-controller", "image": "argoproj/workflow-controller:v2.3.0-rc3"}]}}}}' +!kubectl -n kubeflow patch configmaps workflow-controller-configmap --patch '{"data": {"config": "{ executorImage: argoproj/argoexec:v2.3.0-rc3,artifactRepository:{s3: {bucket: mlpipeline,keyPrefix: artifacts,endpoint: minio-service.kubeflow:9000,insecure: true,accessKeySecret: {name: mlpipeline-minio-artifact,key: accesskey},secretKeySecret: {name: mlpipeline-minio-artifact,key: secretkey}}}}" }}' +!kubectl -n kubeflow patch deployments. ml-pipeline --patch '{"spec": {"template": {"spec": {"containers": [{"name": "ml-pipeline-api-server", "image": "elikatsis/ml-pipeline-api-server:0.1.18-pick-1289"}]}}}}' +``` + + deployment.extensions/workflow-controller patched + deployment.extensions/ml-pipeline patched + + +We now need to upload the resulting `nlp_pipeline.py.tar.gz` file generated. + +This can be done through the "Upload PIpeline" button in the UI at http://localhost/_/pipeline-dashboard. + +Once it's uploaded, we want to create and trigger a run! You should now be able to see how each step is executed: + +![](img/running-pipeline.jpg) + +### Seeing the results in the Persistent Volume +The pipeline saves the output of the pipeline together with the trained model in the persistent volume claim. + +The persistent volume claim is the same name as the argo workflow: + + +```python +!kubectl get workflow -n kubeflow +``` + + NAME AGE + nlp-77bln 12m + + +Our workflow is there! So we can actually access it by running + + +```python +!kubectl get workflow -n kubeflow -o jsonpath='{.items[0].metadata.name}' +``` + + nlp-77bln + +And we can use good old `sed` to insert this workflow name in our PVC-Access controler which we can use to inspect the contents of the volume: + + +```python +!sed "s/PVC_NAME/"$(kubectl get workflow -n kubeflow -o jsonpath='{.items[0].metadata.name}')"/g" deploy_pipeline/pvc-access.yaml +``` + + apiVersion: v1 + kind: Pod + metadata: + name: busybox + spec: + containers: + - name: busybox + image: busybox + command: ["/bin/sh", "-ec", "sleep 1000"] + volumeMounts: + - name: mypvc + mountPath: /mnt + volumes: + - name: mypvc + persistentVolumeClaim: + claimName: nlp-77bln + + +We just need to apply this container with our kubectl command, and we can use it to inspect the mounted folder: + + +```python +!sed "s/PVC_NAME/"$(kubectl get workflow -n kubeflow -o jsonpath='{.items[0].metadata.name}')"-my-pvc/g" deploy_pipeline/pvc-access.yaml | kubectl -n kubeflow apply -f - +``` + + pod/pvc-access-container created + + + +```python +!kubectl get pods -n kubeflow pvc-access-container +``` + + NAME READY STATUS RESTARTS AGE + pvc-access-container 0/1 ContainerCreating 0 1s + + + +```python +!kubectl apply -f deploy_pipeline/pvc-access.yaml -n kubeflow +``` + + pod/busybox created + + + +```python +!kubectl get pods busybox -n kubeflow +``` + + NAME READY STATUS RESTARTS AGE + busybox 0/1 Pending 0 9s + + + +```python +!kubectl -n kubeflow exec -it busybox ls /mnt +``` + + Error from server (BadRequest): pod busybox does not have a host assigned + + + +```python +!kubectl delete -f deploy_pipeline/pvc-access.yaml -n kubeflow +``` + + pod "pvc-access-container" deleted + + + +```python + +``` From bac4784c47ef00ab0e193e0143db52c9a7a8929c Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Sun, 26 May 2019 08:27:40 +0100 Subject: [PATCH 16/22] Updated readme --- examples/kubeflow/README.md | 1108 ++++++++++++++++++++++------------- 1 file changed, 694 insertions(+), 414 deletions(-) diff --git a/examples/kubeflow/README.md b/examples/kubeflow/README.md index 70f21c3031..623f62118d 100644 --- a/examples/kubeflow/README.md +++ b/examples/kubeflow/README.md @@ -5,11 +5,19 @@ In this example we showcase how to build re-usable components to build an ML pip We will automate content moderation on the Reddit comments in /r/science building a machine learning NLP model with the following components: -![](img/kubeflow-seldon-nlp-reusable-components.jpg) +![](img/completed-pipeline.jpg) This tutorial will break down in the following sections: -1) TODO +1) Run all the services (Kubeflow and Seldon) + +2) Test and build all our reusable pipeline steps + +3) Train our NLP Pipeline with Kubeflow + +4) Deploying your ML Pipeline with Seldon + +5) Test Deployed ML REST Endpoints Let's get started! 🚀🔥 @@ -73,7 +81,8 @@ Make sure you install the following dependencies, as they are critical for this Successfully built kfp -# Create project +# 1) Run all the services +### Start by running Kubeflow Kubeflow's CLI allows us to create a project which will allow us to build the configuration we need to deploy our kubeflow and seldon clusters. @@ -96,346 +105,346 @@ kfctl generate all -V kfctl apply all -V ``` - time="2019-05-25T18:24:21+01:00" level=info msg="reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml" filename="coordinator/coordinator.go:341" - time="2019-05-25T18:24:21+01:00" level=info msg="reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml" filename="coordinator/coordinator.go:341" - time="2019-05-25T18:24:21+01:00" level=info msg="Ksonnet.Generate Name kubeflow-seldon AppDir /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon Platform " filename="ksonnet/ksonnet.go:369" - time="2019-05-25T18:24:21+01:00" level=info msg="Creating environment \"default\" with namespace \"kubeflow\", pointing to \"version:v1.13.0\" cluster at address \"https://localhost:6445\"" filename="env/create.go:77" - time="2019-05-25T18:24:25+01:00" level=info msg="Generating ksonnet-lib data at path '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/lib/ksonnet-lib/v1.13.0'" filename="lib/lib.go:148" - time="2019-05-25T18:24:25+01:00" level=info msg="Successfully initialized the app kubeflow-seldon." filename="ksonnet/ksonnet.go:505" - time="2019-05-25T18:24:25+01:00" level=info msg="App kubeflow-seldon add registry kubeflow URI /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/.cache/v0.5.1/kubeflow" filename="ksonnet/ksonnet.go:621" - time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 6 files" filename="registry/cache.go:114" - time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 22 files" filename="registry/cache.go:114" - time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 9 files" filename="registry/cache.go:114" - time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 35 files" filename="registry/cache.go:114" - time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 49 files" filename="registry/cache.go:114" - time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 6 files" filename="registry/cache.go:114" - time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 4 files" filename="registry/cache.go:114" - time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 4 files" filename="registry/cache.go:114" - time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 9 files" filename="registry/cache.go:114" - time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 14 files" filename="registry/cache.go:114" - time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 6 files" filename="registry/cache.go:114" - time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 17 files" filename="registry/cache.go:114" - time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 8 files" filename="registry/cache.go:114" - time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 12 files" filename="registry/cache.go:114" - time="2019-05-25T18:24:25+01:00" level=info msg="Retrieved 4 files" filename="registry/cache.go:114" - time="2019-05-25T18:24:25+01:00" level=info msg="Creating Component: ambassador ..." filename="ksonnet/ksonnet.go:207" - time="2019-05-25T18:24:25+01:00" level=info msg="Args: [ambassador ambassador]" filename="ksonnet/ksonnet.go:208" - time="2019-05-25T18:24:25+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/ambassador.jsonnet'" filename="component/create.go:92" - time="2019-05-25T18:24:25+01:00" level=info msg="Creating Component: argo ..." filename="ksonnet/ksonnet.go:207" - time="2019-05-25T18:24:25+01:00" level=info msg="Args: [argo argo]" filename="ksonnet/ksonnet.go:208" - time="2019-05-25T18:24:25+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/argo.jsonnet'" filename="component/create.go:92" - time="2019-05-25T18:24:25+01:00" level=info msg="Creating Component: centraldashboard ..." filename="ksonnet/ksonnet.go:207" - time="2019-05-25T18:24:25+01:00" level=info msg="Args: [centraldashboard centraldashboard]" filename="ksonnet/ksonnet.go:208" - time="2019-05-25T18:24:26+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/centraldashboard.jsonnet'" filename="component/create.go:92" - time="2019-05-25T18:24:26+01:00" level=info msg="Creating Component: jupyter-web-app ..." filename="ksonnet/ksonnet.go:207" - time="2019-05-25T18:24:26+01:00" level=info msg="Args: [jupyter-web-app jupyter-web-app]" filename="ksonnet/ksonnet.go:208" - time="2019-05-25T18:24:26+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/jupyter-web-app.jsonnet'" filename="component/create.go:92" - time="2019-05-25T18:24:26+01:00" level=info msg="Creating Component: katib ..." filename="ksonnet/ksonnet.go:207" - time="2019-05-25T18:24:26+01:00" level=info msg="Args: [katib katib]" filename="ksonnet/ksonnet.go:208" - time="2019-05-25T18:24:26+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/katib.jsonnet'" filename="component/create.go:92" - time="2019-05-25T18:24:26+01:00" level=info msg="Creating Component: metacontroller ..." filename="ksonnet/ksonnet.go:207" - time="2019-05-25T18:24:26+01:00" level=info msg="Args: [metacontroller metacontroller]" filename="ksonnet/ksonnet.go:208" - time="2019-05-25T18:24:26+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/metacontroller.jsonnet'" filename="component/create.go:92" - time="2019-05-25T18:24:26+01:00" level=info msg="Creating Component: notebook-controller ..." filename="ksonnet/ksonnet.go:207" - time="2019-05-25T18:24:26+01:00" level=info msg="Args: [notebook-controller notebook-controller]" filename="ksonnet/ksonnet.go:208" - time="2019-05-25T18:24:26+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/notebook-controller.jsonnet'" filename="component/create.go:92" - time="2019-05-25T18:24:26+01:00" level=info msg="Creating Component: pipeline ..." filename="ksonnet/ksonnet.go:207" - time="2019-05-25T18:24:26+01:00" level=info msg="Args: [pipeline pipeline]" filename="ksonnet/ksonnet.go:208" - time="2019-05-25T18:24:26+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/pipeline.jsonnet'" filename="component/create.go:92" - time="2019-05-25T18:24:26+01:00" level=info msg="Creating Component: pytorch-operator ..." filename="ksonnet/ksonnet.go:207" - time="2019-05-25T18:24:26+01:00" level=info msg="Args: [pytorch-operator pytorch-operator]" filename="ksonnet/ksonnet.go:208" - time="2019-05-25T18:24:26+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/pytorch-operator.jsonnet'" filename="component/create.go:92" - time="2019-05-25T18:24:26+01:00" level=info msg="Creating Component: tensorboard ..." filename="ksonnet/ksonnet.go:207" - time="2019-05-25T18:24:26+01:00" level=info msg="Args: [tensorboard tensorboard]" filename="ksonnet/ksonnet.go:208" - time="2019-05-25T18:24:26+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/tensorboard.jsonnet'" filename="component/create.go:92" - time="2019-05-25T18:24:26+01:00" level=info msg="Creating Component: tf-job-operator ..." filename="ksonnet/ksonnet.go:207" - time="2019-05-25T18:24:26+01:00" level=info msg="Args: [tf-job-operator tf-job-operator]" filename="ksonnet/ksonnet.go:208" - time="2019-05-25T18:24:26+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/tf-job-operator.jsonnet'" filename="component/create.go:92" - time="2019-05-25T18:24:26+01:00" level=info msg="deploying kubeflow application" filename="cmd/apply.go:35" - time="2019-05-25T18:24:26+01:00" level=info msg="reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml" filename="coordinator/coordinator.go:341" - time="2019-05-25T18:24:26+01:00" level=info msg="reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml" filename="coordinator/coordinator.go:341" - time="2019-05-25T18:24:26+01:00" level=info msg="namespace: kubeflow" filename="ksonnet/ksonnet.go:109" - time="2019-05-25T18:24:26+01:00" level=info msg="Creating namespace: kubeflow" filename="ksonnet/ksonnet.go:112" - time="2019-05-25T18:24:34+01:00" level=info msg="Applying services kubeflow.ambassador" filename="cluster/upsert.go:73" - time="2019-05-25T18:24:34+01:00" level=info msg="Creating non-existent services kubeflow.ambassador" filename="cluster/upsert.go:92" - time="2019-05-25T18:24:34+01:00" level=info msg="Applying services kubeflow.ambassador-admin" filename="cluster/upsert.go:73" - time="2019-05-25T18:24:34+01:00" level=info msg="Creating non-existent services kubeflow.ambassador-admin" filename="cluster/upsert.go:92" - time="2019-05-25T18:24:34+01:00" level=info msg="Applying clusterroles ambassador" filename="cluster/upsert.go:73" - time="2019-05-25T18:24:34+01:00" level=info msg="Creating non-existent clusterroles ambassador" filename="cluster/upsert.go:92" - time="2019-05-25T18:24:34+01:00" level=info msg="Applying serviceaccounts kubeflow.ambassador" filename="cluster/upsert.go:73" - time="2019-05-25T18:24:34+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.ambassador" filename="cluster/upsert.go:92" - time="2019-05-25T18:24:34+01:00" level=info msg="Applying clusterrolebindings ambassador" filename="cluster/upsert.go:73" - time="2019-05-25T18:24:34+01:00" level=info msg="Creating non-existent clusterrolebindings ambassador" filename="cluster/upsert.go:92" - time="2019-05-25T18:24:35+01:00" level=info msg="Applying deployments kubeflow.ambassador" filename="cluster/upsert.go:73" - time="2019-05-25T18:24:35+01:00" level=info msg="Creating non-existent deployments kubeflow.ambassador" filename="cluster/upsert.go:92" - time="2019-05-25T18:24:35+01:00" level=info msg="Component ambassador apply succeeded" filename="ksonnet/ksonnet.go:171" - time="2019-05-25T18:24:41+01:00" level=info msg="Applying customresourcedefinitions workflows.argoproj.io" filename="cluster/upsert.go:73" - time="2019-05-25T18:24:41+01:00" level=info msg="Creating non-existent customresourcedefinitions workflows.argoproj.io" filename="cluster/upsert.go:92" - time="2019-05-25T18:24:45+01:00" level=info msg="Applying clusterrolebindings argo" filename="cluster/upsert.go:73" - time="2019-05-25T18:24:45+01:00" level=info msg="Creating non-existent clusterrolebindings argo" filename="cluster/upsert.go:92" - time="2019-05-25T18:24:45+01:00" level=info msg="Applying serviceaccounts kubeflow.argo-ui" filename="cluster/upsert.go:73" - time="2019-05-25T18:24:45+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.argo-ui" filename="cluster/upsert.go:92" - time="2019-05-25T18:24:45+01:00" level=info msg="Applying services kubeflow.argo-ui" filename="cluster/upsert.go:73" - time="2019-05-25T18:24:45+01:00" level=info msg="Creating non-existent services kubeflow.argo-ui" filename="cluster/upsert.go:92" - time="2019-05-25T18:24:46+01:00" level=info msg="Applying configmaps kubeflow.workflow-controller-configmap" filename="cluster/upsert.go:73" - time="2019-05-25T18:24:46+01:00" level=info msg="Creating non-existent configmaps kubeflow.workflow-controller-configmap" filename="cluster/upsert.go:92" - time="2019-05-25T18:24:46+01:00" level=info msg="Applying serviceaccounts kubeflow.argo" filename="cluster/upsert.go:73" - time="2019-05-25T18:24:46+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.argo" filename="cluster/upsert.go:92" - time="2019-05-25T18:24:46+01:00" level=info msg="Applying clusterroles argo" filename="cluster/upsert.go:73" - time="2019-05-25T18:24:46+01:00" level=info msg="Creating non-existent clusterroles argo" filename="cluster/upsert.go:92" - time="2019-05-25T18:24:46+01:00" level=info msg="Applying clusterroles argo-ui" filename="cluster/upsert.go:73" - time="2019-05-25T18:24:46+01:00" level=info msg="Creating non-existent clusterroles argo-ui" filename="cluster/upsert.go:92" - time="2019-05-25T18:24:46+01:00" level=info msg="Applying clusterrolebindings argo-ui" filename="cluster/upsert.go:73" - time="2019-05-25T18:24:46+01:00" level=info msg="Creating non-existent clusterrolebindings argo-ui" filename="cluster/upsert.go:92" - time="2019-05-25T18:24:46+01:00" level=info msg="Applying deployments kubeflow.workflow-controller" filename="cluster/upsert.go:73" - time="2019-05-25T18:24:46+01:00" level=info msg="Creating non-existent deployments kubeflow.workflow-controller" filename="cluster/upsert.go:92" - time="2019-05-25T18:24:46+01:00" level=info msg="Applying deployments kubeflow.argo-ui" filename="cluster/upsert.go:73" - time="2019-05-25T18:24:46+01:00" level=info msg="Creating non-existent deployments kubeflow.argo-ui" filename="cluster/upsert.go:92" - time="2019-05-25T18:24:46+01:00" level=info msg="Component argo apply succeeded" filename="ksonnet/ksonnet.go:171" - time="2019-05-25T18:24:53+01:00" level=info msg="Applying clusterrolebindings centraldashboard" filename="cluster/upsert.go:73" - time="2019-05-25T18:24:53+01:00" level=info msg="Creating non-existent clusterrolebindings centraldashboard" filename="cluster/upsert.go:92" - time="2019-05-25T18:24:53+01:00" level=info msg="Applying services kubeflow.centraldashboard" filename="cluster/upsert.go:73" - time="2019-05-25T18:24:53+01:00" level=info msg="Creating non-existent services kubeflow.centraldashboard" filename="cluster/upsert.go:92" - time="2019-05-25T18:24:53+01:00" level=info msg="Applying serviceaccounts kubeflow.centraldashboard" filename="cluster/upsert.go:73" - time="2019-05-25T18:24:53+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.centraldashboard" filename="cluster/upsert.go:92" - time="2019-05-25T18:24:53+01:00" level=info msg="Applying roles kubeflow.centraldashboard" filename="cluster/upsert.go:73" - time="2019-05-25T18:24:53+01:00" level=info msg="Creating non-existent roles kubeflow.centraldashboard" filename="cluster/upsert.go:92" - time="2019-05-25T18:24:53+01:00" level=info msg="Applying rolebindings kubeflow.centraldashboard" filename="cluster/upsert.go:73" - time="2019-05-25T18:24:53+01:00" level=info msg="Creating non-existent rolebindings kubeflow.centraldashboard" filename="cluster/upsert.go:92" - time="2019-05-25T18:24:53+01:00" level=info msg="Applying clusterroles centraldashboard" filename="cluster/upsert.go:73" - time="2019-05-25T18:24:53+01:00" level=info msg="Creating non-existent clusterroles centraldashboard" filename="cluster/upsert.go:92" - time="2019-05-25T18:24:53+01:00" level=info msg="Applying deployments kubeflow.centraldashboard" filename="cluster/upsert.go:73" - time="2019-05-25T18:24:53+01:00" level=info msg="Creating non-existent deployments kubeflow.centraldashboard" filename="cluster/upsert.go:92" - time="2019-05-25T18:24:53+01:00" level=info msg="Component centraldashboard apply succeeded" filename="ksonnet/ksonnet.go:171" - time="2019-05-25T18:24:59+01:00" level=info msg="Applying services kubeflow.jupyter-web-app" filename="cluster/upsert.go:73" - time="2019-05-25T18:24:59+01:00" level=info msg="Creating non-existent services kubeflow.jupyter-web-app" filename="cluster/upsert.go:92" - time="2019-05-25T18:24:59+01:00" level=info msg="Applying deployments kubeflow.jupyter-web-app" filename="cluster/upsert.go:73" - time="2019-05-25T18:24:59+01:00" level=info msg="Creating non-existent deployments kubeflow.jupyter-web-app" filename="cluster/upsert.go:92" - time="2019-05-25T18:24:59+01:00" level=info msg="Applying configmaps kubeflow.jupyter-web-app-config" filename="cluster/upsert.go:73" - time="2019-05-25T18:24:59+01:00" level=info msg="Creating non-existent configmaps kubeflow.jupyter-web-app-config" filename="cluster/upsert.go:92" - time="2019-05-25T18:24:59+01:00" level=info msg="Applying serviceaccounts kubeflow.jupyter-web-app" filename="cluster/upsert.go:73" - time="2019-05-25T18:24:59+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.jupyter-web-app" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:00+01:00" level=info msg="Applying clusterrolebindings jupyter-web-app-binding" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:00+01:00" level=info msg="Creating non-existent clusterrolebindings jupyter-web-app-binding" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:00+01:00" level=info msg="Applying clusterroles jupyter-web-app-cluster-role" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:00+01:00" level=info msg="Creating non-existent clusterroles jupyter-web-app-cluster-role" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:00+01:00" level=info msg="Applying serviceaccounts kubeflow.jupyter-notebook" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:00+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.jupyter-notebook" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:00+01:00" level=info msg="Applying roles kubeflow.jupyter-notebook-role" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:00+01:00" level=info msg="Creating non-existent roles kubeflow.jupyter-notebook-role" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:00+01:00" level=info msg="Applying rolebindings kubeflow.jupyter-notebook-role-binding" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:00+01:00" level=info msg="Creating non-existent rolebindings kubeflow.jupyter-notebook-role-binding" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:00+01:00" level=info msg="Component jupyter-web-app apply succeeded" filename="ksonnet/ksonnet.go:171" - time="2019-05-25T18:25:10+01:00" level=info msg="Applying clusterroles metrics-collector" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:10+01:00" level=info msg="Creating non-existent clusterroles metrics-collector" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:11+01:00" level=info msg="Applying services kubeflow.studyjob-controller" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:11+01:00" level=info msg="Creating non-existent services kubeflow.studyjob-controller" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:11+01:00" level=info msg="Applying services kubeflow.vizier-db" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:11+01:00" level=info msg="Creating non-existent services kubeflow.vizier-db" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:11+01:00" level=info msg="Applying persistentvolumeclaims kubeflow.katib-mysql" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:11+01:00" level=info msg="Creating non-existent persistentvolumeclaims kubeflow.katib-mysql" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:11+01:00" level=info msg="Applying clusterrolebindings studyjob-controller" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:11+01:00" level=info msg="Creating non-existent clusterrolebindings studyjob-controller" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:11+01:00" level=info msg="Applying secrets kubeflow.vizier-db-secrets" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:11+01:00" level=info msg="Creating non-existent secrets kubeflow.vizier-db-secrets" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:11+01:00" level=info msg="Applying clusterroles vizier-core" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:11+01:00" level=info msg="Creating non-existent clusterroles vizier-core" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:11+01:00" level=info msg="Applying clusterrolebindings vizier-core" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:11+01:00" level=info msg="Creating non-existent clusterrolebindings vizier-core" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:11+01:00" level=info msg="Applying serviceaccounts kubeflow.vizier-core" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:11+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.vizier-core" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:11+01:00" level=info msg="Applying services kubeflow.vizier-core-rest" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:11+01:00" level=info msg="Creating non-existent services kubeflow.vizier-core-rest" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:11+01:00" level=info msg="Applying serviceaccounts kubeflow.studyjob-controller" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:11+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.studyjob-controller" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:11+01:00" level=info msg="Applying services kubeflow.katib-ui" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:12+01:00" level=info msg="Creating non-existent services kubeflow.katib-ui" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:12+01:00" level=info msg="Applying clusterroles studyjob-controller" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:12+01:00" level=info msg="Creating non-existent clusterroles studyjob-controller" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:12+01:00" level=info msg="Applying clusterroles katib-ui" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:12+01:00" level=info msg="Creating non-existent clusterroles katib-ui" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:12+01:00" level=info msg="Applying clusterrolebindings katib-ui" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:12+01:00" level=info msg="Creating non-existent clusterrolebindings katib-ui" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:12+01:00" level=info msg="Applying serviceaccounts kubeflow.katib-ui" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:12+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.katib-ui" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:12+01:00" level=info msg="Applying services kubeflow.vizier-suggestion-random" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:12+01:00" level=info msg="Creating non-existent services kubeflow.vizier-suggestion-random" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:13+01:00" level=info msg="Applying services kubeflow.vizier-core" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:13+01:00" level=info msg="Creating non-existent services kubeflow.vizier-core" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:13+01:00" level=info msg="Applying services kubeflow.vizier-suggestion-grid" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:13+01:00" level=info msg="Creating non-existent services kubeflow.vizier-suggestion-grid" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:13+01:00" level=info msg="Applying configmaps kubeflow.metricscollector-template" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:14+01:00" level=info msg="Creating non-existent configmaps kubeflow.metricscollector-template" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:14+01:00" level=info msg="Applying services kubeflow.vizier-suggestion-hyperband" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:14+01:00" level=info msg="Creating non-existent services kubeflow.vizier-suggestion-hyperband" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:14+01:00" level=info msg="Applying clusterrolebindings metrics-collector" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:14+01:00" level=info msg="Creating non-existent clusterrolebindings metrics-collector" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:14+01:00" level=info msg="Applying services kubeflow.vizier-suggestion-bayesianoptimization" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:14+01:00" level=info msg="Creating non-existent services kubeflow.vizier-suggestion-bayesianoptimization" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:15+01:00" level=info msg="Applying serviceaccounts kubeflow.metrics-collector" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:15+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.metrics-collector" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:15+01:00" level=info msg="Applying customresourcedefinitions studyjobs.kubeflow.org" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:15+01:00" level=info msg="Creating non-existent customresourcedefinitions studyjobs.kubeflow.org" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:15+01:00" level=info msg="Applying configmaps kubeflow.worker-template" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:15+01:00" level=info msg="Creating non-existent configmaps kubeflow.worker-template" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:15+01:00" level=info msg="Applying deployments kubeflow.vizier-suggestion-bayesianoptimization" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:15+01:00" level=info msg="Creating non-existent deployments kubeflow.vizier-suggestion-bayesianoptimization" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:15+01:00" level=info msg="Applying deployments kubeflow.vizier-suggestion-hyperband" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:15+01:00" level=info msg="Creating non-existent deployments kubeflow.vizier-suggestion-hyperband" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:16+01:00" level=info msg="Applying deployments kubeflow.vizier-suggestion-grid" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:16+01:00" level=info msg="Creating non-existent deployments kubeflow.vizier-suggestion-grid" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:16+01:00" level=info msg="Applying deployments kubeflow.katib-ui" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:16+01:00" level=info msg="Creating non-existent deployments kubeflow.katib-ui" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:16+01:00" level=info msg="Applying deployments kubeflow.vizier-core-rest" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:16+01:00" level=info msg="Creating non-existent deployments kubeflow.vizier-core-rest" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:16+01:00" level=info msg="Applying deployments kubeflow.vizier-db" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:16+01:00" level=info msg="Creating non-existent deployments kubeflow.vizier-db" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:16+01:00" level=info msg="Applying deployments kubeflow.studyjob-controller" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:16+01:00" level=info msg="Creating non-existent deployments kubeflow.studyjob-controller" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:16+01:00" level=info msg="Applying deployments kubeflow.vizier-core" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:16+01:00" level=info msg="Creating non-existent deployments kubeflow.vizier-core" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:17+01:00" level=info msg="Applying deployments kubeflow.vizier-suggestion-random" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:17+01:00" level=info msg="Creating non-existent deployments kubeflow.vizier-suggestion-random" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:17+01:00" level=info msg="Component katib apply succeeded" filename="ksonnet/ksonnet.go:171" - time="2019-05-25T18:25:30+01:00" level=info msg="Applying customresourcedefinitions compositecontrollers.metacontroller.k8s.io" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:30+01:00" level=info msg="Creating non-existent customresourcedefinitions compositecontrollers.metacontroller.k8s.io" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:30+01:00" level=info msg="Applying customresourcedefinitions controllerrevisions.metacontroller.k8s.io" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:30+01:00" level=info msg="Creating non-existent customresourcedefinitions controllerrevisions.metacontroller.k8s.io" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:30+01:00" level=info msg="Applying customresourcedefinitions decoratorcontrollers.metacontroller.k8s.io" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:30+01:00" level=info msg="Creating non-existent customresourcedefinitions decoratorcontrollers.metacontroller.k8s.io" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:30+01:00" level=info msg="Applying serviceaccounts kubeflow.meta-controller-service" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:30+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.meta-controller-service" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:30+01:00" level=info msg="Applying clusterrolebindings meta-controller-cluster-role-binding" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:30+01:00" level=info msg="Creating non-existent clusterrolebindings meta-controller-cluster-role-binding" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:30+01:00" level=info msg="Applying statefulsets kubeflow.metacontroller" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:30+01:00" level=info msg="Creating non-existent statefulsets kubeflow.metacontroller" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:30+01:00" level=info msg="Component metacontroller apply succeeded" filename="ksonnet/ksonnet.go:171" - time="2019-05-25T18:25:37+01:00" level=info msg="Applying customresourcedefinitions notebooks.kubeflow.org" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:37+01:00" level=info msg="Creating non-existent customresourcedefinitions notebooks.kubeflow.org" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:42+01:00" level=info msg="Applying services kubeflow.notebooks-controller" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:45+01:00" level=info msg="Creating non-existent services kubeflow.notebooks-controller" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:47+01:00" level=info msg="Applying serviceaccounts kubeflow.notebook-controller" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:47+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.notebook-controller" filename="cluster/upsert.go:92" - time="2019-05-25T18:25:57+01:00" level=info msg="Applying deployments kubeflow.notebooks-controller" filename="cluster/upsert.go:73" - time="2019-05-25T18:25:58+01:00" level=info msg="Creating non-existent deployments kubeflow.notebooks-controller" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:00+01:00" level=info msg="Applying clusterroles notebooks-controller" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:00+01:00" level=info msg="Creating non-existent clusterroles notebooks-controller" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:00+01:00" level=info msg="Applying clusterrolebindings notebooks-controller" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:00+01:00" level=info msg="Creating non-existent clusterrolebindings notebooks-controller" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:00+01:00" level=info msg="Component notebook-controller apply succeeded" filename="ksonnet/ksonnet.go:171" - time="2019-05-25T18:26:08+01:00" level=info msg="Applying services kubeflow.minio-service" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:08+01:00" level=info msg="Creating non-existent services kubeflow.minio-service" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:08+01:00" level=info msg="Applying deployments kubeflow.minio" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:08+01:00" level=info msg="Creating non-existent deployments kubeflow.minio" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:08+01:00" level=info msg="Applying secrets kubeflow.mlpipeline-minio-artifact" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:08+01:00" level=info msg="Creating non-existent secrets kubeflow.mlpipeline-minio-artifact" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:08+01:00" level=info msg="Applying services kubeflow.mysql" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:08+01:00" level=info msg="Creating non-existent services kubeflow.mysql" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:08+01:00" level=info msg="Applying deployments kubeflow.mysql" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:08+01:00" level=info msg="Creating non-existent deployments kubeflow.mysql" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:09+01:00" level=info msg="Applying serviceaccounts kubeflow.ml-pipeline" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:09+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.ml-pipeline" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:09+01:00" level=info msg="Applying rolebindings kubeflow.ml-pipeline" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:09+01:00" level=info msg="Creating non-existent rolebindings kubeflow.ml-pipeline" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:09+01:00" level=info msg="Applying roles kubeflow.ml-pipeline" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:09+01:00" level=info msg="Creating non-existent roles kubeflow.ml-pipeline" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:09+01:00" level=info msg="Applying services kubeflow.ml-pipeline" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:09+01:00" level=info msg="Creating non-existent services kubeflow.ml-pipeline" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:10+01:00" level=info msg="Applying deployments kubeflow.ml-pipeline" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:10+01:00" level=info msg="Creating non-existent deployments kubeflow.ml-pipeline" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:10+01:00" level=info msg="Applying serviceaccounts kubeflow.pipeline-runner" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:10+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.pipeline-runner" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:10+01:00" level=info msg="Applying clusterroles pipeline-runner" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:10+01:00" level=info msg="Creating non-existent clusterroles pipeline-runner" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:10+01:00" level=info msg="Applying clusterrolebindings pipeline-runner" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:10+01:00" level=info msg="Creating non-existent clusterrolebindings pipeline-runner" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:11+01:00" level=info msg="Applying serviceaccounts kubeflow.ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:11+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:11+01:00" level=info msg="Applying clusterrolebindings ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:11+01:00" level=info msg="Creating non-existent clusterrolebindings ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:11+01:00" level=info msg="Applying roles kubeflow.ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:11+01:00" level=info msg="Creating non-existent roles kubeflow.ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:11+01:00" level=info msg="Applying deployments kubeflow.ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:11+01:00" level=info msg="Creating non-existent deployments kubeflow.ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:12+01:00" level=info msg="Applying customresourcedefinitions scheduledworkflows.kubeflow.org" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:12+01:00" level=info msg="Creating non-existent customresourcedefinitions scheduledworkflows.kubeflow.org" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:12+01:00" level=info msg="Applying serviceaccounts kubeflow.ml-pipeline-persistenceagent" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:12+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.ml-pipeline-persistenceagent" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:13+01:00" level=info msg="Applying clusterrolebindings ml-pipeline-persistenceagent" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:13+01:00" level=info msg="Creating non-existent clusterrolebindings ml-pipeline-persistenceagent" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:13+01:00" level=info msg="Applying clusterroles ml-pipeline-persistenceagent" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:13+01:00" level=info msg="Creating non-existent clusterroles ml-pipeline-persistenceagent" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:13+01:00" level=info msg="Applying deployments kubeflow.ml-pipeline-persistenceagent" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:13+01:00" level=info msg="Creating non-existent deployments kubeflow.ml-pipeline-persistenceagent" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:13+01:00" level=info msg="Applying serviceaccounts kubeflow.ml-pipeline-viewer-crd-service-account" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:13+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.ml-pipeline-viewer-crd-service-account" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:13+01:00" level=info msg="Applying clusterrolebindings ml-pipeline-viewer-crd-role-binding" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:13+01:00" level=info msg="Creating non-existent clusterrolebindings ml-pipeline-viewer-crd-role-binding" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:13+01:00" level=info msg="Applying clusterroles ml-pipeline-viewer-controller-role" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:13+01:00" level=info msg="Creating non-existent clusterroles ml-pipeline-viewer-controller-role" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:14+01:00" level=info msg="Applying deployments kubeflow.ml-pipeline-viewer-controller-deployment" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:14+01:00" level=info msg="Creating non-existent deployments kubeflow.ml-pipeline-viewer-controller-deployment" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:14+01:00" level=info msg="Applying customresourcedefinitions viewers.kubeflow.org" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:14+01:00" level=info msg="Creating non-existent customresourcedefinitions viewers.kubeflow.org" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:14+01:00" level=info msg="Applying serviceaccounts kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:14+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:14+01:00" level=info msg="Applying services kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:14+01:00" level=info msg="Creating non-existent services kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:15+01:00" level=info msg="Applying services kubeflow.ml-pipeline-tensorboard-ui" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:15+01:00" level=info msg="Creating non-existent services kubeflow.ml-pipeline-tensorboard-ui" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:15+01:00" level=info msg="Applying rolebindings kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:15+01:00" level=info msg="Creating non-existent rolebindings kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:16+01:00" level=info msg="Applying roles kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:16+01:00" level=info msg="Creating non-existent roles kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:16+01:00" level=info msg="Applying deployments kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:16+01:00" level=info msg="Creating non-existent deployments kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:16+01:00" level=info msg="Applying persistentvolumeclaims kubeflow.mysql-pv-claim" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:16+01:00" level=info msg="Creating non-existent persistentvolumeclaims kubeflow.mysql-pv-claim" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:16+01:00" level=info msg="Applying persistentvolumeclaims kubeflow.minio-pvc" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:16+01:00" level=info msg="Creating non-existent persistentvolumeclaims kubeflow.minio-pvc" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:16+01:00" level=info msg="Component pipeline apply succeeded" filename="ksonnet/ksonnet.go:171" - time="2019-05-25T18:26:25+01:00" level=info msg="Applying configmaps kubeflow.pytorch-operator-config" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:25+01:00" level=info msg="Creating non-existent configmaps kubeflow.pytorch-operator-config" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:25+01:00" level=info msg="Applying serviceaccounts kubeflow.pytorch-operator" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:25+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.pytorch-operator" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:26+01:00" level=info msg="Applying clusterroles pytorch-operator" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:26+01:00" level=info msg="Creating non-existent clusterroles pytorch-operator" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:26+01:00" level=info msg="Applying clusterrolebindings pytorch-operator" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:26+01:00" level=info msg="Creating non-existent clusterrolebindings pytorch-operator" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:26+01:00" level=info msg="Applying customresourcedefinitions pytorchjobs.kubeflow.org" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:26+01:00" level=info msg="Creating non-existent customresourcedefinitions pytorchjobs.kubeflow.org" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:26+01:00" level=info msg="Applying deployments kubeflow.pytorch-operator" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:26+01:00" level=info msg="Creating non-existent deployments kubeflow.pytorch-operator" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:26+01:00" level=info msg="Component pytorch-operator apply succeeded" filename="ksonnet/ksonnet.go:171" - time="2019-05-25T18:26:42+01:00" level=info msg="Applying services kubeflow.tensorboard" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:42+01:00" level=info msg="Creating non-existent services kubeflow.tensorboard" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:43+01:00" level=info msg="Applying deployments kubeflow.tensorboard" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:43+01:00" level=info msg="Creating non-existent deployments kubeflow.tensorboard" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:43+01:00" level=info msg="Component tensorboard apply succeeded" filename="ksonnet/ksonnet.go:171" - time="2019-05-25T18:26:58+01:00" level=info msg="Applying customresourcedefinitions tfjobs.kubeflow.org" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:59+01:00" level=info msg="Creating non-existent customresourcedefinitions tfjobs.kubeflow.org" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:59+01:00" level=info msg="Applying serviceaccounts kubeflow.tf-job-dashboard" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:59+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.tf-job-dashboard" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:59+01:00" level=info msg="Applying configmaps kubeflow.tf-job-operator-config" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:59+01:00" level=info msg="Creating non-existent configmaps kubeflow.tf-job-operator-config" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:59+01:00" level=info msg="Applying serviceaccounts kubeflow.tf-job-operator" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:59+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.tf-job-operator" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:59+01:00" level=info msg="Applying clusterroles tf-job-operator" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:59+01:00" level=info msg="Creating non-existent clusterroles tf-job-operator" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:59+01:00" level=info msg="Applying clusterrolebindings tf-job-operator" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:59+01:00" level=info msg="Creating non-existent clusterrolebindings tf-job-operator" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:59+01:00" level=info msg="Applying services kubeflow.tf-job-dashboard" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:59+01:00" level=info msg="Creating non-existent services kubeflow.tf-job-dashboard" filename="cluster/upsert.go:92" - time="2019-05-25T18:26:59+01:00" level=info msg="Applying clusterroles tf-job-dashboard" filename="cluster/upsert.go:73" - time="2019-05-25T18:26:59+01:00" level=info msg="Creating non-existent clusterroles tf-job-dashboard" filename="cluster/upsert.go:92" - time="2019-05-25T18:27:00+01:00" level=info msg="Applying clusterrolebindings tf-job-dashboard" filename="cluster/upsert.go:73" - time="2019-05-25T18:27:00+01:00" level=info msg="Creating non-existent clusterrolebindings tf-job-dashboard" filename="cluster/upsert.go:92" - time="2019-05-25T18:27:00+01:00" level=info msg="Applying deployments kubeflow.tf-job-operator" filename="cluster/upsert.go:73" - time="2019-05-25T18:27:00+01:00" level=info msg="Creating non-existent deployments kubeflow.tf-job-operator" filename="cluster/upsert.go:92" - time="2019-05-25T18:27:01+01:00" level=info msg="Applying deployments kubeflow.tf-job-dashboard" filename="cluster/upsert.go:73" - time="2019-05-25T18:27:01+01:00" level=info msg="Creating non-existent deployments kubeflow.tf-job-dashboard" filename="cluster/upsert.go:92" - time="2019-05-25T18:27:01+01:00" level=info msg="Component tf-job-operator apply succeeded" filename="ksonnet/ksonnet.go:171" - time="2019-05-25T18:27:01+01:00" level=info msg="All components apply succeeded" filename="ksonnet/ksonnet.go:192" + time="2019-05-26T07:28:04+01:00" level=info msg="reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml" filename="coordinator/coordinator.go:341" + time="2019-05-26T07:28:04+01:00" level=info msg="reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml" filename="coordinator/coordinator.go:341" + time="2019-05-26T07:28:04+01:00" level=info msg="Ksonnet.Generate Name kubeflow-seldon AppDir /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon Platform " filename="ksonnet/ksonnet.go:369" + time="2019-05-26T07:28:05+01:00" level=info msg="Creating environment \"default\" with namespace \"kubeflow\", pointing to \"version:v1.13.0\" cluster at address \"https://localhost:6445\"" filename="env/create.go:77" + time="2019-05-26T07:28:12+01:00" level=info msg="Generating ksonnet-lib data at path '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/lib/ksonnet-lib/v1.13.0'" filename="lib/lib.go:148" + time="2019-05-26T07:28:12+01:00" level=info msg="Successfully initialized the app kubeflow-seldon." filename="ksonnet/ksonnet.go:505" + time="2019-05-26T07:28:12+01:00" level=info msg="App kubeflow-seldon add registry kubeflow URI /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/.cache/v0.5.1/kubeflow" filename="ksonnet/ksonnet.go:621" + time="2019-05-26T07:28:12+01:00" level=info msg="Retrieved 6 files" filename="registry/cache.go:114" + time="2019-05-26T07:28:12+01:00" level=info msg="Retrieved 22 files" filename="registry/cache.go:114" + time="2019-05-26T07:28:12+01:00" level=info msg="Retrieved 9 files" filename="registry/cache.go:114" + time="2019-05-26T07:28:12+01:00" level=info msg="Retrieved 35 files" filename="registry/cache.go:114" + time="2019-05-26T07:28:12+01:00" level=info msg="Retrieved 49 files" filename="registry/cache.go:114" + time="2019-05-26T07:28:13+01:00" level=info msg="Retrieved 6 files" filename="registry/cache.go:114" + time="2019-05-26T07:28:13+01:00" level=info msg="Retrieved 4 files" filename="registry/cache.go:114" + time="2019-05-26T07:28:13+01:00" level=info msg="Retrieved 4 files" filename="registry/cache.go:114" + time="2019-05-26T07:28:13+01:00" level=info msg="Retrieved 9 files" filename="registry/cache.go:114" + time="2019-05-26T07:28:13+01:00" level=info msg="Retrieved 14 files" filename="registry/cache.go:114" + time="2019-05-26T07:28:13+01:00" level=info msg="Retrieved 6 files" filename="registry/cache.go:114" + time="2019-05-26T07:28:13+01:00" level=info msg="Retrieved 17 files" filename="registry/cache.go:114" + time="2019-05-26T07:28:13+01:00" level=info msg="Retrieved 8 files" filename="registry/cache.go:114" + time="2019-05-26T07:28:13+01:00" level=info msg="Retrieved 12 files" filename="registry/cache.go:114" + time="2019-05-26T07:28:13+01:00" level=info msg="Retrieved 4 files" filename="registry/cache.go:114" + time="2019-05-26T07:28:13+01:00" level=info msg="Creating Component: ambassador ..." filename="ksonnet/ksonnet.go:207" + time="2019-05-26T07:28:13+01:00" level=info msg="Args: [ambassador ambassador]" filename="ksonnet/ksonnet.go:208" + time="2019-05-26T07:28:13+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/ambassador.jsonnet'" filename="component/create.go:92" + time="2019-05-26T07:28:13+01:00" level=info msg="Creating Component: argo ..." filename="ksonnet/ksonnet.go:207" + time="2019-05-26T07:28:13+01:00" level=info msg="Args: [argo argo]" filename="ksonnet/ksonnet.go:208" + time="2019-05-26T07:28:14+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/argo.jsonnet'" filename="component/create.go:92" + time="2019-05-26T07:28:14+01:00" level=info msg="Creating Component: centraldashboard ..." filename="ksonnet/ksonnet.go:207" + time="2019-05-26T07:28:14+01:00" level=info msg="Args: [centraldashboard centraldashboard]" filename="ksonnet/ksonnet.go:208" + time="2019-05-26T07:28:14+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/centraldashboard.jsonnet'" filename="component/create.go:92" + time="2019-05-26T07:28:14+01:00" level=info msg="Creating Component: jupyter-web-app ..." filename="ksonnet/ksonnet.go:207" + time="2019-05-26T07:28:14+01:00" level=info msg="Args: [jupyter-web-app jupyter-web-app]" filename="ksonnet/ksonnet.go:208" + time="2019-05-26T07:28:14+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/jupyter-web-app.jsonnet'" filename="component/create.go:92" + time="2019-05-26T07:28:14+01:00" level=info msg="Creating Component: katib ..." filename="ksonnet/ksonnet.go:207" + time="2019-05-26T07:28:14+01:00" level=info msg="Args: [katib katib]" filename="ksonnet/ksonnet.go:208" + time="2019-05-26T07:28:14+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/katib.jsonnet'" filename="component/create.go:92" + time="2019-05-26T07:28:14+01:00" level=info msg="Creating Component: metacontroller ..." filename="ksonnet/ksonnet.go:207" + time="2019-05-26T07:28:14+01:00" level=info msg="Args: [metacontroller metacontroller]" filename="ksonnet/ksonnet.go:208" + time="2019-05-26T07:28:14+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/metacontroller.jsonnet'" filename="component/create.go:92" + time="2019-05-26T07:28:14+01:00" level=info msg="Creating Component: notebook-controller ..." filename="ksonnet/ksonnet.go:207" + time="2019-05-26T07:28:14+01:00" level=info msg="Args: [notebook-controller notebook-controller]" filename="ksonnet/ksonnet.go:208" + time="2019-05-26T07:28:14+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/notebook-controller.jsonnet'" filename="component/create.go:92" + time="2019-05-26T07:28:14+01:00" level=info msg="Creating Component: pipeline ..." filename="ksonnet/ksonnet.go:207" + time="2019-05-26T07:28:14+01:00" level=info msg="Args: [pipeline pipeline]" filename="ksonnet/ksonnet.go:208" + time="2019-05-26T07:28:15+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/pipeline.jsonnet'" filename="component/create.go:92" + time="2019-05-26T07:28:15+01:00" level=info msg="Creating Component: pytorch-operator ..." filename="ksonnet/ksonnet.go:207" + time="2019-05-26T07:28:15+01:00" level=info msg="Args: [pytorch-operator pytorch-operator]" filename="ksonnet/ksonnet.go:208" + time="2019-05-26T07:28:15+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/pytorch-operator.jsonnet'" filename="component/create.go:92" + time="2019-05-26T07:28:15+01:00" level=info msg="Creating Component: tensorboard ..." filename="ksonnet/ksonnet.go:207" + time="2019-05-26T07:28:15+01:00" level=info msg="Args: [tensorboard tensorboard]" filename="ksonnet/ksonnet.go:208" + time="2019-05-26T07:28:15+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/tensorboard.jsonnet'" filename="component/create.go:92" + time="2019-05-26T07:28:15+01:00" level=info msg="Creating Component: tf-job-operator ..." filename="ksonnet/ksonnet.go:207" + time="2019-05-26T07:28:15+01:00" level=info msg="Args: [tf-job-operator tf-job-operator]" filename="ksonnet/ksonnet.go:208" + time="2019-05-26T07:28:15+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/tf-job-operator.jsonnet'" filename="component/create.go:92" + time="2019-05-26T07:28:16+01:00" level=info msg="deploying kubeflow application" filename="cmd/apply.go:35" + time="2019-05-26T07:28:16+01:00" level=info msg="reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml" filename="coordinator/coordinator.go:341" + time="2019-05-26T07:28:16+01:00" level=info msg="reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml" filename="coordinator/coordinator.go:341" + time="2019-05-26T07:28:16+01:00" level=info msg="namespace: kubeflow" filename="ksonnet/ksonnet.go:109" + time="2019-05-26T07:28:16+01:00" level=info msg="Creating namespace: kubeflow" filename="ksonnet/ksonnet.go:112" + time="2019-05-26T07:28:34+01:00" level=info msg="Applying services kubeflow.ambassador" filename="cluster/upsert.go:73" + time="2019-05-26T07:28:34+01:00" level=info msg="Creating non-existent services kubeflow.ambassador" filename="cluster/upsert.go:92" + time="2019-05-26T07:28:35+01:00" level=info msg="Applying services kubeflow.ambassador-admin" filename="cluster/upsert.go:73" + time="2019-05-26T07:28:35+01:00" level=info msg="Creating non-existent services kubeflow.ambassador-admin" filename="cluster/upsert.go:92" + time="2019-05-26T07:28:35+01:00" level=info msg="Applying clusterroles ambassador" filename="cluster/upsert.go:73" + time="2019-05-26T07:28:35+01:00" level=info msg="Creating non-existent clusterroles ambassador" filename="cluster/upsert.go:92" + time="2019-05-26T07:28:35+01:00" level=info msg="Applying serviceaccounts kubeflow.ambassador" filename="cluster/upsert.go:73" + time="2019-05-26T07:28:35+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.ambassador" filename="cluster/upsert.go:92" + time="2019-05-26T07:28:35+01:00" level=info msg="Applying clusterrolebindings ambassador" filename="cluster/upsert.go:73" + time="2019-05-26T07:28:35+01:00" level=info msg="Creating non-existent clusterrolebindings ambassador" filename="cluster/upsert.go:92" + time="2019-05-26T07:28:35+01:00" level=info msg="Applying deployments kubeflow.ambassador" filename="cluster/upsert.go:73" + time="2019-05-26T07:28:35+01:00" level=info msg="Creating non-existent deployments kubeflow.ambassador" filename="cluster/upsert.go:92" + time="2019-05-26T07:28:35+01:00" level=info msg="Component ambassador apply succeeded" filename="ksonnet/ksonnet.go:171" + time="2019-05-26T07:28:53+01:00" level=info msg="Applying customresourcedefinitions workflows.argoproj.io" filename="cluster/upsert.go:73" + time="2019-05-26T07:28:53+01:00" level=info msg="Creating non-existent customresourcedefinitions workflows.argoproj.io" filename="cluster/upsert.go:92" + time="2019-05-26T07:28:57+01:00" level=info msg="Applying clusterrolebindings argo" filename="cluster/upsert.go:73" + time="2019-05-26T07:28:57+01:00" level=info msg="Creating non-existent clusterrolebindings argo" filename="cluster/upsert.go:92" + time="2019-05-26T07:28:57+01:00" level=info msg="Applying serviceaccounts kubeflow.argo-ui" filename="cluster/upsert.go:73" + time="2019-05-26T07:28:57+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.argo-ui" filename="cluster/upsert.go:92" + time="2019-05-26T07:28:57+01:00" level=info msg="Applying services kubeflow.argo-ui" filename="cluster/upsert.go:73" + time="2019-05-26T07:28:57+01:00" level=info msg="Creating non-existent services kubeflow.argo-ui" filename="cluster/upsert.go:92" + time="2019-05-26T07:28:57+01:00" level=info msg="Applying configmaps kubeflow.workflow-controller-configmap" filename="cluster/upsert.go:73" + time="2019-05-26T07:28:57+01:00" level=info msg="Creating non-existent configmaps kubeflow.workflow-controller-configmap" filename="cluster/upsert.go:92" + time="2019-05-26T07:28:57+01:00" level=info msg="Applying serviceaccounts kubeflow.argo" filename="cluster/upsert.go:73" + time="2019-05-26T07:28:57+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.argo" filename="cluster/upsert.go:92" + time="2019-05-26T07:28:57+01:00" level=info msg="Applying clusterroles argo" filename="cluster/upsert.go:73" + time="2019-05-26T07:28:57+01:00" level=info msg="Creating non-existent clusterroles argo" filename="cluster/upsert.go:92" + time="2019-05-26T07:28:57+01:00" level=info msg="Applying clusterroles argo-ui" filename="cluster/upsert.go:73" + time="2019-05-26T07:28:57+01:00" level=info msg="Creating non-existent clusterroles argo-ui" filename="cluster/upsert.go:92" + time="2019-05-26T07:28:57+01:00" level=info msg="Applying clusterrolebindings argo-ui" filename="cluster/upsert.go:73" + time="2019-05-26T07:28:58+01:00" level=info msg="Creating non-existent clusterrolebindings argo-ui" filename="cluster/upsert.go:92" + time="2019-05-26T07:28:58+01:00" level=info msg="Applying deployments kubeflow.workflow-controller" filename="cluster/upsert.go:73" + time="2019-05-26T07:28:58+01:00" level=info msg="Creating non-existent deployments kubeflow.workflow-controller" filename="cluster/upsert.go:92" + time="2019-05-26T07:28:58+01:00" level=info msg="Applying deployments kubeflow.argo-ui" filename="cluster/upsert.go:73" + time="2019-05-26T07:28:58+01:00" level=info msg="Creating non-existent deployments kubeflow.argo-ui" filename="cluster/upsert.go:92" + time="2019-05-26T07:28:58+01:00" level=info msg="Component argo apply succeeded" filename="ksonnet/ksonnet.go:171" + time="2019-05-26T07:29:12+01:00" level=info msg="Applying clusterrolebindings centraldashboard" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:12+01:00" level=info msg="Creating non-existent clusterrolebindings centraldashboard" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:12+01:00" level=info msg="Applying services kubeflow.centraldashboard" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:12+01:00" level=info msg="Creating non-existent services kubeflow.centraldashboard" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:13+01:00" level=info msg="Applying serviceaccounts kubeflow.centraldashboard" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:13+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.centraldashboard" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:13+01:00" level=info msg="Applying roles kubeflow.centraldashboard" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:13+01:00" level=info msg="Creating non-existent roles kubeflow.centraldashboard" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:13+01:00" level=info msg="Applying rolebindings kubeflow.centraldashboard" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:13+01:00" level=info msg="Creating non-existent rolebindings kubeflow.centraldashboard" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:13+01:00" level=info msg="Applying clusterroles centraldashboard" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:13+01:00" level=info msg="Creating non-existent clusterroles centraldashboard" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:13+01:00" level=info msg="Applying deployments kubeflow.centraldashboard" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:13+01:00" level=info msg="Creating non-existent deployments kubeflow.centraldashboard" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:13+01:00" level=info msg="Component centraldashboard apply succeeded" filename="ksonnet/ksonnet.go:171" + time="2019-05-26T07:29:29+01:00" level=info msg="Applying services kubeflow.jupyter-web-app" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:29+01:00" level=info msg="Creating non-existent services kubeflow.jupyter-web-app" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:29+01:00" level=info msg="Applying deployments kubeflow.jupyter-web-app" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:29+01:00" level=info msg="Creating non-existent deployments kubeflow.jupyter-web-app" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:29+01:00" level=info msg="Applying configmaps kubeflow.jupyter-web-app-config" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:29+01:00" level=info msg="Creating non-existent configmaps kubeflow.jupyter-web-app-config" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:29+01:00" level=info msg="Applying serviceaccounts kubeflow.jupyter-web-app" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:29+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.jupyter-web-app" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:29+01:00" level=info msg="Applying clusterrolebindings jupyter-web-app-binding" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:29+01:00" level=info msg="Creating non-existent clusterrolebindings jupyter-web-app-binding" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:29+01:00" level=info msg="Applying clusterroles jupyter-web-app-cluster-role" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:29+01:00" level=info msg="Creating non-existent clusterroles jupyter-web-app-cluster-role" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:30+01:00" level=info msg="Applying serviceaccounts kubeflow.jupyter-notebook" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:30+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.jupyter-notebook" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:30+01:00" level=info msg="Applying roles kubeflow.jupyter-notebook-role" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:30+01:00" level=info msg="Creating non-existent roles kubeflow.jupyter-notebook-role" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:30+01:00" level=info msg="Applying rolebindings kubeflow.jupyter-notebook-role-binding" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:30+01:00" level=info msg="Creating non-existent rolebindings kubeflow.jupyter-notebook-role-binding" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:30+01:00" level=info msg="Component jupyter-web-app apply succeeded" filename="ksonnet/ksonnet.go:171" + time="2019-05-26T07:29:45+01:00" level=info msg="Applying clusterroles metrics-collector" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:45+01:00" level=info msg="Creating non-existent clusterroles metrics-collector" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:45+01:00" level=info msg="Applying services kubeflow.studyjob-controller" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:45+01:00" level=info msg="Creating non-existent services kubeflow.studyjob-controller" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:45+01:00" level=info msg="Applying services kubeflow.vizier-db" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:45+01:00" level=info msg="Creating non-existent services kubeflow.vizier-db" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:45+01:00" level=info msg="Applying persistentvolumeclaims kubeflow.katib-mysql" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:45+01:00" level=info msg="Creating non-existent persistentvolumeclaims kubeflow.katib-mysql" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:45+01:00" level=info msg="Applying clusterrolebindings studyjob-controller" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:45+01:00" level=info msg="Creating non-existent clusterrolebindings studyjob-controller" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:45+01:00" level=info msg="Applying secrets kubeflow.vizier-db-secrets" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:45+01:00" level=info msg="Creating non-existent secrets kubeflow.vizier-db-secrets" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:45+01:00" level=info msg="Applying clusterroles vizier-core" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:45+01:00" level=info msg="Creating non-existent clusterroles vizier-core" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:45+01:00" level=info msg="Applying clusterrolebindings vizier-core" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:45+01:00" level=info msg="Creating non-existent clusterrolebindings vizier-core" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:45+01:00" level=info msg="Applying serviceaccounts kubeflow.vizier-core" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:45+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.vizier-core" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:46+01:00" level=info msg="Applying services kubeflow.vizier-core-rest" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:46+01:00" level=info msg="Creating non-existent services kubeflow.vizier-core-rest" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:46+01:00" level=info msg="Applying serviceaccounts kubeflow.studyjob-controller" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:46+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.studyjob-controller" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:46+01:00" level=info msg="Applying services kubeflow.katib-ui" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:46+01:00" level=info msg="Creating non-existent services kubeflow.katib-ui" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:46+01:00" level=info msg="Applying clusterroles studyjob-controller" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:46+01:00" level=info msg="Creating non-existent clusterroles studyjob-controller" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:46+01:00" level=info msg="Applying clusterroles katib-ui" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:46+01:00" level=info msg="Creating non-existent clusterroles katib-ui" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:46+01:00" level=info msg="Applying clusterrolebindings katib-ui" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:46+01:00" level=info msg="Creating non-existent clusterrolebindings katib-ui" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:46+01:00" level=info msg="Applying serviceaccounts kubeflow.katib-ui" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:46+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.katib-ui" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:46+01:00" level=info msg="Applying services kubeflow.vizier-suggestion-random" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:47+01:00" level=info msg="Creating non-existent services kubeflow.vizier-suggestion-random" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:47+01:00" level=info msg="Applying services kubeflow.vizier-core" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:47+01:00" level=info msg="Creating non-existent services kubeflow.vizier-core" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:47+01:00" level=info msg="Applying services kubeflow.vizier-suggestion-grid" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:47+01:00" level=info msg="Creating non-existent services kubeflow.vizier-suggestion-grid" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:48+01:00" level=info msg="Applying configmaps kubeflow.metricscollector-template" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:48+01:00" level=info msg="Creating non-existent configmaps kubeflow.metricscollector-template" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:48+01:00" level=info msg="Applying services kubeflow.vizier-suggestion-hyperband" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:48+01:00" level=info msg="Creating non-existent services kubeflow.vizier-suggestion-hyperband" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:48+01:00" level=info msg="Applying clusterrolebindings metrics-collector" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:48+01:00" level=info msg="Creating non-existent clusterrolebindings metrics-collector" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:49+01:00" level=info msg="Applying services kubeflow.vizier-suggestion-bayesianoptimization" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:49+01:00" level=info msg="Creating non-existent services kubeflow.vizier-suggestion-bayesianoptimization" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:49+01:00" level=info msg="Applying serviceaccounts kubeflow.metrics-collector" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:49+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.metrics-collector" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:49+01:00" level=info msg="Applying customresourcedefinitions studyjobs.kubeflow.org" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:49+01:00" level=info msg="Creating non-existent customresourcedefinitions studyjobs.kubeflow.org" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:49+01:00" level=info msg="Applying configmaps kubeflow.worker-template" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:49+01:00" level=info msg="Creating non-existent configmaps kubeflow.worker-template" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:50+01:00" level=info msg="Applying deployments kubeflow.vizier-suggestion-bayesianoptimization" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:50+01:00" level=info msg="Creating non-existent deployments kubeflow.vizier-suggestion-bayesianoptimization" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:50+01:00" level=info msg="Applying deployments kubeflow.vizier-suggestion-hyperband" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:50+01:00" level=info msg="Creating non-existent deployments kubeflow.vizier-suggestion-hyperband" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:50+01:00" level=info msg="Applying deployments kubeflow.vizier-suggestion-grid" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:50+01:00" level=info msg="Creating non-existent deployments kubeflow.vizier-suggestion-grid" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:50+01:00" level=info msg="Applying deployments kubeflow.katib-ui" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:50+01:00" level=info msg="Creating non-existent deployments kubeflow.katib-ui" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:50+01:00" level=info msg="Applying deployments kubeflow.vizier-core-rest" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:50+01:00" level=info msg="Creating non-existent deployments kubeflow.vizier-core-rest" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:50+01:00" level=info msg="Applying deployments kubeflow.vizier-db" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:50+01:00" level=info msg="Creating non-existent deployments kubeflow.vizier-db" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:51+01:00" level=info msg="Applying deployments kubeflow.studyjob-controller" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:51+01:00" level=info msg="Creating non-existent deployments kubeflow.studyjob-controller" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:51+01:00" level=info msg="Applying deployments kubeflow.vizier-core" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:51+01:00" level=info msg="Creating non-existent deployments kubeflow.vizier-core" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:51+01:00" level=info msg="Applying deployments kubeflow.vizier-suggestion-random" filename="cluster/upsert.go:73" + time="2019-05-26T07:29:51+01:00" level=info msg="Creating non-existent deployments kubeflow.vizier-suggestion-random" filename="cluster/upsert.go:92" + time="2019-05-26T07:29:51+01:00" level=info msg="Component katib apply succeeded" filename="ksonnet/ksonnet.go:171" + time="2019-05-26T07:30:12+01:00" level=info msg="Applying customresourcedefinitions compositecontrollers.metacontroller.k8s.io" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:12+01:00" level=info msg="Creating non-existent customresourcedefinitions compositecontrollers.metacontroller.k8s.io" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:12+01:00" level=info msg="Applying customresourcedefinitions controllerrevisions.metacontroller.k8s.io" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:12+01:00" level=info msg="Creating non-existent customresourcedefinitions controllerrevisions.metacontroller.k8s.io" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:12+01:00" level=info msg="Applying customresourcedefinitions decoratorcontrollers.metacontroller.k8s.io" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:12+01:00" level=info msg="Creating non-existent customresourcedefinitions decoratorcontrollers.metacontroller.k8s.io" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:12+01:00" level=info msg="Applying serviceaccounts kubeflow.meta-controller-service" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:12+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.meta-controller-service" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:13+01:00" level=info msg="Applying clusterrolebindings meta-controller-cluster-role-binding" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:13+01:00" level=info msg="Creating non-existent clusterrolebindings meta-controller-cluster-role-binding" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:13+01:00" level=info msg="Applying statefulsets kubeflow.metacontroller" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:13+01:00" level=info msg="Creating non-existent statefulsets kubeflow.metacontroller" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:13+01:00" level=info msg="Component metacontroller apply succeeded" filename="ksonnet/ksonnet.go:171" + time="2019-05-26T07:30:28+01:00" level=info msg="Applying customresourcedefinitions notebooks.kubeflow.org" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:28+01:00" level=info msg="Creating non-existent customresourcedefinitions notebooks.kubeflow.org" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:29+01:00" level=info msg="Applying services kubeflow.notebooks-controller" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:29+01:00" level=info msg="Creating non-existent services kubeflow.notebooks-controller" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:29+01:00" level=info msg="Applying serviceaccounts kubeflow.notebook-controller" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:29+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.notebook-controller" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:29+01:00" level=info msg="Applying deployments kubeflow.notebooks-controller" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:29+01:00" level=info msg="Creating non-existent deployments kubeflow.notebooks-controller" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:29+01:00" level=info msg="Applying clusterroles notebooks-controller" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:29+01:00" level=info msg="Creating non-existent clusterroles notebooks-controller" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:29+01:00" level=info msg="Applying clusterrolebindings notebooks-controller" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:29+01:00" level=info msg="Creating non-existent clusterrolebindings notebooks-controller" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:29+01:00" level=info msg="Component notebook-controller apply succeeded" filename="ksonnet/ksonnet.go:171" + time="2019-05-26T07:30:46+01:00" level=info msg="Applying services kubeflow.minio-service" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:46+01:00" level=info msg="Creating non-existent services kubeflow.minio-service" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:46+01:00" level=info msg="Applying deployments kubeflow.minio" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:46+01:00" level=info msg="Creating non-existent deployments kubeflow.minio" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:46+01:00" level=info msg="Applying secrets kubeflow.mlpipeline-minio-artifact" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:46+01:00" level=info msg="Creating non-existent secrets kubeflow.mlpipeline-minio-artifact" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:46+01:00" level=info msg="Applying services kubeflow.mysql" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:46+01:00" level=info msg="Creating non-existent services kubeflow.mysql" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:46+01:00" level=info msg="Applying deployments kubeflow.mysql" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:46+01:00" level=info msg="Creating non-existent deployments kubeflow.mysql" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:46+01:00" level=info msg="Applying serviceaccounts kubeflow.ml-pipeline" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:46+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.ml-pipeline" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:47+01:00" level=info msg="Applying rolebindings kubeflow.ml-pipeline" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:47+01:00" level=info msg="Creating non-existent rolebindings kubeflow.ml-pipeline" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:47+01:00" level=info msg="Applying roles kubeflow.ml-pipeline" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:47+01:00" level=info msg="Creating non-existent roles kubeflow.ml-pipeline" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:47+01:00" level=info msg="Applying services kubeflow.ml-pipeline" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:47+01:00" level=info msg="Creating non-existent services kubeflow.ml-pipeline" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:47+01:00" level=info msg="Applying deployments kubeflow.ml-pipeline" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:47+01:00" level=info msg="Creating non-existent deployments kubeflow.ml-pipeline" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:47+01:00" level=info msg="Applying serviceaccounts kubeflow.pipeline-runner" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:47+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.pipeline-runner" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:47+01:00" level=info msg="Applying clusterroles pipeline-runner" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:47+01:00" level=info msg="Creating non-existent clusterroles pipeline-runner" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:48+01:00" level=info msg="Applying clusterrolebindings pipeline-runner" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:48+01:00" level=info msg="Creating non-existent clusterrolebindings pipeline-runner" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:48+01:00" level=info msg="Applying serviceaccounts kubeflow.ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:48+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:48+01:00" level=info msg="Applying clusterrolebindings ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:48+01:00" level=info msg="Creating non-existent clusterrolebindings ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:48+01:00" level=info msg="Applying roles kubeflow.ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:48+01:00" level=info msg="Creating non-existent roles kubeflow.ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:48+01:00" level=info msg="Applying deployments kubeflow.ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:48+01:00" level=info msg="Creating non-existent deployments kubeflow.ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:48+01:00" level=info msg="Applying customresourcedefinitions scheduledworkflows.kubeflow.org" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:48+01:00" level=info msg="Creating non-existent customresourcedefinitions scheduledworkflows.kubeflow.org" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:48+01:00" level=info msg="Applying serviceaccounts kubeflow.ml-pipeline-persistenceagent" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:48+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.ml-pipeline-persistenceagent" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:48+01:00" level=info msg="Applying clusterrolebindings ml-pipeline-persistenceagent" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:48+01:00" level=info msg="Creating non-existent clusterrolebindings ml-pipeline-persistenceagent" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:48+01:00" level=info msg="Applying clusterroles ml-pipeline-persistenceagent" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:48+01:00" level=info msg="Creating non-existent clusterroles ml-pipeline-persistenceagent" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:48+01:00" level=info msg="Applying deployments kubeflow.ml-pipeline-persistenceagent" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:48+01:00" level=info msg="Creating non-existent deployments kubeflow.ml-pipeline-persistenceagent" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:49+01:00" level=info msg="Applying serviceaccounts kubeflow.ml-pipeline-viewer-crd-service-account" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:49+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.ml-pipeline-viewer-crd-service-account" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:49+01:00" level=info msg="Applying clusterrolebindings ml-pipeline-viewer-crd-role-binding" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:49+01:00" level=info msg="Creating non-existent clusterrolebindings ml-pipeline-viewer-crd-role-binding" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:49+01:00" level=info msg="Applying clusterroles ml-pipeline-viewer-controller-role" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:49+01:00" level=info msg="Creating non-existent clusterroles ml-pipeline-viewer-controller-role" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:49+01:00" level=info msg="Applying deployments kubeflow.ml-pipeline-viewer-controller-deployment" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:49+01:00" level=info msg="Creating non-existent deployments kubeflow.ml-pipeline-viewer-controller-deployment" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:49+01:00" level=info msg="Applying customresourcedefinitions viewers.kubeflow.org" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:49+01:00" level=info msg="Creating non-existent customresourcedefinitions viewers.kubeflow.org" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:49+01:00" level=info msg="Applying serviceaccounts kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:49+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:49+01:00" level=info msg="Applying services kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:49+01:00" level=info msg="Creating non-existent services kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:49+01:00" level=info msg="Applying services kubeflow.ml-pipeline-tensorboard-ui" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:49+01:00" level=info msg="Creating non-existent services kubeflow.ml-pipeline-tensorboard-ui" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:50+01:00" level=info msg="Applying rolebindings kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:50+01:00" level=info msg="Creating non-existent rolebindings kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:50+01:00" level=info msg="Applying roles kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:50+01:00" level=info msg="Creating non-existent roles kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:50+01:00" level=info msg="Applying deployments kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:50+01:00" level=info msg="Creating non-existent deployments kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:50+01:00" level=info msg="Applying persistentvolumeclaims kubeflow.mysql-pv-claim" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:50+01:00" level=info msg="Creating non-existent persistentvolumeclaims kubeflow.mysql-pv-claim" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:50+01:00" level=info msg="Applying persistentvolumeclaims kubeflow.minio-pvc" filename="cluster/upsert.go:73" + time="2019-05-26T07:30:50+01:00" level=info msg="Creating non-existent persistentvolumeclaims kubeflow.minio-pvc" filename="cluster/upsert.go:92" + time="2019-05-26T07:30:50+01:00" level=info msg="Component pipeline apply succeeded" filename="ksonnet/ksonnet.go:171" + time="2019-05-26T07:31:07+01:00" level=info msg="Applying configmaps kubeflow.pytorch-operator-config" filename="cluster/upsert.go:73" + time="2019-05-26T07:31:07+01:00" level=info msg="Creating non-existent configmaps kubeflow.pytorch-operator-config" filename="cluster/upsert.go:92" + time="2019-05-26T07:31:07+01:00" level=info msg="Applying serviceaccounts kubeflow.pytorch-operator" filename="cluster/upsert.go:73" + time="2019-05-26T07:31:07+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.pytorch-operator" filename="cluster/upsert.go:92" + time="2019-05-26T07:31:07+01:00" level=info msg="Applying clusterroles pytorch-operator" filename="cluster/upsert.go:73" + time="2019-05-26T07:31:07+01:00" level=info msg="Creating non-existent clusterroles pytorch-operator" filename="cluster/upsert.go:92" + time="2019-05-26T07:31:08+01:00" level=info msg="Applying clusterrolebindings pytorch-operator" filename="cluster/upsert.go:73" + time="2019-05-26T07:31:08+01:00" level=info msg="Creating non-existent clusterrolebindings pytorch-operator" filename="cluster/upsert.go:92" + time="2019-05-26T07:31:08+01:00" level=info msg="Applying customresourcedefinitions pytorchjobs.kubeflow.org" filename="cluster/upsert.go:73" + time="2019-05-26T07:31:08+01:00" level=info msg="Creating non-existent customresourcedefinitions pytorchjobs.kubeflow.org" filename="cluster/upsert.go:92" + time="2019-05-26T07:31:08+01:00" level=info msg="Applying deployments kubeflow.pytorch-operator" filename="cluster/upsert.go:73" + time="2019-05-26T07:31:08+01:00" level=info msg="Creating non-existent deployments kubeflow.pytorch-operator" filename="cluster/upsert.go:92" + time="2019-05-26T07:31:08+01:00" level=info msg="Component pytorch-operator apply succeeded" filename="ksonnet/ksonnet.go:171" + time="2019-05-26T07:31:27+01:00" level=info msg="Applying services kubeflow.tensorboard" filename="cluster/upsert.go:73" + time="2019-05-26T07:31:27+01:00" level=info msg="Creating non-existent services kubeflow.tensorboard" filename="cluster/upsert.go:92" + time="2019-05-26T07:31:27+01:00" level=info msg="Applying deployments kubeflow.tensorboard" filename="cluster/upsert.go:73" + time="2019-05-26T07:31:27+01:00" level=info msg="Creating non-existent deployments kubeflow.tensorboard" filename="cluster/upsert.go:92" + time="2019-05-26T07:31:27+01:00" level=info msg="Component tensorboard apply succeeded" filename="ksonnet/ksonnet.go:171" + time="2019-05-26T07:31:48+01:00" level=info msg="Applying customresourcedefinitions tfjobs.kubeflow.org" filename="cluster/upsert.go:73" + time="2019-05-26T07:31:48+01:00" level=info msg="Creating non-existent customresourcedefinitions tfjobs.kubeflow.org" filename="cluster/upsert.go:92" + time="2019-05-26T07:31:48+01:00" level=info msg="Applying serviceaccounts kubeflow.tf-job-dashboard" filename="cluster/upsert.go:73" + time="2019-05-26T07:31:48+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.tf-job-dashboard" filename="cluster/upsert.go:92" + time="2019-05-26T07:31:48+01:00" level=info msg="Applying configmaps kubeflow.tf-job-operator-config" filename="cluster/upsert.go:73" + time="2019-05-26T07:31:48+01:00" level=info msg="Creating non-existent configmaps kubeflow.tf-job-operator-config" filename="cluster/upsert.go:92" + time="2019-05-26T07:31:48+01:00" level=info msg="Applying serviceaccounts kubeflow.tf-job-operator" filename="cluster/upsert.go:73" + time="2019-05-26T07:31:48+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.tf-job-operator" filename="cluster/upsert.go:92" + time="2019-05-26T07:31:48+01:00" level=info msg="Applying clusterroles tf-job-operator" filename="cluster/upsert.go:73" + time="2019-05-26T07:31:48+01:00" level=info msg="Creating non-existent clusterroles tf-job-operator" filename="cluster/upsert.go:92" + time="2019-05-26T07:31:48+01:00" level=info msg="Applying clusterrolebindings tf-job-operator" filename="cluster/upsert.go:73" + time="2019-05-26T07:31:48+01:00" level=info msg="Creating non-existent clusterrolebindings tf-job-operator" filename="cluster/upsert.go:92" + time="2019-05-26T07:31:48+01:00" level=info msg="Applying services kubeflow.tf-job-dashboard" filename="cluster/upsert.go:73" + time="2019-05-26T07:31:48+01:00" level=info msg="Creating non-existent services kubeflow.tf-job-dashboard" filename="cluster/upsert.go:92" + time="2019-05-26T07:31:48+01:00" level=info msg="Applying clusterroles tf-job-dashboard" filename="cluster/upsert.go:73" + time="2019-05-26T07:31:48+01:00" level=info msg="Creating non-existent clusterroles tf-job-dashboard" filename="cluster/upsert.go:92" + time="2019-05-26T07:31:48+01:00" level=info msg="Applying clusterrolebindings tf-job-dashboard" filename="cluster/upsert.go:73" + time="2019-05-26T07:31:48+01:00" level=info msg="Creating non-existent clusterrolebindings tf-job-dashboard" filename="cluster/upsert.go:92" + time="2019-05-26T07:31:48+01:00" level=info msg="Applying deployments kubeflow.tf-job-operator" filename="cluster/upsert.go:73" + time="2019-05-26T07:31:48+01:00" level=info msg="Creating non-existent deployments kubeflow.tf-job-operator" filename="cluster/upsert.go:92" + time="2019-05-26T07:31:49+01:00" level=info msg="Applying deployments kubeflow.tf-job-dashboard" filename="cluster/upsert.go:73" + time="2019-05-26T07:31:49+01:00" level=info msg="Creating non-existent deployments kubeflow.tf-job-dashboard" filename="cluster/upsert.go:92" + time="2019-05-26T07:31:49+01:00" level=info msg="Component tf-job-operator apply succeeded" filename="ksonnet/ksonnet.go:171" + time="2019-05-26T07:31:49+01:00" level=info msg="All components apply succeeded" filename="ksonnet/ksonnet.go:192" ### Now let's run Seldon @@ -469,8 +478,8 @@ As you can see, we are running the Seldon Operator in the Kubeflow namespace. !helm install seldon-core-operator --namespace kubeflow --repo https://storage.googleapis.com/seldon-charts ``` - NAME: yummy-donkey - LAST DEPLOYED: Sat May 25 18:27:34 2019 + NAME: filled-hare + LAST DEPLOYED: Sun May 26 07:32:41 2019 NAMESPACE: kubeflow STATUS: DEPLOYED @@ -493,7 +502,7 @@ As you can see, we are running the Seldon Operator in the Kubeflow namespace. ==> v1/Service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE - seldon-operator-controller-manager-service ClusterIP 10.105.250.206 443/TCP 1s + seldon-operator-controller-manager-service ClusterIP 10.110.123.156 443/TCP 1s ==> v1/StatefulSet NAME READY AGE @@ -517,56 +526,37 @@ Check all the Seldon Deployment is running !kubectl get pod -n kubeflow | grep seldon ``` - seldon-operator-controller-manager-0 1/1 Running 1 52s - - -# Train our NLP Pipeline with Kubeflow -We can access the Kubeflow dashboard to train our ML pipeline via http://localhost/_/pipeline-dashboard - -If you can't edit this, you need to make sure that the ambassador gateway service is accessible: + seldon-operator-controller-manager-0 1/1 Running 1 7s -```python -!kubectl get svc ambassador -n kubeflow -``` +### Temporary fix for Argo image - NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE - ambassador NodePort 10.99.81.144 80:31713/TCP 9m13s +At the time of writing we need to make some updates in the Argo images with the following commands below. - -In my case, I need to change the kind from `NodePort` into `LoadBalancer` which can be done with the following command: +(This basically changes the images to the latest ones, otherwise we will get an error when we attach the volume) ```python -!kubectl patch svc ambassador --type='json' -p '[{"op":"replace","path":"/spec/type","value":"LoadBalancer"}]' -n kubeflow +!kubectl -n kubeflow patch deployments. workflow-controller --patch '{"spec": {"template": {"spec": {"containers": [{"name": "workflow-controller", "image": "argoproj/workflow-controller:v2.3.0-rc3"}]}}}}' +!kubectl -n kubeflow patch deployments. ml-pipeline --patch '{"spec": {"template": {"spec": {"containers": [{"name": "ml-pipeline-api-server", "image": "elikatsis/ml-pipeline-api-server:0.1.18-pick-1289"}]}}}}' +# !kubectl -n kubeflow patch configmaps workflow-controller-configmap --patch '{"data": {"config": "{ executorImage: argoproj/argoexec:v2.3.0-rc3,artifactRepository:{s3: {bucket: mlpipeline,keyPrefix: artifacts,endpoint: minio-service.kubeflow:9000,insecure: true,accessKeySecret: {name: mlpipeline-minio-artifact,key: accesskey},secretKeySecret: {name: mlpipeline-minio-artifact,key: secretkey}}}}" }}' ``` - service/ambassador patched - - -Now that I've changed it to a loadbalancer, it has allocated the external IP as my localhost so I can access it at http://localhost/_/pipeline-dashboard - - -```python -!kubectl get svc ambassador -n kubeflow -``` + deployment.extensions/workflow-controller patched + deployment.extensions/ml-pipeline patched - NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE - ambassador LoadBalancer 10.99.81.144 localhost 80:31713/TCP 10m +The last command you need to run actually needs to be manual as the patch cannot change configmap contents directly -If this was successfull, you should see the following screen: -![](img/k-pipeline-dashboard.jpg) +You need to run the edit commad and change the executorImage to: `argoproj/argoexec:v2.3.0-rc3` -# Upload our NLP pipeline -To uplaod our NLP pipeline we must first create it. This will consist in two steps: +The exact edit command is: -x.1) Build all the docker images for each pipeline step -x.2) Build the Kubeflow pipeline file to upload through the dashboard -x.3) Run a new pipeline instance through the dashboard - +``` +kubectl edit configmaps workflow-controller-configmap -n kubeflow +``` -## x.1 Build all docker images for each pipeline step +# 2) Test and build all our reusable pipeline steps We will start by building each of the components in our ML pipeline. @@ -651,7 +641,7 @@ If you want to understand how the CLI pipeline talks to each other, have a look pipeline/pipeline_tests/test_pipeline.py . [100%] - ===================== 1 passed, 9 warnings in 4.89 seconds ===================== + ==================== 1 passed, 9 warnings in 12.89 seconds ===================== To build the image we provide a build script in each of the steps that contains the instructions: @@ -725,11 +715,43 @@ cd ../tfidf_vectorizer && ./build_image.sh Build completed successfully -# Train ML Pipeline via Kubeflow -Now that we've built our steps, we can actually train our ML pipeline, which looks as follows: -![](img/kubeflow-seldon-nlp-ml-pipelines-training.jpg) +# 3) Train our NLP Pipeline through the Kubeflow UI +We can access the Kubeflow dashboard to train our ML pipeline via http://localhost/_/pipeline-dashboard + +If you can't edit this, you need to make sure that the ambassador gateway service is accessible: + + +```python +!kubectl get svc ambassador -n kubeflow +``` + + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE + ambassador NodePort 10.106.32.40 80:31729/TCP 4m22s + + +In my case, I need to change the kind from `NodePort` into `LoadBalancer` which can be done with the following command: + + +```python +!kubectl patch svc ambassador --type='json' -p '[{"op":"replace","path":"/spec/type","value":"LoadBalancer"}]' -n kubeflow +``` + + service/ambassador patched + + +Now that I've changed it to a loadbalancer, it has allocated the external IP as my localhost so I can access it at http://localhost/_/pipeline-dashboard + + +```python +!kubectl get svc ambassador -n kubeflow +``` + + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE + ambassador LoadBalancer 10.106.32.40 localhost 80:31729/TCP 4m28s -To do this, we have to generate the workflow using our Kubeflow graph definition and then uplaoding it through the UI: + +If this was successfull, you should see the following screen: +![](img/k-pipeline-dashboard.jpg) ```bash @@ -743,20 +765,11 @@ ls train_pipeline/ nlp_pipeline.py.tar.gz -Before uploading the image, at the time of writing we need to make some updates in the Argo images with the following commands below. - -(This basically changes the images to the latest ones, otherwise we will get an error when we attach the volume) - - -```python -!kubectl -n kubeflow patch deployments. workflow-controller --patch '{"spec": {"template": {"spec": {"containers": [{"name": "workflow-controller", "image": "argoproj/workflow-controller:v2.3.0-rc3"}]}}}}' -!kubectl -n kubeflow patch configmaps workflow-controller-configmap --patch '{"data": {"config": "{ executorImage: argoproj/argoexec:v2.3.0-rc3,artifactRepository:{s3: {bucket: mlpipeline,keyPrefix: artifacts,endpoint: minio-service.kubeflow:9000,insecure: true,accessKeySecret: {name: mlpipeline-minio-artifact,key: accesskey},secretKeySecret: {name: mlpipeline-minio-artifact,key: secretkey}}}}" }}' -!kubectl -n kubeflow patch deployments. ml-pipeline --patch '{"spec": {"template": {"spec": {"containers": [{"name": "ml-pipeline-api-server", "image": "elikatsis/ml-pipeline-api-server:0.1.18-pick-1289"}]}}}}' -``` - deployment.extensions/workflow-controller patched - deployment.extensions/ml-pipeline patched +Now that we've built our steps, we can actually train our ML pipeline, which looks as follows: +![](img/kubeflow-seldon-nlp-ml-pipelines-training.jpg) +### Run the pipeline We now need to upload the resulting `nlp_pipeline.py.tar.gz` file generated. @@ -766,7 +779,7 @@ Once it's uploaded, we want to create and trigger a run! You should now be able ![](img/running-pipeline.jpg) -### Seeing the results in the Persistent Volume +### Inspecting the data created in the Persistent Volume The pipeline saves the output of the pipeline together with the trained model in the persistent volume claim. The persistent volume claim is the same name as the argo workflow: @@ -777,7 +790,7 @@ The persistent volume claim is the same name as the argo workflow: ``` NAME AGE - nlp-77bln 12m + nlp-78k79 45s Our workflow is there! So we can actually access it by running @@ -793,16 +806,16 @@ And we can use good old `sed` to insert this workflow name in our PVC-Access con ```python -!sed "s/PVC_NAME/"$(kubectl get workflow -n kubeflow -o jsonpath='{.items[0].metadata.name}')"/g" deploy_pipeline/pvc-access.yaml +!sed "s/PVC_NAME/"$(kubectl get workflow -n kubeflow -o jsonpath='{.items[0].metadata.name}')"-my-pvc/g" deploy_pipeline/pvc-access.yaml ``` apiVersion: v1 kind: Pod metadata: - name: busybox + name: pvc-access-container spec: containers: - - name: busybox + - name: pvc-access-container image: busybox command: ["/bin/sh", "-ec", "sleep 1000"] volumeMounts: @@ -829,42 +842,309 @@ We just need to apply this container with our kubectl command, and we can use it !kubectl get pods -n kubeflow pvc-access-container ``` - NAME READY STATUS RESTARTS AGE - pvc-access-container 0/1 ContainerCreating 0 1s + NAME READY STATUS RESTARTS AGE + pvc-access-container 1/1 Running 0 11s + +Now we can actually see what are the files located in the pvc that the pipeline used: ```python -!kubectl apply -f deploy_pipeline/pvc-access.yaml -n kubeflow +!kubectl -n kubeflow exec -it pvc-access-container ls /mnt ``` - pod/busybox created + clean.data lr.model text.data tfidf.model + labels.data prediction.data tfidf.data tokens.data ```python -!kubectl get pods busybox -n kubeflow +!kubectl delete -f deploy_pipeline/pvc-access.yaml -n kubeflow ``` - NAME READY STATUS RESTARTS AGE - busybox 0/1 Pending 0 9s + pod "pvc-access-container" deleted +# 4) Deploying your ML Pipeline with Seldon +Now that we have trained our ML pipeline, it's time to deploy it at scale! + +For this we will just need to create a simple Graph definition using the SeldonDeploy Kubernetes Custom Resource Definition. + +Adding the Seldon deployment will make our architecture look as follows: + +![](img/kubeflow-seldon-nlp-ml-pipelines.jpg) + +### Seldon Production pipeline contents +If we look at the file we'll be using to deploy our pipeline, we can see that it has the following key points: + +1) Reusable components definitions as containerSpecs: cleantext, spacytokenizer, tfidfvectorizer & lrclassifier + +2) DAG (directed acyclic graph) definition for REST pipeline: cleantext -> spacytokenizer -> tfidfvectorizer -> lrclassifier + ```python -!kubectl -n kubeflow exec -it busybox ls /mnt +!cat deploy_pipeline/seldon_production_pipeline.yaml ``` - Error from server (BadRequest): pod busybox does not have a host assigned + --- + apiVersion: machinelearning.seldon.io/v1alpha2 + kind: SeldonDeployment + metadata: + labels: + app: seldon + name: nlp-classifier + namespace: kubeflow + spec: + annotations: + project_name: NLP Pipeline + deployment_version: v1 + name: nlp-classifier + oauth_key: oauth-key + oauth_secret: oauth-secret + predictors: + - componentSpecs: + - spec: + containers: + - image: clean_text_transformer:0.1 + imagePullPolicy: IfNotPresent + name: cleantext + resources: + requests: + memory: 1Mi + - image: spacy_tokenizer:0.1 + imagePullPolicy: IfNotPresent + name: spacytokenizer + - image: tfidf_vectorizer:0.1 + imagePullPolicy: IfNotPresent + name: tfidfvectorizer + volumeMounts: + - name: mypvc + mountPath: /mnt + - image: lr_text_classifier:0.1 + imagePullPolicy: IfNotPresent + name: lrclassifier + volumeMounts: + - name: mypvc + mountPath: /mnt + terminationGracePeriodSeconds: 20 + volumes: + - name: mypvc + persistentVolumeClaim: + claimName: PVC_NAME + graph: + children: + - name: spacytokenizer + endpoint: + type: REST + type: MODEL + children: + - name: tfidfvectorizer + endpoint: + type: REST + type: MODEL + children: + - name: lrclassifier + endpoint: + type: REST + type: MODEL + children: [] + name: cleantext + endpoint: + type: REST + type: MODEL + name: single-model + replicas: 1 + annotations: + predictor_version: v1 + + +This is the exact same structure as the Kubeflow definition, and can be deployed using kubectl + +Once again, we want to make sure we replace the "PVC_NAME" variable with the workflow ID to attach the container to the Seldon pipeline ```python -!kubectl delete -f deploy_pipeline/pvc-access.yaml -n kubeflow +!sed "s/PVC_NAME/"$(kubectl get workflow -n kubeflow -o jsonpath='{.items[0].metadata.name}')"-my-pvc/g" deploy_pipeline/seldon_production_pipeline.yaml | kubectl -n kubeflow apply -f - ``` - pod "pvc-access-container" deleted + seldondeployment.machinelearning.seldon.io/nlp-classifier created + + +We now make sure that the Seldon Engine with the 4 reusable components are running: + + +```python +!kubectl -n kubeflow get pods | grep nlp-classifier +``` + + nlp-classifier-single-model-51fb0cb-57fbcdd44f-gkxx7 5/5 Running 0 59s + + +We can also find this with the SeldonDeployment custom resource definition + + +```python +!kubectl -n kubeflow get seldondeployment +``` + + NAME AGE + nlp-classifier 1m + + +# 5) Test Deployed ML REST Endpoints +Now that it's running we have a production ML text pipeline that we can Query using REST and GRPC + +We can interact with our API in two ways: + +1) Using CURL or any client like PostMan + +2) Using the Python SeldonClient + +### Using CURL from the terminal +When using CURL, the only thing we need to provide is the data in JSON format, as well as the url, which is: + +``` +http:///seldon/kubeflow//api/v0.1/predictions +``` + + +```bash +%%bash +#!curl -H \"Content-Type: application/x-www-form-urlencoded\" -g localhost/seldon/kubeflow/nlp-classifier/api/v0.1/predictions -d 'json={\"data\":{\"ndarray\":[[\"Hello this is some text to test\"]]}}' +curl -X POST -H 'Content-Type: application/json' \ + -d "{'data': {'names': ['text'], 'ndarray': ['Hello world this is a test']}}" \ + http://127.0.0.1/seldon/kubeflow/nlp-classifier/api/v0.1/predictions +``` + + { + "meta": { + "puid": "rdp3vmdo20g6ihjbu6nub1m3ra", + "tags": { + }, + "routing": { + "cleantext": -1, + "tfidfvectorizer": -1, + "spacytokenizer": -1 + }, + "requestPath": { + "cleantext": "clean_text_transformer:0.1", + "tfidfvectorizer": "tfidf_vectorizer:0.1", + "lrclassifier": "lr_text_classifier:0.1", + "spacytokenizer": "spacy_tokenizer:0.1" + }, + "metrics": [] + }, + "data": { + "names": ["t:0", "t:1"], + "ndarray": [[0.6729278313299858, 0.32707216867001415]] + } + } + + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 100 600 100 528 100 72 816 111 --:--:-- --:--:-- --:--:-- 927 + + +### Using the SeldonClient +We can also use the Python SeldonClient to interact with the pipeline we just deployed + + +```python +from seldon_core.seldon_client import SeldonClient +import numpy as np + +host = "localhost" +port = "80" # Make sure you use the port above +batch = np.array(["Hello world this is a test"]) +payload_type = "ndarray" +deployment_name="nlp-classifier" +transport="rest" +namespace="kubeflow" + +sc = seldon_core.seldon_client.SeldonClient( + gateway="ambassador", + ambassador_endpoint=host + ":" + port, + namespace=namespace) + +client_prediction = sc.predict( + data=batch, + deployment_name=deployment_name, + names=["text"], + payload_type=payload_type, + transport="rest") + +print(client_prediction) +``` + + http://localhost:80/seldon/kubeflow/nlp-classifier/api/v0.1/predictions + Paload: + {'data': {'names': ['text'], 'ndarray': ['Hello world this is a test']}} + HEADERS: + None + Success:True message: + Request: + data { + names: "text" + ndarray { + values { + string_value: "Hello world this is a test" + } + } + } + + Response: + meta { + puid: "slbdab0olpvupib0p2f1raju2s" + routing { + key: "cleantext" + value: -1 + } + routing { + key: "spacytokenizer" + value: -1 + } + routing { + key: "tfidfvectorizer" + value: -1 + } + requestPath { + key: "cleantext" + value: "clean_text_transformer:0.1" + } + requestPath { + key: "lrclassifier" + value: "lr_text_classifier:0.1" + } + requestPath { + key: "spacytokenizer" + value: "spacy_tokenizer:0.1" + } + requestPath { + key: "tfidfvectorizer" + value: "tfidf_vectorizer:0.1" + } + } + data { + names: "t:0" + names: "t:1" + ndarray { + values { + list_value { + values { + number_value: 0.6729278313299858 + } + values { + number_value: 0.32707216867001415 + } + } + } + } + } + + +# You now have a full end-to-end training and production NLP pipeline 😎 ```python From 063f3860f57bad622edbafedba09e0c604849e48 Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Sun, 26 May 2019 15:54:12 +0100 Subject: [PATCH 17/22] Shortened readme --- examples/kubeflow/README.md | 378 +----------------------------------- 1 file changed, 1 insertion(+), 377 deletions(-) diff --git a/examples/kubeflow/README.md b/examples/kubeflow/README.md index 623f62118d..34bb375915 100644 --- a/examples/kubeflow/README.md +++ b/examples/kubeflow/README.md @@ -40,45 +40,6 @@ Make sure you install the following dependencies, as they are critical for this ``` Collecting https://storage.googleapis.com/ml-pipeline/release/0.1.20/kfp.tar.gz (from -r requirements-dev.txt (line 2)) - Using cached https://storage.googleapis.com/ml-pipeline/release/0.1.20/kfp.tar.gz - Requirement already satisfied (use --upgrade to upgrade): kfp==0.1.20 from https://storage.googleapis.com/ml-pipeline/release/0.1.20/kfp.tar.gz in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from -r requirements-dev.txt (line 2)) - Requirement already satisfied: python-dateutil in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from -r requirements-dev.txt (line 1)) (2.8.0) - Requirement already satisfied: kubernetes in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from -r requirements-dev.txt (line 3)) (9.0.0) - Requirement already satisfied: click in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from -r requirements-dev.txt (line 4)) (7.0) - Requirement already satisfied: urllib3<1.25,>=1.15 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.24.2) - Requirement already satisfied: six>=1.10 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.12.0) - Requirement already satisfied: certifi in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (2019.3.9) - Requirement already satisfied: PyYAML in /home/alejandro/.local/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (3.13) - Requirement already satisfied: google-cloud-storage>=1.13.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.13.0) - Requirement already satisfied: PyJWT>=1.6.4 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.7.1) - Requirement already satisfied: cryptography>=2.4.2 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (2.6.1) - Requirement already satisfied: google-auth>=1.6.1 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.6.3) - Requirement already satisfied: requests_toolbelt>=0.8.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (0.9.1) - Requirement already satisfied: kfp-server-api<0.1.19,>=0.1.18 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (0.1.18.2) - Requirement already satisfied: setuptools>=21.0.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kubernetes->-r requirements-dev.txt (line 3)) (41.0.0) - Requirement already satisfied: requests-oauthlib in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kubernetes->-r requirements-dev.txt (line 3)) (1.2.0) - Requirement already satisfied: websocket-client!=0.40.0,!=0.41.*,!=0.42.*,>=0.32.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kubernetes->-r requirements-dev.txt (line 3)) (0.56.0) - Requirement already satisfied: requests in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kubernetes->-r requirements-dev.txt (line 3)) (2.21.0) - Requirement already satisfied: google-resumable-media>=0.3.1 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-cloud-storage>=1.13.0->kfp==0.1.20->-r requirements-dev.txt (line 2)) (0.3.2) - Requirement already satisfied: google-cloud-core<0.29dev,>=0.28.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-cloud-storage>=1.13.0->kfp==0.1.20->-r requirements-dev.txt (line 2)) (0.28.1) - Requirement already satisfied: google-api-core<2.0.0dev,>=0.1.1 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-cloud-storage>=1.13.0->kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.11.0) - Requirement already satisfied: asn1crypto>=0.21.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from cryptography>=2.4.2->kfp==0.1.20->-r requirements-dev.txt (line 2)) (0.24.0) - Requirement already satisfied: cffi!=1.11.3,>=1.8 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from cryptography>=2.4.2->kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.12.3) - Requirement already satisfied: rsa>=3.1.4 in /home/alejandro/.local/lib/python3.7/site-packages (from google-auth>=1.6.1->kfp==0.1.20->-r requirements-dev.txt (line 2)) (3.4.2) - Requirement already satisfied: pyasn1-modules>=0.2.1 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-auth>=1.6.1->kfp==0.1.20->-r requirements-dev.txt (line 2)) (0.2.5) - Requirement already satisfied: cachetools>=2.0.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-auth>=1.6.1->kfp==0.1.20->-r requirements-dev.txt (line 2)) (3.1.0) - Requirement already satisfied: oauthlib>=3.0.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from requests-oauthlib->kubernetes->-r requirements-dev.txt (line 3)) (3.0.1) - Requirement already satisfied: idna<2.9,>=2.5 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from requests->kubernetes->-r requirements-dev.txt (line 3)) (2.8) - Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from requests->kubernetes->-r requirements-dev.txt (line 3)) (3.0.4) - Requirement already satisfied: pytz in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-api-core<2.0.0dev,>=0.1.1->google-cloud-storage>=1.13.0->kfp==0.1.20->-r requirements-dev.txt (line 2)) (2019.1) - Requirement already satisfied: googleapis-common-protos!=1.5.4,<2.0dev,>=1.5.3 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-api-core<2.0.0dev,>=0.1.1->google-cloud-storage>=1.13.0->kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.6.0) - Requirement already satisfied: protobuf>=3.4.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-api-core<2.0.0dev,>=0.1.1->google-cloud-storage>=1.13.0->kfp==0.1.20->-r requirements-dev.txt (line 2)) (3.6.1) - Requirement already satisfied: pycparser in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from cffi!=1.11.3,>=1.8->cryptography>=2.4.2->kfp==0.1.20->-r requirements-dev.txt (line 2)) (2.19) - Requirement already satisfied: pyasn1>=0.1.3 in /home/alejandro/.local/lib/python3.7/site-packages (from rsa>=3.1.4->google-auth>=1.6.1->kfp==0.1.20->-r requirements-dev.txt (line 2)) (0.4.5) - Building wheels for collected packages: kfp - Building wheel for kfp (setup.py) ... [?25ldone - [?25h Stored in directory: /tmp/pip-ephem-wheel-cache-4b2ca_6e/wheels/ae/bb/02/32b1356ee756181099d8f1b0950ac6567cb2b38e71b48f02e8 - Successfully built kfp # 1) Run all the services @@ -106,344 +67,7 @@ kfctl apply all -V ``` time="2019-05-26T07:28:04+01:00" level=info msg="reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml" filename="coordinator/coordinator.go:341" - time="2019-05-26T07:28:04+01:00" level=info msg="reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml" filename="coordinator/coordinator.go:341" - time="2019-05-26T07:28:04+01:00" level=info msg="Ksonnet.Generate Name kubeflow-seldon AppDir /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon Platform " filename="ksonnet/ksonnet.go:369" - time="2019-05-26T07:28:05+01:00" level=info msg="Creating environment \"default\" with namespace \"kubeflow\", pointing to \"version:v1.13.0\" cluster at address \"https://localhost:6445\"" filename="env/create.go:77" - time="2019-05-26T07:28:12+01:00" level=info msg="Generating ksonnet-lib data at path '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/lib/ksonnet-lib/v1.13.0'" filename="lib/lib.go:148" - time="2019-05-26T07:28:12+01:00" level=info msg="Successfully initialized the app kubeflow-seldon." filename="ksonnet/ksonnet.go:505" - time="2019-05-26T07:28:12+01:00" level=info msg="App kubeflow-seldon add registry kubeflow URI /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/.cache/v0.5.1/kubeflow" filename="ksonnet/ksonnet.go:621" - time="2019-05-26T07:28:12+01:00" level=info msg="Retrieved 6 files" filename="registry/cache.go:114" - time="2019-05-26T07:28:12+01:00" level=info msg="Retrieved 22 files" filename="registry/cache.go:114" - time="2019-05-26T07:28:12+01:00" level=info msg="Retrieved 9 files" filename="registry/cache.go:114" - time="2019-05-26T07:28:12+01:00" level=info msg="Retrieved 35 files" filename="registry/cache.go:114" - time="2019-05-26T07:28:12+01:00" level=info msg="Retrieved 49 files" filename="registry/cache.go:114" - time="2019-05-26T07:28:13+01:00" level=info msg="Retrieved 6 files" filename="registry/cache.go:114" - time="2019-05-26T07:28:13+01:00" level=info msg="Retrieved 4 files" filename="registry/cache.go:114" - time="2019-05-26T07:28:13+01:00" level=info msg="Retrieved 4 files" filename="registry/cache.go:114" - time="2019-05-26T07:28:13+01:00" level=info msg="Retrieved 9 files" filename="registry/cache.go:114" - time="2019-05-26T07:28:13+01:00" level=info msg="Retrieved 14 files" filename="registry/cache.go:114" - time="2019-05-26T07:28:13+01:00" level=info msg="Retrieved 6 files" filename="registry/cache.go:114" - time="2019-05-26T07:28:13+01:00" level=info msg="Retrieved 17 files" filename="registry/cache.go:114" - time="2019-05-26T07:28:13+01:00" level=info msg="Retrieved 8 files" filename="registry/cache.go:114" - time="2019-05-26T07:28:13+01:00" level=info msg="Retrieved 12 files" filename="registry/cache.go:114" - time="2019-05-26T07:28:13+01:00" level=info msg="Retrieved 4 files" filename="registry/cache.go:114" - time="2019-05-26T07:28:13+01:00" level=info msg="Creating Component: ambassador ..." filename="ksonnet/ksonnet.go:207" - time="2019-05-26T07:28:13+01:00" level=info msg="Args: [ambassador ambassador]" filename="ksonnet/ksonnet.go:208" - time="2019-05-26T07:28:13+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/ambassador.jsonnet'" filename="component/create.go:92" - time="2019-05-26T07:28:13+01:00" level=info msg="Creating Component: argo ..." filename="ksonnet/ksonnet.go:207" - time="2019-05-26T07:28:13+01:00" level=info msg="Args: [argo argo]" filename="ksonnet/ksonnet.go:208" - time="2019-05-26T07:28:14+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/argo.jsonnet'" filename="component/create.go:92" - time="2019-05-26T07:28:14+01:00" level=info msg="Creating Component: centraldashboard ..." filename="ksonnet/ksonnet.go:207" - time="2019-05-26T07:28:14+01:00" level=info msg="Args: [centraldashboard centraldashboard]" filename="ksonnet/ksonnet.go:208" - time="2019-05-26T07:28:14+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/centraldashboard.jsonnet'" filename="component/create.go:92" - time="2019-05-26T07:28:14+01:00" level=info msg="Creating Component: jupyter-web-app ..." filename="ksonnet/ksonnet.go:207" - time="2019-05-26T07:28:14+01:00" level=info msg="Args: [jupyter-web-app jupyter-web-app]" filename="ksonnet/ksonnet.go:208" - time="2019-05-26T07:28:14+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/jupyter-web-app.jsonnet'" filename="component/create.go:92" - time="2019-05-26T07:28:14+01:00" level=info msg="Creating Component: katib ..." filename="ksonnet/ksonnet.go:207" - time="2019-05-26T07:28:14+01:00" level=info msg="Args: [katib katib]" filename="ksonnet/ksonnet.go:208" - time="2019-05-26T07:28:14+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/katib.jsonnet'" filename="component/create.go:92" - time="2019-05-26T07:28:14+01:00" level=info msg="Creating Component: metacontroller ..." filename="ksonnet/ksonnet.go:207" - time="2019-05-26T07:28:14+01:00" level=info msg="Args: [metacontroller metacontroller]" filename="ksonnet/ksonnet.go:208" - time="2019-05-26T07:28:14+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/metacontroller.jsonnet'" filename="component/create.go:92" - time="2019-05-26T07:28:14+01:00" level=info msg="Creating Component: notebook-controller ..." filename="ksonnet/ksonnet.go:207" - time="2019-05-26T07:28:14+01:00" level=info msg="Args: [notebook-controller notebook-controller]" filename="ksonnet/ksonnet.go:208" - time="2019-05-26T07:28:14+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/notebook-controller.jsonnet'" filename="component/create.go:92" - time="2019-05-26T07:28:14+01:00" level=info msg="Creating Component: pipeline ..." filename="ksonnet/ksonnet.go:207" - time="2019-05-26T07:28:14+01:00" level=info msg="Args: [pipeline pipeline]" filename="ksonnet/ksonnet.go:208" - time="2019-05-26T07:28:15+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/pipeline.jsonnet'" filename="component/create.go:92" - time="2019-05-26T07:28:15+01:00" level=info msg="Creating Component: pytorch-operator ..." filename="ksonnet/ksonnet.go:207" - time="2019-05-26T07:28:15+01:00" level=info msg="Args: [pytorch-operator pytorch-operator]" filename="ksonnet/ksonnet.go:208" - time="2019-05-26T07:28:15+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/pytorch-operator.jsonnet'" filename="component/create.go:92" - time="2019-05-26T07:28:15+01:00" level=info msg="Creating Component: tensorboard ..." filename="ksonnet/ksonnet.go:207" - time="2019-05-26T07:28:15+01:00" level=info msg="Args: [tensorboard tensorboard]" filename="ksonnet/ksonnet.go:208" - time="2019-05-26T07:28:15+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/tensorboard.jsonnet'" filename="component/create.go:92" - time="2019-05-26T07:28:15+01:00" level=info msg="Creating Component: tf-job-operator ..." filename="ksonnet/ksonnet.go:207" - time="2019-05-26T07:28:15+01:00" level=info msg="Args: [tf-job-operator tf-job-operator]" filename="ksonnet/ksonnet.go:208" - time="2019-05-26T07:28:15+01:00" level=info msg="Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/tf-job-operator.jsonnet'" filename="component/create.go:92" - time="2019-05-26T07:28:16+01:00" level=info msg="deploying kubeflow application" filename="cmd/apply.go:35" - time="2019-05-26T07:28:16+01:00" level=info msg="reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml" filename="coordinator/coordinator.go:341" - time="2019-05-26T07:28:16+01:00" level=info msg="reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml" filename="coordinator/coordinator.go:341" - time="2019-05-26T07:28:16+01:00" level=info msg="namespace: kubeflow" filename="ksonnet/ksonnet.go:109" - time="2019-05-26T07:28:16+01:00" level=info msg="Creating namespace: kubeflow" filename="ksonnet/ksonnet.go:112" - time="2019-05-26T07:28:34+01:00" level=info msg="Applying services kubeflow.ambassador" filename="cluster/upsert.go:73" - time="2019-05-26T07:28:34+01:00" level=info msg="Creating non-existent services kubeflow.ambassador" filename="cluster/upsert.go:92" - time="2019-05-26T07:28:35+01:00" level=info msg="Applying services kubeflow.ambassador-admin" filename="cluster/upsert.go:73" - time="2019-05-26T07:28:35+01:00" level=info msg="Creating non-existent services kubeflow.ambassador-admin" filename="cluster/upsert.go:92" - time="2019-05-26T07:28:35+01:00" level=info msg="Applying clusterroles ambassador" filename="cluster/upsert.go:73" - time="2019-05-26T07:28:35+01:00" level=info msg="Creating non-existent clusterroles ambassador" filename="cluster/upsert.go:92" - time="2019-05-26T07:28:35+01:00" level=info msg="Applying serviceaccounts kubeflow.ambassador" filename="cluster/upsert.go:73" - time="2019-05-26T07:28:35+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.ambassador" filename="cluster/upsert.go:92" - time="2019-05-26T07:28:35+01:00" level=info msg="Applying clusterrolebindings ambassador" filename="cluster/upsert.go:73" - time="2019-05-26T07:28:35+01:00" level=info msg="Creating non-existent clusterrolebindings ambassador" filename="cluster/upsert.go:92" - time="2019-05-26T07:28:35+01:00" level=info msg="Applying deployments kubeflow.ambassador" filename="cluster/upsert.go:73" - time="2019-05-26T07:28:35+01:00" level=info msg="Creating non-existent deployments kubeflow.ambassador" filename="cluster/upsert.go:92" - time="2019-05-26T07:28:35+01:00" level=info msg="Component ambassador apply succeeded" filename="ksonnet/ksonnet.go:171" - time="2019-05-26T07:28:53+01:00" level=info msg="Applying customresourcedefinitions workflows.argoproj.io" filename="cluster/upsert.go:73" - time="2019-05-26T07:28:53+01:00" level=info msg="Creating non-existent customresourcedefinitions workflows.argoproj.io" filename="cluster/upsert.go:92" - time="2019-05-26T07:28:57+01:00" level=info msg="Applying clusterrolebindings argo" filename="cluster/upsert.go:73" - time="2019-05-26T07:28:57+01:00" level=info msg="Creating non-existent clusterrolebindings argo" filename="cluster/upsert.go:92" - time="2019-05-26T07:28:57+01:00" level=info msg="Applying serviceaccounts kubeflow.argo-ui" filename="cluster/upsert.go:73" - time="2019-05-26T07:28:57+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.argo-ui" filename="cluster/upsert.go:92" - time="2019-05-26T07:28:57+01:00" level=info msg="Applying services kubeflow.argo-ui" filename="cluster/upsert.go:73" - time="2019-05-26T07:28:57+01:00" level=info msg="Creating non-existent services kubeflow.argo-ui" filename="cluster/upsert.go:92" - time="2019-05-26T07:28:57+01:00" level=info msg="Applying configmaps kubeflow.workflow-controller-configmap" filename="cluster/upsert.go:73" - time="2019-05-26T07:28:57+01:00" level=info msg="Creating non-existent configmaps kubeflow.workflow-controller-configmap" filename="cluster/upsert.go:92" - time="2019-05-26T07:28:57+01:00" level=info msg="Applying serviceaccounts kubeflow.argo" filename="cluster/upsert.go:73" - time="2019-05-26T07:28:57+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.argo" filename="cluster/upsert.go:92" - time="2019-05-26T07:28:57+01:00" level=info msg="Applying clusterroles argo" filename="cluster/upsert.go:73" - time="2019-05-26T07:28:57+01:00" level=info msg="Creating non-existent clusterroles argo" filename="cluster/upsert.go:92" - time="2019-05-26T07:28:57+01:00" level=info msg="Applying clusterroles argo-ui" filename="cluster/upsert.go:73" - time="2019-05-26T07:28:57+01:00" level=info msg="Creating non-existent clusterroles argo-ui" filename="cluster/upsert.go:92" - time="2019-05-26T07:28:57+01:00" level=info msg="Applying clusterrolebindings argo-ui" filename="cluster/upsert.go:73" - time="2019-05-26T07:28:58+01:00" level=info msg="Creating non-existent clusterrolebindings argo-ui" filename="cluster/upsert.go:92" - time="2019-05-26T07:28:58+01:00" level=info msg="Applying deployments kubeflow.workflow-controller" filename="cluster/upsert.go:73" - time="2019-05-26T07:28:58+01:00" level=info msg="Creating non-existent deployments kubeflow.workflow-controller" filename="cluster/upsert.go:92" - time="2019-05-26T07:28:58+01:00" level=info msg="Applying deployments kubeflow.argo-ui" filename="cluster/upsert.go:73" - time="2019-05-26T07:28:58+01:00" level=info msg="Creating non-existent deployments kubeflow.argo-ui" filename="cluster/upsert.go:92" - time="2019-05-26T07:28:58+01:00" level=info msg="Component argo apply succeeded" filename="ksonnet/ksonnet.go:171" - time="2019-05-26T07:29:12+01:00" level=info msg="Applying clusterrolebindings centraldashboard" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:12+01:00" level=info msg="Creating non-existent clusterrolebindings centraldashboard" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:12+01:00" level=info msg="Applying services kubeflow.centraldashboard" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:12+01:00" level=info msg="Creating non-existent services kubeflow.centraldashboard" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:13+01:00" level=info msg="Applying serviceaccounts kubeflow.centraldashboard" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:13+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.centraldashboard" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:13+01:00" level=info msg="Applying roles kubeflow.centraldashboard" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:13+01:00" level=info msg="Creating non-existent roles kubeflow.centraldashboard" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:13+01:00" level=info msg="Applying rolebindings kubeflow.centraldashboard" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:13+01:00" level=info msg="Creating non-existent rolebindings kubeflow.centraldashboard" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:13+01:00" level=info msg="Applying clusterroles centraldashboard" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:13+01:00" level=info msg="Creating non-existent clusterroles centraldashboard" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:13+01:00" level=info msg="Applying deployments kubeflow.centraldashboard" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:13+01:00" level=info msg="Creating non-existent deployments kubeflow.centraldashboard" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:13+01:00" level=info msg="Component centraldashboard apply succeeded" filename="ksonnet/ksonnet.go:171" - time="2019-05-26T07:29:29+01:00" level=info msg="Applying services kubeflow.jupyter-web-app" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:29+01:00" level=info msg="Creating non-existent services kubeflow.jupyter-web-app" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:29+01:00" level=info msg="Applying deployments kubeflow.jupyter-web-app" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:29+01:00" level=info msg="Creating non-existent deployments kubeflow.jupyter-web-app" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:29+01:00" level=info msg="Applying configmaps kubeflow.jupyter-web-app-config" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:29+01:00" level=info msg="Creating non-existent configmaps kubeflow.jupyter-web-app-config" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:29+01:00" level=info msg="Applying serviceaccounts kubeflow.jupyter-web-app" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:29+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.jupyter-web-app" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:29+01:00" level=info msg="Applying clusterrolebindings jupyter-web-app-binding" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:29+01:00" level=info msg="Creating non-existent clusterrolebindings jupyter-web-app-binding" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:29+01:00" level=info msg="Applying clusterroles jupyter-web-app-cluster-role" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:29+01:00" level=info msg="Creating non-existent clusterroles jupyter-web-app-cluster-role" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:30+01:00" level=info msg="Applying serviceaccounts kubeflow.jupyter-notebook" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:30+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.jupyter-notebook" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:30+01:00" level=info msg="Applying roles kubeflow.jupyter-notebook-role" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:30+01:00" level=info msg="Creating non-existent roles kubeflow.jupyter-notebook-role" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:30+01:00" level=info msg="Applying rolebindings kubeflow.jupyter-notebook-role-binding" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:30+01:00" level=info msg="Creating non-existent rolebindings kubeflow.jupyter-notebook-role-binding" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:30+01:00" level=info msg="Component jupyter-web-app apply succeeded" filename="ksonnet/ksonnet.go:171" - time="2019-05-26T07:29:45+01:00" level=info msg="Applying clusterroles metrics-collector" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:45+01:00" level=info msg="Creating non-existent clusterroles metrics-collector" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:45+01:00" level=info msg="Applying services kubeflow.studyjob-controller" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:45+01:00" level=info msg="Creating non-existent services kubeflow.studyjob-controller" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:45+01:00" level=info msg="Applying services kubeflow.vizier-db" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:45+01:00" level=info msg="Creating non-existent services kubeflow.vizier-db" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:45+01:00" level=info msg="Applying persistentvolumeclaims kubeflow.katib-mysql" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:45+01:00" level=info msg="Creating non-existent persistentvolumeclaims kubeflow.katib-mysql" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:45+01:00" level=info msg="Applying clusterrolebindings studyjob-controller" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:45+01:00" level=info msg="Creating non-existent clusterrolebindings studyjob-controller" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:45+01:00" level=info msg="Applying secrets kubeflow.vizier-db-secrets" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:45+01:00" level=info msg="Creating non-existent secrets kubeflow.vizier-db-secrets" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:45+01:00" level=info msg="Applying clusterroles vizier-core" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:45+01:00" level=info msg="Creating non-existent clusterroles vizier-core" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:45+01:00" level=info msg="Applying clusterrolebindings vizier-core" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:45+01:00" level=info msg="Creating non-existent clusterrolebindings vizier-core" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:45+01:00" level=info msg="Applying serviceaccounts kubeflow.vizier-core" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:45+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.vizier-core" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:46+01:00" level=info msg="Applying services kubeflow.vizier-core-rest" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:46+01:00" level=info msg="Creating non-existent services kubeflow.vizier-core-rest" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:46+01:00" level=info msg="Applying serviceaccounts kubeflow.studyjob-controller" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:46+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.studyjob-controller" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:46+01:00" level=info msg="Applying services kubeflow.katib-ui" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:46+01:00" level=info msg="Creating non-existent services kubeflow.katib-ui" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:46+01:00" level=info msg="Applying clusterroles studyjob-controller" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:46+01:00" level=info msg="Creating non-existent clusterroles studyjob-controller" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:46+01:00" level=info msg="Applying clusterroles katib-ui" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:46+01:00" level=info msg="Creating non-existent clusterroles katib-ui" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:46+01:00" level=info msg="Applying clusterrolebindings katib-ui" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:46+01:00" level=info msg="Creating non-existent clusterrolebindings katib-ui" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:46+01:00" level=info msg="Applying serviceaccounts kubeflow.katib-ui" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:46+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.katib-ui" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:46+01:00" level=info msg="Applying services kubeflow.vizier-suggestion-random" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:47+01:00" level=info msg="Creating non-existent services kubeflow.vizier-suggestion-random" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:47+01:00" level=info msg="Applying services kubeflow.vizier-core" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:47+01:00" level=info msg="Creating non-existent services kubeflow.vizier-core" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:47+01:00" level=info msg="Applying services kubeflow.vizier-suggestion-grid" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:47+01:00" level=info msg="Creating non-existent services kubeflow.vizier-suggestion-grid" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:48+01:00" level=info msg="Applying configmaps kubeflow.metricscollector-template" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:48+01:00" level=info msg="Creating non-existent configmaps kubeflow.metricscollector-template" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:48+01:00" level=info msg="Applying services kubeflow.vizier-suggestion-hyperband" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:48+01:00" level=info msg="Creating non-existent services kubeflow.vizier-suggestion-hyperband" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:48+01:00" level=info msg="Applying clusterrolebindings metrics-collector" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:48+01:00" level=info msg="Creating non-existent clusterrolebindings metrics-collector" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:49+01:00" level=info msg="Applying services kubeflow.vizier-suggestion-bayesianoptimization" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:49+01:00" level=info msg="Creating non-existent services kubeflow.vizier-suggestion-bayesianoptimization" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:49+01:00" level=info msg="Applying serviceaccounts kubeflow.metrics-collector" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:49+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.metrics-collector" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:49+01:00" level=info msg="Applying customresourcedefinitions studyjobs.kubeflow.org" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:49+01:00" level=info msg="Creating non-existent customresourcedefinitions studyjobs.kubeflow.org" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:49+01:00" level=info msg="Applying configmaps kubeflow.worker-template" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:49+01:00" level=info msg="Creating non-existent configmaps kubeflow.worker-template" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:50+01:00" level=info msg="Applying deployments kubeflow.vizier-suggestion-bayesianoptimization" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:50+01:00" level=info msg="Creating non-existent deployments kubeflow.vizier-suggestion-bayesianoptimization" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:50+01:00" level=info msg="Applying deployments kubeflow.vizier-suggestion-hyperband" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:50+01:00" level=info msg="Creating non-existent deployments kubeflow.vizier-suggestion-hyperband" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:50+01:00" level=info msg="Applying deployments kubeflow.vizier-suggestion-grid" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:50+01:00" level=info msg="Creating non-existent deployments kubeflow.vizier-suggestion-grid" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:50+01:00" level=info msg="Applying deployments kubeflow.katib-ui" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:50+01:00" level=info msg="Creating non-existent deployments kubeflow.katib-ui" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:50+01:00" level=info msg="Applying deployments kubeflow.vizier-core-rest" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:50+01:00" level=info msg="Creating non-existent deployments kubeflow.vizier-core-rest" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:50+01:00" level=info msg="Applying deployments kubeflow.vizier-db" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:50+01:00" level=info msg="Creating non-existent deployments kubeflow.vizier-db" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:51+01:00" level=info msg="Applying deployments kubeflow.studyjob-controller" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:51+01:00" level=info msg="Creating non-existent deployments kubeflow.studyjob-controller" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:51+01:00" level=info msg="Applying deployments kubeflow.vizier-core" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:51+01:00" level=info msg="Creating non-existent deployments kubeflow.vizier-core" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:51+01:00" level=info msg="Applying deployments kubeflow.vizier-suggestion-random" filename="cluster/upsert.go:73" - time="2019-05-26T07:29:51+01:00" level=info msg="Creating non-existent deployments kubeflow.vizier-suggestion-random" filename="cluster/upsert.go:92" - time="2019-05-26T07:29:51+01:00" level=info msg="Component katib apply succeeded" filename="ksonnet/ksonnet.go:171" - time="2019-05-26T07:30:12+01:00" level=info msg="Applying customresourcedefinitions compositecontrollers.metacontroller.k8s.io" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:12+01:00" level=info msg="Creating non-existent customresourcedefinitions compositecontrollers.metacontroller.k8s.io" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:12+01:00" level=info msg="Applying customresourcedefinitions controllerrevisions.metacontroller.k8s.io" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:12+01:00" level=info msg="Creating non-existent customresourcedefinitions controllerrevisions.metacontroller.k8s.io" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:12+01:00" level=info msg="Applying customresourcedefinitions decoratorcontrollers.metacontroller.k8s.io" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:12+01:00" level=info msg="Creating non-existent customresourcedefinitions decoratorcontrollers.metacontroller.k8s.io" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:12+01:00" level=info msg="Applying serviceaccounts kubeflow.meta-controller-service" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:12+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.meta-controller-service" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:13+01:00" level=info msg="Applying clusterrolebindings meta-controller-cluster-role-binding" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:13+01:00" level=info msg="Creating non-existent clusterrolebindings meta-controller-cluster-role-binding" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:13+01:00" level=info msg="Applying statefulsets kubeflow.metacontroller" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:13+01:00" level=info msg="Creating non-existent statefulsets kubeflow.metacontroller" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:13+01:00" level=info msg="Component metacontroller apply succeeded" filename="ksonnet/ksonnet.go:171" - time="2019-05-26T07:30:28+01:00" level=info msg="Applying customresourcedefinitions notebooks.kubeflow.org" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:28+01:00" level=info msg="Creating non-existent customresourcedefinitions notebooks.kubeflow.org" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:29+01:00" level=info msg="Applying services kubeflow.notebooks-controller" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:29+01:00" level=info msg="Creating non-existent services kubeflow.notebooks-controller" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:29+01:00" level=info msg="Applying serviceaccounts kubeflow.notebook-controller" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:29+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.notebook-controller" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:29+01:00" level=info msg="Applying deployments kubeflow.notebooks-controller" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:29+01:00" level=info msg="Creating non-existent deployments kubeflow.notebooks-controller" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:29+01:00" level=info msg="Applying clusterroles notebooks-controller" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:29+01:00" level=info msg="Creating non-existent clusterroles notebooks-controller" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:29+01:00" level=info msg="Applying clusterrolebindings notebooks-controller" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:29+01:00" level=info msg="Creating non-existent clusterrolebindings notebooks-controller" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:29+01:00" level=info msg="Component notebook-controller apply succeeded" filename="ksonnet/ksonnet.go:171" - time="2019-05-26T07:30:46+01:00" level=info msg="Applying services kubeflow.minio-service" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:46+01:00" level=info msg="Creating non-existent services kubeflow.minio-service" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:46+01:00" level=info msg="Applying deployments kubeflow.minio" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:46+01:00" level=info msg="Creating non-existent deployments kubeflow.minio" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:46+01:00" level=info msg="Applying secrets kubeflow.mlpipeline-minio-artifact" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:46+01:00" level=info msg="Creating non-existent secrets kubeflow.mlpipeline-minio-artifact" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:46+01:00" level=info msg="Applying services kubeflow.mysql" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:46+01:00" level=info msg="Creating non-existent services kubeflow.mysql" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:46+01:00" level=info msg="Applying deployments kubeflow.mysql" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:46+01:00" level=info msg="Creating non-existent deployments kubeflow.mysql" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:46+01:00" level=info msg="Applying serviceaccounts kubeflow.ml-pipeline" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:46+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.ml-pipeline" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:47+01:00" level=info msg="Applying rolebindings kubeflow.ml-pipeline" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:47+01:00" level=info msg="Creating non-existent rolebindings kubeflow.ml-pipeline" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:47+01:00" level=info msg="Applying roles kubeflow.ml-pipeline" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:47+01:00" level=info msg="Creating non-existent roles kubeflow.ml-pipeline" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:47+01:00" level=info msg="Applying services kubeflow.ml-pipeline" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:47+01:00" level=info msg="Creating non-existent services kubeflow.ml-pipeline" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:47+01:00" level=info msg="Applying deployments kubeflow.ml-pipeline" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:47+01:00" level=info msg="Creating non-existent deployments kubeflow.ml-pipeline" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:47+01:00" level=info msg="Applying serviceaccounts kubeflow.pipeline-runner" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:47+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.pipeline-runner" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:47+01:00" level=info msg="Applying clusterroles pipeline-runner" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:47+01:00" level=info msg="Creating non-existent clusterroles pipeline-runner" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:48+01:00" level=info msg="Applying clusterrolebindings pipeline-runner" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:48+01:00" level=info msg="Creating non-existent clusterrolebindings pipeline-runner" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:48+01:00" level=info msg="Applying serviceaccounts kubeflow.ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:48+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:48+01:00" level=info msg="Applying clusterrolebindings ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:48+01:00" level=info msg="Creating non-existent clusterrolebindings ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:48+01:00" level=info msg="Applying roles kubeflow.ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:48+01:00" level=info msg="Creating non-existent roles kubeflow.ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:48+01:00" level=info msg="Applying deployments kubeflow.ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:48+01:00" level=info msg="Creating non-existent deployments kubeflow.ml-pipeline-scheduledworkflow" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:48+01:00" level=info msg="Applying customresourcedefinitions scheduledworkflows.kubeflow.org" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:48+01:00" level=info msg="Creating non-existent customresourcedefinitions scheduledworkflows.kubeflow.org" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:48+01:00" level=info msg="Applying serviceaccounts kubeflow.ml-pipeline-persistenceagent" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:48+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.ml-pipeline-persistenceagent" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:48+01:00" level=info msg="Applying clusterrolebindings ml-pipeline-persistenceagent" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:48+01:00" level=info msg="Creating non-existent clusterrolebindings ml-pipeline-persistenceagent" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:48+01:00" level=info msg="Applying clusterroles ml-pipeline-persistenceagent" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:48+01:00" level=info msg="Creating non-existent clusterroles ml-pipeline-persistenceagent" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:48+01:00" level=info msg="Applying deployments kubeflow.ml-pipeline-persistenceagent" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:48+01:00" level=info msg="Creating non-existent deployments kubeflow.ml-pipeline-persistenceagent" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:49+01:00" level=info msg="Applying serviceaccounts kubeflow.ml-pipeline-viewer-crd-service-account" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:49+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.ml-pipeline-viewer-crd-service-account" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:49+01:00" level=info msg="Applying clusterrolebindings ml-pipeline-viewer-crd-role-binding" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:49+01:00" level=info msg="Creating non-existent clusterrolebindings ml-pipeline-viewer-crd-role-binding" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:49+01:00" level=info msg="Applying clusterroles ml-pipeline-viewer-controller-role" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:49+01:00" level=info msg="Creating non-existent clusterroles ml-pipeline-viewer-controller-role" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:49+01:00" level=info msg="Applying deployments kubeflow.ml-pipeline-viewer-controller-deployment" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:49+01:00" level=info msg="Creating non-existent deployments kubeflow.ml-pipeline-viewer-controller-deployment" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:49+01:00" level=info msg="Applying customresourcedefinitions viewers.kubeflow.org" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:49+01:00" level=info msg="Creating non-existent customresourcedefinitions viewers.kubeflow.org" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:49+01:00" level=info msg="Applying serviceaccounts kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:49+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:49+01:00" level=info msg="Applying services kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:49+01:00" level=info msg="Creating non-existent services kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:49+01:00" level=info msg="Applying services kubeflow.ml-pipeline-tensorboard-ui" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:49+01:00" level=info msg="Creating non-existent services kubeflow.ml-pipeline-tensorboard-ui" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:50+01:00" level=info msg="Applying rolebindings kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:50+01:00" level=info msg="Creating non-existent rolebindings kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:50+01:00" level=info msg="Applying roles kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:50+01:00" level=info msg="Creating non-existent roles kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:50+01:00" level=info msg="Applying deployments kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:50+01:00" level=info msg="Creating non-existent deployments kubeflow.ml-pipeline-ui" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:50+01:00" level=info msg="Applying persistentvolumeclaims kubeflow.mysql-pv-claim" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:50+01:00" level=info msg="Creating non-existent persistentvolumeclaims kubeflow.mysql-pv-claim" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:50+01:00" level=info msg="Applying persistentvolumeclaims kubeflow.minio-pvc" filename="cluster/upsert.go:73" - time="2019-05-26T07:30:50+01:00" level=info msg="Creating non-existent persistentvolumeclaims kubeflow.minio-pvc" filename="cluster/upsert.go:92" - time="2019-05-26T07:30:50+01:00" level=info msg="Component pipeline apply succeeded" filename="ksonnet/ksonnet.go:171" - time="2019-05-26T07:31:07+01:00" level=info msg="Applying configmaps kubeflow.pytorch-operator-config" filename="cluster/upsert.go:73" - time="2019-05-26T07:31:07+01:00" level=info msg="Creating non-existent configmaps kubeflow.pytorch-operator-config" filename="cluster/upsert.go:92" - time="2019-05-26T07:31:07+01:00" level=info msg="Applying serviceaccounts kubeflow.pytorch-operator" filename="cluster/upsert.go:73" - time="2019-05-26T07:31:07+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.pytorch-operator" filename="cluster/upsert.go:92" - time="2019-05-26T07:31:07+01:00" level=info msg="Applying clusterroles pytorch-operator" filename="cluster/upsert.go:73" - time="2019-05-26T07:31:07+01:00" level=info msg="Creating non-existent clusterroles pytorch-operator" filename="cluster/upsert.go:92" - time="2019-05-26T07:31:08+01:00" level=info msg="Applying clusterrolebindings pytorch-operator" filename="cluster/upsert.go:73" - time="2019-05-26T07:31:08+01:00" level=info msg="Creating non-existent clusterrolebindings pytorch-operator" filename="cluster/upsert.go:92" - time="2019-05-26T07:31:08+01:00" level=info msg="Applying customresourcedefinitions pytorchjobs.kubeflow.org" filename="cluster/upsert.go:73" - time="2019-05-26T07:31:08+01:00" level=info msg="Creating non-existent customresourcedefinitions pytorchjobs.kubeflow.org" filename="cluster/upsert.go:92" - time="2019-05-26T07:31:08+01:00" level=info msg="Applying deployments kubeflow.pytorch-operator" filename="cluster/upsert.go:73" - time="2019-05-26T07:31:08+01:00" level=info msg="Creating non-existent deployments kubeflow.pytorch-operator" filename="cluster/upsert.go:92" - time="2019-05-26T07:31:08+01:00" level=info msg="Component pytorch-operator apply succeeded" filename="ksonnet/ksonnet.go:171" - time="2019-05-26T07:31:27+01:00" level=info msg="Applying services kubeflow.tensorboard" filename="cluster/upsert.go:73" - time="2019-05-26T07:31:27+01:00" level=info msg="Creating non-existent services kubeflow.tensorboard" filename="cluster/upsert.go:92" - time="2019-05-26T07:31:27+01:00" level=info msg="Applying deployments kubeflow.tensorboard" filename="cluster/upsert.go:73" - time="2019-05-26T07:31:27+01:00" level=info msg="Creating non-existent deployments kubeflow.tensorboard" filename="cluster/upsert.go:92" - time="2019-05-26T07:31:27+01:00" level=info msg="Component tensorboard apply succeeded" filename="ksonnet/ksonnet.go:171" - time="2019-05-26T07:31:48+01:00" level=info msg="Applying customresourcedefinitions tfjobs.kubeflow.org" filename="cluster/upsert.go:73" - time="2019-05-26T07:31:48+01:00" level=info msg="Creating non-existent customresourcedefinitions tfjobs.kubeflow.org" filename="cluster/upsert.go:92" - time="2019-05-26T07:31:48+01:00" level=info msg="Applying serviceaccounts kubeflow.tf-job-dashboard" filename="cluster/upsert.go:73" - time="2019-05-26T07:31:48+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.tf-job-dashboard" filename="cluster/upsert.go:92" - time="2019-05-26T07:31:48+01:00" level=info msg="Applying configmaps kubeflow.tf-job-operator-config" filename="cluster/upsert.go:73" - time="2019-05-26T07:31:48+01:00" level=info msg="Creating non-existent configmaps kubeflow.tf-job-operator-config" filename="cluster/upsert.go:92" - time="2019-05-26T07:31:48+01:00" level=info msg="Applying serviceaccounts kubeflow.tf-job-operator" filename="cluster/upsert.go:73" - time="2019-05-26T07:31:48+01:00" level=info msg="Creating non-existent serviceaccounts kubeflow.tf-job-operator" filename="cluster/upsert.go:92" - time="2019-05-26T07:31:48+01:00" level=info msg="Applying clusterroles tf-job-operator" filename="cluster/upsert.go:73" - time="2019-05-26T07:31:48+01:00" level=info msg="Creating non-existent clusterroles tf-job-operator" filename="cluster/upsert.go:92" - time="2019-05-26T07:31:48+01:00" level=info msg="Applying clusterrolebindings tf-job-operator" filename="cluster/upsert.go:73" - time="2019-05-26T07:31:48+01:00" level=info msg="Creating non-existent clusterrolebindings tf-job-operator" filename="cluster/upsert.go:92" - time="2019-05-26T07:31:48+01:00" level=info msg="Applying services kubeflow.tf-job-dashboard" filename="cluster/upsert.go:73" - time="2019-05-26T07:31:48+01:00" level=info msg="Creating non-existent services kubeflow.tf-job-dashboard" filename="cluster/upsert.go:92" - time="2019-05-26T07:31:48+01:00" level=info msg="Applying clusterroles tf-job-dashboard" filename="cluster/upsert.go:73" - time="2019-05-26T07:31:48+01:00" level=info msg="Creating non-existent clusterroles tf-job-dashboard" filename="cluster/upsert.go:92" - time="2019-05-26T07:31:48+01:00" level=info msg="Applying clusterrolebindings tf-job-dashboard" filename="cluster/upsert.go:73" - time="2019-05-26T07:31:48+01:00" level=info msg="Creating non-existent clusterrolebindings tf-job-dashboard" filename="cluster/upsert.go:92" - time="2019-05-26T07:31:48+01:00" level=info msg="Applying deployments kubeflow.tf-job-operator" filename="cluster/upsert.go:73" - time="2019-05-26T07:31:48+01:00" level=info msg="Creating non-existent deployments kubeflow.tf-job-operator" filename="cluster/upsert.go:92" - time="2019-05-26T07:31:49+01:00" level=info msg="Applying deployments kubeflow.tf-job-dashboard" filename="cluster/upsert.go:73" - time="2019-05-26T07:31:49+01:00" level=info msg="Creating non-existent deployments kubeflow.tf-job-dashboard" filename="cluster/upsert.go:92" - time="2019-05-26T07:31:49+01:00" level=info msg="Component tf-job-operator apply succeeded" filename="ksonnet/ksonnet.go:171" + ... time="2019-05-26T07:31:49+01:00" level=info msg="All components apply succeeded" filename="ksonnet/ksonnet.go:192" From 66dcbb8991ff22c47a8f44802ee71f548277c4f0 Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Mon, 27 May 2019 16:39:13 +0100 Subject: [PATCH 18/22] Changed readme so it has one-level headers --- examples/kubeflow/README.md | 165 +-- .../kubeflow_seldon_e2e_pipeline.ipynb | 1119 ++++++++--------- 2 files changed, 573 insertions(+), 711 deletions(-) diff --git a/examples/kubeflow/README.md b/examples/kubeflow/README.md index 34bb375915..89f0e71ff6 100644 --- a/examples/kubeflow/README.md +++ b/examples/kubeflow/README.md @@ -1,5 +1,5 @@ -# Kubeflow NLP end-to-end with Seldon +# End-to-end Reusable ML Pipeline with Seldon and Kubeflow In this example we showcase how to build re-usable components to build an ML pipeline that can be trained and deployed at scale. @@ -35,15 +35,10 @@ Make sure you install the following dependencies, as they are critical for this ```python -# You can also install the python dependencies that we'll need to build and test: !pip install -r requirements-dev.txt ``` - Collecting https://storage.googleapis.com/ml-pipeline/release/0.1.20/kfp.tar.gz (from -r requirements-dev.txt (line 2)) - - -# 1) Run all the services -### Start by running Kubeflow +## 1) Run all the services (Kubeflow and Seldon) Kubeflow's CLI allows us to create a project which will allow us to build the configuration we need to deploy our kubeflow and seldon clusters. @@ -52,6 +47,9 @@ Kubeflow's CLI allows us to create a project which will allow us to build the co !ls kubeflow-seldon ``` + app.yaml + + Now we run the following commands to basically launch our Kubeflow cluster with all its components. It may take a while to download all the images for Kubeflow so feel free to make yourself a cup of ☕. @@ -66,11 +64,6 @@ kfctl generate all -V kfctl apply all -V ``` - time="2019-05-26T07:28:04+01:00" level=info msg="reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml" filename="coordinator/coordinator.go:341" - ... - time="2019-05-26T07:31:49+01:00" level=info msg="All components apply succeeded" filename="ksonnet/ksonnet.go:192" - - ### Now let's run Seldon For this we'll need Helm to be running, so we'll initialise it. @@ -82,14 +75,9 @@ kubectl rollout status deploy/tiller-deploy -n kube-system ``` $HELM_HOME has been configured at /home/alejandro/.helm. - - Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster. - - Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy. - To prevent this, run `helm init` with the --tiller-tls-verify flag. - For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation + Warning: Tiller is already installed in the cluster. + (Use --client-only to suppress this message, or --upgrade to upgrade Tiller to the current version.) Happy Helming! - Waiting for deployment "tiller-deploy" rollout to finish: 0 of 1 updated replicas are available... deployment "tiller-deploy" successfully rolled out @@ -102,39 +90,39 @@ As you can see, we are running the Seldon Operator in the Kubeflow namespace. !helm install seldon-core-operator --namespace kubeflow --repo https://storage.googleapis.com/seldon-charts ``` - NAME: filled-hare - LAST DEPLOYED: Sun May 26 07:32:41 2019 + NAME: aspiring-chinchilla + LAST DEPLOYED: Mon May 27 16:15:38 2019 NAMESPACE: kubeflow STATUS: DEPLOYED RESOURCES: ==> v1/ClusterRole NAME AGE - seldon-operator-manager-role 1s + seldon-operator-manager-role 0s ==> v1/ClusterRoleBinding NAME AGE - seldon-operator-manager-rolebinding 1s + seldon-operator-manager-rolebinding 0s ==> v1/Pod(related) NAME READY STATUS RESTARTS AGE - seldon-operator-controller-manager-0 0/1 ContainerCreating 0 1s + seldon-operator-controller-manager-0 0/1 ContainerCreating 0 0s ==> v1/Secret NAME TYPE DATA AGE - seldon-operator-webhook-server-secret Opaque 0 1s + seldon-operator-webhook-server-secret Opaque 0 0s ==> v1/Service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE - seldon-operator-controller-manager-service ClusterIP 10.110.123.156 443/TCP 1s + seldon-operator-controller-manager-service ClusterIP 10.108.159.109 443/TCP 0s ==> v1/StatefulSet NAME READY AGE - seldon-operator-controller-manager 0/1 1s + seldon-operator-controller-manager 0/1 0s ==> v1beta1/CustomResourceDefinition NAME AGE - seldondeployments.machinelearning.seldon.io 1s + seldondeployments.machinelearning.seldon.io 0s NOTES: @@ -150,7 +138,7 @@ Check all the Seldon Deployment is running !kubectl get pod -n kubeflow | grep seldon ``` - seldon-operator-controller-manager-0 1/1 Running 1 7s + seldon-operator-controller-manager-0 1/1 Running 0 15s ### Temporary fix for Argo image @@ -160,6 +148,7 @@ At the time of writing we need to make some updates in the Argo images with the (This basically changes the images to the latest ones, otherwise we will get an error when we attach the volume) + ```python !kubectl -n kubeflow patch deployments. workflow-controller --patch '{"spec": {"template": {"spec": {"containers": [{"name": "workflow-controller", "image": "argoproj/workflow-controller:v2.3.0-rc3"}]}}}}' !kubectl -n kubeflow patch deployments. ml-pipeline --patch '{"spec": {"template": {"spec": {"containers": [{"name": "ml-pipeline-api-server", "image": "elikatsis/ml-pipeline-api-server:0.1.18-pick-1289"}]}}}}' @@ -174,27 +163,27 @@ The last command you need to run actually needs to be manual as the patch cannot You need to run the edit commad and change the executorImage to: `argoproj/argoexec:v2.3.0-rc3` -The exact edit command is: - +The command should be run from a terminal: + ``` kubectl edit configmaps workflow-controller-configmap -n kubeflow ``` -# 2) Test and build all our reusable pipeline steps +## 2) Test and build all our reusable pipeline steps We will start by building each of the components in our ML pipeline. ![](img/kubeflow-seldon-nlp-reusable-components.jpg) -## Let's first have a look at our clean_text step: +### Let's first have a look at our clean_text step: + ```python !ls pipeline/pipeline_steps/clean_text/ ``` - Transformer.py __pycache__ pipeline_step.py - __init__.py build_image.sh requirements.txt + Transformer.py __init__.py build_image.sh pipeline_step.py requirements.txt Like in this step, all of the other steps can be found in the `pipeline/pipeline_steps/` folder, and all have the following structure: @@ -206,6 +195,7 @@ Like in this step, all of the other steps can be found in the `pipeline/pipeline ### Let's check out the CLI for clean_text + ```python !python pipeline/pipeline_steps/clean_text/pipeline_step.py --help ``` @@ -221,6 +211,7 @@ Like in this step, all of the other steps can be found in the `pipeline/pipeline This is actually a very simple file, as we are using the click library to define the commands: + ```python !cat pipeline/pipeline_steps/clean_text/pipeline_step.py ``` @@ -265,7 +256,7 @@ If you want to understand how the CLI pipeline talks to each other, have a look pipeline/pipeline_tests/test_pipeline.py . [100%] - ==================== 1 passed, 9 warnings in 12.89 seconds ===================== + ===================== 1 passed, 9 warnings in 3.26 seconds ===================== To build the image we provide a build script in each of the steps that contains the instructions: @@ -285,7 +276,8 @@ The only thing you need to make sure is that Seldon knows how to wrap the right This can be achieved with the s2i/environment file. -As you can see, here we just tell it we want it to use the Transformer file: +As you can see, here we just tell it we want it to use our `Transformer.py` file: + ```python @@ -298,11 +290,9 @@ As you can see, here we just tell it we want it to use the Transformer file: PERSISTENCE=0 -That's it! Quite simple right? +Once this is defined, the only thing we need to do is to run the `build_image.sh` for all the reusable components. -The only thing we need to do is to run the `build_image.sh` for all the reusable components. - -Here we show the manual way to do it, but we recommend to just run `make build_pipeline_steps`. +Here we show the manual way to do it: ```bash @@ -315,47 +305,25 @@ cd ../spacy_tokenize && ./build_image.sh cd ../tfidf_vectorizer && ./build_image.sh ``` - /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/pipeline/pipeline_steps/clean_text - - - ---> Installing application source... - ---> Installing dependencies ... - Looking in links: /whl - Collecting dill==0.2.9 (from -r requirements.txt (line 1)) - WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme. - Downloading https://files.pythonhosted.org/packages/fe/42/bfe2e0857bc284cbe6a011d93f2a9ad58a22cb894461b199ae72cfef0f29/dill-0.2.9.tar.gz (150kB) - Requirement already satisfied: click in /usr/local/lib/python3.6/site-packages (from -r requirements.txt (line 2)) (7.0) - Requirement already satisfied: numpy in /usr/local/lib/python3.6/site-packages (from -r requirements.txt (line 3)) (1.16.3) - Building wheels for collected packages: dill - Building wheel for dill (setup.py): started - Building wheel for dill (setup.py): finished with status 'done' - Stored in directory: /root/.cache/pip/wheels/5b/d7/0f/e58eae695403de585269f4e4a94e0cd6ca60ec0c202936fa4a - Successfully built dill - Installing collected packages: dill - Successfully installed dill-0.2.9 - WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme. - WARNING: You are using pip version 19.1, however version 19.1.1 is available. - You should consider upgrading via the 'pip install --upgrade pip' command. - Build completed successfully - - -# 3) Train our NLP Pipeline through the Kubeflow UI +## 3) Train our NLP Pipeline through the Kubeflow UI We can access the Kubeflow dashboard to train our ML pipeline via http://localhost/_/pipeline-dashboard If you can't edit this, you need to make sure that the ambassador gateway service is accessible: + ```python !kubectl get svc ambassador -n kubeflow ``` - NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE - ambassador NodePort 10.106.32.40 80:31729/TCP 4m22s + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE + ambassador NodePort 10.108.204.59 80:31357/TCP 7m8s In my case, I need to change the kind from `NodePort` into `LoadBalancer` which can be done with the following command: + ```python !kubectl patch svc ambassador --type='json' -p '[{"op":"replace","path":"/spec/type","value":"LoadBalancer"}]' -n kubeflow ``` @@ -366,15 +334,16 @@ In my case, I need to change the kind from `NodePort` into `LoadBalancer` which Now that I've changed it to a loadbalancer, it has allocated the external IP as my localhost so I can access it at http://localhost/_/pipeline-dashboard + ```python !kubectl get svc ambassador -n kubeflow ``` - NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE - ambassador LoadBalancer 10.106.32.40 localhost 80:31729/TCP 4m28s + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE + ambassador LoadBalancer 10.108.204.59 localhost 80:31357/TCP 7m36s -If this was successfull, you should see the following screen: +If this was successfull, you should be able to access the dashboard ![](img/k-pipeline-dashboard.jpg) @@ -389,7 +358,6 @@ ls train_pipeline/ nlp_pipeline.py.tar.gz - Now that we've built our steps, we can actually train our ML pipeline, which looks as follows: ![](img/kubeflow-seldon-nlp-ml-pipelines-training.jpg) @@ -409,12 +377,13 @@ The pipeline saves the output of the pipeline together with the trained model in The persistent volume claim is the same name as the argo workflow: + ```python !kubectl get workflow -n kubeflow ``` NAME AGE - nlp-78k79 45s + nlp-jvfdd 1m Our workflow is there! So we can actually access it by running @@ -424,7 +393,7 @@ Our workflow is there! So we can actually access it by running !kubectl get workflow -n kubeflow -o jsonpath='{.items[0].metadata.name}' ``` - nlp-77bln + nlp-jvfdd And we can use good old `sed` to insert this workflow name in our PVC-Access controler which we can use to inspect the contents of the volume: @@ -448,7 +417,7 @@ And we can use good old `sed` to insert this workflow name in our PVC-Access con volumes: - name: mypvc persistentVolumeClaim: - claimName: nlp-77bln + claimName: nlp-jvfdd-my-pvc We just need to apply this container with our kubectl command, and we can use it to inspect the mounted folder: @@ -467,10 +436,8 @@ We just need to apply this container with our kubectl command, and we can use it ``` NAME READY STATUS RESTARTS AGE - pvc-access-container 1/1 Running 0 11s - + pvc-access-container 1/1 Running 0 6s -Now we can actually see what are the files located in the pvc that the pipeline used: ```python @@ -489,7 +456,7 @@ Now we can actually see what are the files located in the pvc that the pipeline pod "pvc-access-container" deleted -# 4) Deploying your ML Pipeline with Seldon +## 4) Deploying your ML Pipeline with Seldon Now that we have trained our ML pipeline, it's time to deploy it at scale! For this we will just need to create a simple Graph definition using the SeldonDeploy Kubernetes Custom Resource Definition. @@ -506,6 +473,7 @@ If we look at the file we'll be using to deploy our pipeline, we can see that it 2) DAG (directed acyclic graph) definition for REST pipeline: cleantext -> spacytokenizer -> tfidfvectorizer -> lrclassifier + ```python !cat deploy_pipeline/seldon_production_pipeline.yaml ``` @@ -588,6 +556,7 @@ This is the exact same structure as the Kubeflow definition, and can be deployed Once again, we want to make sure we replace the "PVC_NAME" variable with the workflow ID to attach the container to the Seldon pipeline + ```python !sed "s/PVC_NAME/"$(kubectl get workflow -n kubeflow -o jsonpath='{.items[0].metadata.name}')"-my-pvc/g" deploy_pipeline/seldon_production_pipeline.yaml | kubectl -n kubeflow apply -f - ``` @@ -598,25 +567,27 @@ Once again, we want to make sure we replace the "PVC_NAME" variable with the wor We now make sure that the Seldon Engine with the 4 reusable components are running: + ```python !kubectl -n kubeflow get pods | grep nlp-classifier ``` - nlp-classifier-single-model-51fb0cb-57fbcdd44f-gkxx7 5/5 Running 0 59s + nlp-classifier-single-model-51fb0cb-6cf49fdd7d-txlc8 5/5 Running 0 27s We can also find this with the SeldonDeployment custom resource definition + ```python !kubectl -n kubeflow get seldondeployment ``` NAME AGE - nlp-classifier 1m + nlp-classifier 40s -# 5) Test Deployed ML REST Endpoints +## 5) Test Deployed ML REST Endpoints Now that it's running we have a production ML text pipeline that we can Query using REST and GRPC We can interact with our API in two ways: @@ -626,13 +597,15 @@ We can interact with our API in two ways: 2) Using the Python SeldonClient ### Using CURL from the terminal -When using CURL, the only thing we need to provide is the data in JSON format, as well as the url, which is: +When using CURL, the only thing we need to provide is the data in JSON format, as well as the url, which is of the format: ``` http:///seldon/kubeflow//api/v0.1/predictions ``` + + ```bash %%bash #!curl -H \"Content-Type: application/x-www-form-urlencoded\" -g localhost/seldon/kubeflow/nlp-classifier/api/v0.1/predictions -d 'json={\"data\":{\"ndarray\":[[\"Hello this is some text to test\"]]}}' @@ -643,7 +616,7 @@ curl -X POST -H 'Content-Type: application/json' \ { "meta": { - "puid": "rdp3vmdo20g6ihjbu6nub1m3ra", + "puid": "9f7cnfoj2cdk1e052l428s3f7i", "tags": { }, "routing": { @@ -661,13 +634,13 @@ curl -X POST -H 'Content-Type: application/json' \ }, "data": { "names": ["t:0", "t:1"], - "ndarray": [[0.6729278313299858, 0.32707216867001415]] + "ndarray": [[0.6729294030193711, 0.3270705969806289]] } } % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed - 100 600 100 528 100 72 816 111 --:--:-- --:--:-- --:--:-- 927 + 100 599 100 527 100 72 918 125 --:--:-- --:--:-- --:--:-- 1043 ### Using the SeldonClient @@ -686,7 +659,7 @@ deployment_name="nlp-classifier" transport="rest" namespace="kubeflow" -sc = seldon_core.seldon_client.SeldonClient( +sc = SeldonClient( gateway="ambassador", ambassador_endpoint=host + ":" + port, namespace=namespace) @@ -701,11 +674,6 @@ client_prediction = sc.predict( print(client_prediction) ``` - http://localhost:80/seldon/kubeflow/nlp-classifier/api/v0.1/predictions - Paload: - {'data': {'names': ['text'], 'ndarray': ['Hello world this is a test']}} - HEADERS: - None Success:True message: Request: data { @@ -719,7 +687,7 @@ print(client_prediction) Response: meta { - puid: "slbdab0olpvupib0p2f1raju2s" + puid: "5ppdl2ff869fnn6l0n59qspck7" routing { key: "cleantext" value: -1 @@ -756,10 +724,10 @@ print(client_prediction) values { list_value { values { - number_value: 0.6729278313299858 + number_value: 0.6729294030193711 } values { - number_value: 0.32707216867001415 + number_value: 0.3270705969806289 } } } @@ -768,9 +736,4 @@ print(client_prediction) -# You now have a full end-to-end training and production NLP pipeline 😎 - - -```python - -``` +## You now have a full end-to-end training and production NLP pipeline 😎 diff --git a/examples/kubeflow/kubeflow_seldon_e2e_pipeline.ipynb b/examples/kubeflow/kubeflow_seldon_e2e_pipeline.ipynb index 88c1360029..f4d955f1e7 100644 --- a/examples/kubeflow/kubeflow_seldon_e2e_pipeline.ipynb +++ b/examples/kubeflow/kubeflow_seldon_e2e_pipeline.ipynb @@ -4,17 +4,25 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Kubeflow NLP end-to-end with Seldon\n", + "# End-to-end Reusable ML Pipeline with Seldon and Kubeflow\n", "\n", "In this example we showcase how to build re-usable components to build an ML pipeline that can be trained and deployed at scale.\n", "\n", "We will automate content moderation on the Reddit comments in /r/science building a machine learning NLP model with the following components:\n", "\n", - "![](img/kubeflow-seldon-nlp-reusable-components.jpg)\n", + "![](img/completed-pipeline.jpg)\n", "\n", "This tutorial will break down in the following sections:\n", "\n", - "1) TODO\n", + "1) Run all the services (Kubeflow and Seldon)\n", + "\n", + "2) Test and build all our reusable pipeline steps\n", + "\n", + "3) Train our NLP Pipeline with Kubeflow\n", + "\n", + "4) Deploying your ML Pipeline with Seldon\n", + "\n", + "5) Test Deployed ML REST Endpoints\n", "\n", "Let's get started! 🚀🔥\n", "\n", @@ -32,60 +40,12 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "metadata": { "scrolled": true }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Collecting https://storage.googleapis.com/ml-pipeline/release/0.1.20/kfp.tar.gz (from -r requirements-dev.txt (line 2))\n", - " Using cached https://storage.googleapis.com/ml-pipeline/release/0.1.20/kfp.tar.gz\n", - "Requirement already satisfied (use --upgrade to upgrade): kfp==0.1.20 from https://storage.googleapis.com/ml-pipeline/release/0.1.20/kfp.tar.gz in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from -r requirements-dev.txt (line 2))\n", - "Requirement already satisfied: python-dateutil in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from -r requirements-dev.txt (line 1)) (2.8.0)\n", - "Requirement already satisfied: kubernetes in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from -r requirements-dev.txt (line 3)) (9.0.0)\n", - "Requirement already satisfied: click in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from -r requirements-dev.txt (line 4)) (7.0)\n", - "Requirement already satisfied: urllib3<1.25,>=1.15 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.24.2)\n", - "Requirement already satisfied: six>=1.10 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.12.0)\n", - "Requirement already satisfied: certifi in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (2019.3.9)\n", - "Requirement already satisfied: PyYAML in /home/alejandro/.local/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (3.13)\n", - "Requirement already satisfied: google-cloud-storage>=1.13.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.13.0)\n", - "Requirement already satisfied: PyJWT>=1.6.4 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.7.1)\n", - "Requirement already satisfied: cryptography>=2.4.2 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (2.6.1)\n", - "Requirement already satisfied: google-auth>=1.6.1 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.6.3)\n", - "Requirement already satisfied: requests_toolbelt>=0.8.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (0.9.1)\n", - "Requirement already satisfied: kfp-server-api<0.1.19,>=0.1.18 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kfp==0.1.20->-r requirements-dev.txt (line 2)) (0.1.18.2)\n", - "Requirement already satisfied: setuptools>=21.0.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kubernetes->-r requirements-dev.txt (line 3)) (41.0.0)\n", - "Requirement already satisfied: requests-oauthlib in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kubernetes->-r requirements-dev.txt (line 3)) (1.2.0)\n", - "Requirement already satisfied: websocket-client!=0.40.0,!=0.41.*,!=0.42.*,>=0.32.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kubernetes->-r requirements-dev.txt (line 3)) (0.56.0)\n", - "Requirement already satisfied: requests in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from kubernetes->-r requirements-dev.txt (line 3)) (2.21.0)\n", - "Requirement already satisfied: google-resumable-media>=0.3.1 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-cloud-storage>=1.13.0->kfp==0.1.20->-r requirements-dev.txt (line 2)) (0.3.2)\n", - "Requirement already satisfied: google-cloud-core<0.29dev,>=0.28.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-cloud-storage>=1.13.0->kfp==0.1.20->-r requirements-dev.txt (line 2)) (0.28.1)\n", - "Requirement already satisfied: google-api-core<2.0.0dev,>=0.1.1 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-cloud-storage>=1.13.0->kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.11.0)\n", - "Requirement already satisfied: asn1crypto>=0.21.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from cryptography>=2.4.2->kfp==0.1.20->-r requirements-dev.txt (line 2)) (0.24.0)\n", - "Requirement already satisfied: cffi!=1.11.3,>=1.8 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from cryptography>=2.4.2->kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.12.3)\n", - "Requirement already satisfied: rsa>=3.1.4 in /home/alejandro/.local/lib/python3.7/site-packages (from google-auth>=1.6.1->kfp==0.1.20->-r requirements-dev.txt (line 2)) (3.4.2)\n", - "Requirement already satisfied: pyasn1-modules>=0.2.1 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-auth>=1.6.1->kfp==0.1.20->-r requirements-dev.txt (line 2)) (0.2.5)\n", - "Requirement already satisfied: cachetools>=2.0.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-auth>=1.6.1->kfp==0.1.20->-r requirements-dev.txt (line 2)) (3.1.0)\n", - "Requirement already satisfied: oauthlib>=3.0.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from requests-oauthlib->kubernetes->-r requirements-dev.txt (line 3)) (3.0.1)\n", - "Requirement already satisfied: idna<2.9,>=2.5 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from requests->kubernetes->-r requirements-dev.txt (line 3)) (2.8)\n", - "Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from requests->kubernetes->-r requirements-dev.txt (line 3)) (3.0.4)\n", - "Requirement already satisfied: pytz in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-api-core<2.0.0dev,>=0.1.1->google-cloud-storage>=1.13.0->kfp==0.1.20->-r requirements-dev.txt (line 2)) (2019.1)\n", - "Requirement already satisfied: googleapis-common-protos!=1.5.4,<2.0dev,>=1.5.3 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-api-core<2.0.0dev,>=0.1.1->google-cloud-storage>=1.13.0->kfp==0.1.20->-r requirements-dev.txt (line 2)) (1.6.0)\n", - "Requirement already satisfied: protobuf>=3.4.0 in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from google-api-core<2.0.0dev,>=0.1.1->google-cloud-storage>=1.13.0->kfp==0.1.20->-r requirements-dev.txt (line 2)) (3.6.1)\n", - "Requirement already satisfied: pycparser in /home/alejandro/miniconda3/envs/reddit-classification/lib/python3.7/site-packages (from cffi!=1.11.3,>=1.8->cryptography>=2.4.2->kfp==0.1.20->-r requirements-dev.txt (line 2)) (2.19)\n", - "Requirement already satisfied: pyasn1>=0.1.3 in /home/alejandro/.local/lib/python3.7/site-packages (from rsa>=3.1.4->google-auth>=1.6.1->kfp==0.1.20->-r requirements-dev.txt (line 2)) (0.4.5)\n", - "Building wheels for collected packages: kfp\n", - " Building wheel for kfp (setup.py) ... \u001b[?25ldone\n", - "\u001b[?25h Stored in directory: /tmp/pip-ephem-wheel-cache-4b2ca_6e/wheels/ae/bb/02/32b1356ee756181099d8f1b0950ac6567cb2b38e71b48f02e8\n", - "Successfully built kfp\n" - ] - } - ], + "outputs": [], "source": [ - "# You can also install the python dependencies that we'll need to build and test:\n", "!pip install -r requirements-dev.txt" ] }, @@ -93,17 +53,25 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Create project\n", + "## 1) Run all the services (Kubeflow and Seldon)\n", "Kubeflow's CLI allows us to create a project which will allow us to build the configuration we need to deploy our kubeflow and seldon clusters." ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": { "scrolled": true }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "app.yaml\r\n" + ] + } + ], "source": [ "!kfctl init kubeflow-seldon\n", "!ls kubeflow-seldon" @@ -122,358 +90,11 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": { "scrolled": true }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "time=\"2019-05-25T18:24:21+01:00\" level=info msg=\"reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml\" filename=\"coordinator/coordinator.go:341\"\n", - "time=\"2019-05-25T18:24:21+01:00\" level=info msg=\"reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml\" filename=\"coordinator/coordinator.go:341\"\n", - "time=\"2019-05-25T18:24:21+01:00\" level=info msg=\"Ksonnet.Generate Name kubeflow-seldon AppDir /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon Platform \" filename=\"ksonnet/ksonnet.go:369\"\n", - "time=\"2019-05-25T18:24:21+01:00\" level=info msg=\"Creating environment \\\"default\\\" with namespace \\\"kubeflow\\\", pointing to \\\"version:v1.13.0\\\" cluster at address \\\"https://localhost:6445\\\"\" filename=\"env/create.go:77\"\n", - "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Generating ksonnet-lib data at path '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/lib/ksonnet-lib/v1.13.0'\" filename=\"lib/lib.go:148\"\n", - "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Successfully initialized the app kubeflow-seldon.\" filename=\"ksonnet/ksonnet.go:505\"\n", - "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"App kubeflow-seldon add registry kubeflow URI /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/.cache/v0.5.1/kubeflow\" filename=\"ksonnet/ksonnet.go:621\"\n", - "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 6 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 22 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 9 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 35 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 49 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 6 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 4 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 4 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 9 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 14 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 6 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 17 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 8 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 12 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Retrieved 4 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Creating Component: ambassador ...\" filename=\"ksonnet/ksonnet.go:207\"\n", - "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Args: [ambassador ambassador]\" filename=\"ksonnet/ksonnet.go:208\"\n", - "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/ambassador.jsonnet'\" filename=\"component/create.go:92\"\n", - "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Creating Component: argo ...\" filename=\"ksonnet/ksonnet.go:207\"\n", - "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Args: [argo argo]\" filename=\"ksonnet/ksonnet.go:208\"\n", - "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/argo.jsonnet'\" filename=\"component/create.go:92\"\n", - "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Creating Component: centraldashboard ...\" filename=\"ksonnet/ksonnet.go:207\"\n", - "time=\"2019-05-25T18:24:25+01:00\" level=info msg=\"Args: [centraldashboard centraldashboard]\" filename=\"ksonnet/ksonnet.go:208\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/centraldashboard.jsonnet'\" filename=\"component/create.go:92\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Creating Component: jupyter-web-app ...\" filename=\"ksonnet/ksonnet.go:207\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Args: [jupyter-web-app jupyter-web-app]\" filename=\"ksonnet/ksonnet.go:208\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/jupyter-web-app.jsonnet'\" filename=\"component/create.go:92\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Creating Component: katib ...\" filename=\"ksonnet/ksonnet.go:207\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Args: [katib katib]\" filename=\"ksonnet/ksonnet.go:208\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/katib.jsonnet'\" filename=\"component/create.go:92\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Creating Component: metacontroller ...\" filename=\"ksonnet/ksonnet.go:207\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Args: [metacontroller metacontroller]\" filename=\"ksonnet/ksonnet.go:208\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/metacontroller.jsonnet'\" filename=\"component/create.go:92\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Creating Component: notebook-controller ...\" filename=\"ksonnet/ksonnet.go:207\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Args: [notebook-controller notebook-controller]\" filename=\"ksonnet/ksonnet.go:208\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/notebook-controller.jsonnet'\" filename=\"component/create.go:92\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Creating Component: pipeline ...\" filename=\"ksonnet/ksonnet.go:207\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Args: [pipeline pipeline]\" filename=\"ksonnet/ksonnet.go:208\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/pipeline.jsonnet'\" filename=\"component/create.go:92\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Creating Component: pytorch-operator ...\" filename=\"ksonnet/ksonnet.go:207\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Args: [pytorch-operator pytorch-operator]\" filename=\"ksonnet/ksonnet.go:208\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/pytorch-operator.jsonnet'\" filename=\"component/create.go:92\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Creating Component: tensorboard ...\" filename=\"ksonnet/ksonnet.go:207\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Args: [tensorboard tensorboard]\" filename=\"ksonnet/ksonnet.go:208\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/tensorboard.jsonnet'\" filename=\"component/create.go:92\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Creating Component: tf-job-operator ...\" filename=\"ksonnet/ksonnet.go:207\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Args: [tf-job-operator tf-job-operator]\" filename=\"ksonnet/ksonnet.go:208\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/tf-job-operator.jsonnet'\" filename=\"component/create.go:92\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"deploying kubeflow application\" filename=\"cmd/apply.go:35\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml\" filename=\"coordinator/coordinator.go:341\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml\" filename=\"coordinator/coordinator.go:341\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"namespace: kubeflow\" filename=\"ksonnet/ksonnet.go:109\"\n", - "time=\"2019-05-25T18:24:26+01:00\" level=info msg=\"Creating namespace: kubeflow\" filename=\"ksonnet/ksonnet.go:112\"\n", - "time=\"2019-05-25T18:24:34+01:00\" level=info msg=\"Applying services kubeflow.ambassador\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:24:34+01:00\" level=info msg=\"Creating non-existent services kubeflow.ambassador\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:24:34+01:00\" level=info msg=\"Applying services kubeflow.ambassador-admin\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:24:34+01:00\" level=info msg=\"Creating non-existent services kubeflow.ambassador-admin\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:24:34+01:00\" level=info msg=\"Applying clusterroles ambassador\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:24:34+01:00\" level=info msg=\"Creating non-existent clusterroles ambassador\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:24:34+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.ambassador\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:24:34+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.ambassador\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:24:34+01:00\" level=info msg=\"Applying clusterrolebindings ambassador\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:24:34+01:00\" level=info msg=\"Creating non-existent clusterrolebindings ambassador\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:24:35+01:00\" level=info msg=\"Applying deployments kubeflow.ambassador\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:24:35+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.ambassador\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:24:35+01:00\" level=info msg=\"Component ambassador apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", - "time=\"2019-05-25T18:24:41+01:00\" level=info msg=\"Applying customresourcedefinitions workflows.argoproj.io\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:24:41+01:00\" level=info msg=\"Creating non-existent customresourcedefinitions workflows.argoproj.io\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:24:45+01:00\" level=info msg=\"Applying clusterrolebindings argo\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:24:45+01:00\" level=info msg=\"Creating non-existent clusterrolebindings argo\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:24:45+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.argo-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:24:45+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.argo-ui\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:24:45+01:00\" level=info msg=\"Applying services kubeflow.argo-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:24:45+01:00\" level=info msg=\"Creating non-existent services kubeflow.argo-ui\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Applying configmaps kubeflow.workflow-controller-configmap\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Creating non-existent configmaps kubeflow.workflow-controller-configmap\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.argo\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.argo\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Applying clusterroles argo\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Creating non-existent clusterroles argo\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Applying clusterroles argo-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Creating non-existent clusterroles argo-ui\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Applying clusterrolebindings argo-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Creating non-existent clusterrolebindings argo-ui\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Applying deployments kubeflow.workflow-controller\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.workflow-controller\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Applying deployments kubeflow.argo-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.argo-ui\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:24:46+01:00\" level=info msg=\"Component argo apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", - "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Applying clusterrolebindings centraldashboard\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Creating non-existent clusterrolebindings centraldashboard\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Applying services kubeflow.centraldashboard\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Creating non-existent services kubeflow.centraldashboard\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.centraldashboard\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.centraldashboard\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Applying roles kubeflow.centraldashboard\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Creating non-existent roles kubeflow.centraldashboard\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Applying rolebindings kubeflow.centraldashboard\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Creating non-existent rolebindings kubeflow.centraldashboard\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Applying clusterroles centraldashboard\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Creating non-existent clusterroles centraldashboard\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Applying deployments kubeflow.centraldashboard\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.centraldashboard\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:24:53+01:00\" level=info msg=\"Component centraldashboard apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", - "time=\"2019-05-25T18:24:59+01:00\" level=info msg=\"Applying services kubeflow.jupyter-web-app\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:24:59+01:00\" level=info msg=\"Creating non-existent services kubeflow.jupyter-web-app\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:24:59+01:00\" level=info msg=\"Applying deployments kubeflow.jupyter-web-app\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:24:59+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.jupyter-web-app\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:24:59+01:00\" level=info msg=\"Applying configmaps kubeflow.jupyter-web-app-config\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:24:59+01:00\" level=info msg=\"Creating non-existent configmaps kubeflow.jupyter-web-app-config\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:24:59+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.jupyter-web-app\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:24:59+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.jupyter-web-app\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:00+01:00\" level=info msg=\"Applying clusterrolebindings jupyter-web-app-binding\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:00+01:00\" level=info msg=\"Creating non-existent clusterrolebindings jupyter-web-app-binding\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:00+01:00\" level=info msg=\"Applying clusterroles jupyter-web-app-cluster-role\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:00+01:00\" level=info msg=\"Creating non-existent clusterroles jupyter-web-app-cluster-role\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:00+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.jupyter-notebook\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:00+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.jupyter-notebook\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:00+01:00\" level=info msg=\"Applying roles kubeflow.jupyter-notebook-role\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:00+01:00\" level=info msg=\"Creating non-existent roles kubeflow.jupyter-notebook-role\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:00+01:00\" level=info msg=\"Applying rolebindings kubeflow.jupyter-notebook-role-binding\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:00+01:00\" level=info msg=\"Creating non-existent rolebindings kubeflow.jupyter-notebook-role-binding\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:00+01:00\" level=info msg=\"Component jupyter-web-app apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", - "time=\"2019-05-25T18:25:10+01:00\" level=info msg=\"Applying clusterroles metrics-collector\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:10+01:00\" level=info msg=\"Creating non-existent clusterroles metrics-collector\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Applying services kubeflow.studyjob-controller\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Creating non-existent services kubeflow.studyjob-controller\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Applying services kubeflow.vizier-db\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Creating non-existent services kubeflow.vizier-db\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Applying persistentvolumeclaims kubeflow.katib-mysql\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Creating non-existent persistentvolumeclaims kubeflow.katib-mysql\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Applying clusterrolebindings studyjob-controller\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Creating non-existent clusterrolebindings studyjob-controller\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Applying secrets kubeflow.vizier-db-secrets\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Creating non-existent secrets kubeflow.vizier-db-secrets\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Applying clusterroles vizier-core\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Creating non-existent clusterroles vizier-core\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Applying clusterrolebindings vizier-core\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Creating non-existent clusterrolebindings vizier-core\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.vizier-core\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.vizier-core\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Applying services kubeflow.vizier-core-rest\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Creating non-existent services kubeflow.vizier-core-rest\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.studyjob-controller\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.studyjob-controller\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:11+01:00\" level=info msg=\"Applying services kubeflow.katib-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:12+01:00\" level=info msg=\"Creating non-existent services kubeflow.katib-ui\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:12+01:00\" level=info msg=\"Applying clusterroles studyjob-controller\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:12+01:00\" level=info msg=\"Creating non-existent clusterroles studyjob-controller\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:12+01:00\" level=info msg=\"Applying clusterroles katib-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:12+01:00\" level=info msg=\"Creating non-existent clusterroles katib-ui\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:12+01:00\" level=info msg=\"Applying clusterrolebindings katib-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:12+01:00\" level=info msg=\"Creating non-existent clusterrolebindings katib-ui\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:12+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.katib-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:12+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.katib-ui\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:12+01:00\" level=info msg=\"Applying services kubeflow.vizier-suggestion-random\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:12+01:00\" level=info msg=\"Creating non-existent services kubeflow.vizier-suggestion-random\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:13+01:00\" level=info msg=\"Applying services kubeflow.vizier-core\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:13+01:00\" level=info msg=\"Creating non-existent services kubeflow.vizier-core\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:13+01:00\" level=info msg=\"Applying services kubeflow.vizier-suggestion-grid\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:13+01:00\" level=info msg=\"Creating non-existent services kubeflow.vizier-suggestion-grid\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:13+01:00\" level=info msg=\"Applying configmaps kubeflow.metricscollector-template\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:14+01:00\" level=info msg=\"Creating non-existent configmaps kubeflow.metricscollector-template\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:14+01:00\" level=info msg=\"Applying services kubeflow.vizier-suggestion-hyperband\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:14+01:00\" level=info msg=\"Creating non-existent services kubeflow.vizier-suggestion-hyperband\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:14+01:00\" level=info msg=\"Applying clusterrolebindings metrics-collector\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:14+01:00\" level=info msg=\"Creating non-existent clusterrolebindings metrics-collector\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:14+01:00\" level=info msg=\"Applying services kubeflow.vizier-suggestion-bayesianoptimization\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:14+01:00\" level=info msg=\"Creating non-existent services kubeflow.vizier-suggestion-bayesianoptimization\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:15+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.metrics-collector\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:15+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.metrics-collector\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:15+01:00\" level=info msg=\"Applying customresourcedefinitions studyjobs.kubeflow.org\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:15+01:00\" level=info msg=\"Creating non-existent customresourcedefinitions studyjobs.kubeflow.org\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:15+01:00\" level=info msg=\"Applying configmaps kubeflow.worker-template\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:15+01:00\" level=info msg=\"Creating non-existent configmaps kubeflow.worker-template\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:15+01:00\" level=info msg=\"Applying deployments kubeflow.vizier-suggestion-bayesianoptimization\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:15+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.vizier-suggestion-bayesianoptimization\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:15+01:00\" level=info msg=\"Applying deployments kubeflow.vizier-suggestion-hyperband\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:15+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.vizier-suggestion-hyperband\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:16+01:00\" level=info msg=\"Applying deployments kubeflow.vizier-suggestion-grid\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:16+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.vizier-suggestion-grid\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:16+01:00\" level=info msg=\"Applying deployments kubeflow.katib-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:16+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.katib-ui\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:16+01:00\" level=info msg=\"Applying deployments kubeflow.vizier-core-rest\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:16+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.vizier-core-rest\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:16+01:00\" level=info msg=\"Applying deployments kubeflow.vizier-db\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:16+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.vizier-db\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:16+01:00\" level=info msg=\"Applying deployments kubeflow.studyjob-controller\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:16+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.studyjob-controller\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:16+01:00\" level=info msg=\"Applying deployments kubeflow.vizier-core\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:16+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.vizier-core\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:17+01:00\" level=info msg=\"Applying deployments kubeflow.vizier-suggestion-random\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:17+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.vizier-suggestion-random\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:17+01:00\" level=info msg=\"Component katib apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", - "time=\"2019-05-25T18:25:30+01:00\" level=info msg=\"Applying customresourcedefinitions compositecontrollers.metacontroller.k8s.io\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:30+01:00\" level=info msg=\"Creating non-existent customresourcedefinitions compositecontrollers.metacontroller.k8s.io\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:30+01:00\" level=info msg=\"Applying customresourcedefinitions controllerrevisions.metacontroller.k8s.io\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:30+01:00\" level=info msg=\"Creating non-existent customresourcedefinitions controllerrevisions.metacontroller.k8s.io\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:30+01:00\" level=info msg=\"Applying customresourcedefinitions decoratorcontrollers.metacontroller.k8s.io\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:30+01:00\" level=info msg=\"Creating non-existent customresourcedefinitions decoratorcontrollers.metacontroller.k8s.io\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:30+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.meta-controller-service\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:30+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.meta-controller-service\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:30+01:00\" level=info msg=\"Applying clusterrolebindings meta-controller-cluster-role-binding\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:30+01:00\" level=info msg=\"Creating non-existent clusterrolebindings meta-controller-cluster-role-binding\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:30+01:00\" level=info msg=\"Applying statefulsets kubeflow.metacontroller\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:30+01:00\" level=info msg=\"Creating non-existent statefulsets kubeflow.metacontroller\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:30+01:00\" level=info msg=\"Component metacontroller apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", - "time=\"2019-05-25T18:25:37+01:00\" level=info msg=\"Applying customresourcedefinitions notebooks.kubeflow.org\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:37+01:00\" level=info msg=\"Creating non-existent customresourcedefinitions notebooks.kubeflow.org\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:42+01:00\" level=info msg=\"Applying services kubeflow.notebooks-controller\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:45+01:00\" level=info msg=\"Creating non-existent services kubeflow.notebooks-controller\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:47+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.notebook-controller\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:47+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.notebook-controller\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:25:57+01:00\" level=info msg=\"Applying deployments kubeflow.notebooks-controller\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:25:58+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.notebooks-controller\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:00+01:00\" level=info msg=\"Applying clusterroles notebooks-controller\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:00+01:00\" level=info msg=\"Creating non-existent clusterroles notebooks-controller\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:00+01:00\" level=info msg=\"Applying clusterrolebindings notebooks-controller\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:00+01:00\" level=info msg=\"Creating non-existent clusterrolebindings notebooks-controller\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:00+01:00\" level=info msg=\"Component notebook-controller apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", - "time=\"2019-05-25T18:26:08+01:00\" level=info msg=\"Applying services kubeflow.minio-service\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:08+01:00\" level=info msg=\"Creating non-existent services kubeflow.minio-service\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:08+01:00\" level=info msg=\"Applying deployments kubeflow.minio\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:08+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.minio\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:08+01:00\" level=info msg=\"Applying secrets kubeflow.mlpipeline-minio-artifact\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:08+01:00\" level=info msg=\"Creating non-existent secrets kubeflow.mlpipeline-minio-artifact\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:08+01:00\" level=info msg=\"Applying services kubeflow.mysql\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:08+01:00\" level=info msg=\"Creating non-existent services kubeflow.mysql\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:08+01:00\" level=info msg=\"Applying deployments kubeflow.mysql\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:08+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.mysql\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:09+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:09+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:09+01:00\" level=info msg=\"Applying rolebindings kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:09+01:00\" level=info msg=\"Creating non-existent rolebindings kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:09+01:00\" level=info msg=\"Applying roles kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:09+01:00\" level=info msg=\"Creating non-existent roles kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:09+01:00\" level=info msg=\"Applying services kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:09+01:00\" level=info msg=\"Creating non-existent services kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:10+01:00\" level=info msg=\"Applying deployments kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:10+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:10+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.pipeline-runner\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:10+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.pipeline-runner\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:10+01:00\" level=info msg=\"Applying clusterroles pipeline-runner\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:10+01:00\" level=info msg=\"Creating non-existent clusterroles pipeline-runner\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:10+01:00\" level=info msg=\"Applying clusterrolebindings pipeline-runner\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:10+01:00\" level=info msg=\"Creating non-existent clusterrolebindings pipeline-runner\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:11+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:11+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:11+01:00\" level=info msg=\"Applying clusterrolebindings ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:11+01:00\" level=info msg=\"Creating non-existent clusterrolebindings ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:11+01:00\" level=info msg=\"Applying roles kubeflow.ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:11+01:00\" level=info msg=\"Creating non-existent roles kubeflow.ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:11+01:00\" level=info msg=\"Applying deployments kubeflow.ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:11+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:12+01:00\" level=info msg=\"Applying customresourcedefinitions scheduledworkflows.kubeflow.org\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:12+01:00\" level=info msg=\"Creating non-existent customresourcedefinitions scheduledworkflows.kubeflow.org\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:12+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.ml-pipeline-persistenceagent\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:12+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.ml-pipeline-persistenceagent\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:13+01:00\" level=info msg=\"Applying clusterrolebindings ml-pipeline-persistenceagent\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:13+01:00\" level=info msg=\"Creating non-existent clusterrolebindings ml-pipeline-persistenceagent\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:13+01:00\" level=info msg=\"Applying clusterroles ml-pipeline-persistenceagent\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:13+01:00\" level=info msg=\"Creating non-existent clusterroles ml-pipeline-persistenceagent\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:13+01:00\" level=info msg=\"Applying deployments kubeflow.ml-pipeline-persistenceagent\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:13+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.ml-pipeline-persistenceagent\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:13+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.ml-pipeline-viewer-crd-service-account\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:13+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.ml-pipeline-viewer-crd-service-account\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:13+01:00\" level=info msg=\"Applying clusterrolebindings ml-pipeline-viewer-crd-role-binding\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:13+01:00\" level=info msg=\"Creating non-existent clusterrolebindings ml-pipeline-viewer-crd-role-binding\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:13+01:00\" level=info msg=\"Applying clusterroles ml-pipeline-viewer-controller-role\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:13+01:00\" level=info msg=\"Creating non-existent clusterroles ml-pipeline-viewer-controller-role\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:14+01:00\" level=info msg=\"Applying deployments kubeflow.ml-pipeline-viewer-controller-deployment\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:14+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.ml-pipeline-viewer-controller-deployment\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:14+01:00\" level=info msg=\"Applying customresourcedefinitions viewers.kubeflow.org\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:14+01:00\" level=info msg=\"Creating non-existent customresourcedefinitions viewers.kubeflow.org\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:14+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:14+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:14+01:00\" level=info msg=\"Applying services kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:14+01:00\" level=info msg=\"Creating non-existent services kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:15+01:00\" level=info msg=\"Applying services kubeflow.ml-pipeline-tensorboard-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:15+01:00\" level=info msg=\"Creating non-existent services kubeflow.ml-pipeline-tensorboard-ui\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:15+01:00\" level=info msg=\"Applying rolebindings kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:15+01:00\" level=info msg=\"Creating non-existent rolebindings kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:16+01:00\" level=info msg=\"Applying roles kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:16+01:00\" level=info msg=\"Creating non-existent roles kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:16+01:00\" level=info msg=\"Applying deployments kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:16+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:16+01:00\" level=info msg=\"Applying persistentvolumeclaims kubeflow.mysql-pv-claim\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:16+01:00\" level=info msg=\"Creating non-existent persistentvolumeclaims kubeflow.mysql-pv-claim\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:16+01:00\" level=info msg=\"Applying persistentvolumeclaims kubeflow.minio-pvc\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:16+01:00\" level=info msg=\"Creating non-existent persistentvolumeclaims kubeflow.minio-pvc\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:16+01:00\" level=info msg=\"Component pipeline apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", - "time=\"2019-05-25T18:26:25+01:00\" level=info msg=\"Applying configmaps kubeflow.pytorch-operator-config\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:25+01:00\" level=info msg=\"Creating non-existent configmaps kubeflow.pytorch-operator-config\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:25+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.pytorch-operator\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:25+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.pytorch-operator\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:26+01:00\" level=info msg=\"Applying clusterroles pytorch-operator\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:26+01:00\" level=info msg=\"Creating non-existent clusterroles pytorch-operator\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:26+01:00\" level=info msg=\"Applying clusterrolebindings pytorch-operator\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:26+01:00\" level=info msg=\"Creating non-existent clusterrolebindings pytorch-operator\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:26+01:00\" level=info msg=\"Applying customresourcedefinitions pytorchjobs.kubeflow.org\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:26+01:00\" level=info msg=\"Creating non-existent customresourcedefinitions pytorchjobs.kubeflow.org\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:26+01:00\" level=info msg=\"Applying deployments kubeflow.pytorch-operator\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:26+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.pytorch-operator\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:26+01:00\" level=info msg=\"Component pytorch-operator apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", - "time=\"2019-05-25T18:26:42+01:00\" level=info msg=\"Applying services kubeflow.tensorboard\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:42+01:00\" level=info msg=\"Creating non-existent services kubeflow.tensorboard\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:43+01:00\" level=info msg=\"Applying deployments kubeflow.tensorboard\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:43+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.tensorboard\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:43+01:00\" level=info msg=\"Component tensorboard apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", - "time=\"2019-05-25T18:26:58+01:00\" level=info msg=\"Applying customresourcedefinitions tfjobs.kubeflow.org\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Creating non-existent customresourcedefinitions tfjobs.kubeflow.org\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.tf-job-dashboard\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.tf-job-dashboard\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Applying configmaps kubeflow.tf-job-operator-config\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Creating non-existent configmaps kubeflow.tf-job-operator-config\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.tf-job-operator\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.tf-job-operator\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Applying clusterroles tf-job-operator\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Creating non-existent clusterroles tf-job-operator\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Applying clusterrolebindings tf-job-operator\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Creating non-existent clusterrolebindings tf-job-operator\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Applying services kubeflow.tf-job-dashboard\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Creating non-existent services kubeflow.tf-job-dashboard\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Applying clusterroles tf-job-dashboard\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:26:59+01:00\" level=info msg=\"Creating non-existent clusterroles tf-job-dashboard\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:27:00+01:00\" level=info msg=\"Applying clusterrolebindings tf-job-dashboard\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:27:00+01:00\" level=info msg=\"Creating non-existent clusterrolebindings tf-job-dashboard\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:27:00+01:00\" level=info msg=\"Applying deployments kubeflow.tf-job-operator\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:27:00+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.tf-job-operator\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:27:01+01:00\" level=info msg=\"Applying deployments kubeflow.tf-job-dashboard\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-25T18:27:01+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.tf-job-dashboard\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-25T18:27:01+01:00\" level=info msg=\"Component tf-job-operator apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", - "time=\"2019-05-25T18:27:01+01:00\" level=info msg=\"All components apply succeeded\" filename=\"ksonnet/ksonnet.go:192\"\n" - ] - } - ], + "outputs": [], "source": [ "%%bash\n", "cd kubeflow-seldon\n", @@ -491,7 +112,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -499,14 +120,9 @@ "output_type": "stream", "text": [ "$HELM_HOME has been configured at /home/alejandro/.helm.\n", - "\n", - "Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.\n", - "\n", - "Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.\n", - "To prevent this, run `helm init` with the --tiller-tls-verify flag.\n", - "For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation\n", + "Warning: Tiller is already installed in the cluster.\n", + "(Use --client-only to suppress this message, or --upgrade to upgrade Tiller to the current version.)\n", "Happy Helming!\n", - "Waiting for deployment \"tiller-deploy\" rollout to finish: 0 of 1 updated replicas are available...\n", "deployment \"tiller-deploy\" successfully rolled out\n" ] } @@ -528,7 +144,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 5, "metadata": { "scrolled": true }, @@ -537,39 +153,39 @@ "name": "stdout", "output_type": "stream", "text": [ - "NAME: yummy-donkey\n", - "LAST DEPLOYED: Sat May 25 18:27:34 2019\n", + "NAME: aspiring-chinchilla\n", + "LAST DEPLOYED: Mon May 27 16:15:38 2019\n", "NAMESPACE: kubeflow\n", "STATUS: DEPLOYED\n", "\n", "RESOURCES:\n", "==> v1/ClusterRole\n", "NAME AGE\n", - "seldon-operator-manager-role 1s\n", + "seldon-operator-manager-role 0s\n", "\n", "==> v1/ClusterRoleBinding\n", "NAME AGE\n", - "seldon-operator-manager-rolebinding 1s\n", + "seldon-operator-manager-rolebinding 0s\n", "\n", "==> v1/Pod(related)\n", "NAME READY STATUS RESTARTS AGE\n", - "seldon-operator-controller-manager-0 0/1 ContainerCreating 0 1s\n", + "seldon-operator-controller-manager-0 0/1 ContainerCreating 0 0s\n", "\n", "==> v1/Secret\n", "NAME TYPE DATA AGE\n", - "seldon-operator-webhook-server-secret Opaque 0 1s\n", + "seldon-operator-webhook-server-secret Opaque 0 0s\n", "\n", "==> v1/Service\n", "NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\n", - "seldon-operator-controller-manager-service ClusterIP 10.105.250.206 443/TCP 1s\n", + "seldon-operator-controller-manager-service ClusterIP 10.108.159.109 443/TCP 0s\n", "\n", "==> v1/StatefulSet\n", "NAME READY AGE\n", - "seldon-operator-controller-manager 0/1 1s\n", + "seldon-operator-controller-manager 0/1 0s\n", "\n", "==> v1beta1/CustomResourceDefinition\n", "NAME AGE\n", - "seldondeployments.machinelearning.seldon.io 1s\n", + "seldondeployments.machinelearning.seldon.io 0s\n", "\n", "\n", "NOTES:\n", @@ -592,14 +208,14 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "seldon-operator-controller-manager-0 1/1 Running 1 52s\r\n" + "seldon-operator-controller-manager-0 1/1 Running 0 15s\r\n" ] } ], @@ -611,128 +227,71 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Train our NLP Pipeline with Kubeflow\n", - "We can access the Kubeflow dashboard to train our ML pipeline via http://localhost/_/pipeline-dashboard\n", + "### Temporary fix for Argo image\n", "\n", - "If you can't edit this, you need to make sure that the ambassador gateway service is accessible:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\r\n", - "ambassador NodePort 10.99.81.144 80:31713/TCP 9m13s\r\n" - ] - } - ], - "source": [ - "!kubectl get svc ambassador -n kubeflow" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In my case, I need to change the kind from `NodePort` into `LoadBalancer` which can be done with the following command:" + "At the time of writing we need to make some updates in the Argo images with the following commands below.\n", + "\n", + "(This basically changes the images to the latest ones, otherwise we will get an error when we attach the volume)\n" ] }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "service/ambassador patched\r\n" - ] - } - ], - "source": [ - "!kubectl patch svc ambassador --type='json' -p '[{\"op\":\"replace\",\"path\":\"/spec/type\",\"value\":\"LoadBalancer\"}]' -n kubeflow" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now that I've changed it to a loadbalancer, it has allocated the external IP as my localhost so I can access it at http://localhost/_/pipeline-dashboard" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\r\n", - "ambassador LoadBalancer 10.99.81.144 localhost 80:31713/TCP 10m\r\n" + "deployment.extensions/workflow-controller patched\n", + "deployment.extensions/ml-pipeline patched\n" ] } ], "source": [ - "!kubectl get svc ambassador -n kubeflow" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If this was successfull, you should see the following screen:\n", - "![](img/k-pipeline-dashboard.jpg)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Upload our NLP pipeline\n", - "To uplaod our NLP pipeline we must first create it. This will consist in two steps:\n", - " \n", - "x.1) Build all the docker images for each pipeline step\n", - "x.2) Build the Kubeflow pipeline file to upload through the dashboard\n", - "x.3) Run a new pipeline instance through the dashboard\n" + "!kubectl -n kubeflow patch deployments. workflow-controller --patch '{\"spec\": {\"template\": {\"spec\": {\"containers\": [{\"name\": \"workflow-controller\", \"image\": \"argoproj/workflow-controller:v2.3.0-rc3\"}]}}}}'\n", + "!kubectl -n kubeflow patch deployments. ml-pipeline --patch '{\"spec\": {\"template\": {\"spec\": {\"containers\": [{\"name\": \"ml-pipeline-api-server\", \"image\": \"elikatsis/ml-pipeline-api-server:0.1.18-pick-1289\"}]}}}}'\n", + "# !kubectl -n kubeflow patch configmaps workflow-controller-configmap --patch '{\"data\": {\"config\": \"{ executorImage: argoproj/argoexec:v2.3.0-rc3,artifactRepository:{s3: {bucket: mlpipeline,keyPrefix: artifacts,endpoint: minio-service.kubeflow:9000,insecure: true,accessKeySecret: {name: mlpipeline-minio-artifact,key: accesskey},secretKeySecret: {name: mlpipeline-minio-artifact,key: secretkey}}}}\" }}'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## x.1 Build all docker images for each pipeline step" + "The last command you need to run actually needs to be manual as the patch cannot change configmap contents directly\n", + "\n", + "You need to run the edit commad and change the executorImage to: `argoproj/argoexec:v2.3.0-rc3`\n", + "\n", + "The command should be run from a terminal:\n", + "\n", + "```\n", + "kubectl edit configmaps workflow-controller-configmap -n kubeflow\n", + "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ + "## 2) Test and build all our reusable pipeline steps\n", + "\n", "We will start by building each of the components in our ML pipeline. \n", "\n", "![](img/kubeflow-seldon-nlp-reusable-components.jpg)\n", "\n", - "## Let's first have a look at our clean_text step:" + "### Let's first have a look at our clean_text step:\n" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Transformer.py\t__pycache__\tpipeline_step.py\r\n", - "__init__.py\tbuild_image.sh\trequirements.txt\r\n" + "Transformer.py\t__init__.py build_image.sh pipeline_step.py requirements.txt\r\n" ] } ], @@ -750,12 +309,12 @@ "* `requirements.txt` which states the python dependencies to run\n", "* `build_image.sh` which uses `s2i` to build the image with one line\n", "\n", - "### Let's check out the CLI for clean_text" + "### Let's check out the CLI for clean_text\n" ] }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -779,12 +338,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "This is actually a very simple file, as we are using the click library to define the commands:" + "This is actually a very simple file, as we are using the click library to define the commands:\n" ] }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -831,7 +390,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -845,7 +404,7 @@ "\n", "pipeline/pipeline_tests/test_pipeline.py \u001b[32m.\u001b[0m\u001b[36m [100%]\u001b[0m\n", "\n", - "\u001b[33m\u001b[1m===================== 1 passed, 9 warnings in 4.89 seconds =====================\u001b[0m\n" + "\u001b[33m\u001b[1m===================== 1 passed, 9 warnings in 3.26 seconds =====================\u001b[0m\n" ] } ], @@ -862,7 +421,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -888,12 +447,12 @@ "\n", "This can be achieved with the s2i/environment file. \n", "\n", - "As you can see, here we just tell it we want it to use the Transformer file:" + "As you can see, here we just tell it we want it to use our `Transformer.py` file:\n" ] }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -915,150 +474,158 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "That's it! Quite simple right? \n", + "Once this is defined, the only thing we need to do is to run the `build_image.sh` for all the reusable components.\n", "\n", - "The only thing we need to do is to run the `build_image.sh` for all the reusable components.\n", + "Here we show the manual way to do it:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%bash\n", + "# we must be in the same directory\n", + "cd pipeline/pipeline_steps/clean_text/ && ./build_image.sh\n", + "cd ../data_downloader && ./build_image.sh\n", + "cd ../lr_text_classifier && ./build_image.sh\n", + "cd ../spacy_tokenize && ./build_image.sh\n", + "cd ../tfidf_vectorizer && ./build_image.sh" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3) Train our NLP Pipeline through the Kubeflow UI\n", + "We can access the Kubeflow dashboard to train our ML pipeline via http://localhost/_/pipeline-dashboard\n", "\n", - "Here we show the manual way to do it, but we recommend to just run `make build_pipeline_steps`." + "If you can't edit this, you need to make sure that the ambassador gateway service is accessible:\n" ] }, { "cell_type": "code", - "execution_count": 34, - "metadata": { - "scrolled": true - }, + "execution_count": 14, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/pipeline/pipeline_steps/clean_text\n" + "NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\r\n", + "ambassador NodePort 10.108.204.59 80:31357/TCP 7m8s\r\n" ] - }, + } + ], + "source": [ + "!kubectl get svc ambassador -n kubeflow" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In my case, I need to change the kind from `NodePort` into `LoadBalancer` which can be done with the following command:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ { - "name": "stderr", + "name": "stdout", "output_type": "stream", "text": [ - "---> Installing application source...\n", - "---> Installing dependencies ...\n", - "Looking in links: /whl\n", - "Collecting dill==0.2.9 (from -r requirements.txt (line 1))\n", - " WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", - "Downloading https://files.pythonhosted.org/packages/fe/42/bfe2e0857bc284cbe6a011d93f2a9ad58a22cb894461b199ae72cfef0f29/dill-0.2.9.tar.gz (150kB)\n", - "Requirement already satisfied: click in /usr/local/lib/python3.6/site-packages (from -r requirements.txt (line 2)) (7.0)\n", - "Requirement already satisfied: numpy in /usr/local/lib/python3.6/site-packages (from -r requirements.txt (line 3)) (1.16.3)\n", - "Building wheels for collected packages: dill\n", - "Building wheel for dill (setup.py): started\n", - "Building wheel for dill (setup.py): finished with status 'done'\n", - "Stored in directory: /root/.cache/pip/wheels/5b/d7/0f/e58eae695403de585269f4e4a94e0cd6ca60ec0c202936fa4a\n", - "Successfully built dill\n", - "Installing collected packages: dill\n", - "Successfully installed dill-0.2.9\n", - "WARNING: Url '/whl' is ignored. It is either a non-existing path or lacks a specific scheme.\n", - "WARNING: You are using pip version 19.1, however version 19.1.1 is available.\n", - "You should consider upgrading via the 'pip install --upgrade pip' command.\n", - "Build completed successfully\n" + "service/ambassador patched\r\n" ] } ], "source": [ - "%%bash\n", - "# we must be in the same directory\n", - "cd pipeline/pipeline_steps/clean_text/ && ./build_image.sh\n", - "cd ../data_downloader && ./build_image.sh\n", - "cd ../lr_text_classifier && ./build_image.sh\n", - "cd ../spacy_tokenize && ./build_image.sh\n", - "cd ../tfidf_vectorizer && ./build_image.sh" + "!kubectl patch svc ambassador --type='json' -p '[{\"op\":\"replace\",\"path\":\"/spec/type\",\"value\":\"LoadBalancer\"}]' -n kubeflow" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# Train ML Pipeline via Kubeflow\n", - "Now that we've built our steps, we can actually train our ML pipeline, which looks as follows:\n", - "![](img/kubeflow-seldon-nlp-ml-pipelines-training.jpg)\n", - "\n", - "To do this, we have to generate the workflow using our Kubeflow graph definition and then uplaoding it through the UI:" + "Now that I've changed it to a loadbalancer, it has allocated the external IP as my localhost so I can access it at http://localhost/_/pipeline-dashboard\n" ] }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "nlp_pipeline.py\n", - "nlp_pipeline.py.tar.gz\n" + "NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\r\n", + "ambassador LoadBalancer 10.108.204.59 localhost 80:31357/TCP 7m36s\r\n" ] } ], "source": [ - "%%bash\n", - "# Generating graph definition\n", - "python train_pipeline/nlp_pipeline.py\n", - "ls train_pipeline/" + "!kubectl get svc ambassador -n kubeflow" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Before uploading the image, at the time of writing we need to make some updates in the Argo images with the following commands below.\n", - "\n", - "(This basically changes the images to the latest ones, otherwise we will get an error when we attach the volume)" + "If this was successfull, you should be able to access the dashboard\n", + "![](img/k-pipeline-dashboard.jpg)" ] }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "deployment.extensions/workflow-controller patched\n", - "deployment.extensions/ml-pipeline patched\n" + "nlp_pipeline.py\n", + "nlp_pipeline.py.tar.gz\n" ] } ], "source": [ - "!kubectl -n kubeflow patch deployments. workflow-controller --patch '{\"spec\": {\"template\": {\"spec\": {\"containers\": [{\"name\": \"workflow-controller\", \"image\": \"argoproj/workflow-controller:v2.3.0-rc3\"}]}}}}'\n", - "!kubectl -n kubeflow patch configmaps workflow-controller-configmap --patch '{\"data\": {\"config\": \"{ executorImage: argoproj/argoexec:v2.3.0-rc3,artifactRepository:{s3: {bucket: mlpipeline,keyPrefix: artifacts,endpoint: minio-service.kubeflow:9000,insecure: true,accessKeySecret: {name: mlpipeline-minio-artifact,key: accesskey},secretKeySecret: {name: mlpipeline-minio-artifact,key: secretkey}}}}\" }}'\n", - "!kubectl -n kubeflow patch deployments. ml-pipeline --patch '{\"spec\": {\"template\": {\"spec\": {\"containers\": [{\"name\": \"ml-pipeline-api-server\", \"image\": \"elikatsis/ml-pipeline-api-server:0.1.18-pick-1289\"}]}}}}'" + "%%bash\n", + "# Generating graph definition\n", + "python train_pipeline/nlp_pipeline.py\n", + "ls train_pipeline/" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ + "Now that we've built our steps, we can actually train our ML pipeline, which looks as follows:\n", + "![](img/kubeflow-seldon-nlp-ml-pipelines-training.jpg)\n", + "\n", + "### Run the pipeline\n", + "\n", "We now need to upload the resulting `nlp_pipeline.py.tar.gz` file generated.\n", "\n", "This can be done through the \"Upload PIpeline\" button in the UI at http://localhost/_/pipeline-dashboard.\n", "\n", "Once it's uploaded, we want to create and trigger a run! You should now be able to see how each step is executed:\n", "\n", - "![](img/running-pipeline.jpg)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Seeing the results in the Persistent Volume\n", + "![](img/running-pipeline.jpg)\n", + "\n", + "### Inspecting the data created in the Persistent Volume\n", "The pipeline saves the output of the pipeline together with the trained model in the persistent volume claim.\n", "\n", - "The persistent volume claim is the same name as the argo workflow:" + "The persistent volume claim is the same name as the argo workflow:\n" ] }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -1066,7 +633,7 @@ "output_type": "stream", "text": [ "NAME AGE\r\n", - "nlp-77bln 12m\r\n" + "nlp-jvfdd 1m\r\n" ] } ], @@ -1083,14 +650,14 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "nlp-77bln" + "nlp-jvfdd" ] } ], @@ -1107,7 +674,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -1117,10 +684,10 @@ "apiVersion: v1\r\n", "kind: Pod\r\n", "metadata:\r\n", - " name: busybox\r\n", + " name: pvc-access-container\r\n", "spec:\r\n", " containers:\r\n", - " - name: busybox\r\n", + " - name: pvc-access-container\r\n", " image: busybox\r\n", " command: [\"/bin/sh\", \"-ec\", \"sleep 1000\"]\r\n", " volumeMounts:\r\n", @@ -1129,12 +696,12 @@ " volumes:\r\n", " - name: mypvc\r\n", " persistentVolumeClaim:\r\n", - " claimName: nlp-77bln\r\n" + " claimName: nlp-jvfdd-my-pvc\r\n" ] } ], "source": [ - "!sed \"s/PVC_NAME/\"$(kubectl get workflow -n kubeflow -o jsonpath='{.items[0].metadata.name}')\"/g\" deploy_pipeline/pvc-access.yaml" + "!sed \"s/PVC_NAME/\"$(kubectl get workflow -n kubeflow -o jsonpath='{.items[0].metadata.name}')\"-my-pvc/g\" deploy_pipeline/pvc-access.yaml" ] }, { @@ -1146,7 +713,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -1163,15 +730,15 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "NAME READY STATUS RESTARTS AGE\r\n", - "pvc-access-container 0/1 ContainerCreating 0 1s\r\n" + "NAME READY STATUS RESTARTS AGE\r\n", + "pvc-access-container 1/1 Running 0 6s\r\n" ] } ], @@ -1181,79 +748,411 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "pod/busybox created\r\n" + "\u001b[1;32mclean.data\u001b[m \u001b[1;32mlr.model\u001b[m \u001b[1;32mtext.data\u001b[m \u001b[1;32mtfidf.model\u001b[m\r\n", + "\u001b[1;32mlabels.data\u001b[m \u001b[1;32mprediction.data\u001b[m \u001b[1;32mtfidf.data\u001b[m \u001b[1;32mtokens.data\u001b[m\r\n" ] } ], "source": [ - "!kubectl apply -f deploy_pipeline/pvc-access.yaml -n kubeflow" + "!kubectl -n kubeflow exec -it pvc-access-container ls /mnt" ] }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "NAME READY STATUS RESTARTS AGE\r\n", - "busybox 0/1 Pending 0 9s\r\n" + "pod \"pvc-access-container\" deleted\r\n" ] } ], "source": [ - "!kubectl get pods busybox -n kubeflow" + "!kubectl delete -f deploy_pipeline/pvc-access.yaml -n kubeflow" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4) Deploying your ML Pipeline with Seldon\n", + "Now that we have trained our ML pipeline, it's time to deploy it at scale!\n", + "\n", + "For this we will just need to create a simple Graph definition using the SeldonDeploy Kubernetes Custom Resource Definition.\n", + "\n", + "Adding the Seldon deployment will make our architecture look as follows:\n", + "\n", + "![](img/kubeflow-seldon-nlp-ml-pipelines.jpg)\n", + "\n", + "### Seldon Production pipeline contents\n", + "If we look at the file we'll be using to deploy our pipeline, we can see that it has the following key points:\n", + "\n", + "1) Reusable components definitions as containerSpecs: cleantext, spacytokenizer, tfidfvectorizer & lrclassifier\n", + "\n", + "2) DAG (directed acyclic graph) definition for REST pipeline: cleantext -> spacytokenizer -> tfidfvectorizer -> lrclassifier\n" ] }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Error from server (BadRequest): pod busybox does not have a host assigned\r\n" + "---\r\n", + "apiVersion: machinelearning.seldon.io/v1alpha2\r\n", + "kind: SeldonDeployment\r\n", + "metadata:\r\n", + " labels:\r\n", + " app: seldon\r\n", + " name: nlp-classifier\r\n", + " namespace: kubeflow\r\n", + "spec:\r\n", + " annotations:\r\n", + " project_name: NLP Pipeline\r\n", + " deployment_version: v1\r\n", + " name: nlp-classifier\r\n", + " oauth_key: oauth-key\r\n", + " oauth_secret: oauth-secret\r\n", + " predictors:\r\n", + " - componentSpecs:\r\n", + " - spec:\r\n", + " containers:\r\n", + " - image: clean_text_transformer:0.1\r\n", + " imagePullPolicy: IfNotPresent\r\n", + " name: cleantext\r\n", + " resources:\r\n", + " requests:\r\n", + " memory: 1Mi\r\n", + " - image: spacy_tokenizer:0.1\r\n", + " imagePullPolicy: IfNotPresent\r\n", + " name: spacytokenizer\r\n", + " - image: tfidf_vectorizer:0.1\r\n", + " imagePullPolicy: IfNotPresent\r\n", + " name: tfidfvectorizer\r\n", + " volumeMounts:\r\n", + " - name: mypvc\r\n", + " mountPath: /mnt\r\n", + " - image: lr_text_classifier:0.1\r\n", + " imagePullPolicy: IfNotPresent\r\n", + " name: lrclassifier\r\n", + " volumeMounts:\r\n", + " - name: mypvc\r\n", + " mountPath: /mnt\r\n", + " terminationGracePeriodSeconds: 20\r\n", + " volumes:\r\n", + " - name: mypvc\r\n", + " persistentVolumeClaim:\r\n", + " claimName: PVC_NAME\r\n", + " graph:\r\n", + " children:\r\n", + " - name: spacytokenizer\r\n", + " endpoint:\r\n", + " type: REST\r\n", + " type: MODEL\r\n", + " children:\r\n", + " - name: tfidfvectorizer\r\n", + " endpoint:\r\n", + " type: REST\r\n", + " type: MODEL\r\n", + " children:\r\n", + " - name: lrclassifier\r\n", + " endpoint:\r\n", + " type: REST\r\n", + " type: MODEL\r\n", + " children: []\r\n", + " name: cleantext\r\n", + " endpoint:\r\n", + " type: REST\r\n", + " type: MODEL\r\n", + " name: single-model\r\n", + " replicas: 1\r\n", + " annotations:\r\n", + " predictor_version: v1\r\n", + "\r\n" ] } ], "source": [ - "!kubectl -n kubeflow exec -it busybox ls /mnt" + "!cat deploy_pipeline/seldon_production_pipeline.yaml" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is the exact same structure as the Kubeflow definition, and can be deployed using kubectl\n", + "\n", + "Once again, we want to make sure we replace the \"PVC_NAME\" variable with the workflow ID to attach the container to the Seldon pipeline\n" ] }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "pod \"pvc-access-container\" deleted\r\n" + "seldondeployment.machinelearning.seldon.io/nlp-classifier created\r\n" ] } ], "source": [ - "!kubectl delete -f deploy_pipeline/pvc-access.yaml -n kubeflow" + "!sed \"s/PVC_NAME/\"$(kubectl get workflow -n kubeflow -o jsonpath='{.items[0].metadata.name}')\"-my-pvc/g\" deploy_pipeline/seldon_production_pipeline.yaml | kubectl -n kubeflow apply -f -" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now make sure that the Seldon Engine with the 4 reusable components are running:\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 40, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "nlp-classifier-single-model-51fb0cb-6cf49fdd7d-txlc8 5/5 Running 0 27s\r\n" + ] + } + ], + "source": [ + "!kubectl -n kubeflow get pods | grep nlp-classifier" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can also find this with the SeldonDeployment custom resource definition\n" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "NAME AGE\r\n", + "nlp-classifier 40s\r\n" + ] + } + ], + "source": [ + "!kubectl -n kubeflow get seldondeployment " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5) Test Deployed ML REST Endpoints\n", + "Now that it's running we have a production ML text pipeline that we can Query using REST and GRPC\n", + "\n", + "We can interact with our API in two ways: \n", + "\n", + "1) Using CURL or any client like PostMan\n", + "\n", + "2) Using the Python SeldonClient\n", + "\n", + "### Using CURL from the terminal\n", + "When using CURL, the only thing we need to provide is the data in JSON format, as well as the url, which is of the format:\n", + "\n", + "```\n", + "http:///seldon/kubeflow//api/v0.1/predictions\n", + "```\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"meta\": {\n", + " \"puid\": \"9f7cnfoj2cdk1e052l428s3f7i\",\n", + " \"tags\": {\n", + " },\n", + " \"routing\": {\n", + " \"cleantext\": -1,\n", + " \"tfidfvectorizer\": -1,\n", + " \"spacytokenizer\": -1\n", + " },\n", + " \"requestPath\": {\n", + " \"cleantext\": \"clean_text_transformer:0.1\",\n", + " \"tfidfvectorizer\": \"tfidf_vectorizer:0.1\",\n", + " \"lrclassifier\": \"lr_text_classifier:0.1\",\n", + " \"spacytokenizer\": \"spacy_tokenizer:0.1\"\n", + " },\n", + " \"metrics\": []\n", + " },\n", + " \"data\": {\n", + " \"names\": [\"t:0\", \"t:1\"],\n", + " \"ndarray\": [[0.6729294030193711, 0.3270705969806289]]\n", + " }\n", + "}" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " % Total % Received % Xferd Average Speed Time Time Time Current\n", + " Dload Upload Total Spent Left Speed\n", + "\r", + " 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r", + "100 599 100 527 100 72 918 125 --:--:-- --:--:-- --:--:-- 1043\n" + ] + } + ], + "source": [ + "%%bash\n", + "#!curl -H \\\"Content-Type: application/x-www-form-urlencoded\\\" -g localhost/seldon/kubeflow/nlp-classifier/api/v0.1/predictions -d 'json={\\\"data\\\":{\\\"ndarray\\\":[[\\\"Hello this is some text to test\\\"]]}}'\n", + "curl -X POST -H 'Content-Type: application/json' \\\n", + " -d \"{'data': {'names': ['text'], 'ndarray': ['Hello world this is a test']}}\" \\\n", + " http://127.0.0.1/seldon/kubeflow/nlp-classifier/api/v0.1/predictions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Using the SeldonClient\n", + "We can also use the Python SeldonClient to interact with the pipeline we just deployed " + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Success:True message:\n", + "Request:\n", + "data {\n", + " names: \"text\"\n", + " ndarray {\n", + " values {\n", + " string_value: \"Hello world this is a test\"\n", + " }\n", + " }\n", + "}\n", + "\n", + "Response:\n", + "meta {\n", + " puid: \"5ppdl2ff869fnn6l0n59qspck7\"\n", + " routing {\n", + " key: \"cleantext\"\n", + " value: -1\n", + " }\n", + " routing {\n", + " key: \"spacytokenizer\"\n", + " value: -1\n", + " }\n", + " routing {\n", + " key: \"tfidfvectorizer\"\n", + " value: -1\n", + " }\n", + " requestPath {\n", + " key: \"cleantext\"\n", + " value: \"clean_text_transformer:0.1\"\n", + " }\n", + " requestPath {\n", + " key: \"lrclassifier\"\n", + " value: \"lr_text_classifier:0.1\"\n", + " }\n", + " requestPath {\n", + " key: \"spacytokenizer\"\n", + " value: \"spacy_tokenizer:0.1\"\n", + " }\n", + " requestPath {\n", + " key: \"tfidfvectorizer\"\n", + " value: \"tfidf_vectorizer:0.1\"\n", + " }\n", + "}\n", + "data {\n", + " names: \"t:0\"\n", + " names: \"t:1\"\n", + " ndarray {\n", + " values {\n", + " list_value {\n", + " values {\n", + " number_value: 0.6729294030193711\n", + " }\n", + " values {\n", + " number_value: 0.3270705969806289\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n" + ] + } + ], + "source": [ + "from seldon_core.seldon_client import SeldonClient\n", + "import numpy as np\n", + "\n", + "host = \"localhost\"\n", + "port = \"80\" # Make sure you use the port above\n", + "batch = np.array([\"Hello world this is a test\"])\n", + "payload_type = \"ndarray\"\n", + "deployment_name=\"nlp-classifier\"\n", + "transport=\"rest\"\n", + "namespace=\"kubeflow\"\n", + "\n", + "sc = SeldonClient(\n", + " gateway=\"ambassador\", \n", + " ambassador_endpoint=host + \":\" + port,\n", + " namespace=namespace)\n", + "\n", + "client_prediction = sc.predict(\n", + " data=batch, \n", + " deployment_name=deployment_name,\n", + " names=[\"text\"],\n", + " payload_type=payload_type,\n", + " transport=\"rest\")\n", + "\n", + "print(client_prediction)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## You now have a full end-to-end training and production NLP pipeline 😎 " + ] } ], "metadata": { From c9f987ad2a8f6e17354e2712cc7049ffde22c5e7 Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Mon, 27 May 2019 16:45:28 +0100 Subject: [PATCH 19/22] Changed headers to be one-level and added nblink --- doc/source/examples/kubeflow_seldon_e2e_pipeline.nblink | 3 +++ doc/source/examples/notebooks.rst | 1 + 2 files changed, 4 insertions(+) create mode 100644 doc/source/examples/kubeflow_seldon_e2e_pipeline.nblink diff --git a/doc/source/examples/kubeflow_seldon_e2e_pipeline.nblink b/doc/source/examples/kubeflow_seldon_e2e_pipeline.nblink new file mode 100644 index 0000000000..8238d8e1d2 --- /dev/null +++ b/doc/source/examples/kubeflow_seldon_e2e_pipeline.nblink @@ -0,0 +1,3 @@ +{ + "path": "../../../examples/kubeflow/kubeflow_seldon_e2e_pipeline.ipynb" +} diff --git a/doc/source/examples/notebooks.rst b/doc/source/examples/notebooks.rst index 5ab29b685d..8a399a07b0 100644 --- a/doc/source/examples/notebooks.rst +++ b/doc/source/examples/notebooks.rst @@ -19,6 +19,7 @@ Notebooks Istio Canary Jaeger Tracing Keras MNIST + Kubeflow Seldon E2E Pipeline Max gRPC Message Size Model with Custom Metrics MLFlow From 53dfb6db13773b7d5a629fdf8294e18aeeb1ff8d Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Tue, 28 May 2019 17:47:52 +0100 Subject: [PATCH 20/22] Added updated nlpipline --- examples/kubeflow/train_pipeline/nlp_pipeline.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/examples/kubeflow/train_pipeline/nlp_pipeline.py b/examples/kubeflow/train_pipeline/nlp_pipeline.py index 280fd953d7..5d41685727 100644 --- a/examples/kubeflow/train_pipeline/nlp_pipeline.py +++ b/examples/kubeflow/train_pipeline/nlp_pipeline.py @@ -1,5 +1,6 @@ import kfp.dsl as dsl +import yaml from kubernetes import client as k8s @@ -106,6 +107,15 @@ def nlp_pipeline( pvolumes={"/mnt": vectorize_step.pvolume} ) + seldon_config = yaml.load(open("../deploy_pipeline/seldon_production_pipeline.yaml")) + + deploy_step = dsl.ResourceOp( + name="seldondeploy", + k8s_resource=seldon_config, + attribute_outputs={"name": "{.metadata.name}"}) + + deploy_step.after(predict_step) + if __name__ == '__main__': import kfp.compiler as compiler compiler.Compiler().compile(nlp_pipeline, __file__ + '.tar.gz') From 7daf647c160f52dec5f21f8b607ec585eeda3a85 Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Tue, 28 May 2019 19:08:43 +0100 Subject: [PATCH 21/22] Updated pipeline to include deploy step --- .../seldon_production_pipeline.yaml | 6 +- .../img/completed-pipeline-deploy.jpg | Bin 0 -> 141770 bytes examples/kubeflow/img/completed-pipeline.jpg | Bin 159205 -> 0 bytes .../kubeflow/img/kubeflow-seldon-nlp-full.jpg | Bin 160812 -> 140244 bytes .../img/kubeflow-seldon-nlp-ml-pipelines.jpg | Bin 108525 -> 95434 bytes examples/kubeflow/img/seldon-analytics.jpg | Bin 0 -> 195898 bytes .../kubeflow_seldon_e2e_pipeline.ipynb | 1143 +++++++++++++---- .../kubeflow/train_pipeline/nlp_pipeline.py | 6 +- 8 files changed, 918 insertions(+), 237 deletions(-) create mode 100755 examples/kubeflow/img/completed-pipeline-deploy.jpg delete mode 100755 examples/kubeflow/img/completed-pipeline.jpg create mode 100755 examples/kubeflow/img/seldon-analytics.jpg diff --git a/examples/kubeflow/deploy_pipeline/seldon_production_pipeline.yaml b/examples/kubeflow/deploy_pipeline/seldon_production_pipeline.yaml index b6873aafdd..aa443964bb 100644 --- a/examples/kubeflow/deploy_pipeline/seldon_production_pipeline.yaml +++ b/examples/kubeflow/deploy_pipeline/seldon_production_pipeline.yaml @@ -4,13 +4,13 @@ kind: SeldonDeployment metadata: labels: app: seldon - name: nlp-classifier + name: "seldon-deployment-{{workflow.name}}" namespace: kubeflow spec: annotations: project_name: NLP Pipeline deployment_version: v1 - name: nlp-classifier + name: "seldon-deployment-{{workflow.name}}" oauth_key: oauth-key oauth_secret: oauth-secret predictors: @@ -42,7 +42,7 @@ spec: volumes: - name: mypvc persistentVolumeClaim: - claimName: PVC_NAME + claimName: "{{workflow.name}}-my-pvc" graph: children: - name: spacytokenizer diff --git a/examples/kubeflow/img/completed-pipeline-deploy.jpg b/examples/kubeflow/img/completed-pipeline-deploy.jpg new file mode 100755 index 0000000000000000000000000000000000000000..506777975ded190aeebaa80aa1c7f893a4f80660 GIT binary patch literal 141770 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

)`3?<@v%i8h85EBnG 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≫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 KLWz4m^8W!ux)Lk^ literal 0 HcmV?d00001 diff --git a/examples/kubeflow/img/completed-pipeline.jpg b/examples/kubeflow/img/completed-pipeline.jpg deleted file mode 100755 index 6e8ab4204fb8ef65dc372eac81bd74a3c9ecf969..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159205 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%0AVUy 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 diff --git a/examples/kubeflow/img/kubeflow-seldon-nlp-full.jpg b/examples/kubeflow/img/kubeflow-seldon-nlp-full.jpg index 40097aa2d0f8e9324c398d0d4461b2e4d3aef34d..5c51e0e8e5f9fc6210f39da0bc474b80d1bbc1fa 100755 GIT binary patch literal 140244 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 TG`|2hF5J5FpVSp|{GR$ZLAP|P literal 160812 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𝔩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

_ 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 Q^IWyRFYxF8r+$w8H{2!1t^fc4 literal 108525 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 PS-|w|f0!;}|2F=2gN|;6 diff --git a/examples/kubeflow/img/seldon-analytics.jpg b/examples/kubeflow/img/seldon-analytics.jpg new file mode 100755 index 0000000000000000000000000000000000000000..43bbe4468900f08d82ba2549934e2d528a9a71a8 GIT binary patch literal 195898 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ψ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

x!hRq#3h3Gh^FDA-xWab?@eV`9RM8nC#1{z=Zgh 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%0D{kr|QZgp<$M9I$!vNWD?h%?C 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 literal 0 HcmV?d00001 diff --git a/examples/kubeflow/kubeflow_seldon_e2e_pipeline.ipynb b/examples/kubeflow/kubeflow_seldon_e2e_pipeline.ipynb index f4d955f1e7..b97d87ef44 100644 --- a/examples/kubeflow/kubeflow_seldon_e2e_pipeline.ipynb +++ b/examples/kubeflow/kubeflow_seldon_e2e_pipeline.ipynb @@ -10,7 +10,7 @@ "\n", "We will automate content moderation on the Reddit comments in /r/science building a machine learning NLP model with the following components:\n", "\n", - "![](img/completed-pipeline.jpg)\n", + "![](img/completed-pipeline-deploy.jpg)\n", "\n", "This tutorial will break down in the following sections:\n", "\n", @@ -18,13 +18,11 @@ "\n", "2) Test and build all our reusable pipeline steps\n", "\n", - "3) Train our NLP Pipeline with Kubeflow\n", + "3) Use Kubeflow to Train the Pipeline and Deploy to Seldon\n", "\n", - "4) Deploying your ML Pipeline with Seldon\n", + "5) Test Seldon Deployed ML REST Endpoints\n", "\n", - "5) Test Deployed ML REST Endpoints\n", - "\n", - "Let's get started! 🚀🔥\n", + "6) Visualise Seldon's Production ML Pipelines\n", "\n", "# Before you start\n", "Make sure you install the following dependencies, as they are critical for this example to work:\n", @@ -33,9 +31,39 @@ "* A Kubernetes cluster running v1.13 or above (minkube / docker-for-windows work well if enough RAM)\n", "* kubectl v1.14+\n", "* ksonnet v0.13.1+\n", - "* kfctl 0.5.2 - Please use this exact version as there are major changes every few months\n", + "* kfctl 0.5.1 - Please use this exact version as there are major changes every few months\n", "* Python 3.6+\n", - "* Python DEV requirements (we'll install them below)\n" + "* Python DEV requirements (we'll install them below)\n", + "\n", + "Let's get started! 🚀🔥 We will be building the end-to-end pipeline below:\n", + "\n", + "![](img/kubeflow-seldon-nlp-full.jpg)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[38;5;238m───────┬────────────────────────────────────────────────────────────────────────\u001b[0m\n", + " \u001b[38;5;238m│ \u001b[0mFile: \u001b[1mrequirements-dev.txt\u001b[0m\n", + "\u001b[38;5;238m───────┼────────────────────────────────────────────────────────────────────────\u001b[0m\n", + "\u001b[38;5;238m 1\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231mpython-dateutil\u001b[0m\n", + "\u001b[38;5;238m 2\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231mhttps://storage.googleapis.com/ml-pipeline/release/0.1.20/kfp.tar.gz\u001b[0m\n", + "\u001b[38;5;238m 3\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231mkubernetes\u001b[0m\n", + "\u001b[38;5;238m 4\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231mclick\u001b[0m\n", + "\u001b[38;5;238m 5\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231mseldon_core\u001b[0m\n", + "\u001b[38;5;238m 6\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231mnumpy\u001b[0m\n", + "\u001b[38;5;238m───────┴────────────────────────────────────────────────────────────────────────\u001b[0m\n" + ] + } + ], + "source": [ + "!cat requirements-dev.txt" ] }, { @@ -90,11 +118,319 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": { "scrolled": true }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "time=\"2019-05-28T11:43:47+01:00\" level=info msg=\"reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml\" filename=\"coordinator/coordinator.go:341\"\n", + "time=\"2019-05-28T11:43:47+01:00\" level=info msg=\"reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml\" filename=\"coordinator/coordinator.go:341\"\n", + "time=\"2019-05-28T11:43:47+01:00\" level=info msg=\"Ksonnet.Generate Name kubeflow-seldon AppDir /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon Platform \" filename=\"ksonnet/ksonnet.go:369\"\n", + "time=\"2019-05-28T11:43:48+01:00\" level=info msg=\"Creating environment \\\"default\\\" with namespace \\\"kubeflow\\\", pointing to \\\"version:v1.13.0\\\" cluster at address \\\"https://localhost:6445\\\"\" filename=\"env/create.go:77\"\n", + "time=\"2019-05-28T11:43:53+01:00\" level=info msg=\"Generating ksonnet-lib data at path '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/lib/ksonnet-lib/v1.13.0'\" filename=\"lib/lib.go:148\"\n", + "time=\"2019-05-28T11:43:53+01:00\" level=info msg=\"Successfully initialized the app kubeflow-seldon.\" filename=\"ksonnet/ksonnet.go:505\"\n", + "time=\"2019-05-28T11:43:53+01:00\" level=info msg=\"App kubeflow-seldon add registry kubeflow URI /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/.cache/v0.5.1/kubeflow\" filename=\"ksonnet/ksonnet.go:621\"\n", + "time=\"2019-05-28T11:43:53+01:00\" level=info msg=\"Retrieved 6 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-28T11:43:54+01:00\" level=info msg=\"Retrieved 22 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-28T11:43:54+01:00\" level=info msg=\"Retrieved 9 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-28T11:43:54+01:00\" level=info msg=\"Retrieved 35 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-28T11:43:54+01:00\" level=info msg=\"Retrieved 49 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-28T11:43:54+01:00\" level=info msg=\"Retrieved 6 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-28T11:43:54+01:00\" level=info msg=\"Retrieved 4 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-28T11:43:54+01:00\" level=info msg=\"Retrieved 4 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-28T11:43:54+01:00\" level=info msg=\"Retrieved 9 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-28T11:43:54+01:00\" level=info msg=\"Retrieved 14 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-28T11:43:54+01:00\" level=info msg=\"Retrieved 6 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-28T11:43:54+01:00\" level=info msg=\"Retrieved 17 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-28T11:43:54+01:00\" level=info msg=\"Retrieved 8 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-28T11:43:54+01:00\" level=info msg=\"Retrieved 12 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Retrieved 4 files\" filename=\"registry/cache.go:114\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Creating Component: ambassador ...\" filename=\"ksonnet/ksonnet.go:207\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Args: [ambassador ambassador]\" filename=\"ksonnet/ksonnet.go:208\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/ambassador.jsonnet'\" filename=\"component/create.go:92\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Creating Component: argo ...\" filename=\"ksonnet/ksonnet.go:207\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Args: [argo argo]\" filename=\"ksonnet/ksonnet.go:208\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/argo.jsonnet'\" filename=\"component/create.go:92\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Creating Component: centraldashboard ...\" filename=\"ksonnet/ksonnet.go:207\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Args: [centraldashboard centraldashboard]\" filename=\"ksonnet/ksonnet.go:208\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/centraldashboard.jsonnet'\" filename=\"component/create.go:92\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Creating Component: jupyter-web-app ...\" filename=\"ksonnet/ksonnet.go:207\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Args: [jupyter-web-app jupyter-web-app]\" filename=\"ksonnet/ksonnet.go:208\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/jupyter-web-app.jsonnet'\" filename=\"component/create.go:92\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Creating Component: katib ...\" filename=\"ksonnet/ksonnet.go:207\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Args: [katib katib]\" filename=\"ksonnet/ksonnet.go:208\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/katib.jsonnet'\" filename=\"component/create.go:92\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Creating Component: metacontroller ...\" filename=\"ksonnet/ksonnet.go:207\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Args: [metacontroller metacontroller]\" filename=\"ksonnet/ksonnet.go:208\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/metacontroller.jsonnet'\" filename=\"component/create.go:92\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Creating Component: notebook-controller ...\" filename=\"ksonnet/ksonnet.go:207\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Args: [notebook-controller notebook-controller]\" filename=\"ksonnet/ksonnet.go:208\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/notebook-controller.jsonnet'\" filename=\"component/create.go:92\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Creating Component: pipeline ...\" filename=\"ksonnet/ksonnet.go:207\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Args: [pipeline pipeline]\" filename=\"ksonnet/ksonnet.go:208\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/pipeline.jsonnet'\" filename=\"component/create.go:92\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Creating Component: pytorch-operator ...\" filename=\"ksonnet/ksonnet.go:207\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Args: [pytorch-operator pytorch-operator]\" filename=\"ksonnet/ksonnet.go:208\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/pytorch-operator.jsonnet'\" filename=\"component/create.go:92\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Creating Component: tensorboard ...\" filename=\"ksonnet/ksonnet.go:207\"\n", + "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Args: [tensorboard tensorboard]\" filename=\"ksonnet/ksonnet.go:208\"\n", + "time=\"2019-05-28T11:43:56+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/tensorboard.jsonnet'\" filename=\"component/create.go:92\"\n", + "time=\"2019-05-28T11:43:56+01:00\" level=info msg=\"Creating Component: tf-job-operator ...\" filename=\"ksonnet/ksonnet.go:207\"\n", + "time=\"2019-05-28T11:43:56+01:00\" level=info msg=\"Args: [tf-job-operator tf-job-operator]\" filename=\"ksonnet/ksonnet.go:208\"\n", + "time=\"2019-05-28T11:43:56+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/tf-job-operator.jsonnet'\" filename=\"component/create.go:92\"\n", + "time=\"2019-05-28T11:43:56+01:00\" level=info msg=\"deploying kubeflow application\" filename=\"cmd/apply.go:35\"\n", + "time=\"2019-05-28T11:43:56+01:00\" level=info msg=\"reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml\" filename=\"coordinator/coordinator.go:341\"\n", + "time=\"2019-05-28T11:43:56+01:00\" level=info msg=\"reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml\" filename=\"coordinator/coordinator.go:341\"\n", + "time=\"2019-05-28T11:43:56+01:00\" level=info msg=\"namespace: kubeflow\" filename=\"ksonnet/ksonnet.go:109\"\n", + "time=\"2019-05-28T11:43:56+01:00\" level=info msg=\"Creating namespace: kubeflow\" filename=\"ksonnet/ksonnet.go:112\"\n", + "time=\"2019-05-28T11:44:09+01:00\" level=info msg=\"Applying services kubeflow.ambassador\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:09+01:00\" level=info msg=\"Creating non-existent services kubeflow.ambassador\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:44:09+01:00\" level=info msg=\"Applying services kubeflow.ambassador-admin\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:09+01:00\" level=info msg=\"Creating non-existent services kubeflow.ambassador-admin\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:44:09+01:00\" level=info msg=\"Applying clusterroles ambassador\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:09+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.ambassador\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:09+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.ambassador\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:44:09+01:00\" level=info msg=\"Applying clusterrolebindings ambassador\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:09+01:00\" level=info msg=\"Applying deployments kubeflow.ambassador\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:09+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.ambassador\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:44:09+01:00\" level=info msg=\"Component ambassador apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", + "time=\"2019-05-28T11:44:21+01:00\" level=info msg=\"Applying customresourcedefinitions workflows.argoproj.io\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:21+01:00\" level=info msg=\"Creating non-existent customresourcedefinitions workflows.argoproj.io\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:44:25+01:00\" level=info msg=\"Applying clusterrolebindings argo\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:25+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.argo-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:25+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.argo-ui\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:44:26+01:00\" level=info msg=\"Applying services kubeflow.argo-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:26+01:00\" level=info msg=\"Creating non-existent services kubeflow.argo-ui\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:44:26+01:00\" level=info msg=\"Applying configmaps kubeflow.workflow-controller-configmap\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:26+01:00\" level=info msg=\"Creating non-existent configmaps kubeflow.workflow-controller-configmap\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:44:26+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.argo\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:26+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.argo\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:44:26+01:00\" level=info msg=\"Applying clusterroles argo\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:26+01:00\" level=info msg=\"Applying clusterroles argo-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:26+01:00\" level=info msg=\"Applying clusterrolebindings argo-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:26+01:00\" level=info msg=\"Applying deployments kubeflow.workflow-controller\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:26+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.workflow-controller\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:44:26+01:00\" level=info msg=\"Applying deployments kubeflow.argo-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:26+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.argo-ui\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:44:27+01:00\" level=info msg=\"Component argo apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", + "time=\"2019-05-28T11:44:38+01:00\" level=info msg=\"Applying clusterrolebindings centraldashboard\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:38+01:00\" level=info msg=\"Applying services kubeflow.centraldashboard\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:38+01:00\" level=info msg=\"Creating non-existent services kubeflow.centraldashboard\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:44:38+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.centraldashboard\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:38+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.centraldashboard\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:44:38+01:00\" level=info msg=\"Applying roles kubeflow.centraldashboard\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:38+01:00\" level=info msg=\"Creating non-existent roles kubeflow.centraldashboard\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:44:38+01:00\" level=info msg=\"Applying rolebindings kubeflow.centraldashboard\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:38+01:00\" level=info msg=\"Creating non-existent rolebindings kubeflow.centraldashboard\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:44:39+01:00\" level=info msg=\"Applying clusterroles centraldashboard\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:39+01:00\" level=info msg=\"Applying deployments kubeflow.centraldashboard\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:39+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.centraldashboard\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:44:39+01:00\" level=info msg=\"Component centraldashboard apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", + "time=\"2019-05-28T11:44:50+01:00\" level=info msg=\"Applying services kubeflow.jupyter-web-app\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:50+01:00\" level=info msg=\"Creating non-existent services kubeflow.jupyter-web-app\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:44:50+01:00\" level=info msg=\"Applying deployments kubeflow.jupyter-web-app\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:50+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.jupyter-web-app\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:44:50+01:00\" level=info msg=\"Applying configmaps kubeflow.jupyter-web-app-config\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:50+01:00\" level=info msg=\"Creating non-existent configmaps kubeflow.jupyter-web-app-config\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:44:50+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.jupyter-web-app\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:50+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.jupyter-web-app\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:44:50+01:00\" level=info msg=\"Applying clusterrolebindings jupyter-web-app-binding\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:51+01:00\" level=info msg=\"Applying clusterroles jupyter-web-app-cluster-role\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:51+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.jupyter-notebook\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:51+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.jupyter-notebook\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:44:51+01:00\" level=info msg=\"Applying roles kubeflow.jupyter-notebook-role\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:51+01:00\" level=info msg=\"Creating non-existent roles kubeflow.jupyter-notebook-role\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:44:51+01:00\" level=info msg=\"Applying rolebindings kubeflow.jupyter-notebook-role-binding\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:44:51+01:00\" level=info msg=\"Creating non-existent rolebindings kubeflow.jupyter-notebook-role-binding\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:44:51+01:00\" level=info msg=\"Component jupyter-web-app apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", + "time=\"2019-05-28T11:45:01+01:00\" level=info msg=\"Applying clusterroles metrics-collector\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:01+01:00\" level=info msg=\"Applying services kubeflow.studyjob-controller\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:01+01:00\" level=info msg=\"Creating non-existent services kubeflow.studyjob-controller\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:01+01:00\" level=info msg=\"Applying services kubeflow.vizier-db\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:01+01:00\" level=info msg=\"Creating non-existent services kubeflow.vizier-db\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:01+01:00\" level=info msg=\"Applying persistentvolumeclaims kubeflow.katib-mysql\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:01+01:00\" level=info msg=\"Creating non-existent persistentvolumeclaims kubeflow.katib-mysql\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:02+01:00\" level=info msg=\"Applying clusterrolebindings studyjob-controller\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:02+01:00\" level=info msg=\"Applying secrets kubeflow.vizier-db-secrets\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:02+01:00\" level=info msg=\"Creating non-existent secrets kubeflow.vizier-db-secrets\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:02+01:00\" level=info msg=\"Applying clusterroles vizier-core\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:02+01:00\" level=info msg=\"Applying clusterrolebindings vizier-core\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:02+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.vizier-core\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:02+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.vizier-core\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:02+01:00\" level=info msg=\"Applying services kubeflow.vizier-core-rest\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:02+01:00\" level=info msg=\"Creating non-existent services kubeflow.vizier-core-rest\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:02+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.studyjob-controller\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:02+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.studyjob-controller\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:02+01:00\" level=info msg=\"Applying services kubeflow.katib-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:02+01:00\" level=info msg=\"Creating non-existent services kubeflow.katib-ui\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:03+01:00\" level=info msg=\"Applying clusterroles studyjob-controller\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:03+01:00\" level=info msg=\"Applying clusterroles katib-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:03+01:00\" level=info msg=\"Applying clusterrolebindings katib-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:03+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.katib-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:03+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.katib-ui\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:03+01:00\" level=info msg=\"Applying services kubeflow.vizier-suggestion-random\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:03+01:00\" level=info msg=\"Creating non-existent services kubeflow.vizier-suggestion-random\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:04+01:00\" level=info msg=\"Applying services kubeflow.vizier-core\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:04+01:00\" level=info msg=\"Creating non-existent services kubeflow.vizier-core\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:04+01:00\" level=info msg=\"Applying services kubeflow.vizier-suggestion-grid\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:04+01:00\" level=info msg=\"Creating non-existent services kubeflow.vizier-suggestion-grid\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:04+01:00\" level=info msg=\"Applying configmaps kubeflow.metricscollector-template\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:04+01:00\" level=info msg=\"Creating non-existent configmaps kubeflow.metricscollector-template\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:05+01:00\" level=info msg=\"Applying services kubeflow.vizier-suggestion-hyperband\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:05+01:00\" level=info msg=\"Creating non-existent services kubeflow.vizier-suggestion-hyperband\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:05+01:00\" level=info msg=\"Applying clusterrolebindings metrics-collector\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:05+01:00\" level=info msg=\"Applying services kubeflow.vizier-suggestion-bayesianoptimization\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:05+01:00\" level=info msg=\"Creating non-existent services kubeflow.vizier-suggestion-bayesianoptimization\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:05+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.metrics-collector\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:06+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.metrics-collector\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:06+01:00\" level=info msg=\"Applying customresourcedefinitions studyjobs.kubeflow.org\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:06+01:00\" level=info msg=\"Applying configmaps kubeflow.worker-template\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:06+01:00\" level=info msg=\"Creating non-existent configmaps kubeflow.worker-template\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:06+01:00\" level=info msg=\"Applying deployments kubeflow.vizier-suggestion-bayesianoptimization\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:06+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.vizier-suggestion-bayesianoptimization\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:06+01:00\" level=info msg=\"Applying deployments kubeflow.vizier-suggestion-hyperband\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:06+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.vizier-suggestion-hyperband\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:06+01:00\" level=info msg=\"Applying deployments kubeflow.vizier-suggestion-grid\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:06+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.vizier-suggestion-grid\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:07+01:00\" level=info msg=\"Applying deployments kubeflow.katib-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:07+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.katib-ui\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:07+01:00\" level=info msg=\"Applying deployments kubeflow.vizier-core-rest\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:07+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.vizier-core-rest\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:07+01:00\" level=info msg=\"Applying deployments kubeflow.vizier-db\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:07+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.vizier-db\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:07+01:00\" level=info msg=\"Applying deployments kubeflow.studyjob-controller\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:07+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.studyjob-controller\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:07+01:00\" level=info msg=\"Applying deployments kubeflow.vizier-core\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:07+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.vizier-core\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:08+01:00\" level=info msg=\"Applying deployments kubeflow.vizier-suggestion-random\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:08+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.vizier-suggestion-random\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:08+01:00\" level=info msg=\"Component katib apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", + "time=\"2019-05-28T11:45:20+01:00\" level=info msg=\"Applying customresourcedefinitions compositecontrollers.metacontroller.k8s.io\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:20+01:00\" level=info msg=\"Creating non-existent customresourcedefinitions compositecontrollers.metacontroller.k8s.io\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:20+01:00\" level=info msg=\"Applying customresourcedefinitions controllerrevisions.metacontroller.k8s.io\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:20+01:00\" level=info msg=\"Creating non-existent customresourcedefinitions controllerrevisions.metacontroller.k8s.io\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:20+01:00\" level=info msg=\"Applying customresourcedefinitions decoratorcontrollers.metacontroller.k8s.io\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:20+01:00\" level=info msg=\"Creating non-existent customresourcedefinitions decoratorcontrollers.metacontroller.k8s.io\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:20+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.meta-controller-service\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:20+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.meta-controller-service\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:20+01:00\" level=info msg=\"Applying clusterrolebindings meta-controller-cluster-role-binding\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:20+01:00\" level=info msg=\"Creating non-existent clusterrolebindings meta-controller-cluster-role-binding\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:20+01:00\" level=info msg=\"Applying statefulsets kubeflow.metacontroller\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:20+01:00\" level=info msg=\"Creating non-existent statefulsets kubeflow.metacontroller\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:20+01:00\" level=info msg=\"Component metacontroller apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", + "time=\"2019-05-28T11:45:32+01:00\" level=info msg=\"Applying customresourcedefinitions notebooks.kubeflow.org\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:32+01:00\" level=info msg=\"Applying services kubeflow.notebooks-controller\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:32+01:00\" level=info msg=\"Creating non-existent services kubeflow.notebooks-controller\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:32+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.notebook-controller\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:32+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.notebook-controller\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:32+01:00\" level=info msg=\"Applying deployments kubeflow.notebooks-controller\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:32+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.notebooks-controller\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:32+01:00\" level=info msg=\"Applying clusterroles notebooks-controller\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:32+01:00\" level=info msg=\"Applying clusterrolebindings notebooks-controller\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:32+01:00\" level=info msg=\"Component notebook-controller apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", + "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Applying services kubeflow.minio-service\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Creating non-existent services kubeflow.minio-service\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Applying deployments kubeflow.minio\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.minio\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Applying secrets kubeflow.mlpipeline-minio-artifact\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Creating non-existent secrets kubeflow.mlpipeline-minio-artifact\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Applying services kubeflow.mysql\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Creating non-existent services kubeflow.mysql\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Applying deployments kubeflow.mysql\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.mysql\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Applying rolebindings kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Creating non-existent rolebindings kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Applying roles kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Creating non-existent roles kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Applying services kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Creating non-existent services kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Applying deployments kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.pipeline-runner\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.pipeline-runner\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Applying clusterroles pipeline-runner\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:44+01:00\" level=info msg=\"Applying clusterrolebindings pipeline-runner\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:44+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:44+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:44+01:00\" level=info msg=\"Applying clusterrolebindings ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:44+01:00\" level=info msg=\"Applying roles kubeflow.ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:44+01:00\" level=info msg=\"Creating non-existent roles kubeflow.ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:44+01:00\" level=info msg=\"Applying deployments kubeflow.ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:44+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:44+01:00\" level=info msg=\"Applying customresourcedefinitions scheduledworkflows.kubeflow.org\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:44+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.ml-pipeline-persistenceagent\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:44+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.ml-pipeline-persistenceagent\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:45+01:00\" level=info msg=\"Applying clusterrolebindings ml-pipeline-persistenceagent\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:45+01:00\" level=info msg=\"Applying clusterroles ml-pipeline-persistenceagent\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:45+01:00\" level=info msg=\"Applying deployments kubeflow.ml-pipeline-persistenceagent\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:45+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.ml-pipeline-persistenceagent\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:45+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.ml-pipeline-viewer-crd-service-account\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:45+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.ml-pipeline-viewer-crd-service-account\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:45+01:00\" level=info msg=\"Applying clusterrolebindings ml-pipeline-viewer-crd-role-binding\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:45+01:00\" level=info msg=\"Applying clusterroles ml-pipeline-viewer-controller-role\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:45+01:00\" level=info msg=\"Applying deployments kubeflow.ml-pipeline-viewer-controller-deployment\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:45+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.ml-pipeline-viewer-controller-deployment\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Applying customresourcedefinitions viewers.kubeflow.org\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Applying services kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Creating non-existent services kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Applying services kubeflow.ml-pipeline-tensorboard-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Creating non-existent services kubeflow.ml-pipeline-tensorboard-ui\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Applying rolebindings kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Creating non-existent rolebindings kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Applying roles kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Creating non-existent roles kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Applying deployments kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Applying persistentvolumeclaims kubeflow.mysql-pv-claim\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Creating non-existent persistentvolumeclaims kubeflow.mysql-pv-claim\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Applying persistentvolumeclaims kubeflow.minio-pvc\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Creating non-existent persistentvolumeclaims kubeflow.minio-pvc\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Component pipeline apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", + "time=\"2019-05-28T11:46:00+01:00\" level=info msg=\"Applying configmaps kubeflow.pytorch-operator-config\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:46:00+01:00\" level=info msg=\"Creating non-existent configmaps kubeflow.pytorch-operator-config\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:46:00+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.pytorch-operator\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:46:00+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.pytorch-operator\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:46:00+01:00\" level=info msg=\"Applying clusterroles pytorch-operator\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:46:00+01:00\" level=info msg=\"Applying clusterrolebindings pytorch-operator\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:46:01+01:00\" level=info msg=\"Applying customresourcedefinitions pytorchjobs.kubeflow.org\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:46:01+01:00\" level=info msg=\"Applying deployments kubeflow.pytorch-operator\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:46:01+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.pytorch-operator\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:46:01+01:00\" level=info msg=\"Component pytorch-operator apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", + "time=\"2019-05-28T11:46:12+01:00\" level=info msg=\"Applying services kubeflow.tensorboard\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:46:12+01:00\" level=info msg=\"Creating non-existent services kubeflow.tensorboard\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:46:12+01:00\" level=info msg=\"Applying deployments kubeflow.tensorboard\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:46:12+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.tensorboard\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:46:12+01:00\" level=info msg=\"Component tensorboard apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", + "time=\"2019-05-28T11:46:25+01:00\" level=info msg=\"Applying customresourcedefinitions tfjobs.kubeflow.org\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:46:25+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.tf-job-dashboard\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:46:25+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.tf-job-dashboard\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:46:25+01:00\" level=info msg=\"Applying configmaps kubeflow.tf-job-operator-config\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:46:25+01:00\" level=info msg=\"Creating non-existent configmaps kubeflow.tf-job-operator-config\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:46:25+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.tf-job-operator\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:46:25+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.tf-job-operator\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:46:25+01:00\" level=info msg=\"Applying clusterroles tf-job-operator\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:46:25+01:00\" level=info msg=\"Applying clusterrolebindings tf-job-operator\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:46:25+01:00\" level=info msg=\"Applying services kubeflow.tf-job-dashboard\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:46:25+01:00\" level=info msg=\"Creating non-existent services kubeflow.tf-job-dashboard\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:46:26+01:00\" level=info msg=\"Applying clusterroles tf-job-dashboard\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:46:26+01:00\" level=info msg=\"Applying clusterrolebindings tf-job-dashboard\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:46:26+01:00\" level=info msg=\"Applying deployments kubeflow.tf-job-operator\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:46:26+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.tf-job-operator\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:46:26+01:00\" level=info msg=\"Applying deployments kubeflow.tf-job-dashboard\" filename=\"cluster/upsert.go:73\"\n", + "time=\"2019-05-28T11:46:26+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.tf-job-dashboard\" filename=\"cluster/upsert.go:92\"\n", + "time=\"2019-05-28T11:46:26+01:00\" level=info msg=\"Component tf-job-operator apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", + "time=\"2019-05-28T11:46:26+01:00\" level=info msg=\"All components apply succeeded\" filename=\"ksonnet/ksonnet.go:192\"\n" + ] + } + ], "source": [ "%%bash\n", "cd kubeflow-seldon\n", @@ -112,7 +448,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -144,7 +480,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "metadata": { "scrolled": true }, @@ -153,8 +489,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "NAME: aspiring-chinchilla\n", - "LAST DEPLOYED: Mon May 27 16:15:38 2019\n", + "NAME: old-mastiff\n", + "LAST DEPLOYED: Tue May 28 11:47:35 2019\n", "NAMESPACE: kubeflow\n", "STATUS: DEPLOYED\n", "\n", @@ -176,8 +512,8 @@ "seldon-operator-webhook-server-secret Opaque 0 0s\n", "\n", "==> v1/Service\n", - "NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\n", - "seldon-operator-controller-manager-service ClusterIP 10.108.159.109 443/TCP 0s\n", + "NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\n", + "seldon-operator-controller-manager-service ClusterIP 10.101.228.36 443/TCP 0s\n", "\n", "==> v1/StatefulSet\n", "NAME READY AGE\n", @@ -208,14 +544,14 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "seldon-operator-controller-manager-0 1/1 Running 0 15s\r\n" + "seldon-operator-controller-manager-0 1/1 Running 1 6s\r\n" ] } ], @@ -236,7 +572,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -284,19 +620,20 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Transformer.py\t__init__.py build_image.sh pipeline_step.py requirements.txt\r\n" + "clean_text\t lr_text_classifier tfidf_vectorizer\r\n", + "data_downloader spacy_tokenize\r\n" ] } ], "source": [ - "!ls pipeline/pipeline_steps/clean_text/" + "!ls pipeline/pipeline_steps" ] }, { @@ -314,7 +651,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -343,37 +680,41 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "import dill\r\n", - "import click\r\n", - "import dill\r\n", - "try:\r\n", - " # Running for tests\r\n", - " from .Transformer import Transformer\r\n", - "except:\r\n", - " # Running from CLI\r\n", - " from Transformer import Transformer\r\n", - "\r\n", - "@click.command()\r\n", - "@click.option('--in-path', default=\"/mnt/raw_text.data\")\r\n", - "@click.option('--out-path', default=\"/mnt/clean_text.data\")\r\n", - "def run_pipeline(in_path, out_path):\r\n", - " clean_text_transformer = Transformer()\r\n", - " with open(in_path, 'rb') as in_f:\r\n", - " x = dill.load(in_f)\r\n", - " y = clean_text_transformer.predict(x)\r\n", - " with open(out_path, \"wb\") as out_f:\r\n", - " dill.dump(y, out_f)\r\n", - "\r\n", - "if __name__ == \"__main__\":\r\n", - " run_pipeline()\r\n", - "\r\n" + "\u001b[38;5;238m───────┬────────────────────────────────────────────────────────────────────────\u001b[0m\n", + " \u001b[38;5;238m│ \u001b[0mFile: \u001b[1mpipeline/pipeline_steps/clean_text/pipeline_step.py\u001b[0m\n", + "\u001b[38;5;238m───────┼────────────────────────────────────────────────────────────────────────\u001b[0m\n", + "\u001b[38;5;238m 1\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mimport\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mdill\u001b[0m\n", + "\u001b[38;5;238m 2\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mimport\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mclick\u001b[0m\n", + "\u001b[38;5;238m 3\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mimport\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mdill\u001b[0m\n", + "\u001b[38;5;238m 4\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mtry\u001b[0m\u001b[38;5;231m:\u001b[0m\n", + "\u001b[38;5;238m 5\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;242m#\u001b[0m\u001b[38;5;242m Running for tests\u001b[0m\n", + "\u001b[38;5;238m 6\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mfrom\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m.\u001b[0m\u001b[38;5;231mTransformer\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mimport\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mTransformer\u001b[0m\n", + "\u001b[38;5;238m 7\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mexcept\u001b[0m\u001b[38;5;231m:\u001b[0m\n", + "\u001b[38;5;238m 8\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;242m#\u001b[0m\u001b[38;5;242m Running from CLI\u001b[0m\n", + "\u001b[38;5;238m 9\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mfrom\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mTransformer\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mimport\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mTransformer\u001b[0m\n", + "\u001b[38;5;238m 10\u001b[0m \u001b[38;5;238m│\u001b[0m \n", + "\u001b[38;5;238m 11\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m@\u001b[0m\u001b[38;5;231mclick\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mcommand\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231m)\u001b[0m\n", + "\u001b[38;5;238m 12\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m@\u001b[0m\u001b[38;5;231mclick\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231moption\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186m--in-path\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;208mdefault\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m/mnt/raw_text.data\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\n", + "\u001b[38;5;238m 13\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m@\u001b[0m\u001b[38;5;231mclick\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231moption\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186m--out-path\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;208mdefault\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m/mnt/clean_text.data\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\n", + "\u001b[38;5;238m 14\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;149mdef\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;149mrun_pipeline\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;208min_path\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;208mout_path\u001b[0m\u001b[38;5;231m)\u001b[0m\u001b[38;5;231m:\u001b[0m\n", + "\u001b[38;5;238m 15\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mclean_text_transformer\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mTransformer\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231m)\u001b[0m\n", + "\u001b[38;5;238m 16\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mwith\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;81mopen\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231min_path\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186mrb\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m)\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mas\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231min_f\u001b[0m\u001b[38;5;231m:\u001b[0m\n", + "\u001b[38;5;238m 17\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mx\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mdill\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mload\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231min_f\u001b[0m\u001b[38;5;231m)\u001b[0m\n", + "\u001b[38;5;238m 18\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231my\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mclean_text_transformer\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mpredict\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231mx\u001b[0m\u001b[38;5;231m)\u001b[0m\n", + "\u001b[38;5;238m 19\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mwith\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;81mopen\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231mout_path\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mwb\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mas\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mout_f\u001b[0m\u001b[38;5;231m:\u001b[0m\n", + "\u001b[38;5;238m 20\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mdill\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mdump\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231my\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mout_f\u001b[0m\u001b[38;5;231m)\u001b[0m\n", + "\u001b[38;5;238m 21\u001b[0m \u001b[38;5;238m│\u001b[0m \n", + "\u001b[38;5;238m 22\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mif\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231m__name__\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m==\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m__main__\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m:\u001b[0m\n", + "\u001b[38;5;238m 23\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mrun_pipeline\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231m)\u001b[0m\n", + "\u001b[38;5;238m 24\u001b[0m \u001b[38;5;238m│\u001b[0m \n", + "\u001b[38;5;238m───────┴────────────────────────────────────────────────────────────────────────\u001b[0m\n" ] } ], @@ -381,6 +722,71 @@ "!cat pipeline/pipeline_steps/clean_text/pipeline_step.py" ] }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[38;5;238m───────┬────────────────────────────────────────────────────────────────────────\u001b[0m\r\n", + " \u001b[38;5;238m│ \u001b[0mFile: \u001b[1mpipeline/pipeline_steps/clean_text/Transformer.py\u001b[0m\r\n", + "\u001b[38;5;238m───────┼────────────────────────────────────────────────────────────────────────\u001b[0m\r\n", + "\u001b[38;5;238m 1\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mimport\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mre\u001b[0m\u001b[38;5;231m \u001b[0m\r\n", + "\u001b[38;5;238m 2\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mfrom\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mparser\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mimport\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mHTMLParser\u001b[0m\r\n", + "\u001b[38;5;238m 3\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mimport\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mnumpy\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mas\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mnp\u001b[0m\r\n", + "\u001b[38;5;238m 4\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mimport\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mlogging\u001b[0m\r\n", + "\u001b[38;5;238m 5\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", + "\u001b[38;5;238m 6\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;149mclass\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[4;38;5;81mTransformer\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231m)\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 7\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m__html_parser\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mHTMLParser\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m 8\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m__uplus_pattern\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231m\\\u001b[0m\r\n", + "\u001b[38;5;238m 9\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mre\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mcompile\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m\\<\u001b[0m\u001b[38;5;186m[uU]\u001b[0m\u001b[38;5;231m\\+\u001b[0m\u001b[38;5;186m(?P[a-zA-Z0-9]+)\u001b[0m\u001b[38;5;231m\\>\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m 10\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m__markup_link_pattern\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231m\\\u001b[0m\r\n", + "\u001b[38;5;238m 11\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mre\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mcompile\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m\\[\u001b[0m\u001b[38;5;186m(.*)\u001b[0m\u001b[38;5;231m\\]\u001b[0m\u001b[38;5;231m\\(\u001b[0m\u001b[38;5;186m(.*)\u001b[0m\u001b[38;5;231m\\)\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m 12\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", + "\u001b[38;5;238m 13\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;149mdef\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;149mpredict\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;208mself\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;208mX\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;208mfeature_names\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m[\u001b[0m\u001b[38;5;231m]\u001b[0m\u001b[38;5;231m)\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 14\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mlogging\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mwarning\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231mX\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m 15\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mf\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mnp\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mvectorize\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231mTransformer\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mtransform_clean_text\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m 16\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mX_clean\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mf\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231mX\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m 17\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mlogging\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mwarning\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231mX_clean\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m 18\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mreturn\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mX_clean\u001b[0m\r\n", + "\u001b[38;5;238m 19\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", + "\u001b[38;5;238m 20\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;149mdef\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;149mfit\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;208mself\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;208mX\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;208my\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;141mNone\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m**\u001b[0m\u001b[38;5;208mfit_params\u001b[0m\u001b[38;5;231m)\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 21\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mreturn\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mself\u001b[0m\r\n", + "\u001b[38;5;238m 22\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\r\n", + "\u001b[38;5;238m 23\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m@\u001b[0m\u001b[38;5;81mstaticmethod\u001b[0m\r\n", + "\u001b[38;5;238m 24\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;149mdef\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;149mtransform_clean_text\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;208mraw_text\u001b[0m\u001b[38;5;231m)\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 25\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mtry\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 26\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mdecoded\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mraw_text\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mencode\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mISO-8859-1\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mdecode\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mutf-8\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m 27\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mexcept\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 28\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mdecoded\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mraw_text\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mencode\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mISO-8859-1\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mdecode\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mcp1252\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m 29\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231mTransformer\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231m\\\u001b[0m\r\n", + "\u001b[38;5;238m 30\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m__html_parser\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231munescape\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231mdecoded\u001b[0m\u001b[38;5;231m)\u001b[0m\u001b[38;5;231m \u001b[0m\r\n", + "\u001b[38;5;238m 31\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mre\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231msub\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;81mr\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;141m\\r\u001b[0m\u001b[38;5;141m\\n\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m 32\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mre\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231msub\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;81mr\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;141m\\r\u001b[0m\u001b[38;5;141m\\r\u001b[0m\u001b[38;5;141m\\n\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m 33\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mre\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231msub\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;81mr\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;141m\\r\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m 34\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mreplace\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m>\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m > \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m 35\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mreplace\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m<\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m < \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m 36\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mreplace\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m - \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m 37\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mTransformer\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231m__uplus_pattern\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231msub\u001b[0m\u001b[38;5;231m(\u001b[0m\r\n", + "\u001b[38;5;238m 38\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m U\u001b[0m\u001b[38;5;231m\\g\u001b[0m\u001b[38;5;186m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m 39\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mTransformer\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231m__markup_link_pattern\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231msub\u001b[0m\u001b[38;5;231m(\u001b[0m\r\n", + "\u001b[38;5;238m 40\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m \u001b[0m\u001b[38;5;231m\\1\u001b[0m\u001b[38;5;186m \u001b[0m\u001b[38;5;231m\\2\u001b[0m\u001b[38;5;186m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m 41\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mreplace\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;141m\\\\\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m 42\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mreturn\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\r\n", + "\u001b[38;5;238m 43\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", + "\u001b[38;5;238m───────┴────────────────────────────────────────────────────────────────────────\u001b[0m\r\n" + ] + } + ], + "source": [ + "!cat pipeline/pipeline_steps/clean_text/Transformer.py" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -421,7 +827,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -506,7 +912,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -514,7 +920,7 @@ "output_type": "stream", "text": [ "NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\r\n", - "ambassador NodePort 10.108.204.59 80:31357/TCP 7m8s\r\n" + "ambassador NodePort 10.97.236.196 80:30209/TCP 8m58s\r\n" ] } ], @@ -531,7 +937,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -555,7 +961,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -563,7 +969,7 @@ "output_type": "stream", "text": [ "NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\r\n", - "ambassador LoadBalancer 10.108.204.59 localhost 80:31357/TCP 7m36s\r\n" + "ambassador LoadBalancer 10.97.236.196 localhost 80:30209/TCP 9m20s\r\n" ] } ], @@ -579,9 +985,306 @@ "![](img/k-pipeline-dashboard.jpg)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Define the pipeline\n", + "Now we want to generate the pipeline. For this we can use the DSL provided by kubeflow to define the actual steps required. \n", + "\n", + "The pipeline will look as follows:\n", + "\n", + "![](img/kubeflow-seldon-nlp-ml-pipelines.jpg)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[38;5;238m───────┬────────────────────────────────────────────────────────────────────────\u001b[0m\r\n", + " \u001b[38;5;238m│ \u001b[0mFile: \u001b[1mtrain_pipeline/nlp_pipeline.py\u001b[0m\r\n", + "\u001b[38;5;238m───────┼────────────────────────────────────────────────────────────────────────\u001b[0m\r\n", + "\u001b[38;5;238m 1\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", + "\u001b[38;5;238m 2\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mimport\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mkfp\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mdsl\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mas\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mdsl\u001b[0m\r\n", + "\u001b[38;5;238m 3\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mimport\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231myaml\u001b[0m\r\n", + "\u001b[38;5;238m 4\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mfrom\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mkubernetes\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mimport\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mclient\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mas\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mk8s\u001b[0m\r\n", + "\u001b[38;5;238m 5\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", + "\u001b[38;5;238m 6\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", + "\u001b[38;5;238m 7\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m@\u001b[0m\u001b[38;5;231mdsl\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mpipeline\u001b[0m\u001b[38;5;231m(\u001b[0m\r\n", + "\u001b[38;5;238m 8\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mname\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186mNLP\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 9\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mdescription\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186mA pipeline demonstrating reproducible steps for NLP\u001b[0m\u001b[38;5;186m'\u001b[0m\r\n", + "\u001b[38;5;238m 10\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m 11\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;149mdef\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;149mnlp_pipeline\u001b[0m\u001b[38;5;231m(\u001b[0m\r\n", + "\u001b[38;5;238m 12\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mcsv_url\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mhttps://raw.githubusercontent.com/axsauze/reddit-class\u001b[0m\r\n", + "\u001b[38;5;238m \u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;186mification-exploration/master/data/reddit_train.csv\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 13\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mcsv_encoding\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mISO-8859-1\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 14\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mfeatures_column\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mBODY\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 15\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mlabels_column\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mREMOVED\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 16\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mraw_text_path\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186m/mnt/text.data\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 17\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mlabels_path\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186m/mnt/labels.data\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 18\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mclean_text_path\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186m/mnt/clean.data\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 19\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mspacy_tokens_path\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186m/mnt/tokens.data\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 20\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mtfidf_vectors_path\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186m/mnt/tfidf.data\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 21\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mlr_prediction_path\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186m/mnt/prediction.data\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 22\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mtfidf_model_path\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186m/mnt/tfidf.model\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 23\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mlr_model_path\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186m/mnt/lr.model\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 24\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mlr_c_param\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;141m0\u001b[0m\u001b[38;5;141m.\u001b[0m\u001b[38;5;141m1\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 25\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mtfidf_max_features\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;141m10000\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 26\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mtfidf_ngram_range\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;141m3\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 27\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mbatch_size\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186m100\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m)\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 28\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;242m\"\"\"\u001b[0m\r\n", + "\u001b[38;5;238m 29\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;242m Pipeline \u001b[0m\r\n", + "\u001b[38;5;238m 30\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;242m \u001b[0m\u001b[38;5;242m\"\"\"\u001b[0m\r\n", + "\u001b[38;5;238m 31\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mvop\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mdsl\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mVolumeOp\u001b[0m\u001b[38;5;231m(\u001b[0m\r\n", + "\u001b[38;5;238m 32\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mname\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186mmy-pvc\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 33\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mresource_name\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mmy-pvc\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 34\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mmodes\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m[\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mReadWriteMany\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m]\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 35\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208msize\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m1Gi\u001b[0m\u001b[38;5;186m\"\u001b[0m\r\n", + "\u001b[38;5;238m 36\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m 37\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", + "\u001b[38;5;238m 38\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mdownload_step\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mdsl\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mContainerOp\u001b[0m\u001b[38;5;231m(\u001b[0m\r\n", + "\u001b[38;5;238m 39\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mname\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186mdata_downloader\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 40\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mimage\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186mdata_downloader:0.1\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 41\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mcommand\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mpython\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 42\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208marguments\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m[\u001b[0m\r\n", + "\u001b[38;5;238m 43\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m/microservice/pipeline_step.py\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 44\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--labels-path\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mlabels_path\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 45\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--features-path\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mraw_text_path\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 46\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--csv-url\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mcsv_url\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 47\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--csv-encoding\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mcsv_encoding\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 48\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--features-column\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mfeatures_column\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 49\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--labels-column\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mlabels_column\u001b[0m\r\n", + "\u001b[38;5;238m 50\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m]\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 51\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mpvolumes\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m{\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m/mnt\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mvop\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mvolume\u001b[0m\u001b[38;5;231m}\u001b[0m\r\n", + "\u001b[38;5;238m 52\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m 53\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", + "\u001b[38;5;238m 54\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mclean_step\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mdsl\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mContainerOp\u001b[0m\u001b[38;5;231m(\u001b[0m\r\n", + "\u001b[38;5;238m 55\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mname\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186mclean_text\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 56\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mimage\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186mclean_text_transformer:0.1\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 57\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mcommand\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mpython\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 58\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208marguments\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m[\u001b[0m\r\n", + "\u001b[38;5;238m 59\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m/microservice/pipeline_step.py\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 60\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--in-path\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mraw_text_path\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 61\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--out-path\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mclean_text_path\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 62\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m]\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 63\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mpvolumes\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m{\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m/mnt\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mdownload_step\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mpvolume\u001b[0m\u001b[38;5;231m}\u001b[0m\r\n", + "\u001b[38;5;238m 64\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m)\u001b[0m\r\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[38;5;238m 65\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", + "\u001b[38;5;238m 66\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mtokenize_step\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mdsl\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mContainerOp\u001b[0m\u001b[38;5;231m(\u001b[0m\r\n", + "\u001b[38;5;238m 67\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mname\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186mtokenize\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 68\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mimage\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186mspacy_tokenizer:0.1\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 69\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mcommand\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mpython\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 70\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208marguments\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m[\u001b[0m\r\n", + "\u001b[38;5;238m 71\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m/microservice/pipeline_step.py\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 72\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--in-path\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mclean_text_path\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 73\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--out-path\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mspacy_tokens_path\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 74\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m]\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 75\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mpvolumes\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m{\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m/mnt\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mclean_step\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mpvolume\u001b[0m\u001b[38;5;231m}\u001b[0m\r\n", + "\u001b[38;5;238m 76\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m 77\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", + "\u001b[38;5;238m 78\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mvectorize_step\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mdsl\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mContainerOp\u001b[0m\u001b[38;5;231m(\u001b[0m\r\n", + "\u001b[38;5;238m 79\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mname\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186mvectorize\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 80\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mimage\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186mtfidf_vectorizer:0.1\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 81\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mcommand\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mpython\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 82\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208marguments\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m[\u001b[0m\r\n", + "\u001b[38;5;238m 83\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m/microservice/pipeline_step.py\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 84\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--in-path\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mspacy_tokens_path\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 85\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--out-path\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mtfidf_vectors_path\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 86\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--max-features\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mtfidf_max_features\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 87\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--ngram-range\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mtfidf_ngram_range\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 88\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--action\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mtrain\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 89\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--model-path\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mtfidf_model_path\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 90\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m]\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 91\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mpvolumes\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m{\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m/mnt\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mtokenize_step\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mpvolume\u001b[0m\u001b[38;5;231m}\u001b[0m\r\n", + "\u001b[38;5;238m 92\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m 93\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", + "\u001b[38;5;238m 94\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mpredict_step\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mdsl\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mContainerOp\u001b[0m\u001b[38;5;231m(\u001b[0m\r\n", + "\u001b[38;5;238m 95\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mname\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186mpredictor\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 96\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mimage\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186mlr_text_classifier:0.1\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 97\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mcommand\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mpython\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 98\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208marguments\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m[\u001b[0m\r\n", + "\u001b[38;5;238m 99\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m/microservice/pipeline_step.py\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 100\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--in-path\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mtfidf_vectors_path\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 101\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--labels-path\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mlabels_path\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 102\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--out-path\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mlr_prediction_path\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 103\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--c-param\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mlr_c_param\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 104\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--action\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mtrain\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 105\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--model-path\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mlr_model_path\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 106\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m]\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 107\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mpvolumes\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m{\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m/mnt\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mvectorize_step\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mpvolume\u001b[0m\u001b[38;5;231m}\u001b[0m\r\n", + "\u001b[38;5;238m 108\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m 109\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", + "\u001b[38;5;238m 110\u001b[0m \u001b[33m~\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mtry\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 111\u001b[0m \u001b[33m~\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mseldon_config\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231myaml\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mload\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;81mopen\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m../deploy_pipeline/seldon_produ\u001b[0m\r\n", + "\u001b[38;5;238m \u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;186mction_pipeline.yaml\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m 112\u001b[0m \u001b[33m~\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mexcept\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 113\u001b[0m \u001b[33m~\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;242m#\u001b[0m\u001b[38;5;242m If this file is run from the project core directory \u001b[0m\r\n", + "\u001b[38;5;238m 114\u001b[0m \u001b[33m~\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mseldon_config\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231myaml\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mload\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;81mopen\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mdeploy_pipeline/seldon_producti\u001b[0m\r\n", + "\u001b[38;5;238m \u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;186mon_pipeline.yaml\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m 115\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", + "\u001b[38;5;238m 116\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mdeploy_step\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mdsl\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mResourceOp\u001b[0m\u001b[38;5;231m(\u001b[0m\r\n", + "\u001b[38;5;238m 117\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mname\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mseldondeploy\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 118\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mk8s_resource\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231mseldon_config\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", + "\u001b[38;5;238m 119\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mattribute_outputs\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m{\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mname\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;141m{\u001b[0m\u001b[38;5;141m.metadata.name\u001b[0m\u001b[38;5;141m}\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m}\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m 120\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", + "\u001b[38;5;238m 121\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mdeploy_step\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mafter\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231mpredict_step\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m 122\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", + "\u001b[38;5;238m 123\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mif\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231m__name__\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m==\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186m__main__\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 124\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mimport\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mkfp\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mcompiler\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mas\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mcompiler\u001b[0m\r\n", + "\u001b[38;5;238m 125\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mcompiler\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mCompiler\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231m)\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mcompile\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231mnlp_pipeline\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231m__file__\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m+\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186m.tar.gz\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", + "\u001b[38;5;238m───────┴────────────────────────────────────────────────────────────────────────\u001b[0m\r\n" + ] + } + ], + "source": [ + "!cat train_pipeline/nlp_pipeline.py" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Breaking down the code\n", + "As you can see in the DSL, we have the ContainerOp - each of those is a step in the Kubeflow pipeline.\n", + "\n", + "At the end we can see the `seldondeploy` step which basically deploys the trained pipeline\n", + "\n", + "The definition of the SeldonDeployment graph is provided in the `deploy_pipeline/seldon_production_pipeline.yaml` file.\n", + "\n", + "The seldondeployment file defines our production execution graph using the same reusable components." + ] + }, { "cell_type": "code", "execution_count": 18, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[38;5;238m───────┬────────────────────────────────────────────────────────────────────────\u001b[0m\r\n", + " \u001b[38;5;238m│ \u001b[0mFile: \u001b[1mdeploy_pipeline/seldon_production_pipeline.yaml\u001b[0m\r\n", + "\u001b[38;5;238m───────┼────────────────────────────────────────────────────────────────────────\u001b[0m\r\n", + "\u001b[38;5;238m 1\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;149m---\u001b[0m\r\n", + "\u001b[38;5;238m 2\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mapiVersion\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mmachinelearning.seldon.io/v1alpha2\u001b[0m\r\n", + "\u001b[38;5;238m 3\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mkind\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mSeldonDeployment\u001b[0m\r\n", + "\u001b[38;5;238m 4\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mmetadata\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 5\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mlabels\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 6\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mapp\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mseldon\u001b[0m\r\n", + "\u001b[38;5;238m 7\u001b[0m \u001b[33m~\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mseldon-deployment-{{workflow.name}}\u001b[0m\u001b[38;5;186m\"\u001b[0m\r\n", + "\u001b[38;5;238m 8\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mnamespace\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mkubeflow\u001b[0m\r\n", + "\u001b[38;5;238m 9\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mspec\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 10\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mannotations\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 11\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mproject_name\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mNLP Pipeline\u001b[0m\r\n", + "\u001b[38;5;238m 12\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mdeployment_version\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mv1\u001b[0m\r\n", + "\u001b[38;5;238m 13\u001b[0m \u001b[33m~\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mseldon-deployment-{{workflow.name}}\u001b[0m\u001b[38;5;186m\"\u001b[0m\r\n", + "\u001b[38;5;238m 14\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203moauth_key\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186moauth-key\u001b[0m\r\n", + "\u001b[38;5;238m 15\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203moauth_secret\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186moauth-secret\u001b[0m\r\n", + "\u001b[38;5;238m 16\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mpredictors\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 17\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mcomponentSpecs\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 18\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mspec\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 19\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mcontainers\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 20\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mimage\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mclean_text_transformer:0.1\u001b[0m\r\n", + "\u001b[38;5;238m 21\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mimagePullPolicy\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mIfNotPresent\u001b[0m\r\n", + "\u001b[38;5;238m 22\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mcleantext\u001b[0m\r\n", + "\u001b[38;5;238m 23\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mresources\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 24\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mrequests\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 25\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mmemory\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m1Mi\u001b[0m\r\n", + "\u001b[38;5;238m 26\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mimage\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mspacy_tokenizer:0.1\u001b[0m\r\n", + "\u001b[38;5;238m 27\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mimagePullPolicy\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mIfNotPresent\u001b[0m\r\n", + "\u001b[38;5;238m 28\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mspacytokenizer\u001b[0m\r\n", + "\u001b[38;5;238m 29\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mimage\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mtfidf_vectorizer:0.1\u001b[0m\r\n", + "\u001b[38;5;238m 30\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mimagePullPolicy\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mIfNotPresent\u001b[0m\r\n", + "\u001b[38;5;238m 31\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mtfidfvectorizer\u001b[0m\r\n", + "\u001b[38;5;238m 32\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mvolumeMounts\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 33\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mmypvc\u001b[0m\r\n", + "\u001b[38;5;238m 34\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mmountPath\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m/mnt\u001b[0m\r\n", + "\u001b[38;5;238m 35\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mimage\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mlr_text_classifier:0.1\u001b[0m\r\n", + "\u001b[38;5;238m 36\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mimagePullPolicy\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mIfNotPresent\u001b[0m\r\n", + "\u001b[38;5;238m 37\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mlrclassifier\u001b[0m\r\n", + "\u001b[38;5;238m 38\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mvolumeMounts\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 39\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mmypvc\u001b[0m\r\n", + "\u001b[38;5;238m 40\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mmountPath\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m/mnt\u001b[0m\r\n", + "\u001b[38;5;238m 41\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mterminationGracePeriodSeconds\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;141m20\u001b[0m\r\n", + "\u001b[38;5;238m 42\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mvolumes\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 43\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mmypvc\u001b[0m\r\n", + "\u001b[38;5;238m 44\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mpersistentVolumeClaim\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 45\u001b[0m \u001b[33m~\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mclaimName\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m{{workflow.name}}-my-pvc\u001b[0m\u001b[38;5;186m\"\u001b[0m\r\n", + "\u001b[38;5;238m 46\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mgraph\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 47\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mchildren\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 48\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mspacytokenizer\u001b[0m\r\n", + "\u001b[38;5;238m 49\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mendpoint\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 50\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mtype\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mREST\u001b[0m\r\n", + "\u001b[38;5;238m 51\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mtype\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mMODEL\u001b[0m\r\n", + "\u001b[38;5;238m 52\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mchildren\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 53\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mtfidfvectorizer\u001b[0m\r\n", + "\u001b[38;5;238m 54\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mendpoint\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 55\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mtype\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mREST\u001b[0m\r\n", + "\u001b[38;5;238m 56\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mtype\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mMODEL\u001b[0m\r\n", + "\u001b[38;5;238m 57\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mchildren\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 58\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mlrclassifier\u001b[0m\r\n", + "\u001b[38;5;238m 59\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mendpoint\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 60\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mtype\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mREST\u001b[0m\r\n", + "\u001b[38;5;238m 61\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mtype\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mMODEL\u001b[0m\r\n", + "\u001b[38;5;238m 62\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mchildren\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231m[\u001b[0m\u001b[38;5;231m]\u001b[0m\r\n", + "\u001b[38;5;238m 63\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mcleantext\u001b[0m\r\n", + "\u001b[38;5;238m 64\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mendpoint\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 65\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mtype\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mREST\u001b[0m\r\n", + "\u001b[38;5;238m 66\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mtype\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mMODEL\u001b[0m\r\n", + "\u001b[38;5;238m 67\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186msingle-model\u001b[0m\r\n", + "\u001b[38;5;238m 68\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mreplicas\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;141m1\u001b[0m\r\n", + "\u001b[38;5;238m 69\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mannotations\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 70\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mpredictor_version\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mv1\u001b[0m\r\n", + "\u001b[38;5;238m 71\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", + "\u001b[38;5;238m───────┴────────────────────────────────────────────────────────────────────────\u001b[0m\r\n" + ] + } + ], + "source": [ + "!cat deploy_pipeline/seldon_production_pipeline.yaml" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Seldon Production pipeline contents\n", + "If we look at the file we'll be using to deploy our pipeline, we can see that it has the following key points:\n", + "\n", + "1) Reusable components definitions as containerSpecs: cleantext, spacytokenizer, tfidfvectorizer & lrclassifier\n", + "\n", + "2) DAG (directed acyclic graph) definition for REST pipeline: cleantext -> spacytokenizer -> tfidfvectorizer -> lrclassifier\n", + "\n", + "This graph in our production deployment looks as follows:\n", + "\n", + "![](img/kubeflow-seldon-nlp-ml-pipelines-deploy.jpg)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Generate the pipeline files to upload to Kubeflow\n", + "To generate the pipeline we just have to run the pipeline file, which will output the `tar.gz` file that will be uploaded." + ] + }, + { + "cell_type": "code", + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -604,8 +1307,6 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now that we've built our steps, we can actually train our ML pipeline, which looks as follows:\n", - "![](img/kubeflow-seldon-nlp-ml-pipelines-training.jpg)\n", "\n", "### Run the pipeline\n", "\n", @@ -625,7 +1326,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -633,7 +1334,7 @@ "output_type": "stream", "text": [ "NAME AGE\r\n", - "nlp-jvfdd 1m\r\n" + "nlp-bddff 2m\r\n" ] } ], @@ -650,14 +1351,14 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "nlp-jvfdd" + "nlp-bddff" ] } ], @@ -674,34 +1375,38 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "apiVersion: v1\r\n", - "kind: Pod\r\n", - "metadata:\r\n", - " name: pvc-access-container\r\n", - "spec:\r\n", - " containers:\r\n", - " - name: pvc-access-container\r\n", - " image: busybox\r\n", - " command: [\"/bin/sh\", \"-ec\", \"sleep 1000\"]\r\n", - " volumeMounts:\r\n", - " - name: mypvc\r\n", - " mountPath: /mnt\r\n", - " volumes:\r\n", - " - name: mypvc\r\n", - " persistentVolumeClaim:\r\n", - " claimName: nlp-jvfdd-my-pvc\r\n" + "\u001b[38;5;238m───────┬────────────────────────────────────────────────────────────────────────\u001b[0m\r\n", + " \u001b[38;5;238m│ \u001b[0m\u001b[1mSTDIN\u001b[0m\r\n", + "\u001b[38;5;238m───────┼────────────────────────────────────────────────────────────────────────\u001b[0m\r\n", + "\u001b[38;5;238m 1\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mapiVersion\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mv1\u001b[0m\r\n", + "\u001b[38;5;238m 2\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mkind\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mPod\u001b[0m\r\n", + "\u001b[38;5;238m 3\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mmetadata\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 4\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mpvc-access-container\u001b[0m\r\n", + "\u001b[38;5;238m 5\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mspec\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 6\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mcontainers\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 7\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mpvc-access-container\u001b[0m\r\n", + "\u001b[38;5;238m 8\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mimage\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mbusybox\u001b[0m\r\n", + "\u001b[38;5;238m 9\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mcommand\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231m[\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m/bin/sh\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m-ec\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186msleep 1000\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m]\u001b[0m\r\n", + "\u001b[38;5;238m 10\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mvolumeMounts\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 11\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mmypvc\u001b[0m\r\n", + "\u001b[38;5;238m 12\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mmountPath\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m/mnt\u001b[0m\r\n", + "\u001b[38;5;238m 13\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mvolumes\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 14\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mmypvc\u001b[0m\r\n", + "\u001b[38;5;238m 15\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mpersistentVolumeClaim\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", + "\u001b[38;5;238m 16\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mclaimName\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mnlp-b7qt8-my-pvc\u001b[0m\r\n", + "\u001b[38;5;238m───────┴────────────────────────────────────────────────────────────────────────\u001b[0m\r\n" ] } ], "source": [ - "!sed \"s/PVC_NAME/\"$(kubectl get workflow -n kubeflow -o jsonpath='{.items[0].metadata.name}')\"-my-pvc/g\" deploy_pipeline/pvc-access.yaml" + "!sed \"s/PVC_NAME/\"$(kubectl get workflow -n kubeflow -o jsonpath='{.items[0].metadata.name}')\"-my-pvc/g\" deploy_pipeline/pvc-access.yaml " ] }, { @@ -746,6 +1451,13 @@ "!kubectl get pods -n kubeflow pvc-access-container" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can run an `ls` command to see what's inside:" + ] + }, { "cell_type": "code", "execution_count": 25, @@ -785,193 +1497,64 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 4) Deploying your ML Pipeline with Seldon\n", - "Now that we have trained our ML pipeline, it's time to deploy it at scale!\n", - "\n", - "For this we will just need to create a simple Graph definition using the SeldonDeploy Kubernetes Custom Resource Definition.\n", - "\n", - "Adding the Seldon deployment will make our architecture look as follows:\n", - "\n", - "![](img/kubeflow-seldon-nlp-ml-pipelines.jpg)\n", - "\n", - "### Seldon Production pipeline contents\n", - "If we look at the file we'll be using to deploy our pipeline, we can see that it has the following key points:\n", - "\n", - "1) Reusable components definitions as containerSpecs: cleantext, spacytokenizer, tfidfvectorizer & lrclassifier\n", - "\n", - "2) DAG (directed acyclic graph) definition for REST pipeline: cleantext -> spacytokenizer -> tfidfvectorizer -> lrclassifier\n" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "---\r\n", - "apiVersion: machinelearning.seldon.io/v1alpha2\r\n", - "kind: SeldonDeployment\r\n", - "metadata:\r\n", - " labels:\r\n", - " app: seldon\r\n", - " name: nlp-classifier\r\n", - " namespace: kubeflow\r\n", - "spec:\r\n", - " annotations:\r\n", - " project_name: NLP Pipeline\r\n", - " deployment_version: v1\r\n", - " name: nlp-classifier\r\n", - " oauth_key: oauth-key\r\n", - " oauth_secret: oauth-secret\r\n", - " predictors:\r\n", - " - componentSpecs:\r\n", - " - spec:\r\n", - " containers:\r\n", - " - image: clean_text_transformer:0.1\r\n", - " imagePullPolicy: IfNotPresent\r\n", - " name: cleantext\r\n", - " resources:\r\n", - " requests:\r\n", - " memory: 1Mi\r\n", - " - image: spacy_tokenizer:0.1\r\n", - " imagePullPolicy: IfNotPresent\r\n", - " name: spacytokenizer\r\n", - " - image: tfidf_vectorizer:0.1\r\n", - " imagePullPolicy: IfNotPresent\r\n", - " name: tfidfvectorizer\r\n", - " volumeMounts:\r\n", - " - name: mypvc\r\n", - " mountPath: /mnt\r\n", - " - image: lr_text_classifier:0.1\r\n", - " imagePullPolicy: IfNotPresent\r\n", - " name: lrclassifier\r\n", - " volumeMounts:\r\n", - " - name: mypvc\r\n", - " mountPath: /mnt\r\n", - " terminationGracePeriodSeconds: 20\r\n", - " volumes:\r\n", - " - name: mypvc\r\n", - " persistentVolumeClaim:\r\n", - " claimName: PVC_NAME\r\n", - " graph:\r\n", - " children:\r\n", - " - name: spacytokenizer\r\n", - " endpoint:\r\n", - " type: REST\r\n", - " type: MODEL\r\n", - " children:\r\n", - " - name: tfidfvectorizer\r\n", - " endpoint:\r\n", - " type: REST\r\n", - " type: MODEL\r\n", - " children:\r\n", - " - name: lrclassifier\r\n", - " endpoint:\r\n", - " type: REST\r\n", - " type: MODEL\r\n", - " children: []\r\n", - " name: cleantext\r\n", - " endpoint:\r\n", - " type: REST\r\n", - " type: MODEL\r\n", - " name: single-model\r\n", - " replicas: 1\r\n", - " annotations:\r\n", - " predictor_version: v1\r\n", - "\r\n" - ] - } - ], - "source": [ - "!cat deploy_pipeline/seldon_production_pipeline.yaml" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This is the exact same structure as the Kubeflow definition, and can be deployed using kubectl\n", - "\n", - "Once again, we want to make sure we replace the \"PVC_NAME\" variable with the workflow ID to attach the container to the Seldon pipeline\n" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "seldondeployment.machinelearning.seldon.io/nlp-classifier created\r\n" - ] - } - ], - "source": [ - "!sed \"s/PVC_NAME/\"$(kubectl get workflow -n kubeflow -o jsonpath='{.items[0].metadata.name}')\"-my-pvc/g\" deploy_pipeline/seldon_production_pipeline.yaml | kubectl -n kubeflow apply -f -" + "## 5) Test Deployed ML REST Endpoints\n", + "Now that it's running we have a production ML text pipeline that we can Query using REST and GRPC\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "We now make sure that the Seldon Engine with the 4 reusable components are running:\n" + "First we can check if our Seldon deployment is running with" ] }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "nlp-classifier-single-model-51fb0cb-6cf49fdd7d-txlc8 5/5 Running 0 27s\r\n" + "NAME AGE\r\n", + "seldon-deployment-nlp-b7qt8 57m\r\n" ] } ], "source": [ - "!kubectl -n kubeflow get pods | grep nlp-classifier" + "!kubectl -n kubeflow get seldondeployment " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "We can also find this with the SeldonDeployment custom resource definition\n" + "We will need the Seldon Pipeline Deployment name to reach the API, so we can get it using:" ] }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "NAME AGE\r\n", - "nlp-classifier 40s\r\n" + "seldon-deployment-nlp-b7qt8" ] } ], "source": [ - "!kubectl -n kubeflow get seldondeployment " + "!kubectl -n kubeflow get seldondeployment -o jsonpath='{.items[0].metadata.name}'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## 5) Test Deployed ML REST Endpoints\n", - "Now that it's running we have a production ML text pipeline that we can Query using REST and GRPC\n", - "\n", - "We can interact with our API in two ways: \n", + "Now we can interact with our API in two ways: \n", "\n", "1) Using CURL or any client like PostMan\n", "\n", @@ -982,13 +1565,12 @@ "\n", "```\n", "http:///seldon/kubeflow//api/v0.1/predictions\n", - "```\n", - "\n" + "```" ] }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 25, "metadata": {}, "outputs": [ { @@ -997,7 +1579,7 @@ "text": [ "{\n", " \"meta\": {\n", - " \"puid\": \"9f7cnfoj2cdk1e052l428s3f7i\",\n", + " \"puid\": \"k89krp6t7tfgb386nt6vc3iftk\",\n", " \"tags\": {\n", " },\n", " \"routing\": {\n", @@ -1015,7 +1597,7 @@ " },\n", " \"data\": {\n", " \"names\": [\"t:0\", \"t:1\"],\n", - " \"ndarray\": [[0.6729294030193711, 0.3270705969806289]]\n", + " \"ndarray\": [[0.6729318752883149, 0.3270681247116851]]\n", " }\n", "}" ] @@ -1028,16 +1610,16 @@ " Dload Upload Total Spent Left Speed\n", "\r", " 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r", - "100 599 100 527 100 72 918 125 --:--:-- --:--:-- --:--:-- 1043\n" + "100 72 0 0 100 72 0 354 --:--:-- --:--:-- --:--:-- 356\r", + "100 599 100 527 100 72 516 70 0:00:01 0:00:01 --:--:-- 588\n" ] } ], "source": [ "%%bash\n", - "#!curl -H \\\"Content-Type: application/x-www-form-urlencoded\\\" -g localhost/seldon/kubeflow/nlp-classifier/api/v0.1/predictions -d 'json={\\\"data\\\":{\\\"ndarray\\\":[[\\\"Hello this is some text to test\\\"]]}}'\n", "curl -X POST -H 'Content-Type: application/json' \\\n", " -d \"{'data': {'names': ['text'], 'ndarray': ['Hello world this is a test']}}\" \\\n", - " http://127.0.0.1/seldon/kubeflow/nlp-classifier/api/v0.1/predictions" + " http://127.0.0.1/seldon/kubeflow/$(kubectl -n kubeflow get seldondeployment -o jsonpath='{.items[0].metadata.name}')/api/v0.1/predictions" ] }, { @@ -1050,7 +1632,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 36, "metadata": {}, "outputs": [ { @@ -1070,7 +1652,7 @@ "\n", "Response:\n", "meta {\n", - " puid: \"5ppdl2ff869fnn6l0n59qspck7\"\n", + " puid: \"qtdca40d3s0463nn4ginhkvc6t\"\n", " routing {\n", " key: \"cleantext\"\n", " value: -1\n", @@ -1107,10 +1689,10 @@ " values {\n", " list_value {\n", " values {\n", - " number_value: 0.6729294030193711\n", + " number_value: 0.6729318752883149\n", " }\n", " values {\n", - " number_value: 0.3270705969806289\n", + " number_value: 0.3270681247116851\n", " }\n", " }\n", " }\n", @@ -1123,12 +1705,14 @@ "source": [ "from seldon_core.seldon_client import SeldonClient\n", "import numpy as np\n", + "import subprocess\n", "\n", "host = \"localhost\"\n", "port = \"80\" # Make sure you use the port above\n", "batch = np.array([\"Hello world this is a test\"])\n", "payload_type = \"ndarray\"\n", - "deployment_name=\"nlp-classifier\"\n", + "# Get the deployment name\n", + "deployment_name = subprocess.getoutput(\"kubectl -n kubeflow get seldondeployment -o jsonpath='{.items[0].metadata.name}'\")\n", "transport=\"rest\"\n", "namespace=\"kubeflow\"\n", "\n", @@ -1151,8 +1735,101 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## You now have a full end-to-end training and production NLP pipeline 😎 " + "## 6) Visualise Seldon's Production ML Pipelines\n", + "We can visualise the performance using the SeldonAnalytics package, which we can deploy using:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!helm install seldon-core-analytics --repo https://storage.googleapis.com/seldon-charts --namespace kubeflow" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In my case, similar to what I did with Ambassador, I need to make sure the the service is a LoadBalancer instead of a NodePort" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "service/grafana-prom patched\r\n" + ] + } + ], + "source": [ + "!kubectl patch svc grafana-prom --type='json' -p '[{\"op\":\"replace\",\"path\":\"/spec/type\",\"value\":\"LoadBalancer\"}]' -n kubeflow" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\r\n", + "grafana-prom LoadBalancer 10.98.248.223 localhost 80:32445/TCP 64m\r\n" + ] + } + ], + "source": [ + "!kubectl get svc grafana-prom -n kubeflow" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can access it at the port provided, in my case it is http://localhost:32445/d/3swM2iGWz/prediction-analytics?refresh=5s&orgId=1\n", + "\n", + "(initial username is admin and password is password, which will be requested to be changed on the first login)\n", + "\n", + "Generate a bunch of requests and visualise:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "while True:\n", + " client_prediction = sc.predict(\n", + " data=batch, \n", + " deployment_name=deployment_name,\n", + " names=[\"text\"],\n", + " payload_type=payload_type,\n", + " transport=\"rest\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## You now have a full end-to-end training and production NLP pipeline 😎 \n", + "![](img/seldon-analytics.jpg)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/examples/kubeflow/train_pipeline/nlp_pipeline.py b/examples/kubeflow/train_pipeline/nlp_pipeline.py index 5d41685727..34e8f5bde2 100644 --- a/examples/kubeflow/train_pipeline/nlp_pipeline.py +++ b/examples/kubeflow/train_pipeline/nlp_pipeline.py @@ -107,7 +107,11 @@ def nlp_pipeline( pvolumes={"/mnt": vectorize_step.pvolume} ) - seldon_config = yaml.load(open("../deploy_pipeline/seldon_production_pipeline.yaml")) + try: + seldon_config = yaml.load(open("../deploy_pipeline/seldon_production_pipeline.yaml")) + except: + # If this file is run from the project core directory + seldon_config = yaml.load(open("deploy_pipeline/seldon_production_pipeline.yaml")) deploy_step = dsl.ResourceOp( name="seldondeploy", From 4cc9c83c586a67e3ddc69fc0ecfc7d048cd6b270 Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Tue, 28 May 2019 19:29:37 +0100 Subject: [PATCH 22/22] Updated example to showcase seldon analytics --- examples/kubeflow/README.md | 556 ++++++++--- .../kubeflow_seldon_e2e_pipeline.ipynb | 941 ++++++------------ 2 files changed, 708 insertions(+), 789 deletions(-) diff --git a/examples/kubeflow/README.md b/examples/kubeflow/README.md index 89f0e71ff6..147729e037 100644 --- a/examples/kubeflow/README.md +++ b/examples/kubeflow/README.md @@ -5,7 +5,7 @@ In this example we showcase how to build re-usable components to build an ML pip We will automate content moderation on the Reddit comments in /r/science building a machine learning NLP model with the following components: -![](img/completed-pipeline.jpg) +![](img/completed-pipeline-deploy.jpg) This tutorial will break down in the following sections: @@ -13,13 +13,11 @@ This tutorial will break down in the following sections: 2) Test and build all our reusable pipeline steps -3) Train our NLP Pipeline with Kubeflow +3) Use Kubeflow to Train the Pipeline and Deploy to Seldon -4) Deploying your ML Pipeline with Seldon +5) Test Seldon Deployed ML REST Endpoints -5) Test Deployed ML REST Endpoints - -Let's get started! 🚀🔥 +6) Visualise Seldon's Production ML Pipelines # Before you start Make sure you install the following dependencies, as they are critical for this example to work: @@ -28,10 +26,27 @@ Make sure you install the following dependencies, as they are critical for this * A Kubernetes cluster running v1.13 or above (minkube / docker-for-windows work well if enough RAM) * kubectl v1.14+ * ksonnet v0.13.1+ -* kfctl 0.5.2 - Please use this exact version as there are major changes every few months +* kfctl 0.5.1 - Please use this exact version as there are major changes every few months * Python 3.6+ * Python DEV requirements (we'll install them below) +Let's get started! 🚀🔥 We will be building the end-to-end pipeline below: + +![](img/kubeflow-seldon-nlp-full.jpg) + + + +```python +!cat requirements-dev.txt +``` + + python-dateutil + https://storage.googleapis.com/ml-pipeline/release/0.1.20/kfp.tar.gz + kubernetes + click + seldon_core + numpy + ```python @@ -90,8 +105,8 @@ As you can see, we are running the Seldon Operator in the Kubeflow namespace. !helm install seldon-core-operator --namespace kubeflow --repo https://storage.googleapis.com/seldon-charts ``` - NAME: aspiring-chinchilla - LAST DEPLOYED: Mon May 27 16:15:38 2019 + NAME: old-mastiff + LAST DEPLOYED: Tue May 28 11:47:35 2019 NAMESPACE: kubeflow STATUS: DEPLOYED @@ -113,8 +128,8 @@ As you can see, we are running the Seldon Operator in the Kubeflow namespace. seldon-operator-webhook-server-secret Opaque 0 0s ==> v1/Service - NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE - seldon-operator-controller-manager-service ClusterIP 10.108.159.109 443/TCP 0s + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE + seldon-operator-controller-manager-service ClusterIP 10.101.228.36 443/TCP 0s ==> v1/StatefulSet NAME READY AGE @@ -138,7 +153,7 @@ Check all the Seldon Deployment is running !kubectl get pod -n kubeflow | grep seldon ``` - seldon-operator-controller-manager-0 1/1 Running 0 15s + seldon-operator-controller-manager-0 1/1 Running 1 6s ### Temporary fix for Argo image @@ -180,10 +195,11 @@ We will start by building each of the components in our ML pipeline. ```python -!ls pipeline/pipeline_steps/clean_text/ +!ls pipeline/pipeline_steps ``` - Transformer.py __init__.py build_image.sh pipeline_step.py requirements.txt + clean_text lr_text_classifier tfidf_vectorizer + data_downloader spacy_tokenize Like in this step, all of the other steps can be found in the `pipeline/pipeline_steps/` folder, and all have the following structure: @@ -193,6 +209,7 @@ Like in this step, all of the other steps can be found in the `pipeline/pipeline * `build_image.sh` which uses `s2i` to build the image with one line ### Let's check out the CLI for clean_text +The pipeline_step CLI is the entry point for the kubeflow image as it will be able to pass any relevant parameters @@ -242,6 +259,60 @@ This is actually a very simple file, as we are using the click library to define +The Transformer is where the data munging and transformation stage comes in, which will be wrapped by the container and exposed through the Seldon Engine to ensure our pipeline can be used in production. + +Seldon provides multiple different features, such as abilities to send custom metrics, pre-process / post-process data and more. In this example we will only be exposing the `predict` step. + + +```python +!cat pipeline/pipeline_steps/clean_text/Transformer.py +``` + + import re + from html.parser import HTMLParser + import numpy as np + import logging + + class Transformer(): + __html_parser = HTMLParser() + __uplus_pattern = \ + re.compile("\<[uU]\+(?P[a-zA-Z0-9]+)\>") + __markup_link_pattern = \ + re.compile("\[(.*)\]\((.*)\)") + + def predict(self, X, feature_names=[]): + logging.warning(X) + f = np.vectorize(Transformer.transform_clean_text) + X_clean = f(X) + logging.warning(X_clean) + return X_clean + + def fit(self, X, y=None, **fit_params): + return self + + @staticmethod + def transform_clean_text(raw_text): + try: + decoded = raw_text.encode("ISO-8859-1").decode("utf-8") + except: + decoded = raw_text.encode("ISO-8859-1").decode("cp1252") + html_unescaped =Transformer.\ + __html_parser.unescape(decoded) + html_unescaped = re.sub(r"\r\n", " ", html_unescaped) + html_unescaped = re.sub(r"\r\r\n", " ", html_unescaped) + html_unescaped = re.sub(r"\r", " ", html_unescaped) + html_unescaped = html_unescaped.replace(">", " > ") + html_unescaped = html_unescaped.replace("<", " < ") + html_unescaped = html_unescaped.replace("--", " - ") + html_unescaped = Transformer.__uplus_pattern.sub( + " U\g ", html_unescaped) + html_unescaped = Transformer.__markup_link_pattern.sub( + " \1 \2 ", html_unescaped) + html_unescaped = html_unescaped.replace("\\", "") + return html_unescaped + + + If you want to understand how the CLI pipeline talks to each other, have a look at the end to end test in `pipeline/pipeline_tests/`: @@ -317,7 +388,7 @@ If you can't edit this, you need to make sure that the ambassador gateway servic ``` NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE - ambassador NodePort 10.108.204.59 80:31357/TCP 7m8s + ambassador NodePort 10.97.236.196 80:30209/TCP 8m58s In my case, I need to change the kind from `NodePort` into `LoadBalancer` which can be done with the following command: @@ -340,12 +411,252 @@ Now that I've changed it to a loadbalancer, it has allocated the external IP as ``` NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE - ambassador LoadBalancer 10.108.204.59 localhost 80:31357/TCP 7m36s + ambassador LoadBalancer 10.97.236.196 localhost 80:30209/TCP 9m20s If this was successfull, you should be able to access the dashboard ![](img/k-pipeline-dashboard.jpg) +### Define the pipeline +Now we want to generate the pipeline. For this we can use the DSL provided by kubeflow to define the actual steps required. + +The pipeline will look as follows: + +![](img/kubeflow-seldon-nlp-ml-pipelines.jpg) + + +```python +!cat train_pipeline/nlp_pipeline.py +``` + + + import kfp.dsl as dsl + import yaml + from kubernetes import client as k8s + + + @dsl.pipeline( + name='NLP', + description='A pipeline demonstrating reproducible steps for NLP' + ) + def nlp_pipeline( + csv_url="https://raw.githubusercontent.com/axsauze/reddit-classification-exploration/master/data/reddit_train.csv", + csv_encoding="ISO-8859-1", + features_column="BODY", + labels_column="REMOVED", + raw_text_path='/mnt/text.data', + labels_path='/mnt/labels.data', + clean_text_path='/mnt/clean.data', + spacy_tokens_path='/mnt/tokens.data', + tfidf_vectors_path='/mnt/tfidf.data', + lr_prediction_path='/mnt/prediction.data', + tfidf_model_path='/mnt/tfidf.model', + lr_model_path='/mnt/lr.model', + lr_c_param=0.1, + tfidf_max_features=10000, + tfidf_ngram_range=3, + batch_size='100'): + """ + Pipeline + """ + vop = dsl.VolumeOp( + name='my-pvc', + resource_name="my-pvc", + modes=["ReadWriteMany"], + size="1Gi" + ) + + download_step = dsl.ContainerOp( + name='data_downloader', + image='data_downloader:0.1', + command="python", + arguments=[ + "/microservice/pipeline_step.py", + "--labels-path", labels_path, + "--features-path", raw_text_path, + "--csv-url", csv_url, + "--csv-encoding", csv_encoding, + "--features-column", features_column, + "--labels-column", labels_column + ], + pvolumes={"/mnt": vop.volume} + ) + + clean_step = dsl.ContainerOp( + name='clean_text', + image='clean_text_transformer:0.1', + command="python", + arguments=[ + "/microservice/pipeline_step.py", + "--in-path", raw_text_path, + "--out-path", clean_text_path, + ], + pvolumes={"/mnt": download_step.pvolume} + ) + + tokenize_step = dsl.ContainerOp( + name='tokenize', + image='spacy_tokenizer:0.1', + command="python", + arguments=[ + "/microservice/pipeline_step.py", + "--in-path", clean_text_path, + "--out-path", spacy_tokens_path, + ], + pvolumes={"/mnt": clean_step.pvolume} + ) + + vectorize_step = dsl.ContainerOp( + name='vectorize', + image='tfidf_vectorizer:0.1', + command="python", + arguments=[ + "/microservice/pipeline_step.py", + "--in-path", spacy_tokens_path, + "--out-path", tfidf_vectors_path, + "--max-features", tfidf_max_features, + "--ngram-range", tfidf_ngram_range, + "--action", "train", + "--model-path", tfidf_model_path, + ], + pvolumes={"/mnt": tokenize_step.pvolume} + ) + + predict_step = dsl.ContainerOp( + name='predictor', + image='lr_text_classifier:0.1', + command="python", + arguments=[ + "/microservice/pipeline_step.py", + "--in-path", tfidf_vectors_path, + "--labels-path", labels_path, + "--out-path", lr_prediction_path, + "--c-param", lr_c_param, + "--action", "train", + "--model-path", lr_model_path, + ], + pvolumes={"/mnt": vectorize_step.pvolume} + ) + + try: + seldon_config = yaml.load(open("../deploy_pipeline/seldon_production_pipeline.yaml")) + except: + # If this file is run from the project core directory + seldon_config = yaml.load(open("deploy_pipeline/seldon_production_pipeline.yaml")) + + deploy_step = dsl.ResourceOp( + name="seldondeploy", + k8s_resource=seldon_config, + attribute_outputs={"name": "{.metadata.name}"}) + + deploy_step.after(predict_step) + + if __name__ == '__main__': + import kfp.compiler as compiler + compiler.Compiler().compile(nlp_pipeline, __file__ + '.tar.gz') + + +### Breaking down the code +As you can see in the DSL, we have the ContainerOp - each of those is a step in the Kubeflow pipeline. + +At the end we can see the `seldondeploy` step which basically deploys the trained pipeline + +The definition of the SeldonDeployment graph is provided in the `deploy_pipeline/seldon_production_pipeline.yaml` file. + +The seldondeployment file defines our production execution graph using the same reusable components. + + +```python +!cat deploy_pipeline/seldon_production_pipeline.yaml +``` + + --- + apiVersion: machinelearning.seldon.io/v1alpha2 + kind: SeldonDeployment + metadata: + labels: + app: seldon + name: "seldon-deployment-{{workflow.name}}" + namespace: kubeflow + spec: + annotations: + project_name: NLP Pipeline + deployment_version: v1 + name: "seldon-deployment-{{workflow.name}}" + oauth_key: oauth-key + oauth_secret: oauth-secret + predictors: + - componentSpecs: + - spec: + containers: + - image: clean_text_transformer:0.1 + imagePullPolicy: IfNotPresent + name: cleantext + resources: + requests: + memory: 1Mi + - image: spacy_tokenizer:0.1 + imagePullPolicy: IfNotPresent + name: spacytokenizer + - image: tfidf_vectorizer:0.1 + imagePullPolicy: IfNotPresent + name: tfidfvectorizer + volumeMounts: + - name: mypvc + mountPath: /mnt + - image: lr_text_classifier:0.1 + imagePullPolicy: IfNotPresent + name: lrclassifier + volumeMounts: + - name: mypvc + mountPath: /mnt + terminationGracePeriodSeconds: 20 + volumes: + - name: mypvc + persistentVolumeClaim: + claimName: "{{workflow.name}}-my-pvc" + graph: + children: + - name: spacytokenizer + endpoint: + type: REST + type: MODEL + children: + - name: tfidfvectorizer + endpoint: + type: REST + type: MODEL + children: + - name: lrclassifier + endpoint: + type: REST + type: MODEL + children: [] + name: cleantext + endpoint: + type: REST + type: MODEL + name: single-model + replicas: 1 + annotations: + predictor_version: v1 + + + +### Seldon Production pipeline contents +If we look at the file we'll be using to deploy our pipeline, we can see that it has the following key points: + +1) Reusable components definitions as containerSpecs: cleantext, spacytokenizer, tfidfvectorizer & lrclassifier + +2) DAG (directed acyclic graph) definition for REST pipeline: cleantext -> spacytokenizer -> tfidfvectorizer -> lrclassifier + +This graph in our production deployment looks as follows: + +![](img/kubeflow-seldon-nlp-ml-pipelines-deploy.jpg) + +### Generate the pipeline files to upload to Kubeflow +To generate the pipeline we just have to run the pipeline file, which will output the `tar.gz` file that will be uploaded. + ```bash %%bash @@ -358,8 +669,6 @@ ls train_pipeline/ nlp_pipeline.py.tar.gz -Now that we've built our steps, we can actually train our ML pipeline, which looks as follows: -![](img/kubeflow-seldon-nlp-ml-pipelines-training.jpg) ### Run the pipeline @@ -383,7 +692,7 @@ The persistent volume claim is the same name as the argo workflow: ``` NAME AGE - nlp-jvfdd 1m + nlp-bddff 2m Our workflow is there! So we can actually access it by running @@ -393,13 +702,13 @@ Our workflow is there! So we can actually access it by running !kubectl get workflow -n kubeflow -o jsonpath='{.items[0].metadata.name}' ``` - nlp-jvfdd + nlp-bddff And we can use good old `sed` to insert this workflow name in our PVC-Access controler which we can use to inspect the contents of the volume: ```python -!sed "s/PVC_NAME/"$(kubectl get workflow -n kubeflow -o jsonpath='{.items[0].metadata.name}')"-my-pvc/g" deploy_pipeline/pvc-access.yaml +!sed "s/PVC_NAME/"$(kubectl get workflow -n kubeflow -o jsonpath='{.items[0].metadata.name}')"-my-pvc/g" deploy_pipeline/pvc-access.yaml ``` apiVersion: v1 @@ -417,7 +726,7 @@ And we can use good old `sed` to insert this workflow name in our PVC-Access con volumes: - name: mypvc persistentVolumeClaim: - claimName: nlp-jvfdd-my-pvc + claimName: nlp-b7qt8-my-pvc We just need to apply this container with our kubectl command, and we can use it to inspect the mounted folder: @@ -439,6 +748,8 @@ We just need to apply this container with our kubectl command, and we can use it pvc-access-container 1/1 Running 0 6s +Now we can run an `ls` command to see what's inside: + ```python !kubectl -n kubeflow exec -it pvc-access-container ls /mnt @@ -456,141 +767,31 @@ We just need to apply this container with our kubectl command, and we can use it pod "pvc-access-container" deleted -## 4) Deploying your ML Pipeline with Seldon -Now that we have trained our ML pipeline, it's time to deploy it at scale! - -For this we will just need to create a simple Graph definition using the SeldonDeploy Kubernetes Custom Resource Definition. - -Adding the Seldon deployment will make our architecture look as follows: - -![](img/kubeflow-seldon-nlp-ml-pipelines.jpg) - -### Seldon Production pipeline contents -If we look at the file we'll be using to deploy our pipeline, we can see that it has the following key points: - -1) Reusable components definitions as containerSpecs: cleantext, spacytokenizer, tfidfvectorizer & lrclassifier - -2) DAG (directed acyclic graph) definition for REST pipeline: cleantext -> spacytokenizer -> tfidfvectorizer -> lrclassifier - - - -```python -!cat deploy_pipeline/seldon_production_pipeline.yaml -``` - - --- - apiVersion: machinelearning.seldon.io/v1alpha2 - kind: SeldonDeployment - metadata: - labels: - app: seldon - name: nlp-classifier - namespace: kubeflow - spec: - annotations: - project_name: NLP Pipeline - deployment_version: v1 - name: nlp-classifier - oauth_key: oauth-key - oauth_secret: oauth-secret - predictors: - - componentSpecs: - - spec: - containers: - - image: clean_text_transformer:0.1 - imagePullPolicy: IfNotPresent - name: cleantext - resources: - requests: - memory: 1Mi - - image: spacy_tokenizer:0.1 - imagePullPolicy: IfNotPresent - name: spacytokenizer - - image: tfidf_vectorizer:0.1 - imagePullPolicy: IfNotPresent - name: tfidfvectorizer - volumeMounts: - - name: mypvc - mountPath: /mnt - - image: lr_text_classifier:0.1 - imagePullPolicy: IfNotPresent - name: lrclassifier - volumeMounts: - - name: mypvc - mountPath: /mnt - terminationGracePeriodSeconds: 20 - volumes: - - name: mypvc - persistentVolumeClaim: - claimName: PVC_NAME - graph: - children: - - name: spacytokenizer - endpoint: - type: REST - type: MODEL - children: - - name: tfidfvectorizer - endpoint: - type: REST - type: MODEL - children: - - name: lrclassifier - endpoint: - type: REST - type: MODEL - children: [] - name: cleantext - endpoint: - type: REST - type: MODEL - name: single-model - replicas: 1 - annotations: - predictor_version: v1 - - - -This is the exact same structure as the Kubeflow definition, and can be deployed using kubectl - -Once again, we want to make sure we replace the "PVC_NAME" variable with the workflow ID to attach the container to the Seldon pipeline - - - -```python -!sed "s/PVC_NAME/"$(kubectl get workflow -n kubeflow -o jsonpath='{.items[0].metadata.name}')"-my-pvc/g" deploy_pipeline/seldon_production_pipeline.yaml | kubectl -n kubeflow apply -f - -``` - - seldondeployment.machinelearning.seldon.io/nlp-classifier created - +## 5) Test Deployed ML REST Endpoints +Now that it's running we have a production ML text pipeline that we can Query using REST and GRPC -We now make sure that the Seldon Engine with the 4 reusable components are running: +First we can check if our Seldon deployment is running with ```python -!kubectl -n kubeflow get pods | grep nlp-classifier +!kubectl -n kubeflow get seldondeployment ``` - nlp-classifier-single-model-51fb0cb-6cf49fdd7d-txlc8 5/5 Running 0 27s - + NAME AGE + seldon-deployment-nlp-b7qt8 57m -We can also find this with the SeldonDeployment custom resource definition +We will need the Seldon Pipeline Deployment name to reach the API, so we can get it using: ```python -!kubectl -n kubeflow get seldondeployment +!kubectl -n kubeflow get seldondeployment -o jsonpath='{.items[0].metadata.name}' ``` - NAME AGE - nlp-classifier 40s - + seldon-deployment-nlp-b7qt8 -## 5) Test Deployed ML REST Endpoints -Now that it's running we have a production ML text pipeline that we can Query using REST and GRPC - -We can interact with our API in two ways: +Now we can interact with our API in two ways: 1) Using CURL or any client like PostMan @@ -604,19 +805,16 @@ http:///seldon/kubeflow//api/v0.1/predictions ``` - - ```bash %%bash -#!curl -H \"Content-Type: application/x-www-form-urlencoded\" -g localhost/seldon/kubeflow/nlp-classifier/api/v0.1/predictions -d 'json={\"data\":{\"ndarray\":[[\"Hello this is some text to test\"]]}}' curl -X POST -H 'Content-Type: application/json' \ -d "{'data': {'names': ['text'], 'ndarray': ['Hello world this is a test']}}" \ - http://127.0.0.1/seldon/kubeflow/nlp-classifier/api/v0.1/predictions + http://127.0.0.1/seldon/kubeflow/$(kubectl -n kubeflow get seldondeployment -o jsonpath='{.items[0].metadata.name}')/api/v0.1/predictions ``` { "meta": { - "puid": "9f7cnfoj2cdk1e052l428s3f7i", + "puid": "k89krp6t7tfgb386nt6vc3iftk", "tags": { }, "routing": { @@ -634,13 +832,13 @@ curl -X POST -H 'Content-Type: application/json' \ }, "data": { "names": ["t:0", "t:1"], - "ndarray": [[0.6729294030193711, 0.3270705969806289]] + "ndarray": [[0.6729318752883149, 0.3270681247116851]] } } % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed - 100 599 100 527 100 72 918 125 --:--:-- --:--:-- --:--:-- 1043 + 100 599 100 527 100 72 516 70 0:00:01 0:00:01 --:--:-- 588 ### Using the SeldonClient @@ -650,12 +848,14 @@ We can also use the Python SeldonClient to interact with the pipeline we just de ```python from seldon_core.seldon_client import SeldonClient import numpy as np +import subprocess host = "localhost" port = "80" # Make sure you use the port above batch = np.array(["Hello world this is a test"]) payload_type = "ndarray" -deployment_name="nlp-classifier" +# Get the deployment name +deployment_name = subprocess.getoutput("kubectl -n kubeflow get seldondeployment -o jsonpath='{.items[0].metadata.name}'") transport="rest" namespace="kubeflow" @@ -687,7 +887,7 @@ print(client_prediction) Response: meta { - puid: "5ppdl2ff869fnn6l0n59qspck7" + puid: "qtdca40d3s0463nn4ginhkvc6t" routing { key: "cleantext" value: -1 @@ -724,10 +924,10 @@ print(client_prediction) values { list_value { values { - number_value: 0.6729294030193711 + number_value: 0.6729318752883149 } values { - number_value: 0.3270705969806289 + number_value: 0.3270681247116851 } } } @@ -736,4 +936,54 @@ print(client_prediction) +## 6) Visualise Seldon's Production ML Pipelines +We can visualise the performance using the SeldonAnalytics package, which we can deploy using: + + +```python +!helm install seldon-core-analytics --repo https://storage.googleapis.com/seldon-charts --namespace kubeflow +``` + +In my case, similar to what I did with Ambassador, I need to make sure the the service is a LoadBalancer instead of a NodePort + + +```python +!kubectl patch svc grafana-prom --type='json' -p '[{"op":"replace","path":"/spec/type","value":"LoadBalancer"}]' -n kubeflow +``` + + service/grafana-prom patched + + + +```python +!kubectl get svc grafana-prom -n kubeflow +``` + + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE + grafana-prom LoadBalancer 10.98.248.223 localhost 80:32445/TCP 64m + + +Now we can access it at the port provided, in my case it is http://localhost:32445/d/3swM2iGWz/prediction-analytics?refresh=5s&orgId=1 + +(initial username is admin and password is password, which will be requested to be changed on the first login) + +Generate a bunch of requests and visualise: + + +```python +while True: + client_prediction = sc.predict( + data=batch, + deployment_name=deployment_name, + names=["text"], + payload_type=payload_type, + transport="rest") +``` + ## You now have a full end-to-end training and production NLP pipeline 😎 +![](img/seldon-analytics.jpg) + + +```python + +``` diff --git a/examples/kubeflow/kubeflow_seldon_e2e_pipeline.ipynb b/examples/kubeflow/kubeflow_seldon_e2e_pipeline.ipynb index b97d87ef44..ff4d272f05 100644 --- a/examples/kubeflow/kubeflow_seldon_e2e_pipeline.ipynb +++ b/examples/kubeflow/kubeflow_seldon_e2e_pipeline.ipynb @@ -42,23 +42,19 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\u001b[38;5;238m───────┬────────────────────────────────────────────────────────────────────────\u001b[0m\n", - " \u001b[38;5;238m│ \u001b[0mFile: \u001b[1mrequirements-dev.txt\u001b[0m\n", - "\u001b[38;5;238m───────┼────────────────────────────────────────────────────────────────────────\u001b[0m\n", - "\u001b[38;5;238m 1\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231mpython-dateutil\u001b[0m\n", - "\u001b[38;5;238m 2\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231mhttps://storage.googleapis.com/ml-pipeline/release/0.1.20/kfp.tar.gz\u001b[0m\n", - "\u001b[38;5;238m 3\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231mkubernetes\u001b[0m\n", - "\u001b[38;5;238m 4\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231mclick\u001b[0m\n", - "\u001b[38;5;238m 5\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231mseldon_core\u001b[0m\n", - "\u001b[38;5;238m 6\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231mnumpy\u001b[0m\n", - "\u001b[38;5;238m───────┴────────────────────────────────────────────────────────────────────────\u001b[0m\n" + "python-dateutil\r\n", + "https://storage.googleapis.com/ml-pipeline/release/0.1.20/kfp.tar.gz\r\n", + "kubernetes\r\n", + "click\r\n", + "seldon_core\r\n", + "numpy\r\n" ] } ], @@ -118,319 +114,11 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": { "scrolled": true }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "time=\"2019-05-28T11:43:47+01:00\" level=info msg=\"reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml\" filename=\"coordinator/coordinator.go:341\"\n", - "time=\"2019-05-28T11:43:47+01:00\" level=info msg=\"reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml\" filename=\"coordinator/coordinator.go:341\"\n", - "time=\"2019-05-28T11:43:47+01:00\" level=info msg=\"Ksonnet.Generate Name kubeflow-seldon AppDir /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon Platform \" filename=\"ksonnet/ksonnet.go:369\"\n", - "time=\"2019-05-28T11:43:48+01:00\" level=info msg=\"Creating environment \\\"default\\\" with namespace \\\"kubeflow\\\", pointing to \\\"version:v1.13.0\\\" cluster at address \\\"https://localhost:6445\\\"\" filename=\"env/create.go:77\"\n", - "time=\"2019-05-28T11:43:53+01:00\" level=info msg=\"Generating ksonnet-lib data at path '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/lib/ksonnet-lib/v1.13.0'\" filename=\"lib/lib.go:148\"\n", - "time=\"2019-05-28T11:43:53+01:00\" level=info msg=\"Successfully initialized the app kubeflow-seldon.\" filename=\"ksonnet/ksonnet.go:505\"\n", - "time=\"2019-05-28T11:43:53+01:00\" level=info msg=\"App kubeflow-seldon add registry kubeflow URI /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/.cache/v0.5.1/kubeflow\" filename=\"ksonnet/ksonnet.go:621\"\n", - "time=\"2019-05-28T11:43:53+01:00\" level=info msg=\"Retrieved 6 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-28T11:43:54+01:00\" level=info msg=\"Retrieved 22 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-28T11:43:54+01:00\" level=info msg=\"Retrieved 9 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-28T11:43:54+01:00\" level=info msg=\"Retrieved 35 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-28T11:43:54+01:00\" level=info msg=\"Retrieved 49 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-28T11:43:54+01:00\" level=info msg=\"Retrieved 6 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-28T11:43:54+01:00\" level=info msg=\"Retrieved 4 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-28T11:43:54+01:00\" level=info msg=\"Retrieved 4 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-28T11:43:54+01:00\" level=info msg=\"Retrieved 9 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-28T11:43:54+01:00\" level=info msg=\"Retrieved 14 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-28T11:43:54+01:00\" level=info msg=\"Retrieved 6 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-28T11:43:54+01:00\" level=info msg=\"Retrieved 17 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-28T11:43:54+01:00\" level=info msg=\"Retrieved 8 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-28T11:43:54+01:00\" level=info msg=\"Retrieved 12 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Retrieved 4 files\" filename=\"registry/cache.go:114\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Creating Component: ambassador ...\" filename=\"ksonnet/ksonnet.go:207\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Args: [ambassador ambassador]\" filename=\"ksonnet/ksonnet.go:208\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/ambassador.jsonnet'\" filename=\"component/create.go:92\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Creating Component: argo ...\" filename=\"ksonnet/ksonnet.go:207\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Args: [argo argo]\" filename=\"ksonnet/ksonnet.go:208\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/argo.jsonnet'\" filename=\"component/create.go:92\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Creating Component: centraldashboard ...\" filename=\"ksonnet/ksonnet.go:207\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Args: [centraldashboard centraldashboard]\" filename=\"ksonnet/ksonnet.go:208\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/centraldashboard.jsonnet'\" filename=\"component/create.go:92\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Creating Component: jupyter-web-app ...\" filename=\"ksonnet/ksonnet.go:207\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Args: [jupyter-web-app jupyter-web-app]\" filename=\"ksonnet/ksonnet.go:208\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/jupyter-web-app.jsonnet'\" filename=\"component/create.go:92\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Creating Component: katib ...\" filename=\"ksonnet/ksonnet.go:207\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Args: [katib katib]\" filename=\"ksonnet/ksonnet.go:208\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/katib.jsonnet'\" filename=\"component/create.go:92\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Creating Component: metacontroller ...\" filename=\"ksonnet/ksonnet.go:207\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Args: [metacontroller metacontroller]\" filename=\"ksonnet/ksonnet.go:208\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/metacontroller.jsonnet'\" filename=\"component/create.go:92\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Creating Component: notebook-controller ...\" filename=\"ksonnet/ksonnet.go:207\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Args: [notebook-controller notebook-controller]\" filename=\"ksonnet/ksonnet.go:208\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/notebook-controller.jsonnet'\" filename=\"component/create.go:92\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Creating Component: pipeline ...\" filename=\"ksonnet/ksonnet.go:207\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Args: [pipeline pipeline]\" filename=\"ksonnet/ksonnet.go:208\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/pipeline.jsonnet'\" filename=\"component/create.go:92\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Creating Component: pytorch-operator ...\" filename=\"ksonnet/ksonnet.go:207\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Args: [pytorch-operator pytorch-operator]\" filename=\"ksonnet/ksonnet.go:208\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/pytorch-operator.jsonnet'\" filename=\"component/create.go:92\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Creating Component: tensorboard ...\" filename=\"ksonnet/ksonnet.go:207\"\n", - "time=\"2019-05-28T11:43:55+01:00\" level=info msg=\"Args: [tensorboard tensorboard]\" filename=\"ksonnet/ksonnet.go:208\"\n", - "time=\"2019-05-28T11:43:56+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/tensorboard.jsonnet'\" filename=\"component/create.go:92\"\n", - "time=\"2019-05-28T11:43:56+01:00\" level=info msg=\"Creating Component: tf-job-operator ...\" filename=\"ksonnet/ksonnet.go:207\"\n", - "time=\"2019-05-28T11:43:56+01:00\" level=info msg=\"Args: [tf-job-operator tf-job-operator]\" filename=\"ksonnet/ksonnet.go:208\"\n", - "time=\"2019-05-28T11:43:56+01:00\" level=info msg=\"Writing component at '/home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/ks_app/components/tf-job-operator.jsonnet'\" filename=\"component/create.go:92\"\n", - "time=\"2019-05-28T11:43:56+01:00\" level=info msg=\"deploying kubeflow application\" filename=\"cmd/apply.go:35\"\n", - "time=\"2019-05-28T11:43:56+01:00\" level=info msg=\"reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml\" filename=\"coordinator/coordinator.go:341\"\n", - "time=\"2019-05-28T11:43:56+01:00\" level=info msg=\"reading from /home/alejandro/Programming/kubernetes/seldon/seldon-core/examples/kubeflow/kubeflow-seldon/app.yaml\" filename=\"coordinator/coordinator.go:341\"\n", - "time=\"2019-05-28T11:43:56+01:00\" level=info msg=\"namespace: kubeflow\" filename=\"ksonnet/ksonnet.go:109\"\n", - "time=\"2019-05-28T11:43:56+01:00\" level=info msg=\"Creating namespace: kubeflow\" filename=\"ksonnet/ksonnet.go:112\"\n", - "time=\"2019-05-28T11:44:09+01:00\" level=info msg=\"Applying services kubeflow.ambassador\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:09+01:00\" level=info msg=\"Creating non-existent services kubeflow.ambassador\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:44:09+01:00\" level=info msg=\"Applying services kubeflow.ambassador-admin\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:09+01:00\" level=info msg=\"Creating non-existent services kubeflow.ambassador-admin\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:44:09+01:00\" level=info msg=\"Applying clusterroles ambassador\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:09+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.ambassador\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:09+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.ambassador\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:44:09+01:00\" level=info msg=\"Applying clusterrolebindings ambassador\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:09+01:00\" level=info msg=\"Applying deployments kubeflow.ambassador\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:09+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.ambassador\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:44:09+01:00\" level=info msg=\"Component ambassador apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", - "time=\"2019-05-28T11:44:21+01:00\" level=info msg=\"Applying customresourcedefinitions workflows.argoproj.io\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:21+01:00\" level=info msg=\"Creating non-existent customresourcedefinitions workflows.argoproj.io\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:44:25+01:00\" level=info msg=\"Applying clusterrolebindings argo\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:25+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.argo-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:25+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.argo-ui\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:44:26+01:00\" level=info msg=\"Applying services kubeflow.argo-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:26+01:00\" level=info msg=\"Creating non-existent services kubeflow.argo-ui\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:44:26+01:00\" level=info msg=\"Applying configmaps kubeflow.workflow-controller-configmap\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:26+01:00\" level=info msg=\"Creating non-existent configmaps kubeflow.workflow-controller-configmap\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:44:26+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.argo\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:26+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.argo\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:44:26+01:00\" level=info msg=\"Applying clusterroles argo\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:26+01:00\" level=info msg=\"Applying clusterroles argo-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:26+01:00\" level=info msg=\"Applying clusterrolebindings argo-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:26+01:00\" level=info msg=\"Applying deployments kubeflow.workflow-controller\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:26+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.workflow-controller\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:44:26+01:00\" level=info msg=\"Applying deployments kubeflow.argo-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:26+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.argo-ui\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:44:27+01:00\" level=info msg=\"Component argo apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", - "time=\"2019-05-28T11:44:38+01:00\" level=info msg=\"Applying clusterrolebindings centraldashboard\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:38+01:00\" level=info msg=\"Applying services kubeflow.centraldashboard\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:38+01:00\" level=info msg=\"Creating non-existent services kubeflow.centraldashboard\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:44:38+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.centraldashboard\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:38+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.centraldashboard\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:44:38+01:00\" level=info msg=\"Applying roles kubeflow.centraldashboard\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:38+01:00\" level=info msg=\"Creating non-existent roles kubeflow.centraldashboard\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:44:38+01:00\" level=info msg=\"Applying rolebindings kubeflow.centraldashboard\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:38+01:00\" level=info msg=\"Creating non-existent rolebindings kubeflow.centraldashboard\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:44:39+01:00\" level=info msg=\"Applying clusterroles centraldashboard\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:39+01:00\" level=info msg=\"Applying deployments kubeflow.centraldashboard\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:39+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.centraldashboard\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:44:39+01:00\" level=info msg=\"Component centraldashboard apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", - "time=\"2019-05-28T11:44:50+01:00\" level=info msg=\"Applying services kubeflow.jupyter-web-app\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:50+01:00\" level=info msg=\"Creating non-existent services kubeflow.jupyter-web-app\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:44:50+01:00\" level=info msg=\"Applying deployments kubeflow.jupyter-web-app\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:50+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.jupyter-web-app\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:44:50+01:00\" level=info msg=\"Applying configmaps kubeflow.jupyter-web-app-config\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:50+01:00\" level=info msg=\"Creating non-existent configmaps kubeflow.jupyter-web-app-config\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:44:50+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.jupyter-web-app\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:50+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.jupyter-web-app\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:44:50+01:00\" level=info msg=\"Applying clusterrolebindings jupyter-web-app-binding\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:51+01:00\" level=info msg=\"Applying clusterroles jupyter-web-app-cluster-role\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:51+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.jupyter-notebook\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:51+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.jupyter-notebook\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:44:51+01:00\" level=info msg=\"Applying roles kubeflow.jupyter-notebook-role\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:51+01:00\" level=info msg=\"Creating non-existent roles kubeflow.jupyter-notebook-role\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:44:51+01:00\" level=info msg=\"Applying rolebindings kubeflow.jupyter-notebook-role-binding\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:44:51+01:00\" level=info msg=\"Creating non-existent rolebindings kubeflow.jupyter-notebook-role-binding\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:44:51+01:00\" level=info msg=\"Component jupyter-web-app apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", - "time=\"2019-05-28T11:45:01+01:00\" level=info msg=\"Applying clusterroles metrics-collector\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:01+01:00\" level=info msg=\"Applying services kubeflow.studyjob-controller\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:01+01:00\" level=info msg=\"Creating non-existent services kubeflow.studyjob-controller\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:01+01:00\" level=info msg=\"Applying services kubeflow.vizier-db\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:01+01:00\" level=info msg=\"Creating non-existent services kubeflow.vizier-db\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:01+01:00\" level=info msg=\"Applying persistentvolumeclaims kubeflow.katib-mysql\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:01+01:00\" level=info msg=\"Creating non-existent persistentvolumeclaims kubeflow.katib-mysql\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:02+01:00\" level=info msg=\"Applying clusterrolebindings studyjob-controller\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:02+01:00\" level=info msg=\"Applying secrets kubeflow.vizier-db-secrets\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:02+01:00\" level=info msg=\"Creating non-existent secrets kubeflow.vizier-db-secrets\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:02+01:00\" level=info msg=\"Applying clusterroles vizier-core\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:02+01:00\" level=info msg=\"Applying clusterrolebindings vizier-core\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:02+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.vizier-core\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:02+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.vizier-core\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:02+01:00\" level=info msg=\"Applying services kubeflow.vizier-core-rest\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:02+01:00\" level=info msg=\"Creating non-existent services kubeflow.vizier-core-rest\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:02+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.studyjob-controller\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:02+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.studyjob-controller\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:02+01:00\" level=info msg=\"Applying services kubeflow.katib-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:02+01:00\" level=info msg=\"Creating non-existent services kubeflow.katib-ui\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:03+01:00\" level=info msg=\"Applying clusterroles studyjob-controller\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:03+01:00\" level=info msg=\"Applying clusterroles katib-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:03+01:00\" level=info msg=\"Applying clusterrolebindings katib-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:03+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.katib-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:03+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.katib-ui\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:03+01:00\" level=info msg=\"Applying services kubeflow.vizier-suggestion-random\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:03+01:00\" level=info msg=\"Creating non-existent services kubeflow.vizier-suggestion-random\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:04+01:00\" level=info msg=\"Applying services kubeflow.vizier-core\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:04+01:00\" level=info msg=\"Creating non-existent services kubeflow.vizier-core\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:04+01:00\" level=info msg=\"Applying services kubeflow.vizier-suggestion-grid\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:04+01:00\" level=info msg=\"Creating non-existent services kubeflow.vizier-suggestion-grid\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:04+01:00\" level=info msg=\"Applying configmaps kubeflow.metricscollector-template\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:04+01:00\" level=info msg=\"Creating non-existent configmaps kubeflow.metricscollector-template\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:05+01:00\" level=info msg=\"Applying services kubeflow.vizier-suggestion-hyperband\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:05+01:00\" level=info msg=\"Creating non-existent services kubeflow.vizier-suggestion-hyperband\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:05+01:00\" level=info msg=\"Applying clusterrolebindings metrics-collector\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:05+01:00\" level=info msg=\"Applying services kubeflow.vizier-suggestion-bayesianoptimization\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:05+01:00\" level=info msg=\"Creating non-existent services kubeflow.vizier-suggestion-bayesianoptimization\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:05+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.metrics-collector\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:06+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.metrics-collector\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:06+01:00\" level=info msg=\"Applying customresourcedefinitions studyjobs.kubeflow.org\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:06+01:00\" level=info msg=\"Applying configmaps kubeflow.worker-template\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:06+01:00\" level=info msg=\"Creating non-existent configmaps kubeflow.worker-template\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:06+01:00\" level=info msg=\"Applying deployments kubeflow.vizier-suggestion-bayesianoptimization\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:06+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.vizier-suggestion-bayesianoptimization\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:06+01:00\" level=info msg=\"Applying deployments kubeflow.vizier-suggestion-hyperband\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:06+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.vizier-suggestion-hyperband\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:06+01:00\" level=info msg=\"Applying deployments kubeflow.vizier-suggestion-grid\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:06+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.vizier-suggestion-grid\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:07+01:00\" level=info msg=\"Applying deployments kubeflow.katib-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:07+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.katib-ui\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:07+01:00\" level=info msg=\"Applying deployments kubeflow.vizier-core-rest\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:07+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.vizier-core-rest\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:07+01:00\" level=info msg=\"Applying deployments kubeflow.vizier-db\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:07+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.vizier-db\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:07+01:00\" level=info msg=\"Applying deployments kubeflow.studyjob-controller\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:07+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.studyjob-controller\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:07+01:00\" level=info msg=\"Applying deployments kubeflow.vizier-core\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:07+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.vizier-core\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:08+01:00\" level=info msg=\"Applying deployments kubeflow.vizier-suggestion-random\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:08+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.vizier-suggestion-random\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:08+01:00\" level=info msg=\"Component katib apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", - "time=\"2019-05-28T11:45:20+01:00\" level=info msg=\"Applying customresourcedefinitions compositecontrollers.metacontroller.k8s.io\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:20+01:00\" level=info msg=\"Creating non-existent customresourcedefinitions compositecontrollers.metacontroller.k8s.io\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:20+01:00\" level=info msg=\"Applying customresourcedefinitions controllerrevisions.metacontroller.k8s.io\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:20+01:00\" level=info msg=\"Creating non-existent customresourcedefinitions controllerrevisions.metacontroller.k8s.io\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:20+01:00\" level=info msg=\"Applying customresourcedefinitions decoratorcontrollers.metacontroller.k8s.io\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:20+01:00\" level=info msg=\"Creating non-existent customresourcedefinitions decoratorcontrollers.metacontroller.k8s.io\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:20+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.meta-controller-service\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:20+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.meta-controller-service\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:20+01:00\" level=info msg=\"Applying clusterrolebindings meta-controller-cluster-role-binding\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:20+01:00\" level=info msg=\"Creating non-existent clusterrolebindings meta-controller-cluster-role-binding\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:20+01:00\" level=info msg=\"Applying statefulsets kubeflow.metacontroller\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:20+01:00\" level=info msg=\"Creating non-existent statefulsets kubeflow.metacontroller\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:20+01:00\" level=info msg=\"Component metacontroller apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", - "time=\"2019-05-28T11:45:32+01:00\" level=info msg=\"Applying customresourcedefinitions notebooks.kubeflow.org\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:32+01:00\" level=info msg=\"Applying services kubeflow.notebooks-controller\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:32+01:00\" level=info msg=\"Creating non-existent services kubeflow.notebooks-controller\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:32+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.notebook-controller\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:32+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.notebook-controller\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:32+01:00\" level=info msg=\"Applying deployments kubeflow.notebooks-controller\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:32+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.notebooks-controller\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:32+01:00\" level=info msg=\"Applying clusterroles notebooks-controller\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:32+01:00\" level=info msg=\"Applying clusterrolebindings notebooks-controller\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:32+01:00\" level=info msg=\"Component notebook-controller apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", - "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Applying services kubeflow.minio-service\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Creating non-existent services kubeflow.minio-service\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Applying deployments kubeflow.minio\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.minio\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Applying secrets kubeflow.mlpipeline-minio-artifact\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Creating non-existent secrets kubeflow.mlpipeline-minio-artifact\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Applying services kubeflow.mysql\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Creating non-existent services kubeflow.mysql\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Applying deployments kubeflow.mysql\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.mysql\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Applying rolebindings kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Creating non-existent rolebindings kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Applying roles kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Creating non-existent roles kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Applying services kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Creating non-existent services kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Applying deployments kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.ml-pipeline\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.pipeline-runner\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.pipeline-runner\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:43+01:00\" level=info msg=\"Applying clusterroles pipeline-runner\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:44+01:00\" level=info msg=\"Applying clusterrolebindings pipeline-runner\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:44+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:44+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:44+01:00\" level=info msg=\"Applying clusterrolebindings ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:44+01:00\" level=info msg=\"Applying roles kubeflow.ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:44+01:00\" level=info msg=\"Creating non-existent roles kubeflow.ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:44+01:00\" level=info msg=\"Applying deployments kubeflow.ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:44+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.ml-pipeline-scheduledworkflow\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:44+01:00\" level=info msg=\"Applying customresourcedefinitions scheduledworkflows.kubeflow.org\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:44+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.ml-pipeline-persistenceagent\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:44+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.ml-pipeline-persistenceagent\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:45+01:00\" level=info msg=\"Applying clusterrolebindings ml-pipeline-persistenceagent\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:45+01:00\" level=info msg=\"Applying clusterroles ml-pipeline-persistenceagent\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:45+01:00\" level=info msg=\"Applying deployments kubeflow.ml-pipeline-persistenceagent\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:45+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.ml-pipeline-persistenceagent\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:45+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.ml-pipeline-viewer-crd-service-account\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:45+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.ml-pipeline-viewer-crd-service-account\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:45+01:00\" level=info msg=\"Applying clusterrolebindings ml-pipeline-viewer-crd-role-binding\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:45+01:00\" level=info msg=\"Applying clusterroles ml-pipeline-viewer-controller-role\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:45+01:00\" level=info msg=\"Applying deployments kubeflow.ml-pipeline-viewer-controller-deployment\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:45+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.ml-pipeline-viewer-controller-deployment\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Applying customresourcedefinitions viewers.kubeflow.org\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Applying services kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Creating non-existent services kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Applying services kubeflow.ml-pipeline-tensorboard-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Creating non-existent services kubeflow.ml-pipeline-tensorboard-ui\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Applying rolebindings kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Creating non-existent rolebindings kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Applying roles kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Creating non-existent roles kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Applying deployments kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.ml-pipeline-ui\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Applying persistentvolumeclaims kubeflow.mysql-pv-claim\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Creating non-existent persistentvolumeclaims kubeflow.mysql-pv-claim\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Applying persistentvolumeclaims kubeflow.minio-pvc\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Creating non-existent persistentvolumeclaims kubeflow.minio-pvc\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:45:46+01:00\" level=info msg=\"Component pipeline apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", - "time=\"2019-05-28T11:46:00+01:00\" level=info msg=\"Applying configmaps kubeflow.pytorch-operator-config\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:46:00+01:00\" level=info msg=\"Creating non-existent configmaps kubeflow.pytorch-operator-config\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:46:00+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.pytorch-operator\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:46:00+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.pytorch-operator\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:46:00+01:00\" level=info msg=\"Applying clusterroles pytorch-operator\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:46:00+01:00\" level=info msg=\"Applying clusterrolebindings pytorch-operator\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:46:01+01:00\" level=info msg=\"Applying customresourcedefinitions pytorchjobs.kubeflow.org\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:46:01+01:00\" level=info msg=\"Applying deployments kubeflow.pytorch-operator\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:46:01+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.pytorch-operator\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:46:01+01:00\" level=info msg=\"Component pytorch-operator apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", - "time=\"2019-05-28T11:46:12+01:00\" level=info msg=\"Applying services kubeflow.tensorboard\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:46:12+01:00\" level=info msg=\"Creating non-existent services kubeflow.tensorboard\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:46:12+01:00\" level=info msg=\"Applying deployments kubeflow.tensorboard\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:46:12+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.tensorboard\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:46:12+01:00\" level=info msg=\"Component tensorboard apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", - "time=\"2019-05-28T11:46:25+01:00\" level=info msg=\"Applying customresourcedefinitions tfjobs.kubeflow.org\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:46:25+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.tf-job-dashboard\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:46:25+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.tf-job-dashboard\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:46:25+01:00\" level=info msg=\"Applying configmaps kubeflow.tf-job-operator-config\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:46:25+01:00\" level=info msg=\"Creating non-existent configmaps kubeflow.tf-job-operator-config\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:46:25+01:00\" level=info msg=\"Applying serviceaccounts kubeflow.tf-job-operator\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:46:25+01:00\" level=info msg=\"Creating non-existent serviceaccounts kubeflow.tf-job-operator\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:46:25+01:00\" level=info msg=\"Applying clusterroles tf-job-operator\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:46:25+01:00\" level=info msg=\"Applying clusterrolebindings tf-job-operator\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:46:25+01:00\" level=info msg=\"Applying services kubeflow.tf-job-dashboard\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:46:25+01:00\" level=info msg=\"Creating non-existent services kubeflow.tf-job-dashboard\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:46:26+01:00\" level=info msg=\"Applying clusterroles tf-job-dashboard\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:46:26+01:00\" level=info msg=\"Applying clusterrolebindings tf-job-dashboard\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:46:26+01:00\" level=info msg=\"Applying deployments kubeflow.tf-job-operator\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:46:26+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.tf-job-operator\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:46:26+01:00\" level=info msg=\"Applying deployments kubeflow.tf-job-dashboard\" filename=\"cluster/upsert.go:73\"\n", - "time=\"2019-05-28T11:46:26+01:00\" level=info msg=\"Creating non-existent deployments kubeflow.tf-job-dashboard\" filename=\"cluster/upsert.go:92\"\n", - "time=\"2019-05-28T11:46:26+01:00\" level=info msg=\"Component tf-job-operator apply succeeded\" filename=\"ksonnet/ksonnet.go:171\"\n", - "time=\"2019-05-28T11:46:26+01:00\" level=info msg=\"All components apply succeeded\" filename=\"ksonnet/ksonnet.go:192\"\n" - ] - } - ], + "outputs": [], "source": [ "%%bash\n", "cd kubeflow-seldon\n", @@ -646,7 +334,8 @@ "* `requirements.txt` which states the python dependencies to run\n", "* `build_image.sh` which uses `s2i` to build the image with one line\n", "\n", - "### Let's check out the CLI for clean_text\n" + "### Let's check out the CLI for clean_text\n", + "The pipeline_step CLI is the entry point for the kubeflow image as it will be able to pass any relevant parameters\n" ] }, { @@ -680,41 +369,37 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 55, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\u001b[38;5;238m───────┬────────────────────────────────────────────────────────────────────────\u001b[0m\n", - " \u001b[38;5;238m│ \u001b[0mFile: \u001b[1mpipeline/pipeline_steps/clean_text/pipeline_step.py\u001b[0m\n", - "\u001b[38;5;238m───────┼────────────────────────────────────────────────────────────────────────\u001b[0m\n", - "\u001b[38;5;238m 1\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mimport\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mdill\u001b[0m\n", - "\u001b[38;5;238m 2\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mimport\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mclick\u001b[0m\n", - "\u001b[38;5;238m 3\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mimport\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mdill\u001b[0m\n", - "\u001b[38;5;238m 4\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mtry\u001b[0m\u001b[38;5;231m:\u001b[0m\n", - "\u001b[38;5;238m 5\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;242m#\u001b[0m\u001b[38;5;242m Running for tests\u001b[0m\n", - "\u001b[38;5;238m 6\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mfrom\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m.\u001b[0m\u001b[38;5;231mTransformer\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mimport\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mTransformer\u001b[0m\n", - "\u001b[38;5;238m 7\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mexcept\u001b[0m\u001b[38;5;231m:\u001b[0m\n", - "\u001b[38;5;238m 8\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;242m#\u001b[0m\u001b[38;5;242m Running from CLI\u001b[0m\n", - "\u001b[38;5;238m 9\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mfrom\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mTransformer\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mimport\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mTransformer\u001b[0m\n", - "\u001b[38;5;238m 10\u001b[0m \u001b[38;5;238m│\u001b[0m \n", - "\u001b[38;5;238m 11\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m@\u001b[0m\u001b[38;5;231mclick\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mcommand\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231m)\u001b[0m\n", - "\u001b[38;5;238m 12\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m@\u001b[0m\u001b[38;5;231mclick\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231moption\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186m--in-path\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;208mdefault\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m/mnt/raw_text.data\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\n", - "\u001b[38;5;238m 13\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m@\u001b[0m\u001b[38;5;231mclick\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231moption\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186m--out-path\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;208mdefault\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m/mnt/clean_text.data\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\n", - "\u001b[38;5;238m 14\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;149mdef\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;149mrun_pipeline\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;208min_path\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;208mout_path\u001b[0m\u001b[38;5;231m)\u001b[0m\u001b[38;5;231m:\u001b[0m\n", - "\u001b[38;5;238m 15\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mclean_text_transformer\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mTransformer\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231m)\u001b[0m\n", - "\u001b[38;5;238m 16\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mwith\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;81mopen\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231min_path\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186mrb\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m)\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mas\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231min_f\u001b[0m\u001b[38;5;231m:\u001b[0m\n", - "\u001b[38;5;238m 17\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mx\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mdill\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mload\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231min_f\u001b[0m\u001b[38;5;231m)\u001b[0m\n", - "\u001b[38;5;238m 18\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231my\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mclean_text_transformer\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mpredict\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231mx\u001b[0m\u001b[38;5;231m)\u001b[0m\n", - "\u001b[38;5;238m 19\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mwith\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;81mopen\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231mout_path\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mwb\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mas\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mout_f\u001b[0m\u001b[38;5;231m:\u001b[0m\n", - "\u001b[38;5;238m 20\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mdill\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mdump\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231my\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mout_f\u001b[0m\u001b[38;5;231m)\u001b[0m\n", - "\u001b[38;5;238m 21\u001b[0m \u001b[38;5;238m│\u001b[0m \n", - "\u001b[38;5;238m 22\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mif\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231m__name__\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m==\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m__main__\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m:\u001b[0m\n", - "\u001b[38;5;238m 23\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mrun_pipeline\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231m)\u001b[0m\n", - "\u001b[38;5;238m 24\u001b[0m \u001b[38;5;238m│\u001b[0m \n", - "\u001b[38;5;238m───────┴────────────────────────────────────────────────────────────────────────\u001b[0m\n" + "import dill\r\n", + "import click\r\n", + "import dill\r\n", + "try:\r\n", + " # Running for tests\r\n", + " from .Transformer import Transformer\r\n", + "except:\r\n", + " # Running from CLI\r\n", + " from Transformer import Transformer\r\n", + "\r\n", + "@click.command()\r\n", + "@click.option('--in-path', default=\"/mnt/raw_text.data\")\r\n", + "@click.option('--out-path', default=\"/mnt/clean_text.data\")\r\n", + "def run_pipeline(in_path, out_path):\r\n", + " clean_text_transformer = Transformer()\r\n", + " with open(in_path, 'rb') as in_f:\r\n", + " x = dill.load(in_f)\r\n", + " y = clean_text_transformer.predict(x)\r\n", + " with open(out_path, \"wb\") as out_f:\r\n", + " dill.dump(y, out_f)\r\n", + "\r\n", + "if __name__ == \"__main__\":\r\n", + " run_pipeline()\r\n", + "\r\n" ] } ], @@ -722,9 +407,18 @@ "!cat pipeline/pipeline_steps/clean_text/pipeline_step.py" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The Transformer is where the data munging and transformation stage comes in, which will be wrapped by the container and exposed through the Seldon Engine to ensure our pipeline can be used in production.\n", + "\n", + "Seldon provides multiple different features, such as abilities to send custom metrics, pre-process / post-process data and more. In this example we will only be exposing the `predict` step." + ] + }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 56, "metadata": { "scrolled": true }, @@ -733,53 +427,49 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[38;5;238m───────┬────────────────────────────────────────────────────────────────────────\u001b[0m\r\n", - " \u001b[38;5;238m│ \u001b[0mFile: \u001b[1mpipeline/pipeline_steps/clean_text/Transformer.py\u001b[0m\r\n", - "\u001b[38;5;238m───────┼────────────────────────────────────────────────────────────────────────\u001b[0m\r\n", - "\u001b[38;5;238m 1\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mimport\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mre\u001b[0m\u001b[38;5;231m \u001b[0m\r\n", - "\u001b[38;5;238m 2\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mfrom\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mparser\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mimport\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mHTMLParser\u001b[0m\r\n", - "\u001b[38;5;238m 3\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mimport\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mnumpy\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mas\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mnp\u001b[0m\r\n", - "\u001b[38;5;238m 4\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mimport\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mlogging\u001b[0m\r\n", - "\u001b[38;5;238m 5\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", - "\u001b[38;5;238m 6\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;149mclass\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[4;38;5;81mTransformer\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231m)\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 7\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m__html_parser\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mHTMLParser\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m 8\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m__uplus_pattern\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231m\\\u001b[0m\r\n", - "\u001b[38;5;238m 9\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mre\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mcompile\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m\\<\u001b[0m\u001b[38;5;186m[uU]\u001b[0m\u001b[38;5;231m\\+\u001b[0m\u001b[38;5;186m(?P[a-zA-Z0-9]+)\u001b[0m\u001b[38;5;231m\\>\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m 10\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m__markup_link_pattern\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231m\\\u001b[0m\r\n", - "\u001b[38;5;238m 11\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mre\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mcompile\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m\\[\u001b[0m\u001b[38;5;186m(.*)\u001b[0m\u001b[38;5;231m\\]\u001b[0m\u001b[38;5;231m\\(\u001b[0m\u001b[38;5;186m(.*)\u001b[0m\u001b[38;5;231m\\)\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m 12\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", - "\u001b[38;5;238m 13\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;149mdef\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;149mpredict\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;208mself\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;208mX\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;208mfeature_names\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m[\u001b[0m\u001b[38;5;231m]\u001b[0m\u001b[38;5;231m)\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 14\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mlogging\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mwarning\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231mX\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m 15\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mf\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mnp\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mvectorize\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231mTransformer\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mtransform_clean_text\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m 16\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mX_clean\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mf\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231mX\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m 17\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mlogging\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mwarning\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231mX_clean\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m 18\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mreturn\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mX_clean\u001b[0m\r\n", - "\u001b[38;5;238m 19\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", - "\u001b[38;5;238m 20\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;149mdef\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;149mfit\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;208mself\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;208mX\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;208my\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;141mNone\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m**\u001b[0m\u001b[38;5;208mfit_params\u001b[0m\u001b[38;5;231m)\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 21\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mreturn\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mself\u001b[0m\r\n", - "\u001b[38;5;238m 22\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\r\n", - "\u001b[38;5;238m 23\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m@\u001b[0m\u001b[38;5;81mstaticmethod\u001b[0m\r\n", - "\u001b[38;5;238m 24\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;149mdef\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;149mtransform_clean_text\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;208mraw_text\u001b[0m\u001b[38;5;231m)\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 25\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mtry\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 26\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mdecoded\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mraw_text\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mencode\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mISO-8859-1\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mdecode\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mutf-8\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m 27\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mexcept\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 28\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mdecoded\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mraw_text\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mencode\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mISO-8859-1\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mdecode\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mcp1252\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m 29\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231mTransformer\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231m\\\u001b[0m\r\n", - "\u001b[38;5;238m 30\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m__html_parser\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231munescape\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231mdecoded\u001b[0m\u001b[38;5;231m)\u001b[0m\u001b[38;5;231m \u001b[0m\r\n", - "\u001b[38;5;238m 31\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mre\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231msub\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;81mr\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;141m\\r\u001b[0m\u001b[38;5;141m\\n\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m 32\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mre\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231msub\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;81mr\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;141m\\r\u001b[0m\u001b[38;5;141m\\r\u001b[0m\u001b[38;5;141m\\n\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m 33\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mre\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231msub\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;81mr\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;141m\\r\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m 34\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mreplace\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m>\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m > \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m 35\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mreplace\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m<\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m < \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m 36\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mreplace\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m - \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m 37\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mTransformer\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231m__uplus_pattern\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231msub\u001b[0m\u001b[38;5;231m(\u001b[0m\r\n", - "\u001b[38;5;238m 38\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m U\u001b[0m\u001b[38;5;231m\\g\u001b[0m\u001b[38;5;186m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m 39\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mTransformer\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231m__markup_link_pattern\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231msub\u001b[0m\u001b[38;5;231m(\u001b[0m\r\n", - "\u001b[38;5;238m 40\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m \u001b[0m\u001b[38;5;231m\\1\u001b[0m\u001b[38;5;186m \u001b[0m\u001b[38;5;231m\\2\u001b[0m\u001b[38;5;186m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m 41\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mreplace\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;141m\\\\\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m 42\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mreturn\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mhtml_unescaped\u001b[0m\r\n", - "\u001b[38;5;238m 43\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", - "\u001b[38;5;238m───────┴────────────────────────────────────────────────────────────────────────\u001b[0m\r\n" + "import re \r\n", + "from html.parser import HTMLParser\r\n", + "import numpy as np\r\n", + "import logging\r\n", + "\r\n", + "class Transformer():\r\n", + " __html_parser = HTMLParser()\r\n", + " __uplus_pattern = \\\r\n", + " re.compile(\"\\<[uU]\\+(?P[a-zA-Z0-9]+)\\>\")\r\n", + " __markup_link_pattern = \\\r\n", + " re.compile(\"\\[(.*)\\]\\((.*)\\)\")\r\n", + "\r\n", + " def predict(self, X, feature_names=[]):\r\n", + " logging.warning(X)\r\n", + " f = np.vectorize(Transformer.transform_clean_text)\r\n", + " X_clean = f(X)\r\n", + " logging.warning(X_clean)\r\n", + " return X_clean\r\n", + "\r\n", + " def fit(self, X, y=None, **fit_params):\r\n", + " return self\r\n", + " \r\n", + " @staticmethod\r\n", + " def transform_clean_text(raw_text):\r\n", + " try:\r\n", + " decoded = raw_text.encode(\"ISO-8859-1\").decode(\"utf-8\")\r\n", + " except:\r\n", + " decoded = raw_text.encode(\"ISO-8859-1\").decode(\"cp1252\")\r\n", + " html_unescaped =Transformer.\\\r\n", + " __html_parser.unescape(decoded) \r\n", + " html_unescaped = re.sub(r\"\\r\\n\", \" \", html_unescaped)\r\n", + " html_unescaped = re.sub(r\"\\r\\r\\n\", \" \", html_unescaped)\r\n", + " html_unescaped = re.sub(r\"\\r\", \" \", html_unescaped)\r\n", + " html_unescaped = html_unescaped.replace(\">\", \" > \")\r\n", + " html_unescaped = html_unescaped.replace(\"<\", \" < \")\r\n", + " html_unescaped = html_unescaped.replace(\"--\", \" - \")\r\n", + " html_unescaped = Transformer.__uplus_pattern.sub(\r\n", + " \" U\\g \", html_unescaped)\r\n", + " html_unescaped = Transformer.__markup_link_pattern.sub(\r\n", + " \" \\1 \\2 \", html_unescaped)\r\n", + " html_unescaped = html_unescaped.replace(\"\\\\\", \"\")\r\n", + " return html_unescaped\r\n", + "\r\n" ] } ], @@ -858,7 +548,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 44, "metadata": {}, "outputs": [ { @@ -999,151 +689,138 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 57, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\u001b[38;5;238m───────┬────────────────────────────────────────────────────────────────────────\u001b[0m\r\n", - " \u001b[38;5;238m│ \u001b[0mFile: \u001b[1mtrain_pipeline/nlp_pipeline.py\u001b[0m\r\n", - "\u001b[38;5;238m───────┼────────────────────────────────────────────────────────────────────────\u001b[0m\r\n", - "\u001b[38;5;238m 1\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", - "\u001b[38;5;238m 2\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mimport\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mkfp\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mdsl\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mas\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mdsl\u001b[0m\r\n", - "\u001b[38;5;238m 3\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mimport\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231myaml\u001b[0m\r\n", - "\u001b[38;5;238m 4\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mfrom\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mkubernetes\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mimport\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mclient\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mas\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mk8s\u001b[0m\r\n", - "\u001b[38;5;238m 5\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", - "\u001b[38;5;238m 6\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", - "\u001b[38;5;238m 7\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m@\u001b[0m\u001b[38;5;231mdsl\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mpipeline\u001b[0m\u001b[38;5;231m(\u001b[0m\r\n", - "\u001b[38;5;238m 8\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mname\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186mNLP\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 9\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mdescription\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186mA pipeline demonstrating reproducible steps for NLP\u001b[0m\u001b[38;5;186m'\u001b[0m\r\n", - "\u001b[38;5;238m 10\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m 11\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;149mdef\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;149mnlp_pipeline\u001b[0m\u001b[38;5;231m(\u001b[0m\r\n", - "\u001b[38;5;238m 12\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mcsv_url\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mhttps://raw.githubusercontent.com/axsauze/reddit-class\u001b[0m\r\n", - "\u001b[38;5;238m \u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;186mification-exploration/master/data/reddit_train.csv\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 13\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mcsv_encoding\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mISO-8859-1\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 14\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mfeatures_column\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mBODY\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 15\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mlabels_column\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mREMOVED\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 16\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mraw_text_path\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186m/mnt/text.data\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 17\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mlabels_path\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186m/mnt/labels.data\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 18\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mclean_text_path\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186m/mnt/clean.data\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 19\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mspacy_tokens_path\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186m/mnt/tokens.data\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 20\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mtfidf_vectors_path\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186m/mnt/tfidf.data\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 21\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mlr_prediction_path\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186m/mnt/prediction.data\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 22\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mtfidf_model_path\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186m/mnt/tfidf.model\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 23\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mlr_model_path\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186m/mnt/lr.model\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 24\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mlr_c_param\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;141m0\u001b[0m\u001b[38;5;141m.\u001b[0m\u001b[38;5;141m1\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 25\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mtfidf_max_features\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;141m10000\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 26\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mtfidf_ngram_range\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;141m3\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 27\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mbatch_size\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186m100\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m)\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 28\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;242m\"\"\"\u001b[0m\r\n", - "\u001b[38;5;238m 29\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;242m Pipeline \u001b[0m\r\n", - "\u001b[38;5;238m 30\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;242m \u001b[0m\u001b[38;5;242m\"\"\"\u001b[0m\r\n", - "\u001b[38;5;238m 31\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mvop\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mdsl\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mVolumeOp\u001b[0m\u001b[38;5;231m(\u001b[0m\r\n", - "\u001b[38;5;238m 32\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mname\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186mmy-pvc\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 33\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mresource_name\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mmy-pvc\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 34\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mmodes\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m[\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mReadWriteMany\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m]\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 35\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208msize\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m1Gi\u001b[0m\u001b[38;5;186m\"\u001b[0m\r\n", - "\u001b[38;5;238m 36\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m 37\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", - "\u001b[38;5;238m 38\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mdownload_step\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mdsl\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mContainerOp\u001b[0m\u001b[38;5;231m(\u001b[0m\r\n", - "\u001b[38;5;238m 39\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mname\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186mdata_downloader\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 40\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mimage\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186mdata_downloader:0.1\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 41\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mcommand\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mpython\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 42\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208marguments\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m[\u001b[0m\r\n", - "\u001b[38;5;238m 43\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m/microservice/pipeline_step.py\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 44\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--labels-path\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mlabels_path\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 45\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--features-path\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mraw_text_path\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 46\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--csv-url\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mcsv_url\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 47\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--csv-encoding\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mcsv_encoding\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 48\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--features-column\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mfeatures_column\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 49\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--labels-column\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mlabels_column\u001b[0m\r\n", - "\u001b[38;5;238m 50\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m]\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 51\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mpvolumes\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m{\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m/mnt\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mvop\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mvolume\u001b[0m\u001b[38;5;231m}\u001b[0m\r\n", - "\u001b[38;5;238m 52\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m 53\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", - "\u001b[38;5;238m 54\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mclean_step\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mdsl\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mContainerOp\u001b[0m\u001b[38;5;231m(\u001b[0m\r\n", - "\u001b[38;5;238m 55\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mname\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186mclean_text\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 56\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mimage\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186mclean_text_transformer:0.1\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 57\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mcommand\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mpython\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 58\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208marguments\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m[\u001b[0m\r\n", - "\u001b[38;5;238m 59\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m/microservice/pipeline_step.py\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 60\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--in-path\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mraw_text_path\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 61\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--out-path\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mclean_text_path\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 62\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m]\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 63\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mpvolumes\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m{\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m/mnt\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mdownload_step\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mpvolume\u001b[0m\u001b[38;5;231m}\u001b[0m\r\n", - "\u001b[38;5;238m 64\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m)\u001b[0m\r\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[38;5;238m 65\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", - "\u001b[38;5;238m 66\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mtokenize_step\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mdsl\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mContainerOp\u001b[0m\u001b[38;5;231m(\u001b[0m\r\n", - "\u001b[38;5;238m 67\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mname\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186mtokenize\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 68\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mimage\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186mspacy_tokenizer:0.1\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 69\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mcommand\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mpython\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 70\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208marguments\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m[\u001b[0m\r\n", - "\u001b[38;5;238m 71\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m/microservice/pipeline_step.py\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 72\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--in-path\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mclean_text_path\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 73\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--out-path\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mspacy_tokens_path\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 74\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m]\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 75\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mpvolumes\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m{\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m/mnt\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mclean_step\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mpvolume\u001b[0m\u001b[38;5;231m}\u001b[0m\r\n", - "\u001b[38;5;238m 76\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m 77\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", - "\u001b[38;5;238m 78\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mvectorize_step\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mdsl\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mContainerOp\u001b[0m\u001b[38;5;231m(\u001b[0m\r\n", - "\u001b[38;5;238m 79\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mname\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186mvectorize\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 80\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mimage\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186mtfidf_vectorizer:0.1\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 81\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mcommand\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mpython\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 82\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208marguments\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m[\u001b[0m\r\n", - "\u001b[38;5;238m 83\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m/microservice/pipeline_step.py\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 84\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--in-path\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mspacy_tokens_path\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 85\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--out-path\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mtfidf_vectors_path\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 86\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--max-features\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mtfidf_max_features\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 87\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--ngram-range\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mtfidf_ngram_range\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 88\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--action\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mtrain\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 89\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--model-path\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mtfidf_model_path\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 90\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m]\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 91\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mpvolumes\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m{\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m/mnt\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mtokenize_step\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mpvolume\u001b[0m\u001b[38;5;231m}\u001b[0m\r\n", - "\u001b[38;5;238m 92\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m 93\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", - "\u001b[38;5;238m 94\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mpredict_step\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mdsl\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mContainerOp\u001b[0m\u001b[38;5;231m(\u001b[0m\r\n", - "\u001b[38;5;238m 95\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mname\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186mpredictor\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 96\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mimage\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186mlr_text_classifier:0.1\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 97\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mcommand\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mpython\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 98\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208marguments\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m[\u001b[0m\r\n", - "\u001b[38;5;238m 99\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m/microservice/pipeline_step.py\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 100\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--in-path\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mtfidf_vectors_path\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 101\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--labels-path\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mlabels_path\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 102\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--out-path\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mlr_prediction_path\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 103\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--c-param\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mlr_c_param\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 104\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--action\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mtrain\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 105\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m--model-path\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mlr_model_path\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 106\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m]\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 107\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mpvolumes\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m{\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m/mnt\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mvectorize_step\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mpvolume\u001b[0m\u001b[38;5;231m}\u001b[0m\r\n", - "\u001b[38;5;238m 108\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m 109\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", - "\u001b[38;5;238m 110\u001b[0m \u001b[33m~\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mtry\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 111\u001b[0m \u001b[33m~\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mseldon_config\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231myaml\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mload\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;81mopen\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m../deploy_pipeline/seldon_produ\u001b[0m\r\n", - "\u001b[38;5;238m \u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;186mction_pipeline.yaml\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m 112\u001b[0m \u001b[33m~\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mexcept\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 113\u001b[0m \u001b[33m~\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;242m#\u001b[0m\u001b[38;5;242m If this file is run from the project core directory \u001b[0m\r\n", - "\u001b[38;5;238m 114\u001b[0m \u001b[33m~\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mseldon_config\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231myaml\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mload\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;81mopen\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mdeploy_pipeline/seldon_producti\u001b[0m\r\n", - "\u001b[38;5;238m \u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;186mon_pipeline.yaml\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m)\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m 115\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", - "\u001b[38;5;238m 116\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mdeploy_step\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mdsl\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mResourceOp\u001b[0m\u001b[38;5;231m(\u001b[0m\r\n", - "\u001b[38;5;238m 117\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mname\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mseldondeploy\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 118\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mk8s_resource\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231mseldon_config\u001b[0m\u001b[38;5;231m,\u001b[0m\r\n", - "\u001b[38;5;238m 119\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;208mattribute_outputs\u001b[0m\u001b[38;5;203m=\u001b[0m\u001b[38;5;231m{\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mname\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;141m{\u001b[0m\u001b[38;5;141m.metadata.name\u001b[0m\u001b[38;5;141m}\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m}\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m 120\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", - "\u001b[38;5;238m 121\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mdeploy_step\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mafter\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231mpredict_step\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m 122\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", - "\u001b[38;5;238m 123\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mif\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231m__name__\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m==\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186m__main__\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 124\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mimport\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mkfp\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mcompiler\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mas\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mcompiler\u001b[0m\r\n", - "\u001b[38;5;238m 125\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231mcompiler\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mCompiler\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231m)\u001b[0m\u001b[38;5;231m.\u001b[0m\u001b[38;5;231mcompile\u001b[0m\u001b[38;5;231m(\u001b[0m\u001b[38;5;231mnlp_pipeline\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231m__file__\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203m+\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;186m.tar.gz\u001b[0m\u001b[38;5;186m'\u001b[0m\u001b[38;5;231m)\u001b[0m\r\n", - "\u001b[38;5;238m───────┴────────────────────────────────────────────────────────────────────────\u001b[0m\r\n" + "\r\n", + "import kfp.dsl as dsl\r\n", + "import yaml\r\n", + "from kubernetes import client as k8s\r\n", + "\r\n", + "\r\n", + "@dsl.pipeline(\r\n", + " name='NLP',\r\n", + " description='A pipeline demonstrating reproducible steps for NLP'\r\n", + ")\r\n", + "def nlp_pipeline(\r\n", + " csv_url=\"https://raw.githubusercontent.com/axsauze/reddit-classification-exploration/master/data/reddit_train.csv\",\r\n", + " csv_encoding=\"ISO-8859-1\",\r\n", + " features_column=\"BODY\",\r\n", + " labels_column=\"REMOVED\",\r\n", + " raw_text_path='/mnt/text.data',\r\n", + " labels_path='/mnt/labels.data',\r\n", + " clean_text_path='/mnt/clean.data',\r\n", + " spacy_tokens_path='/mnt/tokens.data',\r\n", + " tfidf_vectors_path='/mnt/tfidf.data',\r\n", + " lr_prediction_path='/mnt/prediction.data',\r\n", + " tfidf_model_path='/mnt/tfidf.model',\r\n", + " lr_model_path='/mnt/lr.model',\r\n", + " lr_c_param=0.1,\r\n", + " tfidf_max_features=10000,\r\n", + " tfidf_ngram_range=3,\r\n", + " batch_size='100'):\r\n", + " \"\"\"\r\n", + " Pipeline \r\n", + " \"\"\"\r\n", + " vop = dsl.VolumeOp(\r\n", + " name='my-pvc',\r\n", + " resource_name=\"my-pvc\",\r\n", + " modes=[\"ReadWriteMany\"],\r\n", + " size=\"1Gi\"\r\n", + " )\r\n", + "\r\n", + " download_step = dsl.ContainerOp(\r\n", + " name='data_downloader',\r\n", + " image='data_downloader:0.1',\r\n", + " command=\"python\",\r\n", + " arguments=[\r\n", + " \"/microservice/pipeline_step.py\",\r\n", + " \"--labels-path\", labels_path,\r\n", + " \"--features-path\", raw_text_path,\r\n", + " \"--csv-url\", csv_url,\r\n", + " \"--csv-encoding\", csv_encoding,\r\n", + " \"--features-column\", features_column,\r\n", + " \"--labels-column\", labels_column\r\n", + " ],\r\n", + " pvolumes={\"/mnt\": vop.volume}\r\n", + " )\r\n", + "\r\n", + " clean_step = dsl.ContainerOp(\r\n", + " name='clean_text',\r\n", + " image='clean_text_transformer:0.1',\r\n", + " command=\"python\",\r\n", + " arguments=[\r\n", + " \"/microservice/pipeline_step.py\",\r\n", + " \"--in-path\", raw_text_path,\r\n", + " \"--out-path\", clean_text_path,\r\n", + " ],\r\n", + " pvolumes={\"/mnt\": download_step.pvolume}\r\n", + " )\r\n", + "\r\n", + " tokenize_step = dsl.ContainerOp(\r\n", + " name='tokenize',\r\n", + " image='spacy_tokenizer:0.1',\r\n", + " command=\"python\",\r\n", + " arguments=[\r\n", + " \"/microservice/pipeline_step.py\",\r\n", + " \"--in-path\", clean_text_path,\r\n", + " \"--out-path\", spacy_tokens_path,\r\n", + " ],\r\n", + " pvolumes={\"/mnt\": clean_step.pvolume}\r\n", + " )\r\n", + "\r\n", + " vectorize_step = dsl.ContainerOp(\r\n", + " name='vectorize',\r\n", + " image='tfidf_vectorizer:0.1',\r\n", + " command=\"python\",\r\n", + " arguments=[\r\n", + " \"/microservice/pipeline_step.py\",\r\n", + " \"--in-path\", spacy_tokens_path,\r\n", + " \"--out-path\", tfidf_vectors_path,\r\n", + " \"--max-features\", tfidf_max_features,\r\n", + " \"--ngram-range\", tfidf_ngram_range,\r\n", + " \"--action\", \"train\",\r\n", + " \"--model-path\", tfidf_model_path,\r\n", + " ],\r\n", + " pvolumes={\"/mnt\": tokenize_step.pvolume}\r\n", + " )\r\n", + "\r\n", + " predict_step = dsl.ContainerOp(\r\n", + " name='predictor',\r\n", + " image='lr_text_classifier:0.1',\r\n", + " command=\"python\",\r\n", + " arguments=[\r\n", + " \"/microservice/pipeline_step.py\",\r\n", + " \"--in-path\", tfidf_vectors_path,\r\n", + " \"--labels-path\", labels_path,\r\n", + " \"--out-path\", lr_prediction_path,\r\n", + " \"--c-param\", lr_c_param,\r\n", + " \"--action\", \"train\",\r\n", + " \"--model-path\", lr_model_path,\r\n", + " ],\r\n", + " pvolumes={\"/mnt\": vectorize_step.pvolume}\r\n", + " )\r\n", + "\r\n", + " try:\r\n", + " seldon_config = yaml.load(open(\"../deploy_pipeline/seldon_production_pipeline.yaml\"))\r\n", + " except:\r\n", + " # If this file is run from the project core directory \r\n", + " seldon_config = yaml.load(open(\"deploy_pipeline/seldon_production_pipeline.yaml\"))\r\n", + "\r\n", + " deploy_step = dsl.ResourceOp(\r\n", + " name=\"seldondeploy\",\r\n", + " k8s_resource=seldon_config,\r\n", + " attribute_outputs={\"name\": \"{.metadata.name}\"})\r\n", + "\r\n", + " deploy_step.after(predict_step)\r\n", + "\r\n", + "if __name__ == '__main__':\r\n", + " import kfp.compiler as compiler\r\n", + " compiler.Compiler().compile(nlp_pipeline, __file__ + '.tar.gz')\r\n" ] } ], @@ -1167,7 +844,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 46, "metadata": { "scrolled": true }, @@ -1176,81 +853,77 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[38;5;238m───────┬────────────────────────────────────────────────────────────────────────\u001b[0m\r\n", - " \u001b[38;5;238m│ \u001b[0mFile: \u001b[1mdeploy_pipeline/seldon_production_pipeline.yaml\u001b[0m\r\n", - "\u001b[38;5;238m───────┼────────────────────────────────────────────────────────────────────────\u001b[0m\r\n", - "\u001b[38;5;238m 1\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;149m---\u001b[0m\r\n", - "\u001b[38;5;238m 2\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mapiVersion\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mmachinelearning.seldon.io/v1alpha2\u001b[0m\r\n", - "\u001b[38;5;238m 3\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mkind\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mSeldonDeployment\u001b[0m\r\n", - "\u001b[38;5;238m 4\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mmetadata\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 5\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mlabels\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 6\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mapp\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mseldon\u001b[0m\r\n", - "\u001b[38;5;238m 7\u001b[0m \u001b[33m~\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mseldon-deployment-{{workflow.name}}\u001b[0m\u001b[38;5;186m\"\u001b[0m\r\n", - "\u001b[38;5;238m 8\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mnamespace\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mkubeflow\u001b[0m\r\n", - "\u001b[38;5;238m 9\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mspec\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 10\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mannotations\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 11\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mproject_name\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mNLP Pipeline\u001b[0m\r\n", - "\u001b[38;5;238m 12\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mdeployment_version\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mv1\u001b[0m\r\n", - "\u001b[38;5;238m 13\u001b[0m \u001b[33m~\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186mseldon-deployment-{{workflow.name}}\u001b[0m\u001b[38;5;186m\"\u001b[0m\r\n", - "\u001b[38;5;238m 14\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203moauth_key\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186moauth-key\u001b[0m\r\n", - "\u001b[38;5;238m 15\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203moauth_secret\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186moauth-secret\u001b[0m\r\n", - "\u001b[38;5;238m 16\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mpredictors\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 17\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mcomponentSpecs\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 18\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mspec\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 19\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mcontainers\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 20\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mimage\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mclean_text_transformer:0.1\u001b[0m\r\n", - "\u001b[38;5;238m 21\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mimagePullPolicy\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mIfNotPresent\u001b[0m\r\n", - "\u001b[38;5;238m 22\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mcleantext\u001b[0m\r\n", - "\u001b[38;5;238m 23\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mresources\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 24\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mrequests\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 25\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mmemory\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m1Mi\u001b[0m\r\n", - "\u001b[38;5;238m 26\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mimage\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mspacy_tokenizer:0.1\u001b[0m\r\n", - "\u001b[38;5;238m 27\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mimagePullPolicy\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mIfNotPresent\u001b[0m\r\n", - "\u001b[38;5;238m 28\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mspacytokenizer\u001b[0m\r\n", - "\u001b[38;5;238m 29\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mimage\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mtfidf_vectorizer:0.1\u001b[0m\r\n", - "\u001b[38;5;238m 30\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mimagePullPolicy\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mIfNotPresent\u001b[0m\r\n", - "\u001b[38;5;238m 31\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mtfidfvectorizer\u001b[0m\r\n", - "\u001b[38;5;238m 32\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mvolumeMounts\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 33\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mmypvc\u001b[0m\r\n", - "\u001b[38;5;238m 34\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mmountPath\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m/mnt\u001b[0m\r\n", - "\u001b[38;5;238m 35\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mimage\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mlr_text_classifier:0.1\u001b[0m\r\n", - "\u001b[38;5;238m 36\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mimagePullPolicy\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mIfNotPresent\u001b[0m\r\n", - "\u001b[38;5;238m 37\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mlrclassifier\u001b[0m\r\n", - "\u001b[38;5;238m 38\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mvolumeMounts\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 39\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mmypvc\u001b[0m\r\n", - "\u001b[38;5;238m 40\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mmountPath\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m/mnt\u001b[0m\r\n", - "\u001b[38;5;238m 41\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mterminationGracePeriodSeconds\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;141m20\u001b[0m\r\n", - "\u001b[38;5;238m 42\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mvolumes\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 43\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mmypvc\u001b[0m\r\n", - "\u001b[38;5;238m 44\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mpersistentVolumeClaim\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 45\u001b[0m \u001b[33m~\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mclaimName\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m{{workflow.name}}-my-pvc\u001b[0m\u001b[38;5;186m\"\u001b[0m\r\n", - "\u001b[38;5;238m 46\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mgraph\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 47\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mchildren\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 48\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mspacytokenizer\u001b[0m\r\n", - "\u001b[38;5;238m 49\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mendpoint\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 50\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mtype\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mREST\u001b[0m\r\n", - "\u001b[38;5;238m 51\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mtype\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mMODEL\u001b[0m\r\n", - "\u001b[38;5;238m 52\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mchildren\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 53\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mtfidfvectorizer\u001b[0m\r\n", - "\u001b[38;5;238m 54\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mendpoint\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 55\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mtype\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mREST\u001b[0m\r\n", - "\u001b[38;5;238m 56\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mtype\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mMODEL\u001b[0m\r\n", - "\u001b[38;5;238m 57\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mchildren\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 58\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mlrclassifier\u001b[0m\r\n", - "\u001b[38;5;238m 59\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mendpoint\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 60\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mtype\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mREST\u001b[0m\r\n", - "\u001b[38;5;238m 61\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mtype\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mMODEL\u001b[0m\r\n", - "\u001b[38;5;238m 62\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mchildren\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231m[\u001b[0m\u001b[38;5;231m]\u001b[0m\r\n", - "\u001b[38;5;238m 63\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mcleantext\u001b[0m\r\n", - "\u001b[38;5;238m 64\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mendpoint\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 65\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mtype\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mREST\u001b[0m\r\n", - "\u001b[38;5;238m 66\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mtype\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mMODEL\u001b[0m\r\n", - "\u001b[38;5;238m 67\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186msingle-model\u001b[0m\r\n", - "\u001b[38;5;238m 68\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mreplicas\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;141m1\u001b[0m\r\n", - "\u001b[38;5;238m 69\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mannotations\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 70\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mpredictor_version\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mv1\u001b[0m\r\n", - "\u001b[38;5;238m 71\u001b[0m \u001b[38;5;238m│\u001b[0m \r\n", - "\u001b[38;5;238m───────┴────────────────────────────────────────────────────────────────────────\u001b[0m\r\n" + "---\r\n", + "apiVersion: machinelearning.seldon.io/v1alpha2\r\n", + "kind: SeldonDeployment\r\n", + "metadata:\r\n", + " labels:\r\n", + " app: seldon\r\n", + " name: \"seldon-deployment-{{workflow.name}}\"\r\n", + " namespace: kubeflow\r\n", + "spec:\r\n", + " annotations:\r\n", + " project_name: NLP Pipeline\r\n", + " deployment_version: v1\r\n", + " name: \"seldon-deployment-{{workflow.name}}\"\r\n", + " oauth_key: oauth-key\r\n", + " oauth_secret: oauth-secret\r\n", + " predictors:\r\n", + " - componentSpecs:\r\n", + " - spec:\r\n", + " containers:\r\n", + " - image: clean_text_transformer:0.1\r\n", + " imagePullPolicy: IfNotPresent\r\n", + " name: cleantext\r\n", + " resources:\r\n", + " requests:\r\n", + " memory: 1Mi\r\n", + " - image: spacy_tokenizer:0.1\r\n", + " imagePullPolicy: IfNotPresent\r\n", + " name: spacytokenizer\r\n", + " - image: tfidf_vectorizer:0.1\r\n", + " imagePullPolicy: IfNotPresent\r\n", + " name: tfidfvectorizer\r\n", + " volumeMounts:\r\n", + " - name: mypvc\r\n", + " mountPath: /mnt\r\n", + " - image: lr_text_classifier:0.1\r\n", + " imagePullPolicy: IfNotPresent\r\n", + " name: lrclassifier\r\n", + " volumeMounts:\r\n", + " - name: mypvc\r\n", + " mountPath: /mnt\r\n", + " terminationGracePeriodSeconds: 20\r\n", + " volumes:\r\n", + " - name: mypvc\r\n", + " persistentVolumeClaim:\r\n", + " claimName: \"{{workflow.name}}-my-pvc\"\r\n", + " graph:\r\n", + " children:\r\n", + " - name: spacytokenizer\r\n", + " endpoint:\r\n", + " type: REST\r\n", + " type: MODEL\r\n", + " children:\r\n", + " - name: tfidfvectorizer\r\n", + " endpoint:\r\n", + " type: REST\r\n", + " type: MODEL\r\n", + " children:\r\n", + " - name: lrclassifier\r\n", + " endpoint:\r\n", + " type: REST\r\n", + " type: MODEL\r\n", + " children: []\r\n", + " name: cleantext\r\n", + " endpoint:\r\n", + " type: REST\r\n", + " type: MODEL\r\n", + " name: single-model\r\n", + " replicas: 1\r\n", + " annotations:\r\n", + " predictor_version: v1\r\n", + "\r\n" ] } ], @@ -1375,33 +1048,29 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\u001b[38;5;238m───────┬────────────────────────────────────────────────────────────────────────\u001b[0m\r\n", - " \u001b[38;5;238m│ \u001b[0m\u001b[1mSTDIN\u001b[0m\r\n", - "\u001b[38;5;238m───────┼────────────────────────────────────────────────────────────────────────\u001b[0m\r\n", - "\u001b[38;5;238m 1\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mapiVersion\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mv1\u001b[0m\r\n", - "\u001b[38;5;238m 2\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mkind\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mPod\u001b[0m\r\n", - "\u001b[38;5;238m 3\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mmetadata\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 4\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mpvc-access-container\u001b[0m\r\n", - "\u001b[38;5;238m 5\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;203mspec\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 6\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mcontainers\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 7\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mpvc-access-container\u001b[0m\r\n", - "\u001b[38;5;238m 8\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mimage\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mbusybox\u001b[0m\r\n", - "\u001b[38;5;238m 9\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mcommand\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231m[\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m/bin/sh\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186m-ec\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m,\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;186msleep 1000\u001b[0m\u001b[38;5;186m\"\u001b[0m\u001b[38;5;231m]\u001b[0m\r\n", - "\u001b[38;5;238m 10\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mvolumeMounts\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 11\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mmypvc\u001b[0m\r\n", - "\u001b[38;5;238m 12\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mmountPath\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186m/mnt\u001b[0m\r\n", - "\u001b[38;5;238m 13\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mvolumes\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 14\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;231m-\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;203mname\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mmypvc\u001b[0m\r\n", - "\u001b[38;5;238m 15\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mpersistentVolumeClaim\u001b[0m\u001b[38;5;231m:\u001b[0m\r\n", - "\u001b[38;5;238m 16\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;231m \u001b[0m\u001b[38;5;203mclaimName\u001b[0m\u001b[38;5;231m:\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;186mnlp-b7qt8-my-pvc\u001b[0m\r\n", - "\u001b[38;5;238m───────┴────────────────────────────────────────────────────────────────────────\u001b[0m\r\n" + "apiVersion: v1\r\n", + "kind: Pod\r\n", + "metadata:\r\n", + " name: pvc-access-container\r\n", + "spec:\r\n", + " containers:\r\n", + " - name: pvc-access-container\r\n", + " image: busybox\r\n", + " command: [\"/bin/sh\", \"-ec\", \"sleep 1000\"]\r\n", + " volumeMounts:\r\n", + " - name: mypvc\r\n", + " mountPath: /mnt\r\n", + " volumes:\r\n", + " - name: mypvc\r\n", + " persistentVolumeClaim:\r\n", + " claimName: nlp-b7qt8-my-pvc\r\n" ] } ],