新しい IBM Developer JP サイトへようこそ!サイトのデザインが一新され、旧 developerWorks のコンテンツも統合されました。 詳細はこちら

Kubeflow を利用して IBM Cloud Private 内で機械学習モデルをトレーニングし、利用可能にする

このチュートリアルはラーニング・パス「Kubeflow 入門」を構成するコンテンツです。

概要

Kubernetes 対応の機械学習ツールキットとして知られている Kubeflow は、Kubernetes 上の機械学習ワークフローのデプロイメントを単純化して移植可能にし、スケーラブルにすることを目的とするオープンソース・プロジェクトです。IBM Cloud Private は、オンプレミスのコンテナー化されたアプリケーションを開発、管理するためのプラットフォームです。Modified National Institute of Standards and Technology (MNIST) データベースは手書きの数字を格納する大規模なデータベースであり、機械学習のトレーニングとテストによく使われています。

このチュートリアルでは、IBM Cloud Private-CE 内で Kubeflow を使用して、MNIST データベースを対象に GitHub サンプルに基づく機械学習モデルをトレーニングし、利用可能にする方法を説明します。チュートリアルの内容は以下のとおりです。

  • IBM Cloud Private 上で LoadBalancer サービスを有効にする
  • サンプル・アプリケーション用の PV と PVC を作成する
  • ソースをコンパイルする
  • パイプライン・アプリケーションを Kubeflow Dashboard にデプロイしてテストする

前提条件

このチュートリアルに取り組むには、最小要件として 8 基のコア、16 GB の RAM、250 GB のストレージを搭載した Ubuntu 18 マシンが必要です。また、チュートリアルの手順は root 権限で実行する必要があります。Kubeflow は IBM Cloud Private 内にインストールします。Kubeflow をまだインストールしていない場合は、以下のチュートリアルに従ってインストールしてください。

開発環境を構築する必要もあります。

所要時間

このチュートリアルの所要時間は約 30 分です。

IBM Cloud Private 上で LoadBalancer サービスを有効にする

すでに IBM Cloud Private 上で LoadBalancer サービスを有効にしている場合、このステップは不要です。デフォルトでは、IBM Cloud Private に LoadBalancer サービスのサポートは組み込まれていません。IBM Cloud Private 上で LoadBalancer サービスを有効にするために、このチュートリアルでは LoadBalancer サービスの MetalLB 実装 (layer2 モード) を選択して使用します。他の選択肢については、「Working with LoadBalancer services on IBM Cloud Private」を参照してください。

  1. MetalLB をインストールします。

     kubectl create clusterrolebinding privileged-metallb-clusterrolebinding \
     --clusterrole=ibm-privileged-clusterrole \
     --group=system:serviceaccounts:metallb-system
    
     kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.7.3/manifests/metallb.yaml
    

    イメージに対する権限の問題が発生したら、image-policy.yaml という名前のファイルを作成して以下の内容を含めてください。

     apiVersion: securityenforcement.admission.cloud.ibm.com/v1beta1
     kind: ImagePolicy
     metadata:
       name: image-policy
     spec:
       repositories:
         - name: docker.io/*
           policy: null
         - name: k8s.gcr.io/*
           policy: null
         - name: gcr.io/*
           policy: null
         - name: ibmcom/*
           policy: null
         - name: quay.io/*
           policy: null
    

    次に、以下のコマンドを実行して metallb-system 名前空間に対して image-policy を作成し、MetalLB のインストールを再試行します。

     kubectl create -n metallb-system -f image-policy.yaml
     kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.7.3/manifests/metallb.yaml
    
  2. layer2 を使用して MetalLB を構成します。MetalLB のポッドが稼動中になったことを確認してから続行します。

     kubectl -n metallb-system get pod
     NAME                        READY     STATUS    RESTARTS   AGE
     controller-9c57dbd4-sh2ms   1/1       Running   0          1d
    

    以下のコマンドを実行して MetalLB を構成します (実際の IP アドレス範囲を使用してください)。

     kubectl create -f - << EOF
     apiVersion: v1
     kind: ConfigMap
     metadata:
       namespace: metallb-system
       name: config
     data:
       config: |
         address-pools:
         - name: default
           protocol: layer2
           addresses:
           -  {IP address range}
     EOF
    

サンプル・アプリケーション用の PV と PVC を作成する

GitHub 内に用意されているサンプル・アプリケーション mnist_pipeline.py は、元々は Google Cloud Platform 内で稼働するように作成されたものですが、オンプレミスで稼働するように変更されています。このアプリケーションをシングル・ノード構成のクラスター内で実行するには、永続ボリューム (PV) と永続ボリューム・クレーム (PVC) を作成する必要があります。

  1. PV を作成します。jane-pv.yaml という名前 (または任意の名前) の YAML ファイルを作成し、以下の内容を含めます。

     apiVersion: v1
     kind: PersistentVolume
     metadata:
       name: jane-pv-volume
       labels:
         type: local
     spec:
       storageClassName: manual
       capacity:
         storage: 10Gi
       accessModes:
         - ReadWriteMany
       hostPath:
         path: "/mnt/data"
    
  2. 以下のコマンドを実行して PV を作成します。

     kubectl apply -f /root/jane/jane-pv.yaml -n kubeflow
    
  3. PVCを作成します。jane-pv-claim.yaml という名前 (または任意の名前) の YAML ファイルを作成し、以下の内容を含めます。

     apiVersion: v1
     kind: PersistentVolumeClaim
     metadata:
       name: jane-pv-claim
     spec:
       storageClassName: manual
       accessModes:
         - ReadWriteMany
       resources:
         requests:
           storage: 3Gi
    
  4. 以下のコマンドを実行して PVC を作成します。

     kubectl apply -f /root/jane/jane-pv-claim.yaml -n kubeflow
    
  5. 以下のコマンドを実行して、作成した PV のステータスを確認します。

     kubectl get pv jane-pv-volume -n kubeflow
    

以下のようにステータスが「Bound」となっていれば問題はありません。

NAME             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM                    STORAGECLASS   REASON    AGE
jane-pv-volume   10Gi       RWX            Retain           Bound     kubeflow/jane-pv-claim   manual                   3d

ソースをコンパイルする

/root/src という名前のディレクトリーを作成して、GitHub からサンプルを複製しておきました。このディレクトリーには任意の名前を使用してかまいません。サンプルをコンパイルするには、その前に、「Kubeflow 開発環境を構築する」の手順に従ってコンパイル環境を構築しておく必要があります。または、Kubeflow サイトで説明している手順に従って開発環境を構築することもできます。

mkdir /root/src
cd /root/src
git clone https://github.com/kubeflow/examples.git
cd /root/src/examples/pipelines/mnist-pipelines
conda activate mlpipeline
pip install -r requirements.txt –upgrade
sed -i.sedbak s"/platform = 'GCP'/platform = 'onprem'/"  mnist_pipeline.py
python3 mnist_pipeline.py

コンパイルが完了した時点で、/root/src/examples/pipelines/mnist-pipelines ディレクトリー内に mnist_pipeline.py.tar.gz という名前のファイルが作成されています。

パイプライン・アプリケーションを Kubeflow Dashboard にアップロードしてデプロイする

Kubeflow 開発環境を構築する」の手順に従って、アプリケーション (mnist_pipeline.py.tar.gz) をアップロードし、エクスペリメントを作成して実行します。以下の実行パラメーターを入力してください (この他のパラメーターにはデフォルトを使用します)。

  • 「model-export-dir」: /mnt/export
  • 「pvc-name」: jane-pv-claim

実行パラメーターを示す画面のスクリーンショット

正常に実行が完了すると、以下のように表示されます。

Run3 のグラフを示す画面のスクリーンショット

GitHub 内にあるソース・ファイル mnist_pipeline.py では、同じアプリケーションが 3 つのコンテナーを起動して、モデルのトレーニング、モデルの運用、Web UI の起動とモデルのテストのそれぞれを行います。サンプル・アプリケーションの詳細については。mnist-pipelines の GitHub サイトを参照してください。

パイプラインが正常に実行された後、以下のコマンドを実行すると、Web UI の URL を確認できます。

kubectl get svc web-ui -n kubeflow
NAME      TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
web-ui    LoadBalancer   10.0.0.50    x.xx.xxx.xx   80:30096/TCP   23h

Web UI は http://x.xx.xxx.xx:30096/ にあります。

Run3 のグラフを示す画面のスクリーンショット

次は、さまざまな入力 (手書きの数字) を使用してモデルの実験とテストを行ってください。

まとめ

このチュートリアルでは、IBM Cloud Private 内で Kubeflow を使用して、MNIST データベースを対象に GitHub サンプルに基づく機械学習モデルをトレーニングし利用可能にする方法を説明しました。このチュートリアルの手順を通して明らかになったように、Kubeflow パイプラインを使用すると、このプロセスが実にシンプルで簡単になります。

このチュートリアルはラーニング・パス「Kubeflow 入門」を構成する最後のコンテンツです。Kubeflow について理解を深め、Kubeflow のインストール方法、開発環境の構築方法、Kubeflow を使用して Db2 for z/OS REST サービスを作成する方法を把握していただけたことを願います。

謝辞

IBM Cloud Private 内で LoadBalancer を使用する際にサポートしてくださった Jin Chi He 氏に深く感謝いたします。