OpenShift AI - 管理和使用 OpenShift AI 运行环境

《OpenShift / RHEL / DevSecOps 汇总目录》
说明:本文已经在 OpenShift 4.14 + RHODS 2.50 的环境中验证

说明:请先根据《OpenShift AI - 部署 OpenShift AI 环境,运行 AI/ML 应用(视频)》一文完成 OpenShift AI 环境的安装。

注意:如无特殊说明,和 OpenShift AI 相关的 Blog 均无需 GPU。

文章目录

  • 启停 Notebook Server
    • 启动
    • 停止
  • Notebook 镜像
    • Notebook Image 和 ImageStream
    • 使用定制的 Notebook Image
  • 定制服务器的运行配置
  • 应用 vs 项目
  • 通过 Data connection 使用外部对象存储
    • 创建外部对象存储
    • 在 AI 项目中使用外部对象存储
  • 用户和访问权限
  • 参考

启停 Notebook Server

RHOAI 使用 StatefulSet 来运行 Applications > Enabled 中的 Jupyter 环境,该 StatefulSet 和其他相关资源全部运行在 rhods-notebook 项目中。

启动

  1. 登录 RHOAI 控制台,然后进入 Applications > Enabled,再点击 Jupyter 下方的 Launch application 链接。
    OpenShift AI - 管理和使用 OpenShift AI 运行环境_第1张图片
  2. 在 Start a notebook server 页面选中一个 Notebook 使用的镜像以及其他选项,然后点击 Start server 按钮。
    OpenShift AI - 管理和使用 OpenShift AI 运行环境_第2张图片
  3. 在下图的 Starting server 窗口点击任意按钮即可转到登录页面,然后使用可用用户登录 Jupyter Notebook 即可。OpenShift AI - 管理和使用 OpenShift AI 运行环境_第3张图片
  4. 此时在 rhods-notebooks 项目中会运行名为 jupter-nb-user1 的 StatefulSet 和对应的资源。
$ oc get all -n rhods-notebooks
Warning: apps.openshift.io/v1 DeploymentConfig is deprecated in v4.14+, unavailable in v4.10000+
NAME                     READY   STATUS    RESTARTS   AGE
pod/jupyter-nb-user1-0   2/2     Running   0          14m

NAME                           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
service/jupyter-nb-user1       ClusterIP   172.31.145.240   <none>        80/TCP    14m
service/jupyter-nb-user1-tls   ClusterIP   172.31.157.129   <none>        443/TCP   14m

NAME                                READY   AGE
statefulset.apps/jupyter-nb-user1   1/1     14m

NAME                                        HOST/PORT                                                                        PATH   SERVICES               PORT          TERMINATION          WILDCARD
route.route.openshift.io/jupyter-nb-user1   jupyter-nb-user1-rhods-notebooks.apps.cluster-4gwc7.dynamic.redhatworkshops.io          jupyter-nb-user1-tls   oauth-proxy   reencrypt/Redirect   None

$ oc get pvc -n rhods-notebooks
NAME                      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                           AGE
jupyterhub-nb-user1-pvc   Bound    pvc-379c22b3-ddc8-4c7c-b6ae-59311f2a1383   20Gi       RWO            ocs-external-storagecluster-ceph-rbd   41m

OpenShift AI - 管理和使用 OpenShift AI 运行环境_第4张图片

停止

  1. 在 Jupyter Notebook 页面中选择 File > Hub Control Panel 菜单。
    OpenShift AI - 管理和使用 OpenShift AI 运行环境_第5张图片
  2. 此时会跳转到 RHOAI 控制台,点击 Stop notebook server 即可停止运行。
    OpenShift AI - 管理和使用 OpenShift AI 运行环境_第6张图片
  3. 运行命令,确认在 StatefulSet 中已经没有运行的 Pod 了。
$ oc get statefulset -n rhods-notebooks
NAME               READY   AGE
jupyter-nb-user1   0/0     16m

Notebook 镜像

在 RHOAI 中是通过容器运行 Jupyter notebook 的。可以在 RHOAI 控制台中看到缺省提供的容器镜像类型,它们包括:Minimal Python、Standard Data Science、CUDA、Pytorch、TensorFlow、HabanaAI、TrustAI。另外用户也可以使用自己定制的容器镜像。
注意:每个镜像包含的预安装包见详细说明。

Notebook Image 和 ImageStream

在创建 Jupyter notebook server 的界面中需要我们选择所使用的镜像。这些镜像是通过 redhat-ods-applications 项目中的 ImageStream 被访问到的。

  1. 执行命令,可以查看到 redhat-ods-applications 项目中的 ImageStream。
$ oc get is -n redhat-ods-applications
NAME                                IMAGE REPOSITORY                                                                                             TAGS                UPDATED
habana-notebook                     image-registry.openshift-image-registry.svc:5000/redhat-ods-applications/habana-notebook                     2023.2              9 minutes ago
minimal-gpu                         image-registry.openshift-image-registry.svc:5000/redhat-ods-applications/minimal-gpu                         1.2,2023.1,2023.2   9 minutes ago
odh-trustyai-notebook               image-registry.openshift-image-registry.svc:5000/redhat-ods-applications/odh-trustyai-notebook               2023.1,2023.2       9 minutes ago
pytorch                             image-registry.openshift-image-registry.svc:5000/redhat-ods-applications/pytorch                             1.2,2023.1,2023.2   9 minutes ago
s2i-generic-data-science-notebook   image-registry.openshift-image-registry.svc:5000/redhat-ods-applications/s2i-generic-data-science-notebook   1.2,2023.1,2023.2   9 minutes ago
s2i-minimal-notebook                image-registry.openshift-image-registry.svc:5000/redhat-ods-applications/s2i-minimal-notebook                1.2,2023.1,2023.2   9 minutes ago
tensorflow                          image-registry.openshift-image-registry.svc:5000/redhat-ods-applications/tensorflow                          1.2,2023.1,2023.2   9 minutes ago
  1. 查看名为 tensorflow 的 ImageStream,注意:Image 的相关信息都保存在 annotations 中,例如:软件版本、python 依赖软件版本等。
$ oc get is -n redhat-ods-applications tensorflow -ojsonpath={.spec.tags[2]} | jq
{
  "annotations": {
    "opendatahub.io/notebook-build-commit": "d0ce8b0",
    "opendatahub.io/notebook-python-dependencies": "[{\"name\":\"TensorFlow\",\"version\":\"2.13\"},{\"name\":\"Tensorboard\",\"version\":\"2.13\"}, {\"name\":\"Boto3\",\"version\":\"1.28\"},{\"name\":\"Kafka-Python\",\"version\":\"2.0\"},{\"name\":\"Kfp-tekton\",\"version\":\"1.5\"},{\"name\":\"Matplotlib\",\"version\":\"3.6\"},{\"name\":\"Numpy\",\"version\":\"1.24\"},{\"name\":\"Pandas\",\"version\":\"1.5\"},{\"name\":\"Scikit-learn\",\"version\":\"1.3\"},{\"name\":\"Scipy\",\"version\":\"1.11\"},{\"name\":\"Elyra\",\"version\":\"3.15\"},{\"name\":\"PyMongo\",\"version\":\"4.5\"},{\"name\":\"Pyodbc\",\"version\":\"4.0\"}, {\"name\":\"Codeflare-SDK\",\"version\":\"0.12\"}, {\"name\":\"Sklearn-onnx\",\"version\":\"1.15\"}, {\"name\":\"Psycopg\",\"version\":\"3.1\"}, {\"name\":\"MySQL Connector/Python\",\"version\":\"8.0\"}]",
    "opendatahub.io/notebook-software": "[{\"name\":\"CUDA\",\"version\":\"11.8\"},{\"name\":\"Python\",\"version\":\"v3.9\"},{\"name\":\"TensorFlow\",\"version\":\"2.13\"}]",
    "opendatahub.io/workbench-image-recommended": "true",
    "openshift.io/imported-from": "quay.io/modh/cuda-notebooks"
  },
  "from": {
    "kind": "DockerImage",
    "name": "quay.io/modh/cuda-notebooks@sha256:59d571d0d245c050eb9f79de5c3c40517a575d8fdfb41385a324ee45a42b597b"
  },
  "generation": 2,
  "importPolicy": {
    "importMode": "Legacy"
  },
  "name": "2023.2",
  "referencePolicy": {
    "type": "Source"
  }
}

使用定制的 Notebook Image

除了可以使用 OpenShift 默认提供的 Notebook 镜像外,用户可以定制自己的 Notebook 镜像。

  1. 使用管理员登录 OpenShift AI 的控制台,然后进入 Settings > Notebook image settings,
    OpenShift AI - 管理和使用 OpenShift AI 运行环境_第7张图片
  2. 在 Import notebook image 窗口中按下图配置定制的镜像,最后点击 Import。其中 Image localion 为用户定制的容器镜像,在这里我们可以使用 quay.io/opendatahub-contrib/workbench-images:jupyter-spark-ubi9-py39_2023a_latest,它包含了 Hadoop 和 Spark 环境。
    OpenShift AI - 管理和使用 OpenShift AI 运行环境_第8张图片
  3. 完成后可以看到定制的 Notebook 镜像列表。
    OpenShift AI - 管理和使用 OpenShift AI 运行环境_第9张图片
  4. 此时再进入 Applications > Enabled 的 Notebook Server 界面,可以看到定制的镜像已经成为可选项。
    OpenShift AI - 管理和使用 OpenShift AI 运行环境_第10张图片

定制服务器的运行配置

  1. 进入 OpenShift 控制台的 API Explorer 页面,然后搜索 OdhDashboardConfig 类型对象,点击进入该对象。
    OpenShift AI - 管理和使用 OpenShift AI 运行环境_第11张图片
  2. 切换到 redhat-ods-applications 项目,在对象的实例列表中点击进入 odh-dashborad-config。
    OpenShift AI - 管理和使用 OpenShift AI 运行环境_第12张图片
  3. 在 YAML 中的 notebookSizes 部分就是运行 Notebook 服务器的几档配置。

应用 vs 项目

在 RHOAI 控制台中每个有权限的用户都可在 Applications 中创建并运行一个 Notebook Server 环境。所有用户的 Notebook Server 都是以 StatefulSet 方式运行在 rhods-notebook 项目中。然而一个用户的多个 AI/ML 都在 Applications 中的这个 Notebook Server 环境中运行往往是不够的,因此用户可以在 Data Science Projects 中创建多个项目以运维不同的 AI/ML。

  1. 用一个一般用户登录 RHOAI 控制台,然后进入 Data Science Projects 菜单,再点击 Create data science project 按钮。
    OpenShift AI - 管理和使用 OpenShift AI 运行环境_第13张图片
  2. 在 Create data science project 窗口填写 Name 和 Resource name。
    OpenShift AI - 管理和使用 OpenShift AI 运行环境_第14张图片
  3. 在 Create workbench 页面中按照下图配置,然后点击 Create workbench 按钮。
    OpenShift AI - 管理和使用 OpenShift AI 运行环境_第15张图片
  4. 查看 Data Science Project 的详细信息,如下图。其中可以通过 Data connection 配置来访问外部的对象存储,以便可以从外部向应用提供模型训练数据,并存储训练好的模型。
    OpenShift AI - 管理和使用 OpenShift AI 运行环境_第16张图片
  5. 当上图的 Status 为 Running 后,可以点击 Open 链接打开 Jupyter Notebook。另外还可以进入 OpenShift 控制台对应的项目,确认已经有运行的 StatefulSet 对象。
    OpenShift AI - 管理和使用 OpenShift AI 运行环境_第17张图片
  6. 当上图的 Status 为 Running 后,可以在对应的项目中看到对应 Workbench 的 StatefulSet 对象。

通过 Data connection 使用外部对象存储

在训练 AI 模型的时候,对于使用数据量相对较小的简单项目,可以将文件上传到工作台的 Notebook 运行环境中。但更复杂的项目会涉及的更大的数据集,这时不建议将数据直接存储在 Jupyter 的代码库中,因为这会导致代码库超载,更好的办法是将数据存储在专用存储系统中,需要时再将数据下载到工作台。同样,训练好的模型在导出时可能会产生较大的文件,因此也建议将其存储在专用存储系统中。

OpenShift AI 的 Data connection 是一组用于访问外部存储系统的配置。

创建外部对象存储

本文以 MinIO 为例创建对象存储。

  1. 在 OpenShift 控制台中创建一个名为 minio 的项目。
  2. 在 minio 的项目中运行以下 YAML 创建的对应资源。
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: minio-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
  volumeMode: Filesystem
---
kind: Secret
apiVersion: v1
metadata:
  name: minio-secret
stringData:
  # change the username and password to your own values.
  # ensure that the user is at least 3 characters long and the password at least 8
  minio_root_user: minio
  minio_root_password: minio123
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: minio
spec:
  replicas: 1
  selector:
    matchLabels:
      app: minio
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: minio
    spec:
      volumes:
        - name: data
          persistentVolumeClaim:
            claimName: minio-pvc
      containers:
        - resources:
            limits:
              cpu: 250m
              memory: 1Gi
            requests:
              cpu: 20m
              memory: 100Mi
          readinessProbe:
            tcpSocket:
              port: 9000
            initialDelaySeconds: 5
            timeoutSeconds: 1
            periodSeconds: 5
            successThreshold: 1
            failureThreshold: 3
          terminationMessagePath: /dev/termination-log
          name: minio
          livenessProbe:
            tcpSocket:
              port: 9000
            initialDelaySeconds: 30
            timeoutSeconds: 1
            periodSeconds: 5
            successThreshold: 1
            failureThreshold: 3
          env:
            - name: MINIO_ROOT_USER
              valueFrom:
                secretKeyRef:
                  name: minio-secret
                  key: minio_root_user
            - name: MINIO_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: minio-secret
                  key: minio_root_password
          ports:
            - containerPort: 9000
              protocol: TCP
            - containerPort: 9090
              protocol: TCP
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: data
              mountPath: /data
              subPath: minio
          terminationMessagePolicy: File
          image: >-
            quay.io/minio/minio:RELEASE.2023-06-19T19-52-50Z
          args:
            - server
            - /data
            - --console-address
            - :9090
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      securityContext: {}
      schedulerName: default-scheduler
  strategy:
    type: Recreate
  revisionHistoryLimit: 10
  progressDeadlineSeconds: 600
---
kind: Service
apiVersion: v1
metadata:
  name: minio-service
spec:
  ipFamilies:
    - IPv4
  ports:
    - name: api
      protocol: TCP
      port: 9000
      targetPort: 9000
    - name: ui
      protocol: TCP
      port: 9090
      targetPort: 9090
  internalTrafficPolicy: Cluster
  type: ClusterIP
  ipFamilyPolicy: SingleStack
  sessionAffinity: None
  selector:
    app: minio
---
kind: Route
apiVersion: route.openshift.io/v1
metadata:
  name: minio-api
spec:
  to:
    kind: Service
    name: minio-service
    weight: 100
  port:
    targetPort: api
  wildcardPolicy: None
  tls:
    termination: edge
    insecureEdgeTerminationPolicy: Redirect
---
kind: Route
apiVersion: route.openshift.io/v1
metadata:
  name: minio-ui
spec:
  to:
    kind: Service
    name: minio-service
    weight: 100
  port:
    targetPort: ui
  wildcardPolicy: None
  tls:
    termination: edge
    insecureEdgeTerminationPolicy: Redirect
  1. 用浏览器打开名为 minio-ui 的 route 地址,然后用 minio/minio123 登录 minio 的控制台。
  2. 创建一个 Bucket,例如 mybucket。
    OpenShift AI - 管理和使用 OpenShift AI 运行环境_第18张图片

在 AI 项目中使用外部对象存储

  1. 在 RHOAI 控制台上进入 Data Science Projects 菜单,然后创建一个名为 large-model 的项目。
  2. 创建名为 large-model 的 Workbench,Notebook image 选择 TensorFlow 类型。
  3. 在 Data connections 区域按下图使用 minio-api 的 route 地址和 mybucket 创建一个新的 Data connection。
    OpenShift AI - 管理和使用 OpenShift AI 运行环境_第19张图片
  4. 在下图的 large-model 项目页面中点击 Workbenches 的 Open 链接,然后登录 Jupyter Notebook。
    OpenShift AI - 管理和使用 OpenShift AI 运行环境_第20张图片
  5. 将 https://github.com/RedHatQuickCourses/rhods-intro.git 导入到 Notebook。
  6. 打开 rhods-intro/notebooks/data-connections/exercise.ipynb 文件,然后运行。
  7. 其中下面这步会将 hello.txt 文件保存到由 Data Connection 配置到的对象存储。
    OpenShift AI - 管理和使用 OpenShift AI 运行环境_第21张图片
  8. 在 MinIO 控制台可查看 mybucket 中已经有 hello.txt 文件了。
    OpenShift AI - 管理和使用 OpenShift AI 运行环境_第22张图片

用户和访问权限

  1. 使用管理员登录 RHOAI 的控制台,然后进入 Settings > User management 页面。在下图中配置可以使用 RHOAI 的一般用户和管理员用户。默认 OpenShift 系统管理员可以管理 RHOAI,而所有登录用户都可访问 RHOAI 控制台。
    OpenShift AI - 管理和使用 OpenShift AI 运行环境_第23张图片
  2. 使用一般用户 user1 和 user2 分别登录 RHOAI 控制台,然后都在 Applications 中创建 Notebook Server。此时在管理员的管理视图中可以在 Applications > Enabled 中的 Administration 页面中看到 user1 和 user2 用户的 notebook 运行环境。
    OpenShift AI - 管理和使用 OpenShift AI 运行环境_第24张图片
  3. 确保先完成上一节 “应用和项目”,然后进入 ds-license-plate 项目的 Permissions,
    OpenShift AI - 管理和使用 OpenShift AI 运行环境_第25张图片
  4. 在 Users 中按下图增加一项,让 user2 可以管理 ds-license-plate 项目。
    OpenShift AI - 管理和使用 OpenShift AI 运行环境_第26张图片
  5. 用 user2 登录 RHOAI,确认该用户可以访问并管理 user1 创建的 ds-license-plate 项目。

参考

https://ai-on-openshift.io/odh-rhods/configuration/
https://github.com/opendatahub-io/notebooks/blob/main/docs/workbenches.md

你可能感兴趣的:(openshift,AI,人工智能,云原生)