MLflow Kubernetes Pod部署

时间:2020-04-07 20:37:04

标签: docker kubernetes mlflow

我正在尝试创建一个kubernetes容器,该容器将运行MLflow跟踪器以将mlflow工件存储在指定的s3位置。以下是我尝试使用的配置

Dockerfile:

FROM python:3.7.0

RUN pip install mlflow==1.0.0
RUN pip install boto3
RUN pip install awscli --upgrade --user

ENV AWS_MLFLOW_BUCKET aws_mlflow_bucket
ENV AWS_ACCESS_KEY_ID aws_access_key_id
ENV AWS_SECRET_ACCESS_KEY aws_secret_access_key

COPY run.sh /

ENTRYPOINT ["/run.sh"]

# docker build -t seedjeffwan/mlflow-tracking-server:1.0.0 .
# 1.0.0 is current mlflow version

run.sh:

#!/bin/sh

set -e

if [ -z $FILE_DIR ]; then
  echo >&2 "FILE_DIR must be set"
  exit 1
fi

if [ -z $AWS_MLFLOW_BUCKET ]; then
  echo >&2 "AWS_MLFLOW_BUCKET must be set"
  exit 1
fi

if [ -z $AWS_ACCESS_KEY_ID ]; then
  echo >&2 "AWS_ACCESS_KEY_ID must be set"
  exit 1
fi

if [ -z $AWS_SECRET_ACCESS_KEY ]; then
  echo >&2 "AWS_SECRET_ACCESS_KEY must be set"
  exit 1
fi

mkdir -p $FILE_DIR && mlflow server \
    --backend-store-uri $FILE_DIR \
    --default-artifact-root s3://${AWS_MLFLOW_BUCKET} \
    --host 0.0.0.0 \
    --port 5000

mlflow.yaml:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mlflow-tracking-server
  namespace: default
spec:
  selector:
    matchLabels:
      app: mlflow-tracking-server
  replicas: 1
  template:
    metadata:
      labels:
        app: mlflow-tracking-server
    spec:
      containers:
      - name: mlflow-tracking-server
        image: seedim/mlflow-tracker-service:v1
        ports:
        - containerPort: 5000
        env:
        # FILE_DIR can not be mount dir, MLFLOW need a empty dir but mount dir has lost+found
        - name: FILE_DIR
          value: /mnt/mlflow/manifest
        - name: AWS_MLFLOW_BUCKET
          value: <aws_s3_bucket>
        - name: AWS_ACCESS_KEY_ID
          valueFrom:
            secretKeyRef:
              name: aws-secret
              key: AWS_ACCESS_KEY_ID
        - name: AWS_SECRET_ACCESS_KEY
          valueFrom:
            secretKeyRef:
              name: aws-secret
              key: AWS_SECRET_ACCESS_KEY
        volumeMounts:
        - mountPath: /mnt/mlflow
          name: mlflow-manifest-storage
      volumes:
        - name: mlflow-manifest-storage
          persistentVolumeClaim:
            claimName: mlflow-manifest-pvc

---
apiVersion: v1
kind: Service
metadata:
  name: mlflow-tracking-server
  namespace: default
  labels:
    app: mlflow-tracking-server
spec:
  ports:
  - port: 5000
    protocol: TCP
  selector:
    app: mlflow-tracking-server

---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mlflow-manifest-pvc
  namespace: default
spec:
  storageClassName: gp2
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi

然后我要构建docker映像,将其保存到minikube环境中,然后尝试在kubernetes pod上运行docker映像。

当我尝试此操作时,对于图像容器,我收到CrashLoopBackOff错误,并且对于使用yaml创建的容器,“容器具有未绑定的即时PersistentVolumeClaims”。

我正在尝试遵循此处的信息(https://github.com/aws-samples/eks-kubeflow-workshop/blob/master/notebooks/07_Experiment_Tracking/07_02_MLFlow.ipynb)。

在这种情况下我有做错什么吗?

谢谢

1 个答案:

答案 0 :(得分:2)

这里的问题与您的minikube群集未提供的“持久卷声明”有关。

您将需要决定切换到平台托管的kubernetes服务,还是坚持使用minikube,并手动满足“持续批量声明”或 以及其他解决方案。

最简单的选择是使用helm图表进行mflow安装,例如thisthis

第一个头盔chart列出了要求:

先决条件

  • Kubernetes集群1.10 +
  • 头盔2.8.0 +
  • 基础架构中的PV供应商支持。

就像在指南中一样,您遵循此指南需要PV供应商支持。

因此,通过切换到EKS,您很可能会更轻松地用s3存储工件来部署mflow。

如果您希望保留在minikube上,则需要从链接的指南中修改头盔图表值或yaml文件,以与PV的手动配置兼容。可能还需要为s3配置权限。

第二个头盔chart具有以下限制/功能:

此图表的已知限制

我创建了此图表以在公司的生产就绪环境中使用它。我们正在MLFlow和Postgres后端存储一起使用。

因此,以下功能已被排除在图表之外:

  • 使用持久卷作为后端存储。
  • 使用其他数据库引擎,例如MySQL或SQLServer。

您可以尝试将其安装在minikube上。这种设置将导致工件被存储在远程数据库中。仍然需要调整才能连接到s3。

无论如何,minikube仍然是主要用于学习的轻量级kubernetes发行版,因此,如果坚持时间太长,最终将达到另一个限制。

希望有帮助。