এই টিউটোরিয়ালটি দেখায় কিভাবে টেনসরফ্লো রেসনেট মডেল পরিবেশন করতে ডকার কন্টেনারে চলমান টেনসরফ্লো সার্ভিং উপাদান ব্যবহার করতে হয় এবং কুবারনেটসের সাথে সার্ভিং ক্লাস্টার কীভাবে স্থাপন করতে হয়।
টেনসরফ্লো সার্ভিং সম্পর্কে আরও জানতে, আমরা টেনসরফ্লো সার্ভিং বেসিক টিউটোরিয়াল এবং টেনসরফ্লো সার্ভিং অ্যাডভান্সড টিউটোরিয়াল সুপারিশ করি।
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 মডেল সফলভাবে স্থাপন করেছেন!