显然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以外的其他服務。

sub003-01.png
    • この公式サンプルでは機械学習の推論を行っていません。推論実行済のデータ(productionデータ)を定期的に転送しています。

 

    Evidently AIでモニタリングする際はモデル学習時のデータ(referenceデータ)が必要になります。これも事前に用意したデータを読み取る形にしています。

此外,文件夹的结构如下所示。

sub003-05.png

建立程序

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です。初回ログイン後にパスワードの変更を求められます。
sub003-02.png

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

sub003-04.png

完成和删除步骤

我们将终止和删除以下所创建的资源。

# ポートフォワードの終了
# 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的理解更深入了。

bannerAds