Skip to content

Commit

Permalink
Merge branch 'SeldonIO:master' into patch-1
Browse files Browse the repository at this point in the history
  • Loading branch information
rajgupt committed Jun 18, 2021
2 parents 2a176ab + 0522e2e commit b0cbc6c
Show file tree
Hide file tree
Showing 330 changed files with 44,775 additions and 71,614 deletions.
18 changes: 0 additions & 18 deletions .dependabot/config.yml

This file was deleted.

146 changes: 146 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
version: 2
updates:
- package-ecosystem: pip
directory: "/python"
schedule:
interval: weekly
open-pull-requests-limit: 10
reviewers:
- adriangonz
ignore:
- dependency-name: azure-storage-blob
versions:
- ">= 12.a, < 13"
- dependency-name: black
versions:
- ">= 21.4b0.a, < 21.5"
- dependency-name: coverage
versions:
- ">= 5.0.a, < 5.1"
- dependency-name: coverage
versions:
- "> 5.2, < 5.3"
- dependency-name: flake8
versions:
- "> 3.8.1, < 3.9"
- dependency-name: flake8
versions:
- "> 3.9.0, < 3.10"
- dependency-name: grpcio-reflection
versions:
- ">= 1.35.a, < 1.36"
- dependency-name: grpcio-reflection
versions:
- ">= 1.37.a, < 1.38"
- dependency-name: jaeger-client
versions:
- ">= 4.3.a, < 4.4"
- dependency-name: mypy-protobuf
versions:
- ">= 1.21.a, < 1.22"
- dependency-name: opentracing
versions:
- ">= 2.3.a, < 2.4"
- dependency-name: pandas
versions:
- "> 1.0.1, < 1.1"
- dependency-name: pandas
versions:
- "> 1.1.0, < 1.2"
- dependency-name: pandas
versions:
- ">= 1.2.a, < 1.3"
- dependency-name: pillow
versions:
- "> 6.2.0, < 6.3"
- dependency-name: pillow
versions:
- "> 7.1.1, < 7.2"
- dependency-name: pillow
versions:
- ">= 8.2.a, < 8.3"
- dependency-name: pytest
versions:
- "> 5.3.1, < 5.4"
- dependency-name: pytest
versions:
- "> 5.4.2, < 5.5"
- dependency-name: pytest
versions:
- "> 6.2.2, < 6.3"
- dependency-name: tornado
versions:
- "> 4.5.3"
- dependency-name: urllib3
versions:
- ">= 1.26.a, < 1.27"
- dependency-name: cryptography
versions:
- 3.4.6
- 3.4.7
- dependency-name: grpcio-tools
versions:
- 1.36.0
- 1.36.1
- dependency-name: pillow
versions:
- 8.1.2
- dependency-name: tenacity
versions:
- 7.0.0
- dependency-name: pip-licenses
versions:
- 3.3.1
- dependency-name: grpcio-reflection
versions:
- 1.36.0
- dependency-name: mypy
versions:
- "0.812"
- dependency-name: coverage
versions:
- "5.5"
- dependency-name: mypy-protobuf
versions:
- "1.24"
- package-ecosystem: gomod
directory: "/executor"
schedule:
interval: weekly
open-pull-requests-limit: 10
reviewers:
- adriangonz
- package-ecosystem: gomod
directory: "/operator"
schedule:
interval: weekly
open-pull-requests-limit: 10
reviewers:
- adriangonz
ignore:
- dependency-name: sigs.k8s.io/controller-runtime
versions:
- 0.8.2
- 0.8.3
- dependency-name: github.com/google/go-cmp
versions:
- 0.5.5
- dependency-name: github.com/onsi/gomega
versions:
- 1.10.5
- 1.11.0
- dependency-name: github.com/onsi/ginkgo
versions:
- 1.15.1
- dependency-name: k8s.io/apiextensions-apiserver
versions:
- 0.20.4
- dependency-name: k8s.io/apimachinery
versions:
- 0.20.4
- dependency-name: k8s.io/api
versions:
- 0.20.4
- dependency-name: github.com/go-logr/logr
versions:
- 0.4.0
4 changes: 2 additions & 2 deletions .lighthouse/jenkins-x/notebooks.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,11 @@ spec:
requests:
cpu: 3
memory: 10000Mi
ephemeral-storage: "100Gi"
ephemeral-storage: "150Gi"
limits:
cpu: 3
memory: 10000Mi
ephemeral-storage: "100Gi"
ephemeral-storage: "150Gi"
securityContext:
privileged: true
imagePullPolicy: Always
Expand Down
1,333 changes: 817 additions & 516 deletions CHANGELOG.md

Large diffs are not rendered by default.

13 changes: 10 additions & 3 deletions components/alibi-detect-server/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,12 +1,19 @@
# TODO: Add to release script
FROM docker.io/seldonio/seldon-core-s2i-python37-ubi8:1.8.0-dev
# TODO: Add to release script
FROM docker.io/seldonio/seldon-core-s2i-python37-ubi8:1.10.0-dev
LABEL name="Seldon Alibi Detect Server" \
vendor="Seldon Technologies" \
version="1.8.0-dev" \
version="1.10.0-dev" \
release="1" \
summary="Alibi Detect Server for Seldon Core" \
description="The Alibi Detect Server provides outlier, drift and adversarial detection services for Seldon Core"

# Install Rclone Binary to be present in the image
RUN yum install -y unzip
RUN wget https://downloads.rclone.org/v1.55.1/rclone-v1.55.1-linux-amd64.zip && \
unzip rclone-v1.55.1-linux-amd64.zip && \
mv rclone-v1.55.1-linux-amd64/rclone /usr/bin/rclone && \
rm -rf rclone-v1.55.1-linux-amd64.zip rclone-v1.55.1-linux-amd64

ADD requirements_server.txt .

RUN pip install pip -U
Expand Down
13 changes: 7 additions & 6 deletions components/alibi-detect-server/adserver/ad_model.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import json
from typing import List, Dict, Optional
from typing import List, Dict, Optional, Union
import logging
import kfserving
import numpy as np
from adserver.constants import HEADER_RETURN_INSTANCE_SCORE
from .numpy_encoder import NumpyEncoder
from alibi_detect.utils.saving import load_detector, Data
from adserver.base import CEModel
from adserver.base import CEModel, ModelResponse
from adserver.base.storage import download_model


class AlibiDetectAdversarialDetectionModel(
Expand Down Expand Up @@ -34,13 +34,13 @@ def load(self):
Load the model from storage
"""
model_folder = kfserving.Storage.download(self.storage_uri)
model_folder = download_model(self.storage_uri)
self.model: Data = load_detector(model_folder)
self.ready = True

# or create

def process_event(self, inputs: List, headers: Dict) -> Dict:
def process_event(self, inputs: Union[List, Dict], headers: Dict) -> ModelResponse:
"""
Process the event and return Alibi Detect score
Expand Down Expand Up @@ -75,4 +75,5 @@ def process_event(self, inputs: List, headers: Dict) -> Dict:

ad_preds = self.model.predict(X, return_instance_score=ret_instance_score)

return json.loads(json.dumps(ad_preds, cls=NumpyEncoder))
data = json.loads(json.dumps(ad_preds, cls=NumpyEncoder))
return ModelResponse(data=data, metrics=None)
2 changes: 1 addition & 1 deletion components/alibi-detect-server/adserver/base/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
from .model import CEModel
from .model import CEModel, ModelResponse
from .alibi_model import AlibiDetectModel
4 changes: 2 additions & 2 deletions components/alibi-detect-server/adserver/base/alibi_model.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import kfserving
from typing import Optional
from adserver.base.model import CEModel
from adserver.base.storage import download_model
from alibi_detect.utils.saving import load_detector, Data


Expand All @@ -27,6 +27,6 @@ def load(self):
Load the model from storage
"""
model_folder = kfserving.Storage.download(self.storage_uri)
model_folder = download_model(self.storage_uri)
self.model: Data = load_detector(model_folder)
self.ready = True
7 changes: 6 additions & 1 deletion components/alibi-detect-server/adserver/base/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@

DEFAULT_EVENT_PREFIX = "seldon.ceserver."

class ModelResponse(object):

def __init__(self, data: Dict, metrics: Optional[List[Dict]]):
self.data = data
self.metrics = metrics

class CEModel(object):
def __init__(self, name: str):
Expand All @@ -23,7 +28,7 @@ def load(self):
"""
raise NotImplementedError

def process_event(self, inputs: Union[List, Dict], headers: Dict) -> Optional[Dict]:
def process_event(self, inputs: Union[List, Dict], headers: Dict) -> Optional[ModelResponse]:
"""
Process the event data and return a response
Expand Down
63 changes: 63 additions & 0 deletions components/alibi-detect-server/adserver/base/storage.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import os
import sys
import kfserving
import logging
import tempfile
from distutils.util import strtobool


logger = logging.getLogger(__name__)

try:
from sh import rclone
except ImportError:
logger.warning(
"rclone-based storage funcionality not available without rclone binary"
)
rclone = None


def _rclone_enabled():
# IF RCLONE_ENABLED variable set explicitly we read from it
enabled = os.environ.get("RCLONE_ENABLED", None)
if enabled is not None:
return strtobool(enabled)

# Otherwise we determine if Rclone config is provided
for key in os.environ.keys():
if "RCLONE_CONFIG" in key:
return True
else:
return False


RCLONE_ENABLED = _rclone_enabled()


class Rclone:
def __init__(self, cfg_file: str = None):
self.cfg_file = cfg_file

def copy(self, src: str, dest: str = None):
if rclone is None:
raise RuntimeError(
"rclone binary not found - rclone-based storage funcionality disabled"
)

if dest is None:
dest = tempfile.mkdtemp()

args = ["-vv"]
kwargs = {}
if self.cfg_file is not None:
kwargs["config"] = os.path.abspath(os.path.expanduser(self.cfg_file))

rclone.copy(src, dest, *args, **kwargs, _out=sys.stdout, _err_to_out=True)
return dest


def download_model(storage_uri) -> str:
if RCLONE_ENABLED:
return Rclone().copy(storage_uri)
else:
return kfserving.Storage.download(storage_uri)
16 changes: 5 additions & 11 deletions components/alibi-detect-server/adserver/cd_model.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
import json
from typing import List, Dict, Optional
from typing import List, Dict, Optional, Union
import logging
import numpy as np
from .numpy_encoder import NumpyEncoder
from adserver.base import AlibiDetectModel, ModelResponse
from alibi_detect.utils.saving import load_detector, Data
from adserver.base import AlibiDetectModel
from seldon_core.user_model import SeldonResponse
import kfserving
import tensorflow as tf
from transformers import AutoTokenizer


def _append_drift_metrcs(metrics, drift, name):
Expand Down Expand Up @@ -59,7 +55,7 @@ def __init__(
self.batch: np.array = None
self.model: Data = model

def process_event(self, inputs: List, headers: Dict) -> Optional[Dict]:
def process_event(self, inputs: Union[List, Dict], headers: Dict) -> Optional[ModelResponse]:
"""
Process the event and return Alibi Detect score
Expand Down Expand Up @@ -104,7 +100,7 @@ def process_event(self, inputs: List, headers: Dict) -> Optional[Dict]:

output = json.loads(json.dumps(cd_preds, cls=NumpyEncoder))

metrics = []
metrics: List[Dict] = []
drift = output.get("data")

if drift:
Expand All @@ -113,9 +109,7 @@ def process_event(self, inputs: List, headers: Dict) -> Optional[Dict]:
_append_drift_metrcs(metrics, drift, "p_val")
_append_drift_metrcs(metrics, drift, "threshold")

seldon_response = SeldonResponse(output, None, metrics)

return seldon_response
return ModelResponse(data=output, metrics=metrics)
else:
logging.info(
"Not running drift detection. Batch size is %d. Need %d",
Expand Down
Loading

0 comments on commit b0cbc6c

Please sign in to comment.