KF Serving
https://github.com/kubeflow/kfserving/tree/master/docs/samples/custom
镜像准备
cat > requirements.txt <<EOF
Flask==1.1.1
gunicorn==20.0.4
EOF
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
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"