すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:クラウドネイティブAIコンポーネントセットユーザーガイド

最終更新日:Jan 07, 2025

このトピックでは、Fashion-MNISTという名前のオープンソースデータセットを例として使用し、クラウドネイティブAIコンポーネントセットを使用して、Container Service for Kubernetes (ACK) クラスターでディープラーニングジョブを実行し、分散トレーニングのパフォーマンスを最適化し、モデルを調整し、モデルをACKクラスターにデプロイするタスクを完了する方法を説明します。

背景情報

クラウドネイティブAIコンポーネントセットには、Helmチャートを使用して個別にデプロイできるコンポーネントが含まれています。 これらのコンポーネントを使用して、AIプロジェクトを高速化できます。

クラウドネイティブAIコンポーネントセットは、管理者と開発者の2種類のロールに適しています。

  • 管理者は、ダッシュボードを使用して、ユーザーと権限の管理、クラスターリソースの割り当て、外部ストレージの構成、データセットの管理、リソース使用率の監視を行います。

  • 開発者はクラスターリソースを使用してジョブを送信します。 開発者は管理者によって作成され、ArenaやJupyter Notebookなどのツールを使用して開発を実行する前に権限を付与する必要があります。

前提条件

次の操作は管理者によって完了します。

  • ACKクラスターが作成されます。 詳細については、「ACK管理クラスターの作成」をご参照ください。

    • クラスター内の各ノードのディスクサイズは少なくとも300 GBです。

    • 最適なデータアクセラレーションが必要な場合は、それぞれ8つのV100 GPUを提供する4つのECS (Elastic Compute Service) インスタンスを使用します。

    • 最適なトポロジ認識が必要な場合は、それぞれ2つのV100 GPUを提供する2つのECSインスタンスを使用します。

  • クラウドネイティブAIコンポーネントセットに含まれるすべてのコンポーネントがクラスターにインストールされます。 詳細については、「クラウドネイティブAIスイートのデプロイ」をご参照ください。

  • AIダッシュボードはすぐに使用できます。 詳細については、「AIダッシュボードへのアクセス」をご参照ください。

  • AI開発者コンソールは使用可能です。 詳細については、「AI開発者コンソールへのログイン」をご参照ください。

  • Fashion-MNISTデータセットがダウンロードされ、Object Storage Service (OSS) バケットにアップロードされます。 モデルをOSSバケットにアップロードする方法の詳細については、「オブジェクトのアップロード」をご参照ください。

  • テストコードを格納するGitリポジトリのアドレス、ユーザー名、およびパスワードが取得されます。

  • kubectlクライアントがクラスターに接続されています。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。

  • アリーナがインストールされています。 詳細については、「Arenaクライアントの設定」をご参照ください。

テスト環境

この例では、クラウドネイティブのAIコンポーネントセットとオープンソースのFashion-MNISTデータセットを使用して、AIモデルを開発、トレーニング、高速化、管理、評価、およびデプロイします。

次の表に、クラスター内のノードを示します。

ホスト名

IP

ロール

GPUの数

vCPUの数

メモリ

cn-beijing.192.168.0.13

192.168.0.13

ジャンプサーバー

1

8

30580004 KiB

cn-beijing.192.168.0.16

192.168.0.16

ワーカー

1

8

30580004 KiB

cn-beijing.192.168.0.17

192.168.0.17

ワーカー

1

8

30580004 KiB

cn-beijing.192.168.0.240

192.168.0.240

ワーカー

1

8

30580004 KiB

cn-beijing.192.168.0.239

192.168.0.239

ワーカー

1

8

30580004 KiB

実験の目的

このトピックは、次の目的を達成することを目的としています。

  • データセットを管理します。

  • Jupyter Notebookを使用して開発環境を構築します。

  • スタンドアロンのトレーニングジョブを送信します。

  • 分散トレーニングジョブを送信します。

  • Fluidを使用してトレーニング作業を加速します。

  • ACKのAIジョブスケジューラを使用して、トレーニングジョブを高速化します。

  • モデルを管理します。

  • モデルを評価します。

  • 推論サービスを展開します。

ステップ1: ユーザーを作成してリソースを割り当てる

開発者は、管理者から次の情報とリソースを取得する必要があります。

  • ユーザーのユーザー名とパスワード。 ユーザーの作成方法の詳細については、「ユーザーの管理」をご参照ください。

  • リソースの割り当て リソースクォータを割り当てる方法の詳細については、「エラスティッククォータグループの管理」をご参照ください。

  • 開発者がAI開発者コンソールを使用してジョブを送信する場合のAI開発者コンソールのエンドポイント。 AI開発者コンソールへのアクセス方法の詳細については、「AI開発者コンソールへのログイン」をご参照ください。

  • 開発者がArenaを使用してジョブを送信する場合に、クラスターにログインするために使用されるkubeconfigファイル。 クラスターへのログインに使用されるkubeconfigファイルの取得方法の詳細については、「手順2: クラスター資格情報の種類の選択」をご参照ください。

ステップ2: データセットの作成

管理者はデータセットを準備する必要があります。 この例では、Fashion-MNISTデータセットが使用されています。

a: Fashion-MNISTデータセットの追加

  1. 次のYAMLテンプレートを使用して、fashion-mnist.yamlという名前のファイルを作成します。

    この例では、Fashion-MNISTデータセットを格納するOSSバケットをマウントするために、永続ボリューム (PV) と永続ボリューム要求 (PVC) が作成されます。

    apiVersion: v1
    kind: PersistentVolume
    メタデータ:
      名前: fashion-demo-pv
    spec:
      accessModes:
      - ReadWriteMany
      capacity:
        storage: 10Gi
      csi:
        driver: ossplugin.csi.alibabacloud.com
        volumeAttributes:
          bucket: fashion-mnist
          otherOpts: ""
          url: oss-cn-beijing.aliyuncs.com
          akId: "AKID"
          akSecret: "AKSECRET"
        volumeHandle: fashion-demo-pv
      persistentVolumeReclaimPolicy: Retain
      storageClassName: oss
      volumeMode: ファイルシステム
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    メタデータ:
      名前: fashion-demo-pvc
      名前空間: demo-ns
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 10Gi
      セレクタ:
        matchLabels:
          alicloud-pvname: ファッションデモ-pv
      storageClassName: oss
      volumeMode: ファイルシステム
      volumeName: ファッション-デモ-pv 
  2. 次のコマンドを実行して、fashion-mnist.yamlファイルを作成します。

    kubectl create -f fashion-mnist.yaml
  3. 作成したPVとPVCのステータスを確認します。

    • 次のコマンドを実行して、作成されたPVのステータスを確認します。

      kubectl get pv fashion-mnist-jackwg

      期待される出力:

      が容量アクセスモードに名前を付けると、ポリシーステータスはSTORAGECLASSの理由年齢を主張します
      fashion-mnist-jackwg 10Gi RWX Retainバウンドns1/fashion-mnist-jackwg-pvc oss 8h 
    • 次のコマンドを実行して、作成されたPVCのステータスを確認します。

      kubectl get pvc fashion-mnist-jackwg-pvc -n ns1

      期待される出力:

      名ステータスボリューム容量アクセスモードSTORAGECLASS年齢
      ファッション-mnist-jackwg-pvcバウンドファッション-mnist-jackwg 10Gi RWX oss 8h 

    出力は、PVとPVCの両方がBound状態にあることを示しています。

b: データセットの高速化

管理者はAIダッシュボードを使用してデータセットを高速化する必要があります。

  1. 管理者としてAccess AI Dashboardします。
  2. AIダッシュボードの左側のナビゲーションウィンドウで、[データセット] > [データセットリスト] を選択します。
  3. [データセットリスト] ページでデータセットを見つけ、[演算子] 列の [高速化] をクリックします。

    次の図は、高速化されたデータセットを示しています。Accelerate the dataset

ステップ3: モデルを開発する

このセクションでは、Jupyter Notebookを使用して開発環境を構築する方法について説明します。 手順:

  1. オプションです。 カスタムイメージを使用してJupyterノートブックを作成します。

  2. Jupyterノートブックを使用して、モデルを開発およびテストします。

  3. Gitリポジトリにコードを送信するには、Jupyterノートブックを使用します。

  4. Arena SDKを使用して、トレーニングジョブを送信します。

a (オプション): カスタムイメージを使用してJupyterノートブックを作成

AI開発者コンソールには、Jupyterノートブックを作成するためのTensorFlowとPyTorchをサポートするさまざまなバージョンの画像が用意されています。 カスタムイメージを使用してJupyterノートブックを作成することもできます。

  1. 次のDockerfileテンプレートを使用して、Dockerfileという名前のファイルを作成します。

    カスタムイメージの制限の詳細については、「ノートブックの作成と使用」をご参照ください。

    cat<<EOF >dockerfile
    tensorflow/tensorflowから: 1.15.5-gpu
    ユーザールート
    RUN pipインストールjupyter && \
        pipインストールipywidgets && \
        jupyter nbextension enable -- py widgetsnbextension && \
        pip install jupyterlab && jupyter serverextension enable -- py jupyterlab
    輸出8888
    # USER jovyan
    CMD ["sh" 、"-c" 、"jupyter-lab-notebook-dir=/home/jovyan-ip=0.0.0.0-ブラウザなし-許可-ルート-ポート=8888-NotebookApp.token=''-NotebookApp.password=''-NotebookApp.allow_origin='*' * '-NotebookApp.base_url=$
    EOF 
  2. 次のコマンドを実行して、Dockerfileからイメージをビルドします。

    docker build -f dockerfile。

    期待される出力:

    Dockerデーモンへのビルドコンテキストの送信9.216kB
    ステップ1/5: tensorflow/tensorflowから: 1.15.5-gpu
     ---> 73be11373498
    ステップ2/5 : USER root
     ---> キャッシュの使用
     ---> 7ee21dc7e42e
    ステップ3/5: 実行pip install jupyter && pip install ipywidgets && jupyter nbextension enable -- py widgetsnbextension && pip install jupyterlab && jupyter serverextension enable -- py jupyterlab
     ---> キャッシュの使用
     ---> 23bc51c5e16d
    ステップ4/5 : EXPOSE 8888
     ---> キャッシュの使用
     ---> 76a55822ddae
    ステップ5/5 : CMD ["sh", "-c", "jupyter-lab-notebook-dir=/home/jovyan-ip=0.0.0-no-browser-allow-root-port=8888-NotebookApp.token=''-NotebookApp.password=''-NotebookApp.allow_origin='*'-Notebook_met_arate_arity=${Falmet_App} ']
     ---> キャッシュの使用
     ---> 3692f04626d5
    正常に構築された3692f04626d 5 
  3. 次のコマンドを実行して、イメージをDockerイメージリポジトリにプッシュします。

    dockerタグ ${IMAGE_ID} registry-vpc.cn-beijing.aliyuncs.com/${DOCKER_REPO}/jupyter:fashion-mnist-20210802a
    docker pus h registry-vpc.cn-beijing.aliyuncs.com/${DOCKER_REPO}/jupyter: ファッションmnist-20210802a 
  4. Dockerイメージリポジトリからイメージをプルするために使用されるシークレットを作成します。

    詳細については、「既存のDocker資格情報に基づくシークレットの作成」をご参照ください。

    kubectl create secret docker-registry regcred \
      -- docker-server=<レジストリサーバー> \
      -- docker-username=<ユーザー名> \
      -- docker-password=<パスワード> \
      -- docker-email=<あなたのメールアドレス> 
  5. AI開発者コンソールでJupyterノートブックを作成します。

    詳細については、「ノートブックの作成と使用」をご参照ください。

    次の図は、Jupyterノートブックを作成するためのパラメーターを示しています。Create a Jupyter notebook

b: Jupyterノートブックを使用してモデルを開発およびテスト

  1. AI開発者コンソール
    へのログイン
  2. AI開発者コンソールの左側のナビゲーションウィンドウで、[ノートブック] をクリックします。
  3. [ノートブック] ページで、[実行中] 状態のJupyterノートブックをクリックします。

  4. CLIランチャーを作成し、データセットがマウントされていることを確認します。

    pwd
    /ルート /データ
    ls -alh 

    期待される出力:

    合計30M
    drwx ----- 1ルートルート0 1月1日1970。
    drwx ------ 1ルートルート4.0K 8月2 04:15 ..
    drwxr-xr-x 1ルートルート0 8月1 14:16 saved_model
    -rw-r ----- 1ルートルート4.3M Aug 1 01:53 t10k-images-idx3-ubyte.gz
    -rw-r ----- 1ルートルート5.1K 8月1 01:53 t10k-labels-idx1-ubyte.gz
    -rw-r ----- 1ルートルート26M 8月1 01:54 train-images-idx3-ubyte.gz
    -rw-r ----- 1ルート29K 8月1 01:53 train-labels-idx1-ubyte.gz 
  5. Fashion-MNISTデータセットに基づいてモデルをトレーニングするために使用するJupyterノートブックを作成します。 次のコードブロックは、ノートブックの初期化に使用されます。

    #!/usr/bin/python
    # -*-コーディング: UTF-8 -*-
    
    osのインポート
    gzipのインポート
    numpyをnpとしてインポートする
    tensorflowをtfとしてインポートする
    tensorflow import kerasから
    印刷 ('TensorFlowバージョン: {}'.format(tf.__version__))
    dataset_path = "/root/data/"
    model_path = "./model/"
    model_version = "v1"
    
    def load_data():
        files = [
            'train-labels-idx1-ubyte.gz '、
            'train-images-idx3-ubyte.gz '、
            't10k-labels-idx1-ubyte.gz '、
            't10k-images-idx3-ubyte.gz'
        ]
        パス= []
        ファイル内のfnameの場合:
            paths.append(os.path.join(dataset_path, fname))
        gzip.open (パス [0], 'rb') をlabelpathとして使用する:
            y_train = np.frombuffer(labelpath.read(), np.uint8, offset=8)
        gzip.open (パス [1] 、'rb') をimgpathとして使用します。
            x_train = np.frombuffer(imgpath.read(), np.uint8, offset=16).reshape(len(y_train), 28,28)
        gzip.open (パス [2] 、'rb') をlabelpathとして使用する:
            y_test = np.frombuffer(labelpath.read(), np.uint8, offset=8)
        gzip.open (パス [3], 'rb') をimgpathとして:
            x_test = np.frombuffer(imgpath.read(), np.uint8, offset=16).reshape(len(y_test), 28,28)
        return (x_train, y_train),(x_test, y_test)
    
    def train():
        (train_images, train_labels), (test_images, test_labels) = load_data()
    
        # 値を0.0から1.0にスケーリングします
        train_images = train_images / 255.0
        test_images = test_images / 255.0
    
        # モデルに供給するための形状変更
        train_images = train_images.reshape(train_images.shape[0], 28,28, 1)
        test_images = test_images.reshape(test_images.shape[0], 28,28, 1)
    
        class_names = ['Tシャツ /トップ' 、'ズボン' 、'プルバー' 、'ドレス' 、'コート' 、
                    「サンダル」、「シャツ」、「スニーカー」、「バッグ」、「アンクルブーツ」]
    
        print('\ntrain_images.shape: {}, of {}'.format(train_images.shape, train_images.dtype))
        プリント ('test_images.shape: {}, of {}'.format(test_images.shape, test_images.dtype))
    
        model = keras.Sequential([
        keras.layers.Conv2D(input_shape=(28,28、1) 、filters=8、kernel_size=3、
                            strides=2、activation='relu' 、name='Conv1') 、
        keras.layers.Flatten() 、
        keras.layers.Dense (10, activation=tf.nn.softmax, name='Softmax')
        ])
        model.summary()
        testing = False
        エポック=5
        model.comパイル (optimizer='adam' 、
                    loss='sparse_categorical_crossentropy '、
                    metrics=['accuracy'])
        logdir = "/training_logs"
        tensorboard_callback = keras.ca llbacks.TensorBoard(log_dir=logdir)
        model.fit(train_images、
            train_labels,
            epochs=epochs、
            callbacks=[tensorboard_callback] 、
        )
        test_loss, test_acc = model.evaluate(test_images, test_labels)
        プリント ('\nテスト精度: {}'.format(test_acc))
        export_path = os.path.join(model_path, model_version)
        print('export_path = {}\ n'.format(export_path))
        tf.keras.mo dels.save_model (
            モデル、
            export_path,
            overwrite=True、
            include_optimizer=True、
            save_format=なし、
            signatures=なし、
            options=なし
        )
        print('\nSaved model success')
    if __name__ ='__main__':
        train() 
    重要

    dataset_pathとmodel_pathをデータセットとモデルのパスに置き換えます。 これにより、ノートブックはクラスターにマウントされているデータセットにアクセスできます。

  6. ノートブックのExecute iconアイコンをクリックします。

    期待される出力:

    TensorFlowバージョン: 1.15.5
    
    train_images.shape :( 60000、28、28、1) 、float64の
    test_images.shape :( 10000, 28, 28, 1) 、of float64
    モデル: "sequential_2"
    _________________________________________________________________
    レイヤー (タイプ) 出力形状Param#
    =================================================================
    Conv1 (Conv2D) (なし、13、13、8) 80
    _________________________________________________________________
    flatten_2 (フラット) (なし、1352) 0
    _________________________________________________________________
    Softmax (密) (なし、10) 13530
    =================================================================
    総パラメーター: 13,610
    訓練可能なパラメータ: 13,610
    トレーニング不可能なパラメータ: 0
    _________________________________________________________________
    60000サンプルのトレーニング
    エポック1/5
    60000/60000 [==============================] - 3s 57us/sample - loss: 0.5452 - acc: 0.8102
    エポック2/5
    60000/60000 [==============================] - 3s 52us/sample - loss: 0.4103 - acc: 0.8555
    エポック3/5
    60000/60000 [==============================] - 3s 55us/sample - loss: 0.3750 - acc: 0.8681
    エポック4/5
    60000/60000 [==============================] - 3s 55us/sample - loss: 0.3524 - acc: 0.8757
    エポック5/5
    60000/60000 [==============================] - 3s 53us/sample - loss: 0.3368 - acc: 0.8798
    10000/10000 [==============================] - 0s 37us/sample - loss: 0.3770 - acc: 0.8673
    
    テスト精度: 0.8672999739646912
    export_path= /モデル /v1
    保存されたモデルの成功 

c: Jupyterノートブックを使用してGitリポジトリにコードを送信

ノートブックを作成したら、そのノートブックを使用してGitリポジトリにコードを送信できます。

  1. 次のコマンドを実行してGitをインストールします。

    apt-getアップデート
    apt-getインストールgit 
  2. 次のコマンドを実行してGitを初期化し、ユーザー名とパスワードをノートブックに保存します。

    git config -- global credential.helper store
    git pull ${YOUR_GIT_REPO} 
  3. 次のコマンドを実行して、Gitリポジトリにコードをプッシュします。

    gitプッシュ起源ファッションテスト

    期待される出力:

    合計0 (デルタ0) 、再利用0 (デルタ0)
    T o codeup.aliyun.com:60 b4cf5c66bba1c04b442e49/tensorflow-fashion-mnist-sample.git
     * [new branch] fashion-test -> fashion-test 

d: Arena SDKを使用してトレーニングジョブを送信

  1. Arena SDKの依存関係をインストールします。

    ! pipインストールcoloredlogs
  2. 次のコードを使用して、初期化用のPythonファイルを作成します。

    osのインポート
    インポートsys
    インポート時間
    arenasdk.client.client importからArenaClient
    arenasdk.enums.types import * から
    arenasdk.exceptions.arena_exception import * から
    arenasdk.training.tensorflow_job_builder import * から
    arenasdk.logger.loggerからLoggerBuilderをインポート
    
    def main():
        印刷 (「アリーナのテスト開始-python-sdk」)
        client = ArenaClient("","demo-ns","info","arena-system") # トレーニングジョブはdemo-ns名前空間に送信されます。 
        print("create ArenaClient success.")
        印刷 (「tfjobの作成を開始」)
        job_name = "arena-sdk-distributed-test"
        job_type = TrainingJobType.TFTrainingJob
        試してみてください。
            # トレーニングジョブを構築する
            job = TensorflowJobBuilder().with_name(job_name)\
                . witch_workers(1)\
                . with_gpus(1)\
                . witch_worker_image("tensorflow/tensorflow:1.5.0-devel-gpu")\
                . witch_ps_image("tensorflow/tensorflow:1.5.0-devel")\
                . witch_ps_count(1)\
                . with_datas({"fashion-demo-pvc":"/data"})\
                . enable_tensorboard()\
                . with_sync_mode("git")\
                . with_sync_source(" https://codeup.aliyun.com/60b4cf5c66bba1c04b442e49/tensorflow-fashion-mnist-sample.git ")\ # Gitリポジトリのアドレス。 
                . with_envs({\
                    "GIT_SYNC_USERNAME":"USERNAME", \ # Gitリポジトリのユーザー名。 
                    "GIT_SYNC_PASSWORD":"PASSWORD",\ # Gitリポジトリのパスワード。 
                    "TEST_TMPDIR":"/",\
                })\
                . with_command("python code/tensorflow-fashion-mnist-sample/tf-distributed-mnist.py").build()
            # トレーニングジョブが存在しない場合は作成します
            client.training().get(job_name, job_type):
                print (「ジョブ {} が作成されました。削除する」. format(job_name))
                client.training().delete(job_name, job_type)
                time.sleep (3)
    
            output = client.training().submit(job)
            プリント (出力)
    
            count = 0
            # 実行中のトレーニングジョブを待っています
            while True:
                カウント> 160の場合:
                    例外発生 (「実行中の待機ジョブのタイムアウト」)
                jobInfo = client.training().get(job_name,job_type)
                if jobInfo.get_status() == TrainingJobStatus.TrainingJobPending:
                    印刷 (「ジョブのステータスは保留中、待機中... 」)
                    カウント=カウント + 1
                    time.sleep(5)
                    continue
                print (「現在のステータスはジョブ {} の {} です」. format(jobInfo.get_status().value,job_name))
                break
            # トレーニングのジョブログを取得する
            logger = LoggerBuilder().with_accepter(sys.stdout).with_follow().with_since("5m")
            # jobInfo.get_instances()[0].get_logs(logger)
            # トレーニングジョブ情報を表示する
            print(str(jobInfo))
            # トレーニングジョブを削除する
            # client.training().delete(job_name, job_type)
        eとしてArenaExceptionを除いて:
            プリント (e)
    
    main() 
    • namespace: この例では、トレーニングジョブはdemo-ns名前空間に送信されます。

    • with_sync_source: Gitリポジトリのアドレス。

    • with_envs: Gitリポジトリのユーザー名とパスワード。

  3. ノートブックのExecute iconアイコンをクリックします。

    期待される出力:

    2021-11-02/08:57:28 DEBUG util.py[line:19] - executeコマンド: [arena get-namespace=demo-ns-arena-namespace=arena-system-loglevel=info arena-sdk-distributed-test-type=tfjob -o json]
    2021-11-02/08:57:28 DEBUG util.py[line:19] - executeコマンド: [arena submit-namespace=demo-ns-arena-namespace=arena-system-loglevel=info tfjob-name=arena-sdk-distributed-test-workers=1-gpus-worker-image=tensorflow/tensorflow:1.5.0-devel-gpu-ps-image=tensorflow/tensorflow:1.5.0-devel-ps=1-data=fashion-demo-pvc:/data-tensorboard-sync-mode=git-sync-source=https://codeup.aliyun.com/60b4cf5c66bba1c04b442e49/tensorflow-fashion-mnist-sample.git -env=GIT_SYNC_USERNAME=kubeai /@ sample-IR tf-distributed-mnist.py //TEm_sample-pyth123
    アリーナのテストを開始する-python-sdk
    作成ArenaClient success.
    tfjobの作成を開始する
    2021-11-02/08:57:29 DEBUG util.py[line:19] - executeコマンド: [arena get-namespace=demo-ns-arena-namespace=arena-system-loglevel=info arena-sdk-distributed-test-type=tfjob -o json]
    service/arena-sdk-distributed-test-tensorboard created
    deployment.apps/arena-sdk-distributed-test-tensorboard created
    作成されたtfjob.kubeflow.org/arena-sdk-distributed-test
    
    ジョブのステータスは保留中、待機中です...
    2021-11-02/09:00:34 DEBUG util.py[line:19] - executeコマンド: [arena get-namespace=demo-ns-arena-namespace=arena-system-loglevel=info arena-sdk-distributed-test-type=tfjob -o json]
    現在の状況はRUNNING of job arena-sdk-distributed-testです。{
        "allocated_gpus": 1,
        "chief_name": "arena-sdk-distributed-test-worker-0" 、
        "duration": "185s" 、
        "instances": [
            {
                "age": "13s" 、
                "gpu_metrics": [],
                "is_chief": false、
                "name": "arena-sdk-distributed-test-ps-0" 、
                "node_ip": "192.168.5.8" 、
                "node_name": "cn-beijing.192.168.5.8" 、
                "owner": "arena-sdk-distributed-test" 、
                "owner_type": "tfjob" 、
                "request_gpus": 0,
                "status": "Running"
            },
            {
                "age": "13s" 、
                "gpu_metrics": [],
                "is_chief": true、
                "name": "arena-sdk-distributed-test-worker-0" 、
                "node_ip": "192.168.5.8" 、
                "node_name": "cn-beijing.192.168.5.8" 、
                "owner": "arena-sdk-distributed-test" 、
                "owner_type": "tfjob" 、
                "request_gpus": 1,
                "status": "Running"
            }
        ],
        "name": "arena-sdk-distributed-test" 、
        "namespace": "demo-ns" 、
        "priority": "N/A" 、
        "request_gpus": 1,
        "tensorboard": "http:// 192.168.5.6:31068" 、
        "type": "tfjob"
    } 

ステップ4: モデルのトレーニング

次の例を参照して、スタンドアロンのTensorFlowトレーニングジョブ、分散TensorFlowトレーニングジョブ、流体加速トレーニングジョブ、およびACKのAIジョブスケジューラによって加速された分散トレーニングジョブを送信します。

例1: スタンドアロンTensorFlowトレーニングジョブの送信

ノートブックを使用してモデルを開発し、モデルを保存した後、ArenaまたはAI開発者コンソールを使用してトレーニングジョブを送信できます。

方法1: Arenaを使用してスタンドアロンのTensorFlowトレーニングジョブを送信する

アリーナ \
  送信 \
  tfjob \
  -n ns1 \
  -- name=fashion-mnist-arena \
  -- data=fashion-mnist-jackwg-pvc:/root/data/ \
  -- env=DATASET_PATH=/root/data/ \
  -- env=MODEL_PATH=/root/saved_model \
  -- env=MODEL_VERSION=1 \
  -- env=GIT_SYNC_USERNAME=<GIT_USERNAME> \
  -- env=GIT_SYNC_PASSWORD=<GIT_PASSWORD> \
  -- sync-mode=git \
  -- sync-source=https://codeup.aliyun.com/60b4cf5c66bba1c04b442e49/tensorflow-fashion-mnist-sample.git \
  -- image="tensorflow/tensorflow:2.2.2-gpu" \
  "python /root/code/tensorflow-fashion-mnist-sample/train.py -- log_dir=/training_logs" 

方法2: AI Developer Consoleを使用してスタンドアロンのTensorFlowトレーニングジョブを送信する

  1. データソースを設定します。 詳細については、「データセットの設定」をご参照ください。

    Configure a dataset

    下表に一部のパラメーターを示します。

    パラメーター

    必須

    名前

    ファッション-デモ

    必須

    名前空間

    デモ-ns

    必須

    PersistentVolumeClaim

    fashion-demo-pvc

    必須

    ローカルディレクトリ

    /ルート /データ

    任意

  2. ソースコードを設定します。 詳細については、「ソースコードリポジトリの設定」をご参照ください。

    Configure the source code

    パラメーター

    必須

    名前

    ファッションgit

    必須

    Gitリポジトリ

    https://codeup.aliyun.com/60b4cf5c66bba1c04b442e49/tensorflow-fashion-mnist-sample.git

    必須

    デフォルトブランチ

    master

    任意

    ローカルディレクトリ

    /root/

    任意

    Gitユーザー

    プライベートGitリポジトリのユーザー名。

    任意

    Git secret

    プライベートGitリポジトリのパスワード。

    任意

  3. スタンドアロンのTensorFlowトレーニングジョブを送信します。 詳細については、「TensorFlowトレーニングジョブの送信」をご参照ください。

    ジョブパラメーターを設定したら、[送信] をクリックします。 トレーニングジョブがジョブリストに表示されます。 ジョブのパラメーターについて次の図に示します。Submit a standalone training job

    パラメーター

    説明

    ジョブ名

    この例では、fashion-tf-uiが使用されます。

    ジョブタイプ

    この例では、TFスタンドアロンが選択されています。

    名前空間

    この例では、demo-nsが選択されています。 データセットが属する名前空間を選択する必要があります。

    データ設定

    この例では、fashion-demoが選択されています。 手順1で設定したデータソースを選択する必要があります。

    コード設定

    この例では、fashion-gitが選択されています。 手順2で設定したソースコードを選択する必要があります。

    コードブランチ

    この例では、masterが指定されています。

    実行コマンド

    この例では、次のコマンドが指定されています。"export DATASET_PATH=/root/data/ &export MODEL_PATH=/root/saved_model &&export MODEL_VERSION=1 &&python /root/code/tensorflow-fashion-mnist-sample/train"

    Private Git

    プライベートGitリポジトリを使用するには、まずプライベートGitリポジトリのユーザー名とパスワードを指定する必要があります。

    インスタンス数

    デフォルト値は 1 です。

    [イメージ]

    この例では、tensorflow/tensorflow:2.2.2-gpuが指定されています。

    画像プルの秘密

    プライベートイメージリポジトリからイメージを取得するには、まずシークレットを作成する必要があります。

    CPU (コア)

    デフォルト値: 4。

    メモリ (GB)

    デフォルト値: 8。

    Arenaコマンドの詳細については、「Arenaを使用してTensorFlowトレーニングジョブを送信する」をご参照ください。

  4. ジョブを送信した後、ジョブログを確認します。

    1. AI開発者コンソールの左側のナビゲーションウィンドウで、[ジョブリスト] をクリックします。

    2. [ジョブリスト] ページで、送信したジョブの名前をクリックします。

    3. 詳細ページで、[インスタンス] タブをクリックします。 表示するインスタンスを見つけて、[操作] 列の [ログ] をクリックします。

      例:

      train_images.shape :( 60000、28、28、1) 、float64の
      test_images.shape :( 10000, 28, 28, 1) 、of float64
      モデル: "sequential"
      _________________________________________________________________
      レイヤー (タイプ) 出力形状Param#
      =================================================================
      Conv1 (Conv2D) (なし、13、13、8) 80
      _________________________________________________________________
      flatten (フラット) (なし、1352) 0
      _________________________________________________________________
      Softmax (密) (なし、10) 13530
      =================================================================
      総パラメーター: 13,610
      訓練可能なパラメータ: 13,610
      トレーニング不可能なパラメータ: 0
      _________________________________________________________________
      エポック1/5
      2021-08-01 14:21:17.532237: E tensorflow/core/profiler/internal/gpu/cupti_tracer.cc:1430] 関数cupti_interface_->EnableCallback( 0、subscriber_、CUPTI_CB_DOMAIN_DRIVER_API、cbid) エラーCUPTI_ERRO_INVALID_PARAMETER
      2021-08-01 14:21:17.532390: tensorflow/core/profiler/internal/gpu/device_tracer.cc:216] GpuTracerは0個のコールバックapiイベントと0個のアクティビティイベントを収集しました。
      2021-08-01 14:21:17.533535: 私はtensorflow/core/profiler/rpc/client/save_profile.cc:168を作成するディレクトリ: /training_logs/train/plugins/profile/2021_08_01_14_21_17
      2021-08-01 14:21:17.533928: tensorflow/core/profiler/rpc/client/save_profile.cc:174] trace.json.gzのgzipツールデータを /training_logs/train/plugins/profile/2021_08_01_14_21_17/fashion-mnist-arena-chief-0.trace.json.gzにダンプ
      2021-08-01 14:21:17.534251: tensorflow/core/profiler/utils/event_span.cc:288] ステップイベントの生成には0ミリ秒かかりました
      
      2021-08-01 14:21:17.534961: 私はtensorflow/python/profiler/internal/profiler_wrapper.cc:87] ディレクトリを作成する: /training_logs/train/plugins/profile /2021_08_08_17_2021_21_17にツールデータをダンプしました。input_pipeline.pbのツールデータを /training_logs/train/plugins/profile/2021_08_01_14_21_17/fashion-mnist-arena-chief-0.input_pipeline.pbにダンプ
      tensorflow_stats.pbのツールデータを /training_logs/train/plugins/profile/2021_08_01_14_21_17/fashion-mnist-arena-chief-0.tensorflow_stats.pbにダンプ
      kernel_stats.pbのツールデータを /training_logs/train/plugins/profile/2021_08_01_14_21_17/fashion-mnist-arena-chief-0.kernel_stats.pbにダンプ
      
      1875/1875 [==============================] - 3s 2ms /ステップロス: 0.5399精度: 0.8116
      エポック2/5
      1875/1875 [==============================] - 3s 2ms /ステップロス: 0.4076精度: 0.8573
      エポック3/5
      1875/1875 [==============================] - 3s 2ms /ステップロス: 0.3727精度: 0.8694
      エポック4/5
      1875/1875 [==============================] - 3s 2ms /ステップロス: 0.3512精度: 0.8769
      エポック5/5
      1875/1875 [==============================] - 3s 2ms /ステップロス: 0.3351精度: 0.8816
      313/313 [==============================] - 0s 1ms /ステップロス: 0.3595精度: 0.8733
      2021-08-01 14:21:34.820089: W tensorflow/python/util/util.cc:329] セットは現在シーケンスとは見なされていませんが、今後変更される可能性があるため、使用を避けることを検討してください。
      警告: tensorflow: /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/resource_variable_ops.pyから: 1817: BaseResourceVariable.__init__ (tensorflow.python.ops.resource_variable_opsから) を呼び出します。
      更新のための指示:
      Kerasを使用する場合は、*_constraint引数をレイヤーに渡します。
      
      テスト精度: 0.8733000159263611
      export_path = /root/saved_model/1
      
      
      保存されたモデルの成功 
  5. TensorBoardでデータを表示します。

    kubectl port-forwardコマンドを使用して、ローカルポートをTensorBoardサービスにマップできます。 MaxComputeとVPC間の接続を確立するには、次の操作を実行します。

    1. 次のコマンドを実行して、TensorBoardサービスのIPアドレスを照会します。

      kubectl get svc -n demo-ns

      期待される出力:

      名タイプCLUSTER-IP EXTERNAL-IPポート年齢
      tf-dist-arena-tensorboard NodePort 172.16.XX.XX <none> 6006:32226/TCP 80m 
    2. 次のコマンドを実行して、ローカルポートをTensorBoardサービスにマップします。

      kubectl port-forward svc/tf-dist-arena-tensorboard -n demo-ns 6006:6006

      期待される出力:

      転送から127.0.0.1:6006 -> 6006
      [::1]:6006 -> 6006からの転送
      6006の接続の取り扱い
      接続の取り扱い6006 
    3. ブラウザのアドレスバーにhttp:// localhost:6006/ と入力して、TensorBoardのデータを表示します。

      Tensorboard

例2: 分散TensorFlowトレーニングジョブの送信

方法1: Arenaを使用して分散TensorFlowトレーニングジョブを送信する

  1. 次のコマンドを実行して、Arenaを使用して分散TensorFlowトレーニングジョブを送信します。

    アリーナはtf \を提出します
        -nデモ-ns \
        -- name=tf-dist-arena \
        -- working-dir=/root/ \
        -- data fashion-mnist-pvc:/data \
        -- env=TEST_TMPDIR=/ \
        -- env=GIT_SYNC_USERNAME=kubeai \
        -- env=GIT_SYNC_PASSWORD=kubeai @ ACK123 \
        -- env=GIT_SYNC_BRANCH=master \
        -- gpus=1 \
        -- workers=2 \
        -- worker-image=tensorflow/tensorflow:1.5.0-devel-gpu \
        -- sync-mode=git \
        -- sync-source=https://codeup.aliyun.com/60b4cf5c66bba1c04b442e49/tensorflow-fashion-mnist-sample.git \
        -- ps=1 \
        -- ps-image=tensorflow/tensorflow:1.5.0-devel \
        -- tensorboard \
        "python code/tensorflow-fashion-mnist-sample/tf-distributed-mnist.py -- log_dir=/training_logs" 
  2. 次のコマンドを実行して、TensorBoardサービスのIPアドレスを照会します。

    kubectl get svc -n demo-ns

    期待される出力:

    名タイプCLUSTER-IP EXTERNAL-IPポート年齢
    tf-dist-arena-tensorboard NodePort 172.16.204.248 <none> 6006:32226/TCP 80m 
  3. 次のコマンドを実行して、ローカルポートをTensorBoardサービスにマップします。

    TensorBoardを表示するには、kubectl port-forwardコマンドを使用してローカルポートをTensorBoardサービスにマップします。

    kubectl port-forward svc/tf-dist-arena-tensorboard -n demo-ns 6006:6006

    期待される出力:

    転送から127.0.0.1:6006 -> 6006
    [::1]:6006 -> 6006からの転送
    6006の接続の取り扱い
    接続の取り扱い6006 
  4. ブラウザのアドレスバーにhttp:// localhost:6006/ と入力して、TensorBoardのデータを表示します。

    View data on TensorBoard

方法2: AI開発者コンソールを使用して分散TensorFlowトレーニングジョブを送信する

  1. データソースを設定します。 詳細については、「データセットの設定」をご参照ください。

    この例では、データソースの設定は1で使用されている設定と同じです。

  2. ソースコードを設定します。 詳細については、「ソースコードリポジトリの設定」をご参照ください。

    この例では、ソースコードの構成は2で使用されるものと同じです。

  3. 分散Tensorflowトレーニングジョブを送信します。 詳細については、「TensorFlowトレーニングジョブの送信」をご参照ください。

    ジョブパラメーターを設定したら、[送信] をクリックします。 トレーニングジョブがジョブリストに表示されます。 ジョブのパラメーターについて次の図に示します。Submit a distributed TensorFlow training job

    パラメーター

    説明

    ジョブ名

    この例では、fashion-ps-uiが使用されます。

    ジョブタイプ

    この例では、TF Distributedが選択されています。

    名前空間

    この例では、demo-nsが選択されています。 データセットが属する名前空間を選択する必要があります。

    データ設定

    この例では、fashion-demoが選択されています。 手順1で設定したデータソースを選択する必要があります。

    コード設定

    この例では、fashion-gitが選択されています。 手順2で設定したソースコードを選択する必要があります。

    実行コマンド

    この例では、次のコマンドが指定されています。"export TEST_TMPDIR=/root/ &python code/tensorflow-fashion-mnist-sample/tf-distributed-mnist.py -- log_dir=/training_logs"

    [イメージ]

    • [リソース] セクションの [ワーカー] タブで、[イメージ]tensorflow/tensorflow:1.5.0-devel-gpuに設定します。

    • [リソース] セクションの [PS] タブで、[イメージ]tensorflow/tensorflow:1.5.0-develに設定します。

    Arenaコマンドの詳細については、「Arenaを使用してTensorFlowトレーニングジョブを送信する」をご参照ください。

  4. TensorBoardでデータを表示します。 詳細については、「方法1: Arenaを使用して分散TensorFlowトレーニングジョブを送信する」の42をご参照ください。

例3: Fluid-acceleratedトレーニングジョブの送信

この例では、データセットはAIダッシュボードで高速化され、高速化されたデータセットを使用するトレーニングジョブが送信されます。 結果は、トレーニングジョブを完了するのに必要な時間が短縮されることを示しています。 手順:

  1. 管理者はAIダッシュボードでデータセットを高速化します。

  2. 開発者はArenaを使用して、高速化データセットを使用するトレーニングジョブを送信します。

  3. Arenaを使用して、トレーニングジョブを完了するのに必要な時間を照会します。

  1. データセットを高速化します。

    手順2: データセットの作成でfashion-demo-pvcを高速化した場合は、この手順をスキップしてください。 データセットを高速化する方法の詳細については、「OSSに基づく高速化データセットの作成」をご参照ください。

  2. 高速化されたデータセットを使用するトレーニングジョブを送信します。

    開発者は、高速化データセットを使用するトレーニングジョブをdemo-ns名前空間に送信します。 高速化されたデータセットを使用するジョブの構成と、通常のデータセットを使用するジョブの構成は、次のパラメーター設定が異なります。

    • -- data: 高速化されたVPC。この例ではfashion-demo-pvc-accです。

    • -- env=DATASET_PATH: データセットPVCのマウントパス (この例では /root/data/ in -- data) 、およびPVCの名前 (この例ではfashion-demo-pvc-acc) 。

    アリーナ \
      送信 \
      tfjob \
      -nデモ-ns \
      -- name=fashion-mnist-fluid \
      -- data=fashion-demo-pvc-acc:/root/data/ \
      -- env=DATASET_PATH=/root/data/fashion-demo-pvc-acc \
      -- env=MODEL_PATH=/root/saved_model \
      -- env=MODEL_VERSION=1 \
      -- env=GIT_SYNC_USERNAME =${ GIT_USERNAME} \
      -- env=GIT_SYNC_PASSWORD =${ GIT_PASSWORD} \
      -- sync-mode=git \
      -- sync-source=https://codeup.aliyun.com/60b4cf5c66bba1c04b442e49/tensorflow-fashion-mnist-sample.git \
      -- image="tensorflow/tensorflow:2.2.2-gpu" \
      "python /root/code/tensorflow-fashion-mnist-sample/train.py -- log_dir=/training_logs" 
  3. 次のコマンドを実行して、2つのトレーニングジョブを完了するのに必要な時間を比較します。

    アリーナリスト-nデモ-ns

    期待される出力:

    NAME STATUS TRAINER DURATION GPU (要求された) GPU (割り当てられた) ノード
    ファッション-mnist-fluid成功したTFJOB 33s 0 N/A 192.168.5.7
    ファッション-ミニスト-アリーナ成功したTFJOB 3m 0 N/A 192.168.5.8 

    arena listコマンドの出力は、Fluid-acceleratedトレーニングジョブを完了するのに33秒かかるのに対し、通常のデータセットを使用するトレーニングジョブを完了するには3分かかることを示しています。 両方のジョブは同じコードで同じノードで実行されます。

例4: ACKのAIジョブスケジューラを使用して分散トレーニングジョブを高速化

ACKは、AIおよびビッグデータコンピューティング向けに最適化されたAIジョブスケジューラを提供します。 AIジョブスケジューラは、ギャングスケジューリング、容量スケジューリング、およびトポロジ認識スケジューリングをサポートします。 この例では、トポロジ認識GPUスケジューリングが有効になっているトレーニングジョブが使用されます。

AIワークロードの高性能を確保するために、AIジョブスケジューラは、ノード上の異種リソースに関するトポロジ情報に基づいて最適なスケジューリングソリューションを選択します。 情報には、NVLinkとPCIeスイッチを使用してGPUが相互に通信する方法、およびCPUの非均一メモリアクセス (NUMA) トポロジが含まれます。 トポロジ対応GPUスケジューリングの詳細については、「トポロジ対応GPUスケジューリングの概要」をご参照ください。 トポロジ対応CPUスケジューリングの詳細については、「トポロジ対応CPUスケジューリング」をご参照ください。

次の手順を実行して、トポロジ認識GPUスケジューリングが有効になっているトレーニングジョブと、トポロジ認識GPUスケジューリングが無効になっているトレーニングジョブを送信します。 次に、ジョブを完了するのに必要な時間を比較します。

  1. 次のコマンドを実行して、トポロジ認識GPUスケジューリングが無効になっているトレーニングジョブを送信します。

    アリーナ送信mpi \
      -- name=tensorflow-4-vgg16 \
      -- gpus=1 \
      -- workers=4 \
      -- imag e=registry.cn-hangzhou.aliyuncs.com/kubernetes-image-hub/tensorflow-benchmark:tf2.3.0-py3.7-cuda10.1 \
      "mpirun -- allow-run-as-root-npy" 4 " -bind-to none -map-by slot -x NCCL_benchseg16 DEBUG=INFO -x NCCL_SOCKET_if_IFNAME=eth0 -x LD_LIBRARY_PATH-m-- mca pta_neb_eptemarks /mot_ethnモデル1-mca-mot_nad_m_n// mobdname 64 -- variable_update=horovod" 
  2. トポロジ対応のGPUスケジューリングが有効になっているトレーニングジョブを送信します。

    ジョブを実行するノードにラベルを追加する必要があります。 この例では、cn-beijing.192.168.XX.XXノードが使用されます。 ノードを、使用されている実際のノードに置き換えます。

    kubectlラベルノードcn-beijing.192.168.XX.XX ack.node.gpu.schedule=topology -- overwrite

    次のコマンドを実行して、トポロジ対応のGPUスケジューリングを有効にするために使用される -- gputopology=trueで設定されたトレーニングジョブを送信します。

    アリーナ送信mpi \
      -- name=tensorflow-topo-4-vgg16 \
      -- gpus=1 \
      -- workers=4 \
      -- gputopology=true \
      -- imag e=registry.cn-hangzhou.aliyuncs.com/kubernetes-image-hub/tensorflow-benchmark:tf2.3.0-py3.7-cuda10.1 \
      "mpirun -- allow-run-as-root-npy" 4 " -bind-to none -map-by slot -x NCCL_benchseg16 DEBUG=INFO -x NCCL_SOCKET_if_IFNAME=eth0 -x LD_LIBRARY_PATH-m-- mca pta_neb_eptemarks /mot_ethnモデル1-mca-mot_nad_m_n// mobdname 64 -- variable_update=horovod 
  3. トレーニングジョブを完了するのに必要な時間を比較します。

    1. 次のコマンドを実行して、2つのトレーニングジョブを完了するのに必要な時間を比較します。

      アリーナリスト-nデモ-ns

      期待される出力:

      NAME STATUS TRAINER DURATION GPU (要求された) GPU (割り当てられた) ノード
      tensorflow-topo-4-vgg16成功したMPIJOB 44s 4 N/A 192.168.4.XX1
      tensorflow-4-vgg16-image-warned成功したMPIJOB 2m 4 N/A 192.168.4.XX0 
    2. 次のコマンドを実行して、トポロジ認識GPUスケジューリングが無効になっているトレーニングジョブの合計GPU処理時間を照会します

      アリーナログtensorflow-topo-4-vgg16 -n demo-ns

      期待される出力:

      100画像 /秒: 251.7 +/- 0.1 (ジッタ=1.2) 7.262
      ----------------------------------------------------------------
      総イメージ /秒: 1006.44 
    3. 次のコマンドを実行して、トポロジ認識GPUスケジューリングが有効になっているトレーニングジョブの合計GPU処理時間を照会します

      アリーナログtensorflow-4-vgg16-image-warned -n demo-ns

      期待される出力:

      100画像 /秒: +/- 0.2 (ジッタ=1.5) 7.261
      ----------------------------------------------------------------
      総イメージ /秒: 225.50 

次の表に、2つのジョブの結果を示します。

トレーニングジョブ

GPUあたりの処理時間 (ns)

合計GPU処理時間 (ns)

期間

トポロジ対応GPUスケジューリングの有効化

56.4

225.50

44

トポロジ対応GPUスケジューリングの無効化

251.7

1006.44

120

ノードでトポロジ対応のGPUスケジューリングを有効にすると、通常のGPUスケジューリングを有効にすることはできません。 通常のGPUスケジューリングを再開するには、次のコマンドを実行してノードラベルを変更します。

kubectlラベルノードcn-beijing.192.168.XX.XX0 ack.node.gpu.schedule=default -- overwrite

ステップ5: モデルを管理する

  1. AI開発者コンソール
    へのログイン
  2. AI開発者コンソールの左側のナビゲーションウィンドウで、[モデル管理] をクリックします。
  3. [モデル管理] ページで、[モデルの作成] をクリックします。

  4. [作成] ダイアログボックスで、モデル名モデルバージョンジョブ名を設定します。

    この例では、モデル名はfsahion-mnist-demo、モデルバージョンはv1、ジョブ名はtf-singleに設定されています。

  5. [OK] をクリックします。 モデルがページに表示されます。

    Create a model

    モデルを評価する場合は、[操作] 列の [新しいモデル評価] をクリックします。

ステップ6: モデルを評価する

クラウドネイティブコンポーネントセットをインストールした後、ArenaまたはAI開発者コンソールを使用して評価ジョブを送信できます。 この例では、Fashion-MNISTデータセットに基づいてトレーニングされたモデルのチェックポイントを評価するために、評価ジョブが送信されます。 手順:

  1. アリーナを使用して、チェックポイントをエクスポートするトレーニングジョブを送信します。

  2. アリーナを使用して評価ジョブを送信します。

  3. AI Developer Consoleを使用して、異なるモデルの評価結果を比較します。

  1. チェックポイントをエクスポートするトレーニングジョブを送信します。

    次のコマンドを実行して、アリーナを使用して、チェックポイントをfashion-demo-pvcにエクスポートするトレーニングジョブを送信します。

    アリーナ \
      送信 \
      tfjob \
      -n demo-ns \ # ビジネス要件に基づいて名前空間を変更できます。 
      -- name=fashion-mnist-arena-ckpt \
      -- data=fashion-demo-pvc:/root/data/ \
      -- env=DATASET_PATH=/root/data/ \
      -- env=MODEL_PATH=/root/data/saved_model \
      -- env=MODEL_VERSION=1 \
      -- env=GIT_SYNC_USERNAME =${ GIT_USERNAME} \ # Gitリポジトリのユーザー名。 
      -- env=GIT_SYNC_PASSWORD =${ GIT_PASSWORD} \ # Gitリポジトリのパスワード。 
      -- env=OUTPUT_CHECKPOINT=1 \
      -- sync-mode=git \
      -- sync-source=https://codeup.aliyun.com/60b4cf5c66bba1c04b442e49/tensorflow-fashion-mnist-sample.git \
      -- image="tensorflow/tensorflow:2.2.2-gpu" \
      "python /root/code/tensorflow-fashion-mnist-sample/train.py -- log_dir=/training_logs" 
  2. 評価ジョブを送信します。

    1. ジョブの配置に使用するイメージを作成します。

      モデル評価用のコードを取得します。 kubeai-sdkディレクトリで次のコマンドを実行して、イメージを作成してプッシュします。

      dockerビルド。 -t ${DOCKER_REGISTRY}:fashion-mnist
      docker push ${DOCKER_REGISTRY}: ファッションmnist 
    2. 次のコマンドを実行して、MySQLへのアクセスを提供するサービスを照会します。

      kubectl get svc -n kube-ai ack-mysql

      期待される出力:

      名タイプCLUSTER-IP EXTERNAL-IPポート年齢
      ack-mysql ClusterIP 172.16.XX.XX <none> 3306/TCP 28h 
    3. 次のコマンドを実行して、Arenaを使用して評価ジョブを送信します。

      アリーナ评価モデル \
       -- namespace=demo-ns \
       -- loglevel=debug \
       -- name=evaluate-job \
       -- imag e=registry.cn-beijing.aliyuncs.com/kube-ai/kubeai-sdk-demo: ファッションミニスト \
       -- env=ENABLE_MYSQL=True \
       -- env=MYSQL_HOST=172.16.77.227 \
       -- env=MYSQL_PORT=3306 \
       -- env=MYSQL_USERNAME=kubeai \
       -- env=MYSQL_PASSWORD=kubeai @ ACK \
       -- data=fashion-demo-pvc:/data \
       -- model-name=1 \
       -- model-path=/data/saved_model/ \
       -- dataset-path=/data/ \
       -- metrics-path=/data/output \
       「python /kubeai/evaluate.py」 
      説明

      MySQLにアクセスするには、前の手順で出力からIPアドレスとポートを取得します。

  3. 評価結果を比較する。

    1. AI開発者コンソールの左側のナビゲーションウィンドウで、[モデル管理] をクリックします。

      Model evaluation list

    2. [ジョブリスト] セクションで、評価ジョブの名前をクリックしてメトリクスを表示できます。

      Evaluation job metrics

      異なる評価ジョブのメトリックを比較することもできます。Compare the metrics of different evaluation jobs

ステップ7: モデルをサービスとしてデプロイする

モデルを開発および評価した後、モデルをサービスとしてデプロイできます。 次の手順では、前述のモデルをtf-servingという名前の推論サービスとして展開する方法について説明します。 Arenaは、TritonやSeldonなどのさまざまなサービスアーキテクチャをサポートしています。 詳細については、「アリーナサーブガイド」をご参照ください。

この例では、ステップ4: モデルのトレーニングでトレーニングされたモデルが使用されます。 モデルは、ステップ2: データセットの作成で使用されるfashion-minist-demo PVCに保存されます。 モデルを他のタイプのストレージに格納する場合は、最初に使用するストレージタイプのPVCを作成する必要があります。

  1. 次のコマンドを実行して、Arenaを使用してTensorFlowモデルをTensorFlow Servingにデプロイします。

    アリーナはtensorflow \を提供します
      -- loglevel=debug \
      -- namespace=demo-ns \
      -- name=ファッション-mnist \
      -- model-name=1 \
      -- gpus=1 \
      -- image=tensorflow/serving:1.15.0-gpu \
      -- data=fashion-demo-pvc:/data \
      -- model-path=/data/saved_model/ \
      -- version-policy=latest 
  2. 次のコマンドを実行して、デプロイした推論サービスの名前を照会します。

    アリーナサーブリスト-n demo-ns

    期待される出力:

    名前タイプバージョンが必要利用可能なアドレスポートGPU
    ファッション・ミニストTensorflow 202111031203 1 1 172.16。XX.XX GRPC:8500、RESTFUL:8501 1 

    [address] 列と [ports] 列のIPアドレスとポートを使用して、クラスター内から推論サービスにリクエストを送信できます。

  3. JupyterでJupyterノートブックを作成し、そのノートブックをクライアントとして使用して、HTTPリクエストをtf-servingサービスに送信します。

    この例では、ステップ3: モデルの開発で作成されたJupyterノートブックが使用されています。

    • ノートブックの初期化に使用172.16コードのserver_ipフィールドの値として、. XX.XXを指定します。 前の手順でADDRESS列に172.16.XX.XXが返されます。

    • ノートブックの初期化に使用するコードのserver_http_portフィールドの値として8501を指定します。 ポート8501は、前の手順でPORTS列に返され、RESTful APIを呼び出すために使用されます。

    例:

    osのインポート
    gzipのインポート
    numpyをnpとしてインポートする
    # matplotlib.pyplotをpltとしてインポートする
    ランダムにインポート
    インポートリクエスト
    jsonのインポート
    
    server_ip = "172.16.XX.XX"
    server_http_port = 8501
    
    dataset_dir = "/root/data/"
    
    def load_data():
            files = [
                'train-labels-idx1-ubyte.gz '、
                'train-images-idx3-ubyte.gz '、
                't10k-labels-idx1-ubyte.gz '、
                't10k-images-idx3-ubyte.gz'
            ]
    
            パス= []
            ファイル内のfnameの場合:
                paths.append(os.path.join(dataset_dir, fname))
    
            gzip.open (パス [0], 'rb') をlabelpathとして使用する:
                y_train = np.frombuffer(labelpath.read(), np.uint8, offset=8)
            gzip.open (パス [1] 、'rb') をimgpathとして使用します。
                x_train = np.frombuffer(imgpath.read(), np.uint8, offset=16).reshape(len(y_train), 28,28)
            gzip.open (パス [2] 、'rb') をlabelpathとして使用する:
                y_test = np.frombuffer(labelpath.read(), np.uint8, offset=8)
            gzip.open (パス [3], 'rb') をimgpathとして:
                x_test = np.frombuffer(imgpath.read(), np.uint8, offset=16).reshape(len(y_test), 28,28)
    
    
            return (x_train, y_train),(x_test, y_test)
    
    def show(idx、タイトル):
      plt.figure()
      plt.imshow(test_images[idx].reshape(28,28))
      plt.axis('off ')
      plt.title('\n\n{}'.format(title), fontdict={'size': 16})
    
    class_names = ['Tシャツ /トップ' 、'ズボン' 、'プルバー' 、'ドレス' 、'コート' 、
                   「サンダル」、「シャツ」、「スニーカー」、「バッグ」、「アンクルブーツ」]
    
    (train_images, train_labels), (test_images, test_labels) = load_data()
    train_images = train_images / 255.0
    test_images = test_images / 255.0
    
    # モデルに供給するための形状変更
    train_images = train_images.reshape(train_images.shape[0], 28,28, 1)
    test_images = test_images.reshape(test_images.shape[0], 28,28, 1)
    
    print('\ntrain_images.shape: {}, of {}'.format(train_images.shape, train_images.dtype))
    プリント ('test_images.shape: {}, of {}'.format(test_images.shape, test_images.dtype))
    
    rando = random.randint (0,len(test_images)-1)
    # show(rando, 'An Example Image: {}'.format(class_names[test_labels[rando]]))
    
    #! pip install -qリクエスト
    
    # リクエストのインポート
    # headers = {"content-type": "application/json"}
    # json_response = requests.post('http:// localhost:8501/v1/models/fashion_model:predict' 、data=data、headers=headers)
    # predictions = json.loads(json_response.text)['predictions']
    
    # show(0, 'モデルはこれが {} (クラス {}) だと思っていましたが、実際には {} (クラス {}) でした '.format ()
    # class_names[np.argmax (予測 [0])] 、np.argmax (予測 [0]) 、class_names[test_labels[0]] 、test_labels[0]))
    
    
    def request_model (データ):
        headers = {"content-type": "application/json"}
        json_response = requests.post('http:// {}:{}/v1/models/1:predict'.format(server_ip, server_http_port), data=data, headers=headers)
        プリント ('======= response:' 、json_response、json_response.text)
        predictions = json.loads(json_response.text)['predictions']
    
        print('モデルはこれが {} (class {}) だと思っていましたが、実際には {} (class {})'.format(class_names[np.argmax(predictions[0])] 、np.argmax(predictions[0]) 、class_names[test_labels[0]] 、test_labels[0])))
        # show(0, 'モデルはこれが {} (クラス {}) だと思っていましたが、実際には {} (クラス {}) でした '.format ()
        # class_names[np.argmax (予測 [0])] 、np.argmax (予測 [0]) 、class_names[test_labels[0]] 、test_labels[0]))
    
    # def request_model_version (データ):
    # headers = {"content-type": "application/json"}
    # json_response = requests.post('http:// {}:{}/v1/models/1/version/1:predict'.format(server_ip、server_http_port) 、data=data、headers=headers)
    # print('======= response:' 、json_response、json_response.text)
    
    # predictions = json.loads(json_response.text)
    # 範囲内のi (0,3):
    # show(i、'モデルはこれが {} (クラス {}) だと思っていましたが、実際には {} (クラス {}) でした'.format ()
    # class_names[np.argmax(predictions[i])] 、np.argmax(predictions[i]) 、class_names[test_labels[i]] 、test_labels[i]))
    
    data = json.dumps({"signature_name": "serving_default", "instances": test_images[0:3].tolist()})
    print('Data: {} ... {}'.format(data[:50], data[len(data)-52:])))
    # request_model_version (データ)
    request_model (データ) 

    ノートブックのExecute iconアイコンをクリックします。 次の出力が返されます。

    train_images.shape :( 60000、28、28、1) 、float64の
    test_images.shape :( 10000, 28, 28, 1) 、of float64
    データ: {"signature_name": "serving_default", "instances": ... [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0]]]}
    ======== response: <レスポンス [200]> {
        "predictions": [[7.42696e-07, 6.9901237556e-09, 2.669364452e-07, 2.27735413e-07, 4.0373439e-07, 7.27086217e-06, 0.0316713452, 0.0010733594, 0.962337255], [0.00685342, 1.854164260764e-08,-0.00613868702, 3.47e-106, 0.9266119 7.98738e-09、0.000122893631、4.85748023e-05、1.50353979e-10、3.57102294e-07、1.89657579e-09、4.4604468e-07、9.23274524e-09]
        ]
    }
    モデルはこれがアンクルブーツ (クラス9) だと思っていましたが、実際にはアンクルブーツ (クラス9) 
    でした。

よくある質問

  • Jupyterノートブックコンソールによく使用されるソフトウェアをインストールするにはどうすればよいですか?

    一般的に使用されるソフトウェアをJupyterノートブックコンソールにインストールするには、次のコマンドを実行します。

    apt-get install ${ソフトウェア名}
  • Jupyterノートブックコンソールで文字化けの問題を修正するにはどうすればよいですか?

    次の内容に基づいて /etc/localeファイルを変更し、ターミナルを再度開きます。

    LC_CTYPE="da_DK.UTF-8"
    LC_NUMERIC="da_DK.UTF-8"
    LC_TIME="da_DK.UTF-8"
    LC_COLLATE="da_DK.UTF-8"
    LC_MONETARY="da_DK.UTF-8"
    LC_MESSAGES="da_DK.UTF-8"
    LC_PAPER="da_DK.UTF-8"
    LC_NAME="da_DK.UTF-8"
    LC_ADDRESS="da_DK.UTF-8"
    LC_TELEPHONE="da_DK.UTF-8"
    LC_MEASUREMENT="da_DK.UTF-8"
    LC_IDENTIFICATION="da_DK.UTF-8"
    LC_ALL=