All Products
Search
Document Center

Container Service for Kubernetes:Panduan developer Cloud Native AI Suite

Last Updated:Jun 18, 2026

Panduan ini menggunakan dataset open-source Fashion-MNIST untuk menunjukkan cara menjalankan tugas pembelajaran mendalam pada kluster ACK dengan Cloud Native AI Suite. Anda akan mempelajari cara mengoptimalkan kinerja pelatihan terdistribusi, mengevaluasi model, dan menerapkannya untuk inferensi pada kluster.

Latar Belakang

Cloud Native AI Suite menyediakan komponen (Helm chart K8s) yang dapat diterapkan secara independen untuk mempercepat rekayasa AI.

Cloud Native AI Suite memiliki dua peran pengguna: administrator dan developer.

  • Administrator: Peran ini bertanggung jawab untuk mengelola pengguna dan izin mereka, mengalokasikan sumber daya kluster, mengonfigurasi penyimpanan eksternal, mengelola set data, dan memantau penggunaan kluster melalui dasbor kluster.

  • Developer: Peran ini terutama menggunakan sumber daya kluster untuk mengirimkan pekerjaan. Developer harus dibuat dan diberikan izin oleh administrator. Mereka kemudian dapat menggunakan alat seperti Arena CLI dan Jupyter Notebook untuk pengembangan sehari-hari.

Prasyarat

Pastikan administrator telah menyelesaikan tugas-tugas berikut:

  • Kluster Kubernetes telah dibuat. Untuk informasi lebih lanjut, lihat Buat kluster ACK yang dikelola.

    • Setiap node dalam kluster memiliki ruang disk minimal 300 GB.

    • Untuk hasil akselerasi data terbaik, gunakan empat instans, masing-masing dilengkapi delapan GPU V100.

    • Untuk hasil kesadaran topologi terbaik, gunakan dua instans V100.

  • Cloud Native AI Suite telah diinstal. Untuk informasi lebih lanjut, lihat Instal Cloud Native AI Suite.

  • Anda memiliki akses ke AI Dashboard. Untuk informasi lebih lanjut, lihat Akses AI Dashboard.

  • Anda memiliki akses ke AI Developer Console. Untuk informasi lebih lanjut, lihat Akses AI Developer Console.

    Catatan

    Mulai 22 Januari 2025, AI Console Alibaba Cloud, yang mencakup AI Developer Console dan AI Dashboard, akan menjadi fitur hanya untuk daftar putih. Perubahan ini tidak memengaruhi penerapan yang sudah ada. Pengguna yang tidak masuk daftar putih dapat menginstal dan mengonfigurasi AI Console dari komunitas open-source. Untuk detailnya, lihat Open-source AI Console.

  • Dataset Fashion MNIST telah diunduh dan diunggah ke Object Storage Service (OSS). Untuk petunjuknya, lihat Unggah file.

  • Anda memiliki URL repositori Git, username, dan password untuk kode pengujian.

  • Anda telah terhubung ke kluster Kubernetes menggunakan klien kubectl. Untuk petunjuknya, lihat Dapatkan kubeconfig kluster dan gunakan kubectl untuk terhubung ke kluster.

  • Alat baris perintah Arena telah diinstal. Untuk petunjuknya, lihat Konfigurasikan klien Arena.

Lingkungan tutorial

Dalam tutorial ini, Anda akan mempelajari cara menggunakan Cloud Native AI Suite untuk mengembangkan, melatih, mempercepat, mengelola, mengevaluasi, dan menerapkan workload Fashion-MNIST.

Kluster yang digunakan dalam tutorial ini terdiri dari node-node berikut:

Host Name

IP

Peran

GPU

vCPU

Memori

cn-beijing.192.168.0.13

192.168.0.13

jump server

1

8

30580004 KiB

cn-beijing.192.168.0.16

192.168.0.16

worker

1

8

30580004 KiB

cn-beijing.192.168.0.17

192.168.0.17

worker

1

8

30580004 KiB

cn-beijing.192.168.0.240

192.168.0.240

worker

1

8

30580004 KiB

cn-beijing.192.168.0.239

192.168.0.239

worker

1

8

30580004 KiB

Tujuan

Setelah menyelesaikan panduan ini, Anda akan mampu:

  • Mengelola set data

  • Menyiapkan lingkungan pengembangan dengan Jupyter Notebook

  • Mengirimkan pekerjaan pelatihan standalone

  • Mengirimkan pekerjaan pelatihan terdistribusi

  • Mempercepat pekerjaan pelatihan dengan Fluid

  • Mempercepat pekerjaan pelatihan dengan ACK AI Task Scheduler

  • Mengelola model

  • Menjalankan evaluasi model

  • Menerapkan layanan inferensi

Langkah 1: Buat akun dan alokasikan sumber daya

Hubungi administrator Anda untuk sumber daya berikut:

  • Username dan password.

  • Kuota sumber daya.

  • Titik akhir AI Developer Console (jika Anda mengirimkan pekerjaan menggunakan konsol).

    Catatan

    AI Console Alibaba Cloud, yang mencakup AI Developer Console dan O&M Console, akan menjadi fitur daftar putih mulai 22 Januari 2025. Jika Anda telah menerapkan AI Developer Console atau O&M Console sebelum tanggal tersebut, penggunaan Anda tidak akan terpengaruh. Jika Anda tidak masuk daftar putih, Anda dapat menginstal dan mengonfigurasi konsol suite AI dari komunitas open-source. Untuk petunjuk konfigurasi lengkap, lihat Open-source AI Console.

  • Jika Anda mengirimkan pekerjaan menggunakan Arena CLI, dapatkan kubeconfig untuk kluster. Untuk petunjuknya, lihat Dapatkan kubeconfig dan terhubung ke kluster.

Langkah 2: Buat set data

Set data dikelola oleh administrator. Contoh ini menggunakan set data fashion-mnist.

Langkah 1: Buat set data fashion-mnist

  1. Buat file fashion-mnist.yaml berdasarkan contoh YAML berikut.

    Contoh ini membuat volume persisten (PV) dan klaim volume persisten (PVC) tipe OSS.

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: 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: Filesystem
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: fashion-demo-pvc
      namespace: demo-ns
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 10Gi
      selector:
        matchLabels:
          alicloud-pvname: fashion-demo-pv
      storageClassName: oss
      volumeMode: Filesystem
      volumeName: fashion-demo-pv
  2. Jalankan perintah berikut untuk membuat set data fashion-mnist.

    kubectl create -f fashion-mnist.yaml
  3. Lihat status PV dan PVC.

    • Periksa status PV.

      kubectl get pv fashion-mnist-jackwg

      Output yang diharapkan:

      NAME                   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                          STORAGECLASS   REASON   AGE
      fashion-mnist-jackwg   10Gi       RWX            Retain           Bound    ns1/fashion-mnist-jackwg-pvc   oss                     8h
    • Periksa status PVC.

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

      Output yang diharapkan:

      NAME                       STATUS   VOLUME                 CAPACITY   ACCESS MODES   STORAGECLASS   AGE
      fashion-mnist-jackwg-pvc   Bound    fashion-mnist-jackwg   10Gi       RWX            oss            8h

    Output menunjukkan bahwa status PV dan PVC keduanya adalah Bound.

Langkah 2: Buat set data terakselerasi

Administrator menggunakan AI Dashboard untuk mempercepat set data.

  1. Akses AI Dashboard sebagai administrator.
  2. Di panel navigasi kiri AI Dashboard, pilih Dataset > Dataset List.
  3. Pada halaman Dataset List, klik Accelerate di kolom Actions set data target.

    Setelah Anda mempercepat set data, informasinya diperbarui di halaman Dataset List. Daftar tersebut mencakup kolom seperti Task name, Namespace, Data source, Accelerated, dan Status. Untuk set data yang dipercepat, kolom Accelerated menampilkan Yes, dan Status-nya berubah dari NotReady menjadi Ready setelah percepatan selesai.

Langkah 3: Pengembangan model

Bagian ini menjelaskan cara menyiapkan lingkungan pengembangan menggunakan Jupyter Notebook. Prosesnya sebagai berikut:

  1. (Opsional) Buat Jupyter Notebook dari gambar kustom.

  2. Kembangkan dan uji model Anda di Jupyter Notebook.

  3. Dorong kode ke repositori Git dari Jupyter Notebook.

  4. Kirimkan pekerjaan pelatihan menggunakan Arena SDK.

(Opsional) Langkah 1: Buat notebook dari gambar kustom

AI Developer Console menyediakan Jupyter Notebook dengan gambar bawaan untuk berbagai versi TensorFlow dan PyTorch. Jika gambar tersebut tidak memenuhi kebutuhan Anda, Anda dapat membuat gambar kustom.

  1. Buat file bernama Dockerfile berdasarkan templat berikut.

    Untuk informasi lebih lanjut tentang persyaratan gambar kustom, lihat Buat dan gunakan notebook.

    cat<<EOF >dockerfile
    FROM tensorflow/tensorflow:1.15.5-gpu
    USER root
    RUN pip install jupyter && \
        pip install ipywidgets && \
        jupyter nbextension enable --py widgetsnbextension && \
        pip install jupyterlab && jupyter serverextension enable --py jupyterlab
    EXPOSE 8888
    #USER jovyan
    CMD ["sh", "-c", "jupyter-lab --notebook-dir=/home/jovyan --ip=0.0.0.0 --no-browser --allow-root --port=8888 --NotebookApp.token='' --NotebookApp.password='' --NotebookApp.allow_origin='*' --NotebookApp.base_url=${NB_PREFIX} --ServerApp.authenticate_prometheus=False"]
    EOF
  2. Jalankan perintah berikut untuk membuat gambar dari Dockerfile.

    docker build -f dockerfile .

    Output yang diharapkan:

    Sending build context to Docker daemon  9.216kB
    Step 1/5 : FROM tensorflow/tensorflow:1.15.5-gpu
     ---> 73be11373498
    Step 2/5 : USER root
     ---> Using cache
     ---> 7ee21dc7e42e
    Step 3/5 : RUN pip install jupyter &&     pip install ipywidgets &&     jupyter nbextension enable --py widgetsnbextension &&     pip install jupyterlab && jupyter serverextension enable --py jupyterlab
     ---> Using cache
     ---> 23bc51c5e16d
    Step 4/5 : EXPOSE 8888
     ---> Using cache
     ---> 76a55822ddae
    Step 5/5 : CMD ["sh", "-c", "jupyter-lab --notebook-dir=/home/jovyan --ip=0.0.0.0 --no-browser --allow-root --port=8888 --NotebookApp.token='' --NotebookApp.password='' --NotebookApp.allow_origin='*' --NotebookApp.base_url=${NB_PREFIX} --ServerApp.authenticate_prometheus=False"]
     ---> Using cache
     ---> 3692f04626d5
    Successfully built 3692f04626d5
  3. Jalankan perintah berikut untuk mendorong gambar ke registri kontainer Anda.

    docker tag ${IMAGE_ID} registry-vpc.cn-beijing.aliyuncs.com/${DOCKER_REPO}/jupyter:fashion-mnist-20210802a
    docker push registry-vpc.cn-beijing.aliyuncs.com/${DOCKER_REPO}/jupyter:fashion-mnist-20210802a
  4. Buat rahasia tarik gambar untuk menarik gambar dari registri kontainer pribadi Anda.

    Untuk informasi lebih lanjut, lihat Buat Secret untuk menarik gambar dari registri pribadi.

    kubectl create secret docker-registry regcred \
      --docker-server=<your-registry-server> \
      --docker-username=<your-username> \
      --docker-password=<your-password> \
      --docker-email=<your-email-address>
  5. Buat Jupyter Notebook di AI Developer Console.

    Untuk informasi lebih lanjut tentang membuat Jupyter Notebook, lihat Buat dan gunakan notebook.

    Konfigurasikan parameter untuk Jupyter Notebook sebagai berikut: Di bagian Notebook Basic Information di sebelah kiri, atur Notebook Name dan Notebook Image (Anda dapat memilih gambar kustom), serta tentukan Namespace dan Image Pull Secret. Untuk Data Configuration, pilih set data untuk menampilkan klaim volume persisten dan direktori penyimpanan lokal yang sesuai. Jika Anda mengaktifkan Workspace PVC, Anda harus menentukan Target PVC dan Mount Path. Di bagian Notebook Resource Configuration di sebelah kanan, atur CPU (Cores), Memory (GB), dan GPU (Units). Setelah selesai mengonfigurasi, klik Create Notebook.

Langkah 2: Kembangkan dan uji di notebook

  1. Akses AI Developer Console
  2. Di panel navigasi kiri AI Developer Console, klik Notebook.
  3. Pada halaman Notebook, klik nama Jupyter Notebook target dengan Status Running.

  4. Buka terminal baru dan jalankan perintah berikut untuk memverifikasi bahwa data berhasil dipasang:

    pwd
    /root/data
    ls -alh

    Output yang diharapkan:

    total 30M
    drwx------ 1 root root    0 Jan  1  1970 .
    drwx------ 1 root root 4.0K Aug  2 04:15 ..
    drwxr-xr-x 1 root root    0 Aug  1 14:16 saved_model
    -rw-r----- 1 root root 4.3M Aug  1 01:53 t10k-images-idx3-ubyte.gz
    -rw-r----- 1 root root 5.1K Aug  1 01:53 t10k-labels-idx1-ubyte.gz
    -rw-r----- 1 root root  26M Aug  1 01:54 train-images-idx3-ubyte.gz
    -rw-r----- 1 root root  29K Aug  1 01:53 train-labels-idx1-ubyte.gz
  5. Di lingkungan Jupyter Notebook Anda, buat file notebook baru untuk mengembangkan model fashion-mnist dan inisialisasi dengan kode berikut:

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    import os
    import gzip
    import numpy as np
    import tensorflow as tf
    from tensorflow import keras
    print('TensorFlow version: {}'.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'
        ]
        paths = []
        for fname in files:
            paths.append(os.path.join(dataset_path, fname))
        with gzip.open(paths[0], 'rb') as labelpath:
            y_train = np.frombuffer(labelpath.read(), np.uint8, offset=8)
        with gzip.open(paths[1], 'rb') as imgpath:
            x_train = np.frombuffer(imgpath.read(), np.uint8, offset=16).reshape(len(y_train), 28, 28)
        with gzip.open(paths[2], 'rb') as labelpath:
            y_test = np.frombuffer(labelpath.read(), np.uint8, offset=8)
        with gzip.open(paths[3], 'rb') as 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()
    
        # scale the values to 0.0 to 1.0
        train_images = train_images / 255.0
        test_images = test_images / 255.0
    
        # reshape for feeding into the model
        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-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
                    'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
    
        print('\ntrain_images.shape: {}, of {}'.format(train_images.shape, train_images.dtype))
        print('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
        epochs = 5
        model.compile(optimizer='adam',
                    loss='sparse_categorical_crossentropy',
                    metrics=['accuracy'])
        logdir = "/training_logs"
        tensorboard_callback = keras.callbacks.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)
        print('\nTest accuracy: {}'.format(test_acc))
        export_path = os.path.join(model_path, model_version)
        print('export_path = {}\n'.format(export_path))
        tf.keras.models.save_model(
            model,
            export_path,
            overwrite=True,
            include_optimizer=True,
            save_format=None,
            signatures=None,
            options=None
        )
        print('\nSaved model success')
    if __name__ == '__main__':
        train()
    Penting

    Dalam kode, dataset_path dan model_path harus diatur ke jalur pemasangan sumber data di Notebook. Hal ini memungkinkan Notebook mengakses set data yang dipasang ke sistem file lokal.

  6. Di Notebook target, klik ikon 执行图标 untuk menjalankan kode.

    Output yang diharapkan:

    TensorFlow version: 1.15.5
    
    train_images.shape: (60000, 28, 28, 1), of float64
    test_images.shape: (10000, 28, 28, 1), of float64
    Model: "sequential_2"
    _________________________________________________________________
    Layer (type)                 Output Shape              Param #
    =================================================================
    Conv1 (Conv2D)               (None, 13, 13, 8)         80
    _________________________________________________________________
    flatten_2 (Flatten)          (None, 1352)              0
    _________________________________________________________________
    Softmax (Dense)              (None, 10)                13530
    =================================================================
    Total params: 13,610
    Trainable params: 13,610
    Non-trainable params: 0
    _________________________________________________________________
    Train on 60000 samples
    Epoch 1/5
    60000/60000 [==============================] - 3s 57us/sample - loss: 0.5452 - acc: 0.8102
    Epoch 2/5
    60000/60000 [==============================] - 3s 52us/sample - loss: 0.4103 - acc: 0.8555
    Epoch 3/5
    60000/60000 [==============================] - 3s 55us/sample - loss: 0.3750 - acc: 0.8681
    Epoch 4/5
    60000/60000 [==============================] - 3s 55us/sample - loss: 0.3524 - acc: 0.8757
    Epoch 5/5
    60000/60000 [==============================] - 3s 53us/sample - loss: 0.3368 - acc: 0.8798
    10000/10000 [==============================] - 0s 37us/sample - loss: 0.3770 - acc: 0.8673
    
    Test accuracy: 0.8672999739646912
    export_path = ./model/v1
    Saved model success

Langkah 3: Dorong kode ke repositori Git

Setelah membuat Jupyter Notebook, Anda dapat langsung mendorong kode ke repositori Git dari dalam Notebook.

  1. Jalankan perintah berikut untuk menginstal Git.

    apt-get update
    apt-get install git
  2. Jalankan perintah berikut untuk menginisialisasi konfigurasi Git dan menyimpan kredensial Anda di Notebook.

    git config --global credential.helper store
    git pull ${YOUR_GIT_REPO}
  3. Jalankan perintah berikut untuk mendorong kode ke repositori Git.

    git push origin fashion-test

    Output yang diharapkan:

    Total 0 (delta 0), reused 0 (delta 0)
    To codeup.aliyun.com:60b4cf5c66bba1c04b442e49/tensorflow-fashion-mnist-sample.git
     * [new branch]      fashion-test -> fashion-test

Langkah 4: Kirimkan pekerjaan pelatihan menggunakan Arena SDK

  1. Instal dependensi untuk Arena SDK.

    !pip install coloredlogs
  2. Buat file Python baru dan inisialisasi dengan kode berikut:

    import os
    import sys
    import time
    from arenasdk.client.client import ArenaClient
    from arenasdk.enums.types import *
    from arenasdk.exceptions.arena_exception import *
    from arenasdk.training.tensorflow_job_builder import *
    from arenasdk.logger.logger import LoggerBuilder
    
    def main():
        print("start to test arena-python-sdk")
        client = ArenaClient("","demo-ns","info","arena-system") # Pekerjaan dikirim ke namespace demo-ns.
        print("create ArenaClient succeed.")
        print("start to create tfjob")
        job_name = "arena-sdk-distributed-test"
        job_type = TrainingJobType.TFTrainingJob
        try:
            # build the training job
            job =  TensorflowJobBuilder().with_name(job_name)\
                .with_workers(1)\
                .with_gpus(1)\
                .with_worker_image("tensorflow/tensorflow:1.5.0-devel-gpu")\
                .with_ps_image("tensorflow/tensorflow:1.5.0-devel")\
                .with_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")\  # URL repositori Git.
                .with_envs({\
                    "GIT_SYNC_USERNAME":"USERNAME", \   # Username untuk repositori Git.
                    "GIT_SYNC_PASSWORD":"PASSWORD",\    # Password untuk repositori Git.
                    "TEST_TMPDIR":"/",\
                })\
                .with_command("python code/tensorflow-fashion-mnist-sample/tf-distributed-mnist.py").build()
            # Jika pekerjaan pelatihan sudah ada, hapus
            if client.training().get(job_name, job_type):
                print("The job {} already exists. Deleting it.".format(job_name))
                client.training().delete(job_name, job_type)
                time.sleep(3)
    
            output = client.training().submit(job)
            print(output)
    
            count = 0
            # Tunggu hingga pekerjaan pelatihan mulai berjalan.
            while True:
                if count > 160:
                    raise Exception("Timeout waiting for the job to start running")
                jobInfo = client.training().get(job_name,job_type)
                if jobInfo.get_status() == TrainingJobStatus.TrainingJobPending:
                    print("job status is PENDING,waiting...")
                    count = count + 1
                    time.sleep(5)
                    continue
                print("current status is {} of job {}".format(jobInfo.get_status().value,job_name))
                break
            # dapatkan log pekerjaan pelatihan
            logger = LoggerBuilder().with_accepter(sys.stdout).with_follow().with_since("5m")
            #jobInfo.get_instances()[0].get_logs(logger)
            # tampilkan informasi pekerjaan pelatihan
            print(str(jobInfo))
            # hapus pekerjaan pelatihan
            #client.training().delete(job_name, job_type)
        except ArenaException as e:
            print(e)
    
    main()
    • namespace: Dalam contoh ini, pekerjaan pelatihan dikirim ke namespace demo-ns.

    • with_sync_source: URL repositori Git.

    • with_envs: Username dan password untuk repositori Git.

  3. Di Notebook target, klik ikon 执行图标 untuk menjalankan kode.

    Output yang diharapkan:

    2021-11-02/08:57:28 DEBUG util.py[line:19] - execute command: [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 command: [arena submit --namespace=demo-ns --arena-namespace=arena-system --loglevel=info tfjob --name=arena-sdk-distributed-test --workers=1 --gpus=1 --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 --env=GIT_SYNC_PASSWORD=kubeai@ACK123 --env=TEST_TMPDIR=/ python code/tensorflow-fashion-mnist-sample/tf-distributed-mnist.py]
    start to test arena-python-sdk
    create ArenaClient succeed.
    start to create tfjob
    2021-11-02/08:57:29 DEBUG util.py[line:19] - execute command: [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 created
    
    job status is PENDING,waiting...
    2021-11-02/09:00:34 DEBUG util.py[line:19] - execute command: [arena get --namespace=demo-ns --arena-namespace=arena-system --loglevel=info arena-sdk-distributed-test --type=tfjob -o json]
    current status is 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"
    }

Langkah 4: Latih model

Contoh berikut menunjukkan cara mengirimkan pekerjaan pelatihan TensorFlow standalone, pekerjaan pelatihan TensorFlow terdistribusi, pekerjaan pelatihan yang dipercepat Fluid, dan pekerjaan pelatihan terdistribusi yang dipercepat oleh penjadwal pekerjaan AI.

Contoh 1: Kirimkan pekerjaan pelatihan TensorFlow standalone

Setelah selesai mengembangkan dan menyimpan kode di notebook, Anda dapat mengirimkan pekerjaan pelatihan menggunakan Arena CLI atau AI Developer Console.

Metode 1: Gunakan Arena CLI

arena \
  submit \
  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"

Metode 2: Gunakan AI Developer Console

  1. Konfigurasikan sumber data. Untuk informasi lebih lanjut, lihat Konfigurasikan set data.

    Tabel berikut menjelaskan beberapa parameter utama.

    Parameter

    Contoh

    Wajib

    Name

    fashion-demo

    Ya

    Namespace

    demo-ns

    Ya

    PersistentVolumeClaim

    fashion-demo-pvc

    Ya

    Direktori penyimpanan lokal

    /root/data

    Tidak

  2. Konfigurasikan repositori kode sumber. Untuk informasi lebih lanjut, lihat Konfigurasikan repositori kode sumber.

    Parameter

    Contoh

    Wajib

    Name

    fashion-git

    Ya

    Git URL

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

    Ya

    Default branch

    master

    Tidak

    Direktori penyimpanan lokal

    /root/

    Tidak

    Username Git pribadi

    Username untuk repositori Git pribadi Anda.

    Tidak

    Password atau token Git pribadi

    Password atau personal access token untuk repositori Git pribadi Anda.

    Tidak

  3. Kirimkan pekerjaan pelatihan standalone. Untuk informasi lebih lanjut, lihat Kirimkan pekerjaan pelatihan TensorFlow.

    Setelah mengonfigurasi parameter pelatihan, klik Submit. Anda kemudian dapat melihat pekerjaan pelatihan di halaman Job List. Tabel berikut menjelaskan parameter pengiriman pekerjaan.

    Parameter

    Description

    Task Name

    Pada contoh ini, nama job adalah fashion-tf-ui.

    Job type

    Untuk contoh ini, pilih Tensorflow Standalone.

    Namespace

    Pada contoh ini, gunakan demo-ns. Nilai ini harus sama dengan namespace yang digunakan oleh dataset.

    Data source configuration

    Untuk contoh ini, pilih fashion-demo, yang telah dikonfigurasi di Langkah 1.

    Code configuration

    Untuk contoh ini, pilih fashion-git, yang telah dikonfigurasi di Langkah 2.

    Code branch

    Pada contoh ini, gunakan master.

    Command

    Pada contoh ini, gunakan "export DATASET_PATH=/root/data/ &&export MODEL_PATH=/root/saved_model &&export MODEL_VERSION=1 &&python /root/code/tensorflow-fashion-mnist-sample/train.py".

    Private Git repository

    Jika Anda menggunakan repositori pribadi, Anda harus menyediakan username dan password.

    Instance count

    Nilai default-nya adalah 1.

    Image

    Pada contoh ini, gunakan tensorflow/tensorflow:2.2.2-gpu.

    Image pull secret

    Jika Anda menggunakan image dari registri pribadi, Anda harus membuat image pull secret terlebih dahulu.

    CPU (cores)

    Nilai default-nya adalah 4.

    Memory (GB)

    Nilai default-nya adalah 8.

    Untuk informasi lebih lanjut tentang parameter Arena CLI, lihat Gunakan Arena untuk mengirimkan TFJob.

  4. Setelah mengirimkan pekerjaan, lihat log-nya.

    1. Di panel navigasi kiri AI Developer Console, klik Tasks.

    2. Di halaman Tasks, klik nama pekerjaan target.

    3. Di halaman detail pekerjaan, klik tab Instance. Kemudian, di kolom Actions untuk instans target, klik Logs.

      Cuplikan berikut menunjukkan output log untuk contoh ini:

      train_images.shape: (60000, 28, 28, 1), of float64
      test_images.shape: (10000, 28, 28, 1), of float64
      Model: "sequential"
      _________________________________________________________________
      Layer (type)                 Output Shape              Param #
      =================================================================
      Conv1 (Conv2D)               (None, 13, 13, 8)         80
      _________________________________________________________________
      flatten (Flatten)            (None, 1352)              0
      _________________________________________________________________
      Softmax (Dense)              (None, 10)                13530
      =================================================================
      Total params: 13,610
      Trainable params: 13,610
      Non-trainable params: 0
      _________________________________________________________________
      Epoch 1/5
      2021-08-01 14:21:17.532237: E tensorflow/core/profiler/internal/gpu/cupti_tracer.cc:1430] function cupti_interface_->EnableCallback( 0 , subscriber_, CUPTI_CB_DOMAIN_DRIVER_API, cbid)failed with error CUPTI_ERROR_INVALID_PARAMETER
      2021-08-01 14:21:17.532390: I tensorflow/core/profiler/internal/gpu/device_tracer.cc:216]  GpuTracer has collected 0 callback api events and 0 activity events.
      2021-08-01 14:21:17.533535: I tensorflow/core/profiler/rpc/client/save_profile.cc:168] Creating directory: /training_logs/train/plugins/profile/2021_08_01_14_21_17
      2021-08-01 14:21:17.533928: I tensorflow/core/profiler/rpc/client/save_profile.cc:174] Dumped gzipped tool data for trace.json.gz to /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: I tensorflow/core/profiler/utils/event_span.cc:288] Generation of step-events took 0 ms
      
      2021-08-01 14:21:17.534961: I tensorflow/python/profiler/internal/profiler_wrapper.cc:87] Creating directory: /training_logs/train/plugins/profile/2021_08_01_14_21_17Dumped tool data for overview_page.pb to /training_logs/train/plugins/profile/2021_08_01_14_21_17/fashion-mnist-arena-chief-0.overview_page.pb
      Dumped tool data for input_pipeline.pb to /training_logs/train/plugins/profile/2021_08_01_14_21_17/fashion-mnist-arena-chief-0.input_pipeline.pb
      Dumped tool data for tensorflow_stats.pb to /training_logs/train/plugins/profile/2021_08_01_14_21_17/fashion-mnist-arena-chief-0.tensorflow_stats.pb
      Dumped tool data for kernel_stats.pb to /training_logs/train/plugins/profile/2021_08_01_14_21_17/fashion-mnist-arena-chief-0.kernel_stats.pb
      
      1875/1875 [==============================] - 3s 2ms/step - loss: 0.5399 - accuracy: 0.8116
      Epoch 2/5
      1875/1875 [==============================] - 3s 2ms/step - loss: 0.4076 - accuracy: 0.8573
      Epoch 3/5
      1875/1875 [==============================] - 3s 2ms/step - loss: 0.3727 - accuracy: 0.8694
      Epoch 4/5
      1875/1875 [==============================] - 3s 2ms/step - loss: 0.3512 - accuracy: 0.8769
      Epoch 5/5
      1875/1875 [==============================] - 3s 2ms/step - loss: 0.3351 - accuracy: 0.8816
      313/313 [==============================] - 0s 1ms/step - loss: 0.3595 - accuracy: 0.8733
      2021-08-01 14:21:34.820089: W tensorflow/python/util/util.cc:329] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
      WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/resource_variable_ops.py:1817: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version.
      Instructions for updating:
      If using Keras pass *_constraint arguments to layers.
      
      Test accuracy: 0.8733000159263611
      export_path = /root/saved_model/1
      
      Saved model success
  5. Lihat metrik pelatihan di TensorBoard.

    Teruskan port layanan TensorBoard ke mesin lokal Anda menggunakan kubectl port-forward.

    1. Jalankan perintah berikut untuk mendapatkan detail layanan TensorBoard.

      kubectl get svc -n demo-ns

      Output yang diharapkan:

      NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)               AGE
      tf-dist-arena-tensorboard   NodePort    172.16.XX.XX     <none>        6006:32226/TCP        80m
    2. Jalankan perintah berikut untuk meneruskan port TensorBoard.

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

      Output yang diharapkan:

      Forwarding from 127.0.0.1:6006 -> 6006
      Forwarding from [::1]:6006 -> 6006
      Handling connection for 6006
      Handling connection for 6006
    3. Di browser web, buka http://localhost:6006/ untuk melihat dasbor TensorBoard.

      Tab GRAPHS menampilkan graf komputasi model, menunjukkan koneksi dan aliran data antar lapisan seperti Conv1, flatten, dan Softmax. Panel samping menyediakan properti detail untuk node yang dipilih.

Contoh 2: Kirimkan pekerjaan pelatihan TensorFlow terdistribusi

Metode 1: Gunakan Arena CLI

  1. Jalankan perintah berikut untuk mengirimkan pekerjaan pelatihan.

    arena submit tf \
        -n demo-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. Jalankan perintah berikut untuk mendapatkan detail layanan TensorBoard.

    kubectl get svc -n demo-ns

    Output yang diharapkan:

    NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                 AGE
    tf-dist-arena-tensorboard   NodePort    172.16.204.248   <none>        6006:32226/TCP          80m
  3. Jalankan perintah berikut untuk meneruskan port TensorBoard.

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

    Output yang diharapkan:

    Forwarding from 127.0.0.1:6006 -> 6006
    Forwarding from [::1]:6006 -> 6006
    Handling connection for 6006
    Handling connection for 6006
  4. Di browser web, buka http://localhost:6006/ untuk melihat dasbor TensorBoard.

    Tab SCALARS menampilkan plot untuk metrik seperti accuracy dan cross_entropy selama pelatihan. Di panel samping, Anda dapat memfilter berdasarkan run train dan test, serta menyesuaikan opsi tampilan Smoothing dan sumbu.

Metode 2: Gunakan AI Developer Console

  1. Konfigurasikan sumber data. Untuk informasi lebih lanjut, lihat Konfigurasikan set data.

    Contoh ini menggunakan kembali data dari 1, dan konfigurasinya tidak diulang.

  2. Konfigurasikan repositori kode sumber. Untuk informasi lebih lanjut, lihat Konfigurasikan repositori kode sumber.

    Contoh ini menggunakan kembali kode dari 2, sehingga langkah konfigurasinya tidak diulang.

  3. Kirimkan pekerjaan pelatihan TensorFlow terdistribusi. Untuk informasi lebih lanjut, lihat Kirimkan pekerjaan pelatihan TensorFlow.

    Setelah mengonfigurasi parameter pelatihan, klik Submit. Anda kemudian dapat melihat pekerjaan di halaman Job List. Tabel berikut menjelaskan parameter pekerjaan utama.

    Parameter

    Deskripsi

    Task Name

    Dalam contoh ini, gunakan fashion-ps-ui.

    Job type

    Pilih TF Distributed.

    Namespace

    Dalam contoh ini, gunakan demo-ns. Ini harus namespace yang sama dengan set data.

    Konfigurasi sumber data

    Dalam contoh ini, pilih fashion-demo, yang dikonfigurasi di Langkah 1 contoh sebelumnya.

    Konfigurasi kode

    Dalam contoh ini, pilih fashion-git, yang dikonfigurasi di Langkah 2 contoh sebelumnya.

    Command

    Dalam contoh ini, gunakan "export TEST_TMPDIR=/root/ && python code/tensorflow-fashion-mnist-sample/tf-distributed-mnist.py --log_dir=/training_logs".

    Image

    • Di bawah Task Resource Configuration, pada tab Worker, atur Image ke tensorflow/tensorflow:1.5.0-devel-gpu.

    • Di bawah Task Resource Configuration, pada tab PS, atur Image ke tensorflow/tensorflow:1.5.0-devel.

    Untuk informasi lebih lanjut tentang parameter Arena CLI, lihat Gunakan Arena untuk mengirimkan TFJob.

  4. Untuk melihat TensorBoard, ikuti langkah 2 hingga 4 di Metode 1: Gunakan Arena CLI.

Contoh 3: Kirimkan pekerjaan pelatihan yang dipercepat Fluid

Contoh ini menunjukkan cara menggunakan konsol O&M untuk mempercepat set data. Anda akan mengirimkan pekerjaan yang menggunakan set data terakselerasi dan membandingkan waktu eksekusinya dengan pekerjaan standar untuk mengamati manfaat kinerjanya. Alur kerja keseluruhan sebagai berikut:

  1. Administrator mempercepat set data yang ada dari konsol O&M.

  2. Developer mengirimkan pekerjaan pelatihan yang menggunakan set data terakselerasi.

  3. Bandingkan waktu eksekusi pekerjaan menggunakan perintah arena list.

  1. Percepat set data yang ada.

    Jika Anda telah mempercepat set data fashion-demo-pvc di Langkah 2: Buat set data, Anda dapat melewati langkah ini. Untuk petunjuk mempercepat set data, lihat Kelola set data.

  2. Kirimkan pekerjaan yang menggunakan set data terakselerasi.

    Developer mengirimkan pekerjaan pelatihan ke namespace demo-ns. Perbedaan utama dalam perintah pengiriman untuk pekerjaan yang menggunakan set data terakselerasi adalah:

    • --data: Nama PersistentVolumeClaim (PVC) terakselerasi. Dalam contoh ini, yaitu fashion-demo-pvc-acc.

    • --env=DATASET_PATH: Jalur ini dibentuk dengan menambahkan nama PVC (fashion-demo-pvc-acc) ke jalur pemasangan (/root/data/) yang ditentukan dalam parameter --data.

    arena \
      submit \
      tfjob \
      -n demo-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. Jalankan perintah berikut untuk membandingkan waktu eksekusi kedua pekerjaan pelatihan.

    arena list -n demo-ns

    Output yang diharapkan:

    NAME                 STATUS     TRAINER  DURATION  GPU(Requested)  GPU(Allocated)  NODE
    fashion-mnist-fluid  SUCCEEDED  TFJOB    33s       0               N/A             192.168.5.7
    fashion-mnist-arena  SUCCEEDED  TFJOB    3m        0               N/A             192.168.5.8

    Seperti yang ditunjukkan output, dengan kode pelatihan dan sumber daya node yang sama, pekerjaan yang dipercepat Fluid selesai dalam 33 detik, sedangkan pekerjaan standar membutuhkan 3 menit.

Contoh 4: Percepat pekerjaan pelatihan terdistribusi menggunakan penjadwal pekerjaan AI

Penjadwal pekerjaan AI adalah plugin penjadwal yang dioptimalkan untuk ACK yang dirancang untuk workload AI cloud-native dan data besar. Plugin ini mendukung fitur seperti Gang Scheduling, Capacity Scheduling, dan penjadwalan kesadaran topologi. Contoh ini menunjukkan efek percepatan dari penjadwalan kesadaran topologi GPU.

Penjadwal pekerjaan AI menggunakan informasi topologi sumber daya heterogen pada node, seperti tautan komunikasi antar GPU (NVLink, PCIe Switch) atau arsitektur NUMA CPU. Plugin ini membuat keputusan penjadwalan optimal di tingkat kluster untuk meningkatkan kinerja pekerjaan AI. Untuk informasi lebih lanjut tentang penjadwalan kesadaran topologi GPU, lihat Penjadwalan kesadaran topologi GPU. Untuk informasi lebih lanjut tentang penjadwalan kesadaran topologi CPU, lihat Aktifkan penjadwalan CPU kesadaran topologi.

Contoh ini menunjukkan cara mengaktifkan penjadwalan kesadaran topologi GPU dan membandingkan kinerja pekerjaan yang dihasilkan.

  1. Jalankan perintah berikut untuk membuat pekerjaan pelatihan tanpa penjadwalan kesadaran topologi.

    arena submit mpi \
      --name=tensorflow-4-vgg16 \
      --gpus=1 \
      --workers=4 \
      --image=registry.cn-hangzhou.aliyuncs.com/kubernetes-image-hub/tensorflow-benchmark:tf2.3.0-py3.7-cuda10.1 \
      "mpirun --allow-run-as-root -np "4" -bind-to none -map-by slot -x NCCL_DEBUG=INFO -x NCCL_SOCKET_IFNAME=eth0 -x LD_LIBRARY_PATH -x PATH --mca pml ob1 --mca btl_tcp_if_include eth0 --mca oob_tcp_if_include eth0 --mca orte_keep_fqdn_hostnames t --mca btl ^openib python /tensorflow/benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py --model=vgg16 --batch_size=64 --variable_update=horovod"
  2. Buat pekerjaan pelatihan dengan penjadwalan kesadaran topologi diaktifkan.

    Tambahkan label ke node. Perintah berikut menggunakan cn-beijing.192.168.XX.XX sebagai contoh. Ganti dengan nama aktual node kluster Anda.

    kubectl label node cn-beijing.192.168.XX.XX ack.node.gpu.schedule=topology --overwrite

    Jalankan perintah berikut untuk membuat pekerjaan pelatihan. Bendera --gputopology=true mengaktifkan kesadaran topologi di Arena.

    arena submit mpi \
      --name=tensorflow-topo-4-vgg16 \
      --gpus=1 \
      --workers=4 \
      --gputopology=true \
      --image=registry.cn-hangzhou.aliyuncs.com/kubernetes-image-hub/tensorflow-benchmark:tf2.3.0-py3.7-cuda10.1 \
      "mpirun --allow-run-as-root -np "4" -bind-to none -map-by slot -x NCCL_DEBUG=INFO -x NCCL_SOCKET_IFNAME=eth0 -x LD_LIBRARY_PATH -x PATH --mca pml ob1 --mca btl_tcp_if_include eth0 --mca oob_tcp_if_include eth0 --mca orte_keep_fqdn_hostnames t --mca btl ^openib python /tensorflow/benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py --model=vgg16 --batch_size=64 --variable_update=horovod
  3. Bandingkan kinerja kedua pekerjaan.

    1. Jalankan perintah berikut untuk membandingkan waktu eksekusi.

      arena list -n demo-ns

      Output yang diharapkan:

      NAME                             STATUS     TRAINER  DURATION  GPU(Requested)  GPU(Allocated)  NODE
      tensorflow-topo-4-vgg16          SUCCEEDED  MPIJOB   44s       4               N/A             192.168.4.XX1
      tensorflow-4-vgg16-image-warned  SUCCEEDED  MPIJOB   2m        4               N/A             192.168.4.XX0
    2. Jalankan perintah berikut untuk melihat throughput pekerjaan pelatihan dengan penjadwalan kesadaran topologi.

      arena logs tensorflow-topo-4-vgg16 -n demo-ns

      Output yang diharapkan:

      100 images/sec: 251.7 +/- 0.1 (jitter = 1.2)  7.262
      ----------------------------------------------------------------
      total images/sec: 1006.44
    3. Jalankan perintah berikut untuk melihat throughput pekerjaan pelatihan tanpa penjadwalan kesadaran topologi.

      arena logs tensorflow-4-vgg16-image-warned -n demo-ns

      Output yang diharapkan:

      100 images/sec: 56.4 +/- 0.2 (jitter = 1.5)  7.261
      ----------------------------------------------------------------
      total images/sec: 225.50

Tabel berikut merangkum perbandingan kinerja antara kedua pekerjaan.

Pekerjaan pelatihan

Throughput per GPU (images/sec)

Total throughput GPU (images/sec)

Durasi (detik)

Penjadwalan kesadaran topologi diaktifkan

251.7

1006.44

44

Penjadwalan kesadaran topologi dinonaktifkan

56.4

225.50

120

Node dengan penjadwalan kesadaran topologi GPU yang diaktifkan tidak lagi mendukung penjadwalan GPU standar. Untuk mengembalikan penjadwalan GPU standar, jalankan perintah berikut untuk mengubah label node.

kubectl label node cn-beijing.192.168.XX.XX0 ack.node.gpu.schedule=default --overwrite

Langkah 5: Manajemen model

  1. Akses AI Developer Console
  2. Di panel navigasi kiri AI Developer Console, klik Model Manage.
  3. Di halaman Model Management, klik Create Model.

  4. Di kotak dialog Create, konfigurasikan Model Name, Model Version, dan Job Name.

    Dalam contoh ini, nama model adalah fashion-mnist-demo, versi model adalah v1, dan pekerjaan pelatihan adalah tf-single.

  5. Klik OK. Model baru muncul dalam daftar.

    Untuk mengevaluasi model, klik New Model Evaluation di baris model tersebut.

Langkah 6: Evaluasi model

Cloud Native AI Suite mendukung pengiriman pekerjaan evaluasi model. Anda dapat mengirimkan pekerjaan ini menggunakan Arena atau AI Developer Console. Contoh ini menunjukkan cara mengevaluasi checkpoint yang disimpan selama proses pelatihan Fashion-MNIST. Alur kerjanya sebagai berikut:

  1. Kirimkan pekerjaan pelatihan dengan checkpointing diaktifkan menggunakan Arena.

  2. Kirimkan pekerjaan evaluasi model menggunakan Arena.

  3. Bandingkan hasil evaluasi di AI Developer Console.

  1. Kirimkan pekerjaan pelatihan dengan checkpointing diaktifkan.

    Jalankan perintah berikut untuk mengirimkan pekerjaan pelatihan menggunakan Arena. Pekerjaan ini menghasilkan checkpoint dan menyimpannya ke volume fashion-demo-pvc.

    arena \
      submit \
      tfjob \
      -n demo-ns \ # Atur namespace sesuai kebutuhan.
      --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} \ # Masukkan username Git Anda.
      --env=GIT_SYNC_PASSWORD=${GIT_PASSWORD} \ # Masukkan password Git Anda.
      --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. Kirimkan pekerjaan evaluasi model.

    1. Bangun gambar evaluasi.

      Di direktori kubeai-sdk, jalankan perintah berikut untuk membuat dan mendorong gambar.

      docker build . -t ${DOCKER_REGISTRY}:fashion-mnist
      docker push ${DOCKER_REGISTRY}:fashion-mnist
    2. Jalankan perintah berikut untuk mendapatkan detail layanan MySQL yang diterapkan oleh Cloud Native AI Suite.

      kubectl get svc -n kube-ai ack-mysql

      Output yang diharapkan:

      NAME        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
      ack-mysql   ClusterIP   172.16.XX.XX    <none>        3306/TCP   28h
    3. Jalankan perintah berikut untuk mengirimkan pekerjaan evaluasi model menggunakan Arena.

      arena evaluate model \
       --namespace=demo-ns \
       --loglevel=debug \
       --name=evaluate-job \
       --image=registry.cn-beijing.aliyuncs.com/kube-ai/kubeai-sdk-demo:fashion-minist \
       --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"
      Catatan

      Anda dapat memperoleh alamat IP dan port layanan MySQL dari langkah sebelumnya.

  3. Bandingkan hasil evaluasi.

    1. Di panel navigasi kiri AI Developer Console, klik Model Management.

      Halaman ini menampilkan daftar pekerjaan evaluasi model. Daftar tersebut mencakup kolom seperti Name, Model name, Model version, Namespace, Status, Creation time, dan End time. Untuk pekerjaan yang selesai, kolom Status menampilkan Complete. Anda dapat membandingkan hasil beberapa pekerjaan dengan mengklik tombol Compare Metrics di bagian atas halaman.

    2. Di Tasks, klik nama pekerjaan untuk melihat metriknya.

      Hasil evaluasi menampilkan metrik berikut: accuracy, precision, recall, F1_score, dan AUC. Kurva ROC juga memvisualisasikan kinerja klasifikasi model.

      Grafik batang secara visual membandingkan kinerja pekerjaan yang dipilih berdasarkan metrik seperti AUC dan accuracy.

Langkah 7: Penerapan model

Setelah mengembangkan dan mengevaluasi model, Anda menerapkannya sebagai layanan yang dapat dipanggil oleh sistem bisnis. Bagian ini menunjukkan cara menerapkan model dari langkah-langkah sebelumnya sebagai layanan TensorFlow Serving. Arena juga mendukung framework serving lainnya, seperti Triton dan Seldon. Untuk informasi lebih lanjut, lihat dokumentasi serve Arena.

Contoh ini menggunakan model yang dilatih di Langkah 4: Latih model, yang disimpan di PVC fashion-demo-pvc yang dibuat di Langkah 2: Buat set data. Jika model Anda menggunakan jenis penyimpanan berbeda, Anda harus terlebih dahulu membuat PVC yang sesuai di kluster.

  1. Jalankan perintah berikut untuk menerapkan model TensorFlow ke TensorFlow Serving dengan Arena.

    arena serve tensorflow \
      --loglevel=debug \
      --namespace=demo-ns \
      --name=fashion-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. Jalankan perintah berikut untuk mendapatkan nama layanan inferensi yang diterapkan.

    arena serve list -n demo-ns

    Output yang diharapkan:

    NAME           TYPE        VERSION       DESIRED  AVAILABLE  ADDRESS         PORTS                   GPU
    fashion-mnist  Tensorflow  202111031203  1        1          172.16.XX.XX    GRPC:8500,RESTFUL:8501  1

    Anda dapat menggunakan nilai ADDRESS dan PORTS dalam output untuk memanggil layanan dari dalam kluster.

  3. Di Jupyter, buat file Notebook baru untuk mengirim permintaan ke layanan HTTP TensorFlow Serving.

    Contoh ini menggunakan Jupyter Notebook yang dibuat di Langkah 3: Kembangkan model untuk mengirim permintaan.

    • Dalam kode inisialisasi berikut, ganti nilai server_ip dengan ADDRESS (172.16.XX.XX) yang dikembalikan pada langkah sebelumnya.

    • Atur server_http_port ke port RESTFUL (8501) yang dikembalikan pada langkah sebelumnya.

    Kode inisialisasi untuk file Notebook adalah sebagai berikut:

    import os
    import gzip
    import numpy as np
    # import matplotlib.pyplot as plt
    import random
    import requests
    import 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'
            ]
    
            paths = []
            for fname in files:
                paths.append(os.path.join(dataset_dir, fname))
    
            with gzip.open(paths[0], 'rb') as labelpath:
                y_train = np.frombuffer(labelpath.read(), np.uint8, offset=8)
            with gzip.open(paths[1], 'rb') as imgpath:
                x_train = np.frombuffer(imgpath.read(), np.uint8, offset=16).reshape(len(y_train), 28, 28)
            with gzip.open(paths[2], 'rb') as labelpath:
                y_test = np.frombuffer(labelpath.read(), np.uint8, offset=8)
            with gzip.open(paths[3], 'rb') as 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, title):
      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-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
                   'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
    
    (train_images, train_labels), (test_images, test_labels) = load_data()
    train_images = train_images / 255.0
    test_images = test_images / 255.0
    
    # reshape for feeding into the model
    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))
    print('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 requests
    
    # import requests
    # 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, 'The model thought this was a {} (class {}), and it was actually a {} (class {})'.format(
    #   class_names[np.argmax(predictions[0])], np.argmax(predictions[0]), class_names[test_labels[0]], test_labels[0]))
    
    def request_model(data):
        headers = {"content-type": "application/json"}
        json_response = requests.post('http://{}:{}/v1/models/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)['predictions']
    
        print('The model thought this was a {} (class {}), and it was actually a {} (class {})'.format(class_names[np.argmax(predictions[0])], np.argmax(predictions[0]), class_names[test_labels[0]], test_labels[0]))
        #show(0, 'The model thought this was a {} (class {}), and it was actually a {} (class {})'.format(
        #  class_names[np.argmax(predictions[0])], np.argmax(predictions[0]), class_names[test_labels[0]], test_labels[0]))
    
    # def request_model_version(data):
    #     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)
    #     for i in range(0,3):
    #       show(i, 'The model thought this was a {} (class {}), and it was actually a {} (class {})'.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(data)
    request_model(data)

    Klik ikon 执行图标 di Jupyter Notebook untuk melihat output berikut:

    train_images.shape: (60000, 28, 28, 1), of float64
    test_images.shape: (10000, 28, 28, 1), of float64
    Data: {"signature_name": "serving_default", "instances": ...  [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0]]]]}
    =======response: <Response [200]> {
        "predictions": [[7.42696e-07, 6.91237556e-09, 2.66364452e-07, 2.27735413e-07, 4.0373439e-07, 0.00490919966, 7.27086217e-06, 0.0316713452, 0.0010733594, 0.962337255], [0.00685342, 1.8516447e-08, 0.9266119, 2.42278338e-06, 0.0603800081, 4.01338771e-12, 0.00613868702, 4.26091073e-15, 1.35764185e-05, 3.38685469e-10], [1.09047969e-05, 0.999816835, 7.98738e-09, 0.000122893631, 4.85748023e-05, 1.50353979e-10, 3.57102294e-07, 1.89657579e-09, 4.4604468e-07, 9.23274524e-09]
        ]
    }
    The model thought this was a Ankle boot (class 9), and it was actually a Ankle boot (class 9)

FAQ

  • Bagaimana cara menginstal perangkat lunak di konsol Jupyter Notebook?

    Untuk menginstal perangkat lunak, jalankan perintah berikut di konsol Jupyter Notebook.

    apt-get install <software-name>
  • Bagaimana cara memperbaiki karakter acak di konsol Jupyter Notebook?

    Edit file /etc/locale agar berisi hal berikut, lalu buka kembali terminal.

    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=