প্রমিথিউস সার্ভার থেকে মেট্রিক্স লোড করুন

TensorFlow.org এ দেখুন Google Colab-এ চালান GitHub-এ উৎস দেখুন নোটবুক ডাউনলোড করুন

ওভারভিউ

A থেকে এই টিউটোরিয়ালটি লোড CoreDNS মেট্রিক্স প্রমিথিউস একটি মধ্যে সার্ভার tf.data.Dataset , তারপর ব্যবহার tf.keras প্রশিক্ষণ ও অনুমান জন্য।

CoreDNS সেবা আবিষ্কারের উপর নজরদারি সঙ্গে একটি DNS সার্ভার, এবং ব্যাপকভাবে একটি অংশ হিসাবে মোতায়েন করা হয় Kubernetes ক্লাস্টার। যে কারণে এটি প্রায়ই devops অপারেশন দ্বারা ঘনিষ্ঠভাবে পর্যবেক্ষণ করা হয়.

এই টিউটোরিয়ালটি একটি উদাহরণ যা মেশিন লার্নিং এর মাধ্যমে তাদের ক্রিয়াকলাপে অটোমেশন খুঁজছেন devops দ্বারা ব্যবহার করা যেতে পারে।

সেটআপ এবং ব্যবহার

প্রয়োজনীয় tensorflow-io প্যাকেজ ইনস্টল করুন এবং রানটাইম পুনরায় চালু করুন

import os
try:
  %tensorflow_version 2.x
except Exception:
  pass
TensorFlow 2.x selected.
pip install tensorflow-io
from datetime import datetime

import tensorflow as tf
import tensorflow_io as tfio

CoreDNS এবং Prometheus ইনস্টল এবং সেটআপ করুন

ডেমো উদ্দেশ্যে, পোর্টের সাথে একটি CoreDNS সার্ভার স্থানীয়ভাবে 9053 খোলা ডিএনএস প্রশ্নের এবং পোর্ট গ্রহণ করতে 9153 চাঁচুনি জন্য মেট্রিক্স এক্সপোজ করতে (defult) খোলা। নিম্নলিখিত CoreDNS জন্য একটি মৌলিক Corefile কনফিগারেশন এবং পাওয়া যায় ডাউনলোড :

.:9053 {
  prometheus
  whoami
}

ইনস্টলেশন সম্পর্কে আরো বিস্তারিত CoreDNS এর উপর পাওয়া যায়নি ডকুমেন্টেশন

curl -s -OL https://github.com/coredns/coredns/releases/download/v1.6.7/coredns_1.6.7_linux_amd64.tgz
tar -xzf coredns_1.6.7_linux_amd64.tgz

curl -s -OL https://raw.githubusercontent.com/tensorflow/io/master/docs/tutorials/prometheus/Corefile

cat Corefile
.:9053 {
  prometheus
  whoami
}
# Run `./coredns` as a background process.
# IPython doesn't recognize `&` in inline bash cells.
get_ipython().system_raw('./coredns &')

পরবর্তী ধাপে সেটআপ প্রমিথিউস সার্ভারে এবং পোর্টে উদ্ভাসিত হয় গেরো CoreDNS মেট্রিক্স থেকে প্রমিথিউস ব্যবহার 9153 উপরে থেকে। prometheus.yml কনফিগারেশনের জন্য ফাইলের জন্য পাওয়া যায় ডাউনলোড :

curl -s -OL https://github.com/prometheus/prometheus/releases/download/v2.15.2/prometheus-2.15.2.linux-amd64.tar.gz
tar -xzf prometheus-2.15.2.linux-amd64.tar.gz --strip-components=1

curl -s -OL https://raw.githubusercontent.com/tensorflow/io/master/docs/tutorials/prometheus/prometheus.yml

cat prometheus.yml
global:
  scrape_interval:     1s
  evaluation_interval: 1s
alerting:
  alertmanagers:

  - static_configs:
    - targets:
rule_files:
scrape_configs:
- job_name: 'prometheus'
  static_configs:
  - targets: ['localhost:9090']
- job_name: "coredns"
  static_configs:
  - targets: ['localhost:9153']
# Run `./prometheus` as a background process.
# IPython doesn't recognize `&` in inline bash cells.
get_ipython().system_raw('./prometheus &')

অর্ডার কিছু কর্মকান্ডের দেখানোর জন্য, dig কমান্ড CoreDNS সার্ভার যা সেটআপ হয়েছে বিরুদ্ধে আমার কয়েকটি ডিএনএস প্রশ্নের জেনারেট করতে ব্যবহার করা যেতে পারে:

sudo apt-get install -y -qq dnsutils
dig @127.0.0.1 -p 9053 demo1.example.org
; <<>> DiG 9.11.3-1ubuntu1.11-Ubuntu <<>> @127.0.0.1 -p 9053 demo1.example.org
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53868
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 3
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 855234f1adcb7a28 (echoed)
;; QUESTION SECTION:
;demo1.example.org.     IN  A

;; ADDITIONAL SECTION:
demo1.example.org.  0   IN  A   127.0.0.1
_udp.demo1.example.org. 0   IN  SRV 0 0 45361 .

;; Query time: 0 msec
;; SERVER: 127.0.0.1#9053(127.0.0.1)
;; WHEN: Tue Mar 03 22:35:20 UTC 2020
;; MSG SIZE  rcvd: 132
dig @127.0.0.1 -p 9053 demo2.example.org
; <<>> DiG 9.11.3-1ubuntu1.11-Ubuntu <<>> @127.0.0.1 -p 9053 demo2.example.org
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53163
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 3
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: f18b2ba23e13446d (echoed)
;; QUESTION SECTION:
;demo2.example.org.     IN  A

;; ADDITIONAL SECTION:
demo2.example.org.  0   IN  A   127.0.0.1
_udp.demo2.example.org. 0   IN  SRV 0 0 42194 .

;; Query time: 0 msec
;; SERVER: 127.0.0.1#9053(127.0.0.1)
;; WHEN: Tue Mar 03 22:35:21 UTC 2020
;; MSG SIZE  rcvd: 132

এখন একটি CoreDNS সার্ভার যার মেট্রিক্স একটি Prometheus সার্ভার দ্বারা স্ক্র্যাপ করা হয়েছে এবং TensorFlow দ্বারা খাওয়ার জন্য প্রস্তুত৷

CoreDNS মেট্রিক্সের জন্য ডেটাসেট তৈরি করুন এবং এটি TensorFlow-এ ব্যবহার করুন

CoreDNS থাকাকে যে পোস্টগ্রি সার্ভার থেকে পাওয়া যায় একটি ডেটাসেটের তৈরি করুন, সঙ্গে সম্পন্ন করা যেতে পারে tfio.experimental.IODataset.from_prometheus । ন্যূনতম দুটি আর্গুমেন্ট প্রয়োজন. query মেট্রিক্স নির্বাচন করতে প্রমিথিউস সার্ভারে পাস করা হয়েছে এবং length ডেটা সেটটি মধ্যে সময়ের লোড করতে চান হয়।

আপনার সাথে শুরু করতে পারেন "coredns_dns_request_count_total" এবং "5" নিচে ডেটা সেটটি তৈরি করতে (সেকেন্ড)। যেহেতু টিউটোরিয়াল দুই ডিএনএস প্রশ্নের আগে পাঠানো হয়েছিল, এটা আশা করা হচ্ছে যে জন্য মেট্রিক্স "coredns_dns_request_count_total" হতে হবে "2.0" সময় সিরিজ শেষে:

dataset = tfio.experimental.IODataset.from_prometheus(
      "coredns_dns_request_count_total", 5, endpoint="http://localhost:9090")


print("Dataset Spec:\n{}\n".format(dataset.element_spec))

print("CoreDNS Time Series:")
for (time, value) in dataset:
  # time is milli second, convert to data time:
  time = datetime.fromtimestamp(time // 1000)
  print("{}: {}".format(time, value['coredns']['localhost:9153']['coredns_dns_request_count_total']))
Dataset Spec:
(TensorSpec(shape=(), dtype=tf.int64, name=None), {'coredns': {'localhost:9153': {'coredns_dns_request_count_total': TensorSpec(shape=(), dtype=tf.float64, name=None)} } })

CoreDNS Time Series:
2020-03-03 22:35:17: 2.0
2020-03-03 22:35:18: 2.0
2020-03-03 22:35:19: 2.0
2020-03-03 22:35:20: 2.0
2020-03-03 22:35:21: 2.0

ডেটাসেটের স্পেসটি আরও খুঁজছেন:

(
  TensorSpec(shape=(), dtype=tf.int64, name=None),
  {
    'coredns': {
      'localhost:9153': {
        'coredns_dns_request_count_total': TensorSpec(shape=(), dtype=tf.float64, name=None)
      }
    }
  }
)

এটি সুস্পষ্ট যে ডেটা সেটটি একটি নিয়ে গঠিত (time, values) tuple যেখানে values ক্ষেত্র একটি পাইথন অভি মধ্যে প্রসারিত হল:

"job_name": {
  "instance_name": {
    "metric_name": value,
  },
}

উপরের উদাহরণে, 'coredns' , কাজ নাম 'localhost:9153' উদাহরণ হিসেবে বলা যায় নাম, এবং 'coredns_dns_request_count_total' মেট্রিক নাম। উল্লেখ্য যে ব্যবহৃত প্রমিথিউস কোয়েরির উপর নির্ভর করে, একাধিক কাজ/দৃষ্টান্ত/মেট্রিক্স ফেরত দেওয়া সম্ভব। এই কারণেই ডেটাসেটের কাঠামোতে পাইথন ডিক্ট ব্যবহার করা হয়েছে।

এক প্রশ্নের নিন "go_memstats_gc_sys_bytes" একটি উদাহরণ হিসাবে। যেহেতু উভয় CoreDNS এবং প্রমিথিউস Golang লিপিবদ্ধ আছে "go_memstats_gc_sys_bytes" মেট্রিক উভয় জন্য উপলব্ধ "coredns" চাকরি "prometheus" JOB:

dataset = tfio.experimental.IODataset.from_prometheus(
    "go_memstats_gc_sys_bytes", 5, endpoint="http://localhost:9090")

print("Time Series CoreDNS/Prometheus Comparision:")
for (time, value) in dataset:
  # time is milli second, convert to data time:
  time = datetime.fromtimestamp(time // 1000)
  print("{}: {}/{}".format(
      time,
      value['coredns']['localhost:9153']['go_memstats_gc_sys_bytes'],
      value['prometheus']['localhost:9090']['go_memstats_gc_sys_bytes']))
Time Series CoreDNS/Prometheus Comparision:
2020-03-03 22:35:17: 2385920.0/2775040.0
2020-03-03 22:35:18: 2385920.0/2775040.0
2020-03-03 22:35:19: 2385920.0/2775040.0
2020-03-03 22:35:20: 2385920.0/2775040.0
2020-03-03 22:35:21: 2385920.0/2775040.0

নির্মিত Dataset প্রেরণ করার জন্য প্রস্তুত tf.keras সরাসরি পারেন প্রশিক্ষণ বা অনুমান উদ্দেশ্যে এখন।

মডেল প্রশিক্ষণের জন্য ডেটাসেট ব্যবহার করুন

মেট্রিক্স ডেটা সেটটি নির্মিত সঙ্গে, এটা সরাসরি ডেটা সেটটি পাস করা সম্ভব tf.keras মডেল প্রশিক্ষণ বা অনুমান জন্য।

ডেমো উদ্দেশ্যে, এই টিউটোরিয়ালটি ইনপুট হিসাবে 1টি বৈশিষ্ট্য এবং 2টি ধাপ সহ একটি খুব সাধারণ LSTM মডেল ব্যবহার করবে:

n_steps, n_features = 2, 1
simple_lstm_model = tf.keras.models.Sequential([
    tf.keras.layers.LSTM(8, input_shape=(n_steps, n_features)),
    tf.keras.layers.Dense(1)
])

simple_lstm_model.compile(optimizer='adam', loss='mae')

10টি নমুনা সহ CoreDNS-এর জন্য ব্যবহার করা ডেটাসেট হল 'go_memstats_sys_bytes'-এর মান। যাইহোক, একটি সহচরী উইন্ডোতে যেহেতু window=n_steps এবং shift=1 গঠিত হয়, অতিরিক্ত নমুনা প্রয়োজন হয় (যে কোন দুই consecute উপাদানের জন্য প্রথম হিসাবে নেওয়া হয় x এবং দ্বিতীয় হিসাবে নেওয়া হয় y প্রশিক্ষণের জন্য)। মোট 10 + n_steps - 1 + 1 = 12 সেকেন্ড।

তথ্য মান এছাড়াও স্কেল করা হয় [0, 1]

n_samples = 10

dataset = tfio.experimental.IODataset.from_prometheus(
    "go_memstats_sys_bytes", n_samples + n_steps - 1 + 1, endpoint="http://localhost:9090")

# take go_memstats_gc_sys_bytes from coredns job 
dataset = dataset.map(lambda _, v: v['coredns']['localhost:9153']['go_memstats_sys_bytes'])

# find the max value and scale the value to [0, 1]
v_max = dataset.reduce(tf.constant(0.0, tf.float64), tf.math.maximum)
dataset = dataset.map(lambda v: (v / v_max))

# expand the dimension by 1 to fit n_features=1
dataset = dataset.map(lambda v: tf.expand_dims(v, -1))

# take a sliding window
dataset = dataset.window(n_steps, shift=1, drop_remainder=True)
dataset = dataset.flat_map(lambda d: d.batch(n_steps))


# the first value is x and the next value is y, only take 10 samples
x = dataset.take(n_samples)
y = dataset.skip(1).take(n_samples)

dataset = tf.data.Dataset.zip((x, y))

# pass the final dataset to model.fit for training
simple_lstm_model.fit(dataset.batch(1).repeat(10),  epochs=5, steps_per_epoch=10)
Train for 10 steps
Epoch 1/5
10/10 [==============================] - 2s 150ms/step - loss: 0.8484
Epoch 2/5
10/10 [==============================] - 0s 10ms/step - loss: 0.7808
Epoch 3/5
10/10 [==============================] - 0s 10ms/step - loss: 0.7102
Epoch 4/5
10/10 [==============================] - 0s 11ms/step - loss: 0.6359
Epoch 5/5
10/10 [==============================] - 0s 11ms/step - loss: 0.5572
<tensorflow.python.keras.callbacks.History at 0x7f1758f3da90>

উপরের প্রশিক্ষিত মডেলটি বাস্তবে খুব একটা উপযোগী নয়, কারণ এই টিউটোরিয়ালটিতে সেটআপ করা CoreDNS সার্ভারে কোনো কাজের চাপ নেই। যাইহোক, এটি একটি কার্যকরী পাইপলাইন যা সত্য উৎপাদন সার্ভার থেকে মেট্রিক্স লোড করতে ব্যবহার করা যেতে পারে। তারপরে ডেভপস অটোমেশনের বাস্তব-বিশ্বের সমস্যা সমাধানের জন্য মডেলটিকে উন্নত করা যেতে পারে।