KF Serving

https://github.com/kubeflow/kfserving/tree/master/docs/samples/custom

镜像准备

  1. cat > requirements.txt <<EOF
  2. Flask==1.1.1
  3. gunicorn==20.0.4
  4. EOF
  1. cat > custom.yaml <<EOF
  2. apiVersion: serving.kubeflow.org/v1alpha2
  3. kind: InferenceService
  4. metadata:
  5. labels:
  6. controller-tools.k8s.io: "1.0"
  7. name: custom-sample
  8. spec:
  9. default:
  10. predictor:
  11. custom:
  12. container:
  13. name: custom
  14. image: 172.22.28.173:5000/custom-sample
  15. env:
  16. - name: GREETING_TARGET
  17. value: "Python KFServing Sample"
  18. EOF
cat > app.py <<EOF
import os

from flask import Flask

app = Flask(__name__)


@app.route('/v1/models/custom-sample:predict')
def hello_world():
    greeting_target = os.environ.get('GREETING_TARGET', 'World')
    return 'Hello {}!\n'.format(greeting_target)


if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0', port=int(os.environ.get('PORT', 8080)))
EOF
docker build -t 172.22.28.173:5000/custom-sample .
docker push 172.22.28.173:5000/custom-sample

部署

cat > custom.yaml <<EOF
apiVersion: serving.kubeflow.org/v1alpha2
kind: InferenceService
metadata:
  labels:
    controller-tools.k8s.io: "1.0"
  name: custom-sample
spec:
  default:
    predictor:
      custom:
        container:
          name: custom
          image: 172.22.28.173:5000/custom-sample
          env:
            - name: GREETING_TARGET
              value: "Python KFServing Sample"
EOF

kubectl create namespace kfserving
kubectl label ns kfserving serving.kubeflow.org/inferenceservice=enabled
kubectl apply -f custom.yaml -nkfserving

kubectl get inferenceservice -nkfserving
kubectl get all -nkfserving

验证

MODEL_NAME=custom-sample
SERVICE_HOSTNAME=$(kubectl -nkfserving get inferenceservice ${MODEL_NAME} -o jsonpath='{.status.url}' | cut -d "/" -f 3)
echo $SERVICE_HOSTNAME

curl -v -H "Host: ${SERVICE_HOSTNAME}" http://127.0.0.1:31380/v1/models/${MODEL_NAME}:predict
# curl -v -H "Host: ${SERVICE_HOSTNAME}" http://127.0.0.1:31380/v1/models/${MODEL_NAME}:predict
* About to connect() to 127.0.0.1 port 31380 (#0)
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 31380 (#0)
> GET /v1/models/custom-sample:predict HTTP/1.1
> User-Agent: curl/7.29.0
> Accept: */*
> Host: custom-sample.kfserving.example.com
> 
< HTTP/1.1 200 OK
< content-length: 31
< content-type: text/html; charset=utf-8
< date: Fri, 25 Dec 2020 08:34:54 GMT
< server: istio-envoy
< x-envoy-upstream-service-time: 5
< 
Hello Python KFServing Sample!
* Connection #0 to host 127.0.0.1 left intact

Seldon Core Serving

部署

kubectl create ns seldon
kubectl label namespace seldon serving.kubeflow.org/inferenceservice=enabled

cat <<EOF | kubectl create -n seldon -f -
apiVersion: machinelearning.seldon.io/v1
kind: SeldonDeployment
metadata:
  name: seldon-model
spec:
  name: test-deployment
  predictors:
  - componentSpecs:
    - spec:
        containers:
        - image: seldonio/mock_classifier_rest:1.3
          name: classifier
    graph:
      children: []
      endpoint:
        type: REST
      name: classifier
      type: MODEL
    name: example
    replicas: 1
EOF

验证

kubectl get sdep seldon-model -n seldon -o jsonpath='{.status.state}\n'
# kubectl port-forward $(kubectl get pods -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].metadata.name}') -n istio-system 8004:80
curl -s -d '{"data": {"ndarray":[[1.0, 2.0, 5.0]]}}'    -X POST http://localhost:31380/seldon/seldon/seldon-model/api/v1.0/predictions    -H "Content-Type: application/json"