কুবারনেটসের সাথে টেনসরফ্লো সার্ভিং ব্যবহার করুন

এই টিউটোরিয়ালটি দেখায় কিভাবে টেনসরফ্লো রেসনেট মডেল পরিবেশন করতে ডকার কন্টেনারে চলমান টেনসরফ্লো সার্ভিং উপাদান ব্যবহার করতে হয় এবং কুবারনেটসের সাথে সার্ভিং ক্লাস্টার কীভাবে স্থাপন করতে হয়।

টেনসরফ্লো সার্ভিং সম্পর্কে আরও জানতে, আমরা টেনসরফ্লো সার্ভিং বেসিক টিউটোরিয়াল এবং টেনসরফ্লো সার্ভিং অ্যাডভান্সড টিউটোরিয়াল সুপারিশ করি।

TensorFlow ResNet মডেল সম্পর্কে আরও জানতে, আমরা TensorFlow-এ ResNet পড়ার পরামর্শ দিই।

  • পার্ট 1 আপনার পরিবেশ সেটআপ পায়
  • পার্ট 2 দেখায় কিভাবে স্থানীয় ডকার পরিবেশন ইমেজ চালাতে হয়
  • পার্ট 3 দেখায় কিভাবে Kubernetes এ স্থাপন করতে হয়।

পার্ট 1: সেটআপ

শুরু করার আগে, প্রথমে ডকার ইনস্টল করুন

ResNet SavedModel ডাউনলোড করুন

আমাদের স্থানীয় মডেল ডিরেক্টরিটি সাফ করা যাক যদি আমাদের কাছে ইতিমধ্যে একটি থাকে:

rm -rf /tmp/resnet

ডিপ রেসিডুয়াল নেটওয়ার্ক, বা সংক্ষেপে ResNets, খুব গভীর কনভোলিউশনাল নিউরাল নেটওয়ার্কের প্রশিক্ষণ সক্ষম করার জন্য পরিচয় ম্যাপিংয়ের যুগান্তকারী ধারণা প্রদান করেছে। আমাদের উদাহরণের জন্য, আমরা ImageNet ডেটাসেটের জন্য ResNet-এর একটি TensorFlow SavedModel ডাউনলোড করব।

# Download Resnet model from TF Hub
wget https://tfhub.dev/tensorflow/resnet_50/classification/1?tf-hub-format=compressed -o resnet.tar.gz

# Extract SavedModel into a versioned subfolder ‘123’
mkdir -p /tmp/resnet/123
tar xvfz resnet.tar.gz -C /tmp/resnet/123/

আমরা যাচাই করতে পারি আমাদের কাছে SavedModel আছে:

$ ls /tmp/resnet/*
saved_model.pb  variables

পার্ট 2: ডকারে চলছে

স্থাপনার জন্য প্রতিশ্রুতি ইমেজ

এখন আমরা একটি পরিবেশন চিত্র নিতে চাই এবং কুবারনেটস স্থাপনার জন্য একটি নতুন চিত্র $USER/resnet_serving এ সমস্ত পরিবর্তন করতে চাই৷

প্রথমে আমরা একটি ডেমন হিসাবে একটি পরিবেশন চিত্র চালাই:

docker run -d --name serving_base tensorflow/serving

এর পরে, আমরা কন্টেইনারের মডেল ফোল্ডারে ResNet মডেল ডেটা অনুলিপি করি:

docker cp /tmp/resnet serving_base:/models/resnet

অবশেষে আমরা ResNet মডেল পরিবেশন করার জন্য ধারকটি প্রতিশ্রুতিবদ্ধ:

docker commit --change "ENV MODEL_NAME resnet" serving_base \
  $USER/resnet_serving

এখন বেস কন্টেইনার পরিবেশন করা বন্ধ করা যাক

docker kill serving_base
docker rm serving_base

সার্ভার শুরু করুন

এখন রেসনেট মডেল দিয়ে কন্টেইনারটি শুরু করা যাক যাতে এটি পরিবেশনের জন্য প্রস্তুত, gRPC পোর্ট 8500 প্রকাশ করে:

docker run -p 8500:8500 -t $USER/resnet_serving &

সার্ভার জিজ্ঞাসা করুন

ক্লায়েন্টের জন্য, আমাদের টেনসরফ্লো সার্ভিং গিটহাব রেপো ক্লোন করতে হবে:

git clone https://github.com/tensorflow/serving
cd serving

resnet_client_grpc.py- এর মাধ্যমে সার্ভারকে জিজ্ঞাসা করুন। ক্লায়েন্ট একটি ইমেজ ডাউনলোড করে এবং ইমেজনেট শ্রেণীতে শ্রেণীবিভাগের জন্য জিআরপিসি-তে পাঠায়।

tools/run_in_docker.sh python tensorflow_serving/example/resnet_client_grpc.py

এর ফলে আউটপুট যেমন হওয়া উচিত:

outputs {
  key: "classes"
  value {
    dtype: DT_INT64
    tensor_shape {
      dim {
        size: 1
      }
    }
    int64_val: 286
  }
}
outputs {
  key: "probabilities"
  value {
    dtype: DT_FLOAT
    tensor_shape {
      dim {
        size: 1
      }
      dim {
        size: 1001
      }
    }
    float_val: 2.41628322328e-06
    float_val: 1.90121829746e-06
    float_val: 2.72477100225e-05
    float_val: 4.42638565801e-07
    float_val: 8.98362372936e-07
    float_val: 6.84421956976e-06
    float_val: 1.66555237229e-05
...
    float_val: 1.59407863976e-06
    float_val: 1.2315689446e-06
    float_val: 1.17812135159e-06
    float_val: 1.46365800902e-05
    float_val: 5.81210713335e-07
    float_val: 6.59980651108e-05
    float_val: 0.00129527016543
  }
}
model_spec {
  name: "resnet"
  version {
    value: 123
  }
  signature_name: "serving_default"
}

এটা কাজ করে! সার্ভার সফলভাবে একটি বিড়াল ছবি শ্রেণীবদ্ধ!

পার্ট 3: কুবারনেটে স্থাপন করুন

এই বিভাগে আমরা Google ক্লাউড প্ল্যাটফর্মে Kubernetes- এর সাথে একটি সার্ভিং ক্লাস্টার স্থাপন করতে পার্ট 0-এ তৈরি কন্টেইনার ইমেজ ব্যবহার করি।

GCloud প্রকল্প লগইন

এখানে আমরা ধরে নিচ্ছি আপনি tensorflow-serving নামে একটি gcloud প্রকল্প তৈরি করেছেন এবং লগ ইন করেছেন।

gcloud auth login --project tensorflow-serving

একটি ধারক ক্লাস্টার তৈরি করুন

প্রথমে আমরা পরিষেবা স্থাপনের জন্য একটি Google Kubernetes ইঞ্জিন ক্লাস্টার তৈরি করি।

$ gcloud container clusters create resnet-serving-cluster --num-nodes 5

যা কিছু আউটপুট করা উচিত:

Creating cluster resnet-serving-cluster...done.
Created [https://container.googleapis.com/v1/projects/tensorflow-serving/zones/us-central1-f/clusters/resnet-serving-cluster].
kubeconfig entry generated for resnet-serving-cluster.
NAME                       ZONE           MASTER_VERSION  MASTER_IP        MACHINE_TYPE   NODE_VERSION  NUM_NODES  STATUS
resnet-serving-cluster  us-central1-f  1.1.8           104.197.163.119  n1-standard-1  1.1.8         5          RUNNING

gcloud কন্টেইনার কমান্ডের জন্য ডিফল্ট ক্লাস্টার সেট করুন এবং kubectl- এ ক্লাস্টার শংসাপত্রগুলি পাস করুন।

gcloud config set container/cluster resnet-serving-cluster
gcloud container clusters get-credentials resnet-serving-cluster

যার ফলাফল হওয়া উচিত:

Fetching cluster endpoint and auth data.
kubeconfig entry generated for resnet-serving-cluster.

ডকার ইমেজ আপলোড করুন

আসুন এখন আমাদের ছবিটিকে Google কন্টেইনার রেজিস্ট্রিতে পুশ করি যাতে আমরা এটিকে Google ক্লাউড প্ল্যাটফর্মে চালাতে পারি।

প্রথমে আমরা কন্টেইনার রেজিস্ট্রি ফরম্যাট এবং আমাদের প্রকল্পের নাম ব্যবহার করে $USER/resnet_serving চিত্রটিকে ট্যাগ করি,

docker tag $USER/resnet_serving gcr.io/tensorflow-serving/resnet

এরপরে, আমরা ডকারকে শংসাপত্রের সাহায্যকারী হিসাবে gcloud ব্যবহার করতে কনফিগার করি:

gcloud auth configure-docker

এরপরে আমরা ছবিটিকে রেজিস্ট্রিতে পুশ করি,

docker push gcr.io/tensorflow-serving/resnet

কুবারনেটস স্থাপনা এবং পরিষেবা তৈরি করুন

স্থাপনায় resnet_inference সার্ভারের 3টি প্রতিলিপি রয়েছে যা একটি Kubernetes Deployment দ্বারা নিয়ন্ত্রিত হয়। প্রতিলিপিগুলি একটি বাহ্যিক লোড ব্যালেন্সারের সাথে কুবারনেটস পরিষেবা দ্বারা বাহ্যিকভাবে প্রকাশ করা হয়।

Kubernetes config resnet_k8s.yaml উদাহরণ ব্যবহার করে আমরা সেগুলি তৈরি করি।

kubectl create -f tensorflow_serving/example/resnet_k8s.yaml

আউটপুট সহ:

deployment "resnet-deployment" created
service "resnet-service" created

স্থাপনা এবং পডের স্থিতি দেখতে:

$ kubectl get deployments
NAME                    DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
resnet-deployment    3         3         3            3           5s
$ kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
resnet-deployment-bbcbc   1/1       Running   0          10s
resnet-deployment-cj6l2   1/1       Running   0          10s
resnet-deployment-t1uep   1/1       Running   0          10s

পরিষেবার অবস্থা দেখতে:

$ kubectl get services
NAME                    CLUSTER-IP       EXTERNAL-IP       PORT(S)     AGE
resnet-service       10.239.240.227   104.155.184.157   8500/TCP    1m

সবকিছু ঠিকঠাক হতে একটু সময় লাগতে পারে।

$ kubectl describe service resnet-service
Name:           resnet-service
Namespace:      default
Labels:         run=resnet-service
Selector:       run=resnet-service
Type:           LoadBalancer
IP:         10.239.240.227
LoadBalancer Ingress:   104.155.184.157
Port:           <unset> 8500/TCP
NodePort:       <unset> 30334/TCP
Endpoints:      <none>
Session Affinity:   None
Events:
  FirstSeen LastSeen    Count   From            SubobjectPath   Type        Reason      Message
  --------- --------    -----   ----            -------------   --------    ------      -------
  1m        1m      1   {service-controller }           Normal      CreatingLoadBalancer    Creating load balancer
  1m        1m      1   {service-controller }           Normal      CreatedLoadBalancer Created load balancer

পরিষেবার বাহ্যিক IP ঠিকানাটি LoadBalancer Ingress-এর পাশে তালিকাভুক্ত করা হয়েছে।

মডেল জিজ্ঞাসা করুন

আমরা এখন আমাদের স্থানীয় হোস্ট থেকে পরিষেবাটির বাহ্যিক ঠিকানায় অনুসন্ধান করতে পারি।

$ tools/run_in_docker.sh python \
  tensorflow_serving/example/resnet_client_grpc.py \
  --server=104.155.184.157:8500
outputs {
  key: "classes"
  value {
    dtype: DT_INT64
    tensor_shape {
      dim {
        size: 1
      }
    }
    int64_val: 286
  }
}
outputs {
  key: "probabilities"
  value {
    dtype: DT_FLOAT
    tensor_shape {
      dim {
        size: 1
      }
      dim {
        size: 1001
      }
    }
    float_val: 2.41628322328e-06
    float_val: 1.90121829746e-06
    float_val: 2.72477100225e-05
    float_val: 4.42638565801e-07
    float_val: 8.98362372936e-07
    float_val: 6.84421956976e-06
    float_val: 1.66555237229e-05
...
    float_val: 1.59407863976e-06
    float_val: 1.2315689446e-06
    float_val: 1.17812135159e-06
    float_val: 1.46365800902e-05
    float_val: 5.81210713335e-07
    float_val: 6.59980651108e-05
    float_val: 0.00129527016543
  }
}
model_spec {
  name: "resnet"
  version {
    value: 1538687457
  }
  signature_name: "serving_default"
}

আপনি কুবারনেটেসে একটি পরিষেবা হিসাবে পরিবেশনকারী ResNet মডেল সফলভাবে স্থাপন করেছেন!