TensorFlow.org'da görüntüleyin | Google Colab'da çalıştırın | Kaynağı GitHub'da görüntüleyin | Not defterini indir |
genel bakış
Bir gelen bu öğretici yükler CoreDNS ölçümlerini Prometheus bir içine sunucuya tf.data.Dataset
ardından kullandığı tf.keras
eğitim ve çıkarım için.
CoreDNS servis keşif odaklanarak bir DNS sunucusu olduğu ve yaygın bir parçası olarak dağıtıldığı Kubernetes küme. Bu nedenle genellikle devops işlemleri tarafından yakından izlenir.
Bu öğretici, makine öğrenimi yoluyla operasyonlarında otomasyon arayan geliştiriciler tarafından kullanılabilecek bir örnektir.
Kurulum ve kullanım
Gerekli tensorflow-io paketini kurun ve çalışma zamanını yeniden başlatın
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 ve Prometheus'u kurun ve kurun
Demo amaçlar için, bağlantı noktası ile yerel olarak bir CoreDNS sunucusu 9053
açık DNS sorguları ve port almak 9153
kazıma ilişkin ölçümleri ortaya çıkarmak için açık (defult). Aşağıdaki CoreDNS için temel Corefile yapılandırma ve kullanılabilir yükleme :
.:9053 {
prometheus
whoami
}
Yükleme hakkında daha fazla ayrıntı CoreDNS en öğrenilmesi mümkündür belgeler .
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 &')
Bir sonraki adım kurulum Prometheus sunucuya ve bağlantı noktasında maruz sıyrık CoreDNS ölçümlere Prometheus'u kullanmak 9153
yukarıdan. prometheus.yml
yapılandırma için dosya için de kullanılabilir indirmek :
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 &')
Bazı aktiviteyi göstermek amacıyla, dig
komut kurulum olmuştur CoreDNS sunucuya karşı birkaç DNS sorguları oluşturmak için kullanılabilir:
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
Artık, ölçümleri bir Prometheus sunucusu tarafından kazınmış ve TensorFlow tarafından tüketilmeye hazır bir CoreDNS sunucusu.
CoreDNS ölçümleri için Veri Kümesi oluşturun ve bunu TensorFlow'da kullanın
PostgreSQL sunucusu edinilebilir CoreDNS metrikler için bir Veri Kümesi oluşturun ile yapılabilirdi tfio.experimental.IODataset.from_prometheus
. Asgari düzeyde iki argümana ihtiyaç vardır. query
ölçümlerini seçmek için Prometheus sunucuya geçirilir ve length
DataSetbırakma içine yüke istediğiniz dönemdir.
Sen başlayabilir "coredns_dns_request_count_total"
ve "5"
altında Veri Kümesi oluşturmak için (sn). Öğretici iki DNS sorguları önceki gönderildi yana, için ölçümlerini beklenmektedir "coredns_dns_request_count_total"
olacak "2.0"
Zaman dizilerinin sonunda:
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
Veri Kümesinin özelliklerine daha fazla bakmak:
(
TensorSpec(shape=(), dtype=tf.int64, name=None),
{
'coredns': {
'localhost:9153': {
'coredns_dns_request_count_total': TensorSpec(shape=(), dtype=tf.float64, name=None)
}
}
}
)
Veri kümesi bir oluştuğunu açıktır (time, values)
tuple values
alan içine genişletilmiş bir piton dict geçerli:
"job_name": {
"instance_name": {
"metric_name": value,
},
}
Yukarıdaki örnekte, 'coredns'
, iş adıdır 'localhost:9153'
örnek adıdır ve 'coredns_dns_request_count_total'
metrik adıdır. Kullanılan Prometheus sorgusuna bağlı olarak, birden fazla işin/örnek/ölçümün döndürülebileceğini unutmayın. Bu aynı zamanda Veri Kümesinin yapısında python dict kullanılmasının nedenidir.
Başka bir sorgu al "go_memstats_gc_sys_bytes"
örnek olarak. Her iki CoreDNS ve Prometheus Golang yazılmış olduğundan, "go_memstats_gc_sys_bytes"
metrik ikisi için kullanılabilir "coredns"
iş ve "prometheus"
iş:
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
Oluşturulan Dataset
geçirilecek hazır tf.keras
şimdi ya eğitim ya da çıkarsama amaçlı doğrudan.
Model eğitimi için Veri Kümesini kullanın
Veri kümesi oluşturulan ölçümler ile, doğrudan Dataset geçmek mümkündür tf.keras
modeli eğitim veya çıkarım için.
Demo amacıyla, bu eğitimde giriş olarak 1 özellik ve 2 adımlı çok basit bir LSTM modeli kullanılacaktır:
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')
Kullanılacak veri seti, 10 örnekle CoreDNS için 'go_memstats_sys_bytes' değeridir. Bununla birlikte, bir kayan pencere çünkü window=n_steps
ve shift=1
oluşturulur, ilave örnekler (iki consecute elemanları için, ilk olarak alınır ihtiyaç vardır x
ve ikinci olarak alınır y
eğitim için). Toplam olan 10 + n_steps - 1 + 1 = 12
saniye.
Veri değeri de ölçeklendirilir [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>
Bu eğitimde kurulan CoreDNS sunucusunun herhangi bir iş yükü olmadığından, yukarıdaki eğitilmiş model gerçekte pek kullanışlı değildir. Ancak bu, gerçek üretim sunucularından ölçümleri yüklemek için kullanılabilecek çalışan bir işlem hattıdır. Model daha sonra gerçek dünyadaki devops otomasyonu sorununu çözmek için geliştirilebilir.