显然AI在Kubernetes上公开了样本运行
首先
作为构成MLOps的功能要素之一,监控起到重要作用,可以捕捉推断准确度的变化和数据漂移的发生,以便将其与模型的重新训练和再开发相连接。Evidently AI是用于实现这种监控的开源软件,它提供了一个库用于计算各种指标并生成报告。Evidently AI的使用方法和示例已在GitHub上公开。其中有一个名为”Real-time ML monitoring with Evidently and Grafana”的示例可以使用Prometheus和Grafana来实时可视化指标情况。这个公开示例是使用docker compose来运行的,但我们尝试在Kubernetes(minikube)上运行它。
系统环境
-
- PC: Windows 11
-
- WSL2: Ubuntu 20.04
-
- Docker 20.10.17
-
- Python 3.8.10
-
- Amazon Elastic Container Registry (ECR)
AWS CLIがインストールされていることが必要です。
這次我們在本地PC(Windows)上準備了WSL2+Docker(Ubuntu 20.04)的環境,並在那裡運行minikube。此外,為了管理Docker映像,我們使用了AWS的ECR。然而,我認為它也可以在其他Kubernetes環境(如EKS)上運行,並且Docker容器註冊表不一定需要使用ECR以外的其他服務。

-
- この公式サンプルでは機械学習の推論を行っていません。推論実行済のデータ(productionデータ)を定期的に転送しています。
- Evidently AIでモニタリングする際はモデル学習時のデータ(referenceデータ)が必要になります。これも事前に用意したデータを読み取る形にしています。
此外,文件夹的结构如下所示。

建立程序
1. 环境准备完成
安装Minikube和其他工具。有几种安装方法可供选择,但这次我们决定使用一个名为asdf的工具来进行Minikube、kubectl等工具的版本管理。
# asdfのインストール
git clone https://github.com/asdf-vm/asdf.git ~/.asdf
cat <<EOF >> ~/.bashrc
# asdf setting
. $HOME/.asdf/asdf.sh
. $HOME/.asdf/completions/asdf.bash
EOF
exec $SHELL -l
# minikubeのインストール
# 今回はバージョンとして1.23.2を指定
asdf plugin-add minikube
asdf list-all minikube # minikubeのバージョン一覧が出てくる
asdf install minikube 1.23.2
asdf global minikube 1.23.2
# kubectlのインストール
# 今回はバージョンとして1.23.2を指定
asdf plugin-add kubectl
asdf list-all kubectl # kubectlのバージョン一覧が出てくる
asdf install kubectl 1.23.2
asdf global kubectl 1.23.2
我要启动minikube。
minikube start --kubernetes-version=v1.23.2 --memory=6g
我們將進行驗證設定,以便從Minikube訪問ECR。
# 認証情報の設定
minikube addons configure registry-creds
执行上述命令时,将以对话形式要求您输入。输入如下所示:
如果显示”registry-creds was successfully configured”,则表示完成。
Do you want to enable AWS Elastic Container Registry? [y/n]: y
-- Enter AWS Access Key ID: <アクセスキー>
-- Enter AWS Secret Access Key: <シークレットアクセスキー>
-- (Optional) Enter AWS Session Token: <空でEnter>
-- Enter AWS Region: <リージョン>
-- Enter 12 digit AWS Account ID (Comma separated list): <AWSアカウントID>
-- (Optional) Enter ARN of AWS role to assume: <空でEnter>
Do you want to enable Google Container Registry? [y/n]: n
Do you want to enable Docker Registry? [y/n]: n
Do you want to enable Azure Container Registry? [y/n]: n
当您完成输入后,我们会启用认证设置。
# 認証設定の有効化
minikube addons enable registry-creds
从GitHub克隆Evidently AI公开样本。
git clone https://github.com/evidentlyai/evidently.git
创建用于 Prometheus/Grafana 的配置文件。
公开示例中使用的配置文件被存储在克隆的存储库的evidently/examples/integrations/grafana_monitoring_service/config/文件夹中,以yaml格式。
-
- grafana_dashboards.yaml
-
- grafana_datasources.yaml
- prometheus.yml
本次将其定义为ConfigMap。根据本次环境的需求,部分设置已进行了更改。同时,还剔除了原始yaml文件中的注释。
首先创建一个存储清单文件的文件夹。
mkdir manifests
接下来,我们要创建每个清单文件。
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-grafana-dashboards
data:
grafana-dashboards.yaml: |
apiVersion: 1
providers:
- name: 'Evidently Dashboards'
orgId: 1
folder: ''
folderUid: ''
type: file
disableDeletion: false
updateIntervalSeconds: 10
allowUiUpdates: false
options:
path: /opt/grafana/dashboards
foldersFromFilesStructure: true
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-grafana-datasources
data:
grafana-datasources.yaml: |
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://localhost:9090
isDefault: true
【修改部分】
- url: http://prometheus.:9090 -> http://localhost:9090
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-prometheus
data:
prometheus.yml: |
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
monitor: 'my-project'
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
- job_name: 'service'
scrape_interval: 10s
static_configs:
- targets: ['ai-monitor-clusterip:8085']
【修改内容】
-
- alertingの設定は今回利用しないので削除
- job_name: ‘service’ の targets: [‘evidently_service.:8085’] -> [‘ai-monitor-clusterip:8085’]
3. 构建AI监视器的Docker镜像,并推送到ECR。
接下来我们将构建Evidently AI在AI监视器中运行的Docker镜像。首先准备一个ECR仓库,然后进行构建和推送。创建Docker镜像所需的Dockerfile直接使用Evidently AI的公开样本即可。
# AWSアカウントとリージョンの定義
# ご自身の環境に合わせて適宜修正してください。xxxxxxxxxxxxは12桁のAWSアカウントID
AWS_ACCOUNT=xxxxxxxxxxxx
AWS_REGION=ap-northeast-1
# ECRにログイン
# 下記コマンドをこのまま実行(--usernameを書き換えたりする必要なし)
# 認証の有効期限は12時間。それ以上経過した場合は再度コマンドを実行してください。
aws ecr get-login-password --region $AWS_REGION | \
docker login --username AWS \
--password-stdin $AWS_ACCOUNT.dkr.ecr.$AWS_REGION.amazonaws.com
# ECRへリポジトリの作成
# `ai-monitor`というリポジトリにします。
aws ecr create-repository --repository-name ai-monitor
# Evidently AIサンプルのフォルダに移動
cd evidently/examples/integrations/grafana_monitoring_service
# ai-monitorイメージの作成
# dockerイメージ名はリポジトリ名と同じである必要があります。
docker build -t $AWS_ACCOUNT.dkr.ecr.$AWS_REGION.amazonaws.com/ai-monitor .
# イメージのプッシュ
docker push $AWS_ACCOUNT.dkr.ecr.$AWS_REGION.amazonaws.com/ai-monitor
# ホームディレクトリに戻る
cd ~
创建Kubernetes清单文件。
为了创建Kubernetes的各种资源(Pod、Deployment、Service),我们需要创建一个清单文件。
-
- prometheus/grafana用のリソースのマニフェスト
prometheus/grafanaの設定情報はConfigMapで定義したものを使用します。
grafanaのダッシュボード定義は、jsonファイルをvolumeから読み取る形にしています。
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: prometheus-grafana
name: prometheus-grafana
spec:
replicas: 1
selector:
matchLabels:
app: prometheus-grafana
template:
metadata:
labels:
app: prometheus-grafana
spec:
containers:
- image: prom/prometheus
name: prometheus
args: ["--config.file=/etc/prometheus/prometheus.yml", "--storage.tsdb.path=/prometheus"]
ports:
- containerPort: 9090
volumeMounts:
- name: prometheus-config
mountPath: /etc/prometheus
- image: grafana/grafana
name: grafana
securityContext:
runAsUser: 472
ports:
- containerPort: 3000
volumeMounts:
- name: grafana-datasources
mountPath: /etc/grafana/provisioning/datasources
readOnly: true
- name: grafana-dashboards
mountPath: /etc/grafana/provisioning/dashboards
readOnly: true
- name: dashboards
mountPath: /opt/grafana/dashboards
volumes:
- name: prometheus-config
configMap:
name: cm-prometheus
- name: grafana-datasources
configMap:
name: cm-grafana-datasources
- name: grafana-dashboards
configMap:
name: cm-grafana-dashboards
- name: dashboards
hostPath:
path: /data/grafana_monitoring_service/grafana-dashboards
type: DirectoryOrCreate
---
apiVersion: v1
kind: Service
metadata:
labels:
app: prometheus-grafana-clusterip
name: prometheus-grafana-clusterip
spec:
ports:
- name: prometheus
port: 9090
protocol: TCP
targetPort: 9090
- name: grafana
port: 3000
protocol: TCP
targetPort: 3000
selector:
app: prometheus-grafana
type: ClusterIP
-
- ai-monitor(Evidently AI)用のリソースのマニフェスト
referenceデータはvolumeから読み取る形にしています。
xxxxxxxxxxxx部分は各自のAWSアカウントIDを設定します。(リージョンも異なれば合わせて修正してください。)
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: ai-monitor
name: ai-monitor
spec:
replicas: 1
selector:
matchLabels:
app: ai-monitor
template:
metadata:
labels:
app: ai-monitor
spec:
containers:
- image: xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/ai-monitor:latest
name: ai-monitor
ports:
- containerPort: 8085
volumeMounts:
- name: storage
mountPath: /app/datasets
volumes:
- name: storage
hostPath:
path: /data/grafana_monitoring_service/datasets
type: DirectoryOrCreate
---
apiVersion: v1
kind: Service
metadata:
labels:
app: ai-monitor-clusterip
name: ai-monitor-clusterip
spec:
ports:
- port: 8085
protocol: TCP
targetPort: 8085
selector:
app: ai-monitor
type: ClusterIP
5. 创建Kubernetes资源
从之前创建的清单文件中生成Kubernetes资源。
# ConfigMapの生成
kubectl apply -f manifests/cm_grafana-dashboards.yaml \
-f manifests/cm_grafana-datasource.yaml \
-f manifests/cm_prometheus.yaml
# prometheus/grafanaのリソース生成
kubectl apply -f manifests/depsvc_prometheus-grafana.yaml
# ai-monitorのリソース生成
kubectl apply -f manifests/depsvc_ai-monitor.yaml
# リソース生成の確認
# podのステータスが`Running`になることを確認します。初回起動時でも概ね1分以内でRunningになります。
# ※2秒間隔で表示が繰り返されます。podの起動が確認できたらctrl+cで終了してください
watch 'kubectl get pod,deploy,svc,cm'
生成数据集并传送到 Minikube。
生成数据集并将其传输到Minikube。转移的数据将用作Evidently AI监控时用于计算指标的参考数据。
# Evidently AIサンプルのフォルダに移動
cd evidently/examples/integrations/grafana_monitoring_service
# Pythonパッケージの追加
pip install -r requirements.txt
# データセットの生成
# ※サンプルにはkdd_k_neighbors_classifierというデータセットもあるのですが、
# 記事の執筆時点ではエラーが発生する現象が見られたので除外しています。
python scripts/prepare_datasets.py -d "bike_random_forest" -p "datasets/bike_random_forest"
python scripts/prepare_datasets.py -d "bike_gradient_boosting" -p "datasets/bike_gradient_boosting"
# minikube配下のローカルディレクトリへコピー
sudo cp -r datasets/bike_random_forest /var/lib/docker/volumes/minikube/_data/data/grafana_monitoring_service/datasets/
sudo cp -r datasets/bike_gradient_boosting /var/lib/docker/volumes/minikube/_data/data/grafana_monitoring_service/datasets/
# Grafanaダッシュボード定義ファイルのコピー
sudo cp -r dashboards/*.json /var/lib/docker/volumes/minikube/_data/data/grafana_monitoring_service/grafana-dashboards/
# ホームディレクトリに戻る
cd ~
7. 执行端口转发
我们将进行端口转发,以便允许从Minikube外部进行访问。
# prometheus、Grafanaのポートフォワード(バックグラウンド実行)
kubectl port-forward svc/prometheus-grafana-clusterip --address 0.0.0.0 9090 3000 >/dev/null &
# ai-monitorのポートフォワード(バックグラウンド実行)
kubectl port-forward svc/ai-monitor-clusterip --address 0.0.0.0 8085 >/dev/null &
8. 数据发送和仪表盘检查
从客户端发送数据并在Grafana仪表板上确认结果。
# Evidently AIサンプルのフォルダに移動
cd evidently/examples/integrations/grafana_monitoring_service
# データ送信のClient App実行
# これを実行すると2秒間隔で連続的にデータ送信する処理が約20分間動きます。
python scripts/example_run_request.py
一旦数据发送开始后,可以访问Grafana仪表板(http://localhost:3000)。
- 初回起動時のユーザIDと初期パスワードはadmin/adminです。初回ログイン後にパスワードの変更を求められます。

在菜单中选择“仪表盘 > 浏览”,选择一个仪表盘。例如,选择“Evidently Data Drift Dashboard”,会显示以下屏幕。

完成和删除步骤
我们将终止和删除以下所创建的资源。
# ポートフォワードの終了
# job番号は実際の数値に変更してください
jobs
kill %1
kill %2
# kubernetesリソースの削除
cd ~
kubectl delete -f manifests/depsvc_ai-monitor.yaml \
-f manifests/depsvc_prometheus-grafana.yaml \
-f manifests/cm_grafana-dashboards.yaml \
-f manifests/cm_grafana-datasource.yaml \
-f manifests/cm_prometheus.yaml
# ECRリポジトリの削除
aws ecr delete-repository --repository-name ai-monitor --force
# minikubeの停止
minikube stop
# ※minikubeを削除したい場合は`minikube delete`
最后
因为我在学习Kubernetes的同时进行了挑战,所以一开始非常困难,但多亏了这个经历,我的对Kubernetes和Evidently AI的理解更深入了。