全部产品
Search
文档中心

Container Service for Kubernetes:Panduan Pengembang Suite AI Cloud-Native

更新时间:Jul 02, 2025

Topik ini menggunakan dataset open source bernama Fashion-MNIST sebagai contoh untuk menjelaskan cara menggunakan set komponen AI cloud-native dalam menyelesaikan tugas-tugas berikut: menjalankan pekerjaan pembelajaran mendalam di kluster Container Service for Kubernetes (ACK), mengoptimalkan kinerja pelatihan terdistribusi, menyetel model, dan menerapkan model di kluster ACK.

Informasi latar belakang

Set komponen AI cloud-native mencakup komponen yang dapat diterapkan secara independen menggunakan Helm chart. Anda dapat memanfaatkan komponen-komponen ini untuk mempercepat proyek AI.

Set komponen AI cloud-native cocok untuk dua jenis peran: administrator dan pengembang.

  • Administrator mengelola pengguna dan izin, mengalokasikan sumber daya kluster, mengonfigurasi penyimpanan eksternal, mengelola dataset, serta memantau pemanfaatan sumber daya melalui dasbor.

  • Pengembang menggunakan sumber daya kluster dan mengirimkan pekerjaan. Pengembang dibuat oleh administrator dan harus diberi izin sebelum dapat melakukan pengembangan menggunakan alat seperti Arena atau Jupyter Notebook.

Prasyarat

Operasi berikut diselesaikan oleh administrator:

  • Kluster ACK dibuat. Untuk informasi lebih lanjut, lihat Buat Kluster ACK yang Dikelola.

    • Ukuran disk setiap node dalam kluster minimal 300 GB.

    • Jika Anda memerlukan percepatan data optimal, gunakan empat instance Elastic Compute Service (ECS) yang masing-masing menyediakan delapan GPU V100.

    • Jika Anda memerlukan kesadaran topologi optimal, gunakan dua instance ECS yang masing-masing menyediakan dua GPU V100.

  • Semua komponen yang termasuk dalam set komponen AI cloud-native diinstal di kluster. Untuk informasi lebih lanjut, lihat Terapkan Suite AI Cloud-Native.

  • AI Dashboard siap digunakan. Untuk informasi lebih lanjut, lihat Akses AI Dashboard.

  • Konsol Pengembang AI siap digunakan. Untuk informasi lebih lanjut, lihat Masuk ke Konsol Pengembang AI.

    Catatan

    Konsol AI (termasuk AI Dashboard dan Konsol Pengembang AI) yang disediakan oleh Alibaba Cloud mulai diluncurkan secara bertahap melalui mekanisme daftar putih mulai 22 Januari 2025.

    • Penyebaran yang Ada: Jika Anda sudah menerapkan AI Dashboard atau Konsol Pengembang AI sebelum tanggal ini, penggunaan saat ini tidak akan terpengaruh.

    • Instalasi Baru: Pengguna yang tidak masuk daftar putih dapat menginstal dan mengonfigurasi Konsol AI melalui komunitas open-source. Untuk instruksi konfigurasi open-source rinci, lihat Konsol AI Open-source.

  • Dataset Fashion-MNIST diunduh dan diunggah ke Bucket Object Storage Service (OSS). Untuk informasi lebih lanjut tentang cara mengunggah model ke bucket OSS, lihat Unggah Objek.

  • Alamat, nama pengguna, dan kata sandi repositori Git yang menyimpan kode uji diperoleh.

  • Klien kubectl terhubung ke kluster. Untuk informasi lebih lanjut, lihat Dapatkan File kubeconfig Kluster dan Gunakan kubectl untuk Terhubung ke Kluster.

  • Arena diinstal. Untuk informasi lebih lanjut, lihat Konfigurasikan Klien Arena.

Lingkungan pengujian

Dalam contoh ini, model AI dikembangkan, dilatih, dipercepat, dikelola, dievaluasi, dan diterapkan menggunakan set komponen AI cloud-native dan dataset Fashion-MNIST open source.

  • Administrator harus menyelesaikan tugas berikut: Langkah 1: Buat Pengguna dan Alokasikan Sumber Daya dan Langkah 2: Buat Dataset. Tugas yang tersisa dapat diselesaikan oleh pengembang.

  • Pengembang perlu membuat terminal di Jupyter Notebook atau menggunakan jump server di kluster ACK untuk mengirimkan perintah Arena. Jupyter Notebook direkomendasikan untuk mengirimkan perintah Arena.

Tabel berikut menjelaskan node dalam kluster.

Nama Host

IP

Peran

Jumlah GPU

Jumlah 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 eksperimen

Topik ini bertujuan untuk mencapai tujuan berikut:

  • Kelola dataset.

  • Gunakan Jupyter Notebook untuk membangun lingkungan pengembangan.

  • Kirimkan pekerjaan pelatihan mandiri.

  • Kirimkan pekerjaan pelatihan terdistribusi.

  • Gunakan Fluid untuk mempercepat pekerjaan pelatihan.

  • Gunakan penjadwal pekerjaan AI dari ACK untuk mempercepat pekerjaan pelatihan.

  • Kelola model.

  • Evaluasi model.

  • Terapkan layanan inferensi.

Langkah 1: Buat pengguna dan alokasikan sumber daya

Pengembang harus mendapatkan informasi dan sumber daya berikut dari administrator:

  • Nama pengguna dan kata sandi pengguna. Untuk informasi lebih lanjut tentang cara membuat pengguna, lihat Kelola Pengguna.

  • Kuota sumber daya. Untuk informasi lebih lanjut tentang cara mengalokasikan kuota sumber daya, lihat Kelola Grup Kuota Elastis.

  • Titik akhir Konsol Pengembang AI jika pengembang ingin mengirimkan pekerjaan menggunakan Konsol Pengembang AI. Untuk informasi lebih lanjut tentang cara mengakses Konsol Pengembang AI, lihat Masuk ke Konsol Pengembang AI.

    Catatan

    Konsol AI (termasuk AI Dashboard dan Konsol Pengembang AI) yang disediakan oleh Alibaba Cloud mulai diluncurkan secara bertahap melalui mekanisme daftar putih mulai 22 Januari 2025.

    • Penyebaran yang Ada: Jika Anda sudah menerapkan AI Dashboard atau Konsol Pengembang AI sebelum tanggal ini, penggunaan saat ini tidak akan terpengaruh.

    • Instalasi Baru: Pengguna yang tidak masuk daftar putih dapat menginstal dan mengonfigurasi Konsol AI melalui komunitas open-source. Untuk instruksi konfigurasi open-source rinci, lihat Konsol AI Open-source.

  • File kubeconfig yang digunakan untuk masuk ke kluster jika pengembang ingin mengirimkan pekerjaan menggunakan Arena. Untuk informasi lebih lanjut tentang cara mendapatkan file kubeconfig yang digunakan untuk masuk ke kluster, lihat 3. Konfigurasikan File kubeconfig dan Hubungkan ke Kluster.

Langkah 2: Buat dataset

Administrator harus menyiapkan dataset. Dalam contoh ini, dataset Fashion-MNIST digunakan.

a: Add the Fashion-MNIST dataset

  1. Gunakan template YAML berikut untuk membuat file bernama fashion-mnist.yaml:

    Dalam contoh ini, volume persisten (PV) dan klaim volume persisten (PVC) dibuat untuk memasang bucket OSS yang menyimpan dataset Fashion-MNIST.

    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 file fashion-mnist.yaml:

    kubectl create -f fashion-mnist.yaml
  3. Periksa status PV dan PVC yang dibuat.

    • Jalankan perintah berikut untuk memeriksa status PV yang dibuat:

      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
    • Jalankan perintah berikut untuk memeriksa status PVC yang dibuat:

      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 baik PV maupun PVC berada dalam status Terikat.

b: Accelerate the dataset

Administrator harus mempercepat dataset menggunakan AI Dashboard.

  1. Akses AI Dashboard sebagai administrator.
  2. Di panel navigasi kiri AI Dashboard, pilih Dataset > Dataset List.
  3. Di halaman Dataset List, temukan dataset dan klik Accelerate di kolom Operator.

    Gambar berikut menunjukkan dataset yang dipercepat.Accelerate the dataset

Langkah 3: Kembangkan model

Bagian ini menjelaskan cara menggunakan Jupyter Notebook untuk membangun lingkungan pengembangan. Prosedur:

  1. Opsional. Gunakan gambar kustom untuk membuat notebook Jupyter.

  2. Gunakan notebook Jupyter untuk mengembangkan dan menguji model.

  3. Gunakan notebook Jupyter untuk mengirimkan kode ke repositori Git.

  4. Gunakan SDK Arena untuk mengirimkan pekerjaan pelatihan.

a (optional): Use a custom image to create a Jupyter notebook

Konsol Pengembang AI menyediakan berbagai versi gambar yang mendukung TensorFlow dan PyTorch untuk membuat notebook Jupyter. Anda juga dapat menggunakan gambar kustom untuk membuat notebook Jupyter.

  1. Gunakan template Dockerfile berikut untuk membuat file bernama Dockerfile.

    Untuk informasi lebih lanjut tentang batasan 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 membangun 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 repositori gambar Docker 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 Secret yang digunakan untuk menarik gambar dari repositori gambar Docker:

    Untuk informasi lebih lanjut, lihat Buat Secret Berdasarkan Kredensial Docker yang Ada.

    kubectl create secret docker-registry regcred \
      --docker-server=<Your registry server> \
      --docker-username=<Username> \
      --docker-password=<Password> \
      --docker-email=<Your email address>
  5. Buat notebook Jupyter di Konsol Pengembang AI.

    Untuk informasi lebih lanjut, lihat Buat dan Gunakan Notebook.

    Gambar berikut menunjukkan parameter untuk membuat notebook Jupyter.Create a Jupyter notebook

b: Use the Jupyter notebook to develop and test a model

  1. Masuk ke Konsol Pengembang AI
  2. Di panel navigasi kiri Konsol Pengembang AI, klikNotebook.
  3. Di halaman Notebook, klik notebook Jupyter yang berada dalam status Running.

  4. Buat peluncur CLI dan verifikasi bahwa dataset telah 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. Buat notebook Jupyter yang digunakan untuk melatih model berdasarkan dataset Fashion-MNIST. Blok kode berikut digunakan untuk menginisialisasi notebook:

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    import os
    import gzip
    import numpy as np
    import tensorflow as tf
    from tensorflow import keras
    print('Versi 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'
        ]
        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()
    
        # skala nilai ke 0.0 hingga 1.0
        train_images = train_images / 255.0
        test_images = test_images / 255.0
    
        # ubah bentuk untuk memberi makan ke dalam 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', 'Celana', 'Pullover', 'Gaun', 'Jaket',
                    'Sandal', 'Kemeja', 'Sneaker', 'Tas', 'Sepatu Boot Ankle']
        
        print('\ntrain_images.shape: {}, dari {}'.format(train_images.shape, train_images.dtype))
        print('test_images.shape: {}, dari {}'.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('\nAkurasi pengujian: {}'.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('\nModel berhasil disimpan')
    if __name__ == '__main__':
        train()
    Penting

    Ganti dataset_path dan model_path dengan jalur dataset dan model. Ini memungkinkan notebook mengakses dataset yang dipasang ke kluster.

  6. Klik ikon Execute icon pada notebook.

    Output yang Diharapkan:

    Versi TensorFlow: 1.15.5
    
    train_images.shape: (60000, 28, 28, 1), dari float64
    test_images.shape: (10000, 28, 28, 1), dari 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
    
    Akurasi pengujian: 0.8672999739646912
    export_path = ./model/v1
    Model berhasil disimpan

c: Use the Jupyter notebook to submit code to a Git repository

Setelah notebook dibuat, Anda dapat menggunakan notebook untuk mengirimkan kode ke repositori Git.

  1. Jalankan perintah berikut untuk menginstal Git:

    apt-get update
    apt-get install git
  2. Jalankan perintah berikut untuk menginisialisasi Git dan menyimpan nama pengguna dan kata sandi ke 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

d: Use the Arena SDK to submit a training job

  1. Instal dependensi untuk SDK Arena.

    !pip install coloredlogs
  2. Gunakan kode berikut untuk membuat file Python untuk inisialisasi:

    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("mulai menguji arena-python-sdk")
        client = ArenaClient("","demo-ns","info","arena-system") # Pekerjaan pelatihan dikirim ke namespace demo-ns.
        print("ArenaClient berhasil dibuat.")
        print("mulai membuat tfjob")
        job_name = "arena-sdk-distributed-test"
        job_type = TrainingJobType.TFTrainingJob
        try:
            # bangun pekerjaan pelatihan
            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")\  # Alamat repositori Git.
                .with_envs({\
                    "GIT_SYNC_USERNAME":"USERNAME", \   # Nama pengguna repositori Git.
                    "GIT_SYNC_PASSWORD":"PASSWORD",\    # Kata sandi repositori Git.
                    "TEST_TMPDIR":"/",\
                })\
                .with_command("python code/tensorflow-fashion-mnist-sample/tf-distributed-mnist.py").build()
            # jika pekerjaan pelatihan belum ada, buatlah
            if client.training().get(job_name, job_type):
                print("pekerjaan {} telah dibuat, hapus".format(job_name))
                client.training().delete(job_name, job_type)
                time.sleep(3)
    
            output = client.training().submit(job)
            print(output)
    
            count = 0
            # tunggu pekerjaan pelatihan menjadi berjalan
            while True:
                if count > 160:
                    raise Exception("timeout menunggu pekerjaan menjadi berjalan")
                jobInfo = client.training().get(job_name,job_type)
                if jobInfo.get_status() == TrainingJobStatus.TrainingJobPending:
                    print("status pekerjaan adalah PENDING, menunggu...")
                    count = count + 1
                    time.sleep(5)
                    continue
                print("status saat ini adalah {} dari pekerjaan {}".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: Alamat repositori Git.

    • with_envs: Nama pengguna dan kata sandi repositori Git.

  3. Klik ikon Execute icon pada notebook.

    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

Referensi contoh berikut untuk mengirimkan pekerjaan pelatihan TensorFlow mandiri, pekerjaan pelatihan TensorFlow terdistribusi, pekerjaan pelatihan yang dipercepat oleh Fluid, dan pekerjaan pelatihan terdistribusi yang dipercepat oleh penjadwal pekerjaan AI dari ACK.

Example 1: Submit a standalone TensorFlow training job

Setelah Anda mengembangkan model menggunakan notebook dan menyimpan model, Anda dapat menggunakan Arena atau Konsol Pengembang AI untuk mengirimkan pekerjaan pelatihan.

Metode 1: Gunakan Arena untuk mengirimkan pekerjaan pelatihan TensorFlow mandiri

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 Konsol Pengembang AI untuk mengirimkan pekerjaan pelatihan TensorFlow mandiri

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

    Configure a dataset

    Tabel berikut menjelaskan beberapa parameter.

    Parameter

    Contoh

    Diperlukan

    Name

    fashion-demo

    Ya

    Namespace

    demo-ns

    Ya

    PersistentVolumeClaim

    fashion-demo-pvc

    Ya

    Local Directory

    /root/data

    Tidak

  2. Konfigurasikan kode sumber. Untuk informasi lebih lanjut, lihat Konfigurasikan Repositori Kode Sumber.

    Configure the source code

    Parameter

    Contoh

    Diperlukan

    Name

    fashion-git

    Ya

    Git Repository

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

    Ya

    Default Branch

    master

    Tidak

    Local Directory

    /root/

    Tidak

    Git user

    Nama pengguna repositori Git pribadi Anda.

    Tidak

    Git secret

    Kata sandi repositori Git pribadi Anda.

    Tidak

  3. Kirim pekerjaan pelatihan TensorFlow mandiri. Untuk informasi lebih lanjut, lihat Kirim Pekerjaan Pelatihan TensorFlow.

    Setelah Anda mengonfigurasi parameter pekerjaan, klik Submit. Pekerjaan pelatihan muncul dalam daftar pekerjaan. Gambar berikut menjelaskan parameter pekerjaan.Submit a standalone training job

    Parameter

    Deskripsi

    Job Name

    Dalam contoh ini, fashion-tf-ui digunakan.

    Job Type

    Dalam contoh ini, TF Stand-alone dipilih.

    Namespace

    Dalam contoh ini, demo-ns dipilih. Anda harus memilih namespace tempat dataset berada.

    Data Configuration

    Dalam contoh ini, fashion-demo dipilih. Anda harus memilih sumber data yang Anda konfigurasikan di Langkah 1.

    Code Configuration

    Dalam contoh ini, fashion-git dipilih. Anda harus memilih kode sumber yang Anda konfigurasikan di Langkah 2.

    Code branch

    Dalam contoh ini, master ditentukan.

    Execution Command

    Dalam contoh ini, perintah berikut ditentukan: "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

    Untuk menggunakan repositori Git pribadi, Anda harus terlebih dahulu menentukan nama pengguna dan kata sandi repositori Git pribadi tersebut.

    Instances Count

    Nilai default: 1.

    Image

    Dalam contoh ini, tensorflow/tensorflow:2.2.2-gpu ditentukan.

    Image Pull Secrets

    Untuk menarik gambar dari repositori gambar pribadi, Anda harus terlebih dahulu membuat Secret.

    CPU (Cores)

    Nilai default: 4.

    Memory (GB)

    Nilai default: 8.

    Untuk informasi lebih lanjut tentang perintah Arena, lihat Gunakan Arena untuk Mengirimkan Pekerjaan Pelatihan TensorFlow.

  4. Setelah Anda mengirimkan pekerjaan, periksa log pekerjaan.

    1. Di panel navigasi kiri Konsol Pengembang AI, klik Job List.

    2. Di halaman Job List, klik nama pekerjaan yang Anda kirimkan.

    3. Di halaman detail, klik tab Instances. Temukan instans yang ingin Anda lihat dan klik Log di kolom Operator.

      Contoh:

      train_images.shape: (60000, 28, 28, 1), dari float64
      test_images.shape: (10000, 28, 28, 1), dari 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 telah mengumpulkan 0 callback api events dan 0 activity events.
      2021-08-01 14:21:17.533535: I tensorflow/core/profiler/rpc/client/save_profile.cc:168] Membuat direktori: /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] Pembuatan step-events membutuhkan waktu 0 ms
      
      2021-08-01 14:21:17.534961: I tensorflow/python/profiler/internal/profiler_wrapper.cc:87] Membuat direktori: /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] Set saat ini tidak dianggap sebagai urutan, tetapi ini mungkin berubah di masa mendatang, jadi pertimbangkan untuk menghindari penggunaannya.
      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) dengan constraint sudah tidak digunakan lagi dan akan dihapus di versi mendatang.
      Instruksi untuk pembaruan:
      Jika menggunakan Keras, lewatkan argumen *_constraint ke lapisan.
      
      Akurasi pengujian: 0.8733000159263611
      export_path = /root/saved_model/1
      
      
      Model berhasil disimpan
  5. Lihat data pada TensorBoard.

    Anda dapat menggunakan perintah kubectl port-forward untuk memetakan port lokal ke Layanan TensorBoard. Anda juga dapat melakukan operasi berikut untuk membangun koneksi antara MaxCompute dan VPC.

    1. Jalankan perintah berikut untuk memeriksa alamat IP 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 memetakan port lokal ke Layanan 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. Masukkan http://localhost:6006/ ke bilah alamat browser Anda untuk melihat data pada TensorBoard.

      Tensorboard

Example 2: Submit a distributed TensorFlow training job

Metode 1: Gunakan Arena untuk mengirimkan pekerjaan pelatihan TensorFlow terdistribusi

  1. Jalankan perintah berikut untuk mengirimkan pekerjaan pelatihan TensorFlow terdistribusi menggunakan Arena:

    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 memeriksa alamat IP 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 memetakan port lokal ke Layanan TensorBoard.

    Untuk melihat TensorBoard, gunakan perintah kubectl port-forward untuk memetakan port lokal ke Layanan 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. Masukkan http://localhost:6006/ ke bilah alamat browser Anda untuk melihat data pada TensorBoard.

    View data on TensorBoard

Metode 2: Gunakan Konsol Pengembang AI untuk mengirimkan pekerjaan pelatihan TensorFlow terdistribusi

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

    Dalam contoh ini, konfigurasi sumber data sama dengan yang digunakan di Langkah 1.

  2. Konfigurasikan kode sumber. Untuk informasi lebih lanjut, lihat Konfigurasikan Repositori Kode Sumber.

    Dalam contoh ini, konfigurasi kode sumber sama dengan yang digunakan di Langkah 2.

  3. Kirim pekerjaan pelatihan TensorFlow terdistribusi. Untuk informasi lebih lanjut, lihat Kirim Pekerjaan Pelatihan TensorFlow.

    Setelah Anda mengonfigurasi parameter pekerjaan, klik Submit. Pekerjaan pelatihan muncul dalam daftar pekerjaan. Gambar berikut menjelaskan parameter pekerjaan.Submit a distributed TensorFlow training job

    Parameter

    Deskripsi

    Job Name

    Dalam contoh ini, fashion-ps-ui digunakan.

    Job Type

    Dalam contoh ini, TF Distributed dipilih.

    Namespace

    Dalam contoh ini, demo-ns dipilih. Anda harus memilih namespace tempat dataset berada.

    Data Configuration

    Dalam contoh ini, fashion-demo dipilih. Anda harus memilih sumber data yang Anda konfigurasikan di Langkah 1.

    Code Configuration

    Dalam contoh ini, fashion-git dipilih. Anda harus memilih kode sumber yang Anda konfigurasikan di Langkah 2.

    Execution Command

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

    Image

    • Pada tab Worker di bagian Resources, atur Image ke tensorflow/tensorflow:1.5.0-devel-gpu.

    • Pada tab PS di bagian Resources, atur Image ke tensorflow/tensorflow:1.5.0-devel.

    Untuk informasi lebih lanjut tentang perintah Arena, lihat Gunakan Arena untuk Mengirimkan Pekerjaan Pelatihan TensorFlow.

  4. Lihat data pada TensorBoard. Untuk informasi lebih lanjut, lihat Langkah 2 hingga Langkah 4 di Method 1: Use Arena to submit a distributed TensorFlow training job.

Example 3: Submit a Fluid-accelerated training job

Dalam contoh ini, dataset dipercepat pada AI Dashboard dan pekerjaan pelatihan yang menggunakan dataset yang dipercepat dikirimkan. Hasilnya menunjukkan bahwa waktu yang diperlukan untuk menyelesaikan pekerjaan pelatihan berkurang. Prosedur:

  1. Administrator mempercepat dataset pada AI Dashboard.

  2. Pengembang menggunakan Arena untuk mengirimkan pekerjaan pelatihan yang menggunakan dataset yang dipercepat.

  3. Gunakan Arena untuk memeriksa waktu yang diperlukan untuk menyelesaikan pekerjaan pelatihan.

  1. Percepat dataset.

    Jika Anda telah mempercepat fashion-demo-pvc di Langkah 2: Buat Dataset, lewati langkah ini. Untuk informasi lebih lanjut tentang cara mempercepat dataset, lihat Kelola Dataset.

  2. Kirim pekerjaan pelatihan yang menggunakan dataset yang dipercepat.

    Pengembang mengirimkan pekerjaan pelatihan yang menggunakan dataset yang dipercepat ke namespace demo-ns. Konfigurasi pekerjaan yang menggunakan dataset yang dipercepat dan konfigurasi pekerjaan yang menggunakan dataset biasa berbeda dalam pengaturan parameter berikut:

    • --data: VPC yang dipercepat, yaitu fashion-demo-pvc-acc dalam contoh ini.

    • --env=DATASET_PATH: jalur pemasangan PVC dataset, yaitu /root/data/ dalam --data dalam contoh ini, dan nama PVC, yaitu fashion-demo-pvc-acc dalam contoh ini.

    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 yang diperlukan untuk menyelesaikan dua 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

    Output perintah arena list menunjukkan bahwa 33 detik diperlukan untuk menyelesaikan pekerjaan pelatihan yang dipercepat oleh Fluid, sedangkan 3 menit diperlukan untuk menyelesaikan pekerjaan pelatihan yang menggunakan dataset biasa. Kedua pekerjaan berjalan dengan kode yang sama dan pada node yang sama.

Example 4: Use the AI job scheduler of ACK to accelerate a distributed training job

ACK menyediakan penjadwal pekerjaan AI yang dioptimalkan untuk komputasi AI dan big data. Penjadwal pekerjaan AI mendukung penjadwalan gang, penjadwalan kapasitas, dan penjadwalan dengan kesadaran topologi. Dalam contoh ini, digunakan pekerjaan pelatihan yang memiliki penjadwalan GPU dengan kesadaran topologi diaktifkan.

Untuk memastikan kinerja tinggi beban kerja AI, penjadwal pekerjaan AI memilih solusi penjadwalan optimal berdasarkan informasi topologi tentang sumber daya heterogen pada node. Informasi tersebut mencakup bagaimana GPU berkomunikasi satu sama lain menggunakan NVLink dan PCIe Switches, serta topologi akses memori non-seragam (NUMA) dari CPU. Untuk informasi lebih lanjut tentang penjadwalan GPU dengan kesadaran topologi, lihat Penjadwalan dengan Kesadaran Topologi GPU. Untuk informasi lebih lanjut tentang penjadwalan CPU dengan kesadaran topologi, lihat Aktifkan Penjadwalan CPU dengan Kesadaran Topologi.

Lakukan langkah-langkah berikut untuk mengirimkan pekerjaan pelatihan yang memiliki penjadwalan GPU dengan kesadaran topologi diaktifkan dan pekerjaan pelatihan yang memiliki penjadwalan GPU dengan kesadaran topologi dinonaktifkan. Kemudian, bandingkan waktu yang diperlukan untuk menyelesaikan pekerjaan tersebut.

  1. Jalankan perintah berikut untuk mengirimkan pekerjaan pelatihan yang memiliki penjadwalan GPU dengan kesadaran topologi dinonaktifkan:

    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. Kirimkan pekerjaan pelatihan yang memiliki penjadwalan GPU dengan kesadaran topologi diaktifkan.

    Anda harus menambahkan label ke node tempat Anda ingin menjalankan pekerjaan. Dalam contoh ini, node cn-beijing.192.168.XX.XX digunakan. Ganti node dengan node sebenarnya yang digunakan.

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

    Jalankan perintah berikut untuk mengirimkan pekerjaan pelatihan yang dikonfigurasi dengan --gputopology=true, yang digunakan untuk mengaktifkan penjadwalan GPU dengan kesadaran topologi.

    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 waktu yang diperlukan untuk menyelesaikan pekerjaan pelatihan.

    1. Jalankan perintah berikut untuk membandingkan waktu yang diperlukan untuk menyelesaikan dua pekerjaan pelatihan:

      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 memeriksa total waktu pemrosesan GPU dari pekerjaan pelatihan yang memiliki penjadwalan GPU dengan kesadaran topologi dinonaktifkan:

      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 memeriksa total waktu pemrosesan GPU dari pekerjaan pelatihan yang memiliki penjadwalan GPU dengan kesadaran topologi diaktifkan:

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

      Output yang Diharapkan:

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

Tabel berikut menunjukkan hasil dari kedua pekerjaan.

Pekerjaan Pelatihan

Waktu Pemrosesan per GPU (ns)

Total Waktu Pemrosesan GPU (ns)

Durasi (s)

Penjadwalan GPU dengan kesadaran topologi diaktifkan

56.4

225.50

44

Penjadwalan GPU dengan kesadaran topologi dinonaktifkan

251.7

1006.44

120

Setelah penjadwalan GPU dengan kesadaran topologi diaktifkan pada node, penjadwalan GPU reguler tidak dapat diaktifkan. Untuk melanjutkan penjadwalan GPU reguler, jalankan perintah berikut untuk memodifikasi label node:

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

Langkah 5: Kelola model

  1. Masuk ke Konsol Pengembang AI
  2. Di panel navigasi kiri Konsol Pengembang AI, klik Model Manage.
  3. Pada halaman Model Manage, klik Create Model.

  4. Dalam kotak dialog Create, atur Model Name, Model Version, dan Job Name.

    Dalam contoh ini, Nama Model diatur ke fsahion-mnist-demo, Versi Model diatur ke v1, dan Nama Pekerjaan diatur ke tf-single.

  5. Klik OK. Model muncul di halaman.

    Create a model

    Jika Anda ingin mengevaluasi model, klik New Model Evaluate di kolom Operasi.

Langkah 6: Evaluasi model

Setelah Anda menginstal set komponen cloud-native, Anda dapat menggunakan Arena atau Konsol Pengembang AI untuk mengirimkan pekerjaan evaluasi. Dalam contoh ini, pekerjaan evaluasi dikirimkan untuk mengevaluasi checkpoint model yang dilatih berdasarkan dataset Fashion-MNIST. Prosedur:

  1. Gunakan Arena untuk mengirimkan pekerjaan pelatihan yang mengekspor checkpoint.

  2. Gunakan Arena untuk mengirimkan pekerjaan evaluasi.

  3. Gunakan Konsol Pengembang AI untuk membandingkan hasil evaluasi model yang berbeda.

  1. Kirimkan pekerjaan pelatihan yang mengekspor checkpoint.

    Jalankan perintah berikut untuk menggunakan Arena mengirimkan pekerjaan pelatihan yang mengekspor checkpoint ke fashion-demo-pvc:

    arena \
      submit \
      tfjob \
      -n demo-ns \ # Anda dapat mengubah namespace sesuai kebutuhan bisnis Anda.
      --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} \ # Nama pengguna repositori Git Anda.
      --env=GIT_SYNC_PASSWORD=${GIT_PASSWORD} \ # Kata sandi repositori 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.

    1. Bangun gambar yang digunakan untuk menerapkan pekerjaan.

      Dapatkan kode untuk evaluasi model. Jalankan perintah berikut di direktori kubeai-sdk untuk membuat dan mendorong gambar:

      docker build . -t ${DOCKER_REGISTRY}:fashion-mnist
      docker push ${DOCKER_REGISTRY}:fashion-mnist
    2. Jalankan perintah berikut untuk memeriksa Layanan yang memberikan akses ke MySQL:

      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 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 dari output pada langkah sebelumnya untuk mengakses MySQL.

  3. Bandingkan hasil evaluasi.

    1. Di panel navigasi kiri Konsol Pengembang AI, klik Model Manage.

      Model evaluation list

    2. Di bagian Job List, Anda dapat mengklik nama pekerjaan evaluasi untuk melihat metrik.

      Evaluation job metrics

      Anda juga dapat membandingkan metrik dari pekerjaan evaluasi yang berbeda.Compare the metrics of different evaluation jobs

Langkah 7: Terapkan model sebagai layanan

Setelah model dikembangkan dan dievaluasi, Anda dapat menerapkan model sebagai layanan. Langkah-langkah berikut menjelaskan cara menerapkan model sebelumnya sebagai layanan inferensi bernama tf-serving. Arena mendukung berbagai arsitektur layanan, seperti Triton dan Seldon. Untuk informasi lebih lanjut, lihat Panduan Arena Serve.

Dalam contoh ini, model yang dilatih di Langkah 4: Latih Model digunakan. Model disimpan dalam PVC fashion-minist-demo yang digunakan di Langkah 2: Buat Dataset. Jika Anda ingin menyimpan model ke jenis penyimpanan lain, Anda harus terlebih dahulu membuat PVC untuk jenis penyimpanan yang ingin Anda gunakan.

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

    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 memeriksa nama layanan inferensi yang Anda terapkan:

    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 alamat IP dan port di kolom ADDRESS dan PORTS untuk mengirim permintaan ke layanan inferensi dari dalam kluster.

  3. Buat notebook Jupyter di Jupyter dan gunakan notebook sebagai klien untuk mengirim permintaan HTTP ke layanan tf-serving.

    Dalam contoh ini, notebook Jupyter yang dibuat di Langkah 3: Kembangkan Model digunakan.

    • Tentukan 172.16.XX.XX sebagai nilai bidang server_ip dalam kode yang digunakan untuk menginisialisasi notebook. 172.16.XX.XX dikembalikan di kolom ADDRESS pada langkah sebelumnya.

    • Tentukan 8501 sebagai nilai bidang server_http_port dalam kode yang digunakan untuk menginisialisasi notebook. Port 8501 dikembalikan di kolom PORTS pada langkah sebelumnya dan digunakan untuk memanggil API RESTful.

    Contoh:

    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', 'Celana', 'Pullover', 'Gaun', 'Jaket',
                   'Sandal', 'Kemeja', 'Sneaker', 'Tas', 'Sepatu Boot Ankle']
    
    (train_images, train_labels), (test_images, test_labels) = load_data()
    train_images = train_images / 255.0
    test_images = test_images / 255.0
    
    # ubah bentuk untuk memberi makan ke dalam 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: {}, dari {}'.format(train_images.shape, train_images.dtype))
    print('test_images.shape: {}, dari {}'.format(test_images.shape, test_images.dtype))
    
    rando = random.randint(0,len(test_images)-1)
    #show(rando, 'Contoh Gambar: {}'.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, 'Model mengira ini adalah {} (kelas {}), dan sebenarnya ini adalah {} (kelas {})'.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('Model mengira ini adalah {} (kelas {}), dan sebenarnya ini adalah {} (kelas {})'.format(class_names[np.argmax(predictions[0])], np.argmax(predictions[0]), class_names[test_labels[0]], test_labels[0]))
        #show(0, 'Model mengira ini adalah {} (kelas {}), dan sebenarnya ini adalah {} (kelas {})'.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, 'Model mengira ini adalah {} (kelas {}), dan sebenarnya ini adalah {} (kelas {})'.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 Execute icon pada notebook. Output berikut dikembalikan:

    train_images.shape: (60000, 28, 28, 1), dari float64
    test_images.shape: (10000, 28, 28, 1), dari float64
    Data: {"signature_name": "serving_default", "instances": ...  [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]
        ]
    }
    Model mengira ini adalah Sepatu Boot Ankle (kelas 9), dan sebenarnya ini adalah Sepatu Boot Ankle (kelas 9)

FAQ

  • Bagaimana cara menginstal perangkat lunak yang sering digunakan di konsol notebook Jupyter?

    Untuk menginstal perangkat lunak yang sering digunakan di konsol notebook Jupyter, jalankan perintah berikut:

    apt-get install ${Software name}
  • Bagaimana cara memperbaiki masalah karakter kacau di konsol notebook Jupyter?

    Modifikasi file /etc/locale berdasarkan konten berikut dan kemudian 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=