مشاهده در TensorFlow.org | در Google Colab اجرا شود | مشاهده منبع در GitHub | دانلود دفترچه یادداشت |
بررسی اجمالی
این آموزش بارهای CoreDNS معیارهای از پرومته سرور به یک tf.data.Dataset
، سپس با استفاده از tf.keras
برای آموزش و استنتاج است.
CoreDNS یک سرور DNS با تمرکز بر کشف سرویس است، و به طور گسترده ای به عنوان بخشی از مستقر Kubernetes خوشه. به همین دلیل اغلب توسط عملیات توسعه دهنده نظارت دقیق می شود.
این آموزش نمونه ای است که می تواند توسط توسعه دهندگانی که به دنبال اتوماسیون در عملیات خود از طریق یادگیری ماشین هستند، استفاده شود.
راه اندازی و استفاده
بسته 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
باز به دریافت نمایش داده شد DNS و پورت 9153
(مجموعه اشعار) باز به افشای معیارهای برای خراش دادن. در زیر به تنظیمات اولیه Corefile برای CoreDNS است و در دسترس است دانلود :
.: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
فرمان می تواند مورد استفاده برای تولید چند نمایش داده شد DNS در برابر سرور 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 استفاده کنید
یک DataSet برای CoreDNS معیارهای موجود از سرور PostgreSQL است که می تواند با انجام tfio.experimental.IODataset.from_prometheus
. در حد اقل دو آرگومان مورد نیاز است. query
به سرور پرومته گذشت برای انتخاب معیارهای و length
دوره شما می خواهید را به بار به مجموعه داده است.
شما می توانید با شروع "coredns_dns_request_count_total"
و "5"
(ثانیه) برای ایجاد مجموعه داده است. از آنجا که پیش از آن در آموزش دو نمایش داده شد DNS فرستاده شدند، انتظار می رود که متریک برای "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)
تاپل که در آن values
زمینه بینی پایتون گسترش به است:
"job_name": {
"instance_name": {
"metric_name": value,
},
}
در مثال بالا، 'coredns'
نام شغل است، در 'localhost:9153'
به عنوان مثال نام است، و 'coredns_dns_request_count_total'
نام متریک است. توجه داشته باشید که بسته به پرس و جوی Prometheus استفاده شده، ممکن است چندین شغل/نمونه/متریک بازگردانده شوند. به همین دلیل است که پایتون dict در ساختار Dataset استفاده شده است.
نگاهی دیگر جستجوهای "go_memstats_gc_sys_bytes"
به عنوان مثال. از آنجا که هر دو CoreDNS و پرومته در Golang نوشته شده است، "go_memstats_gc_sys_bytes"
متریک دسترس برای هر دو است "coredns"
شغل و "prometheus"
کار:
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
به طور مستقیم برای آموزش و یا استنتاج اهداف است.
از Dataset برای آموزش مدل استفاده کنید
با معیارهای مجموعه داده ایجاد، ممکن است به طور مستقیم تصویب DataSet به tf.keras
برای آموزش مدل و یا استنتاج است.
برای اهداف نمایشی، این آموزش فقط از یک مدل بسیار ساده LSTM با 1 ویژگی و 2 مرحله به عنوان ورودی استفاده می کند:
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')
مجموعه داده مورد استفاده مقدار 'go_memstats_sys_bytes' برای CoreDNS با 10 نمونه است. اما، از آنجا یک پنجره کشویی از 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 که در این آموزش راهاندازی شده است، حجم کاری ندارد. با این حال، این خط لوله کاری است که می تواند برای بارگیری معیارها از سرورهای تولید واقعی استفاده شود. سپس این مدل می تواند برای حل مشکل واقعی اتوماسیون devops بهبود یابد.