Panduan ini menggunakan dataset open-source Fashion-MNIST untuk menunjukkan cara developer menggunakan Cloud Native AI Suite guna menjalankan beban kerja deep learning pada ACK, mengoptimalkan pelatihan terdistribusi, melakukan debug model, dan menerapkan model yang telah dilatih ke kluster.
Latar Belakang
Suite AI cloud-native menyediakan komponen yang dapat diterapkan secara independen (chart Helm K8s) untuk mempercepat rekayasa AI.
Suite AI cloud-native memiliki dua peran pengguna: administrator dan developer.
-
Administrator: Mengelola pengguna, izin, sumber daya kluster, penyimpanan eksternal, set data, dan memantau penggunaan kluster melalui dasbor.
-
Developer: Mengirimkan pekerjaan menggunakan sumber daya kluster. Memerlukan akun yang dibuat oleh administrator dengan izin yang diberikan. Menggunakan alat seperti Arena CLI dan Jupyter Notebook untuk pengembangan.
Prasyarat
Pastikan administrator telah menyelesaikan tugas-tugas berikut:
-
Kluster Kubernetes telah dibuat.
-
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.
-
-
Anda memiliki akses ke AI Dashboard.
-
Anda memiliki akses ke AI Developer Console.
CatatanMulai 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 termasuk dalam daftar putih dapat menginstal dan mengonfigurasi AI Console dari komunitas open-source. Untuk detailnya, lihat Open-source AI Console.
-
Set data Fashion MNIST telah diunduh dan diunggah ke OSS.
-
Anda memiliki URL repositori Git, username, dan password untuk kode pengujian.
-
Klien kubectl telah terhubung ke kluster.
Lingkungan tutorial
Gunakan suite AI cloud-native untuk mengembangkan, melatih, mempercepat, mengevaluasi, dan menerapkan beban kerja Fashion-MNIST pada kluster ACK Anda.
-
Seorang administrator harus terlebih dahulu menyelesaikan Langkah 1: Buat akun dan alokasikan sumber daya untuk developer dan Langkah 2: Buat set data. Anda kemudian dapat menyelesaikan langkah-langkah berikutnya.
-
Kirimkan perintah Arena dari terminal Jupyter Notebook (disarankan) atau server jump kluster.
Kluster yang digunakan dalam tutorial ini terdiri dari node-node berikut:
|
Hostname |
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 dapat:
-
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 mendapatkan sumber daya berikut:
-
Username dan password.
-
Kuota sumber daya.
-
Titik akhir AI Developer Console (jika Anda mengirimkan pekerjaan menggunakan konsol).
CatatanAI Console Alibaba Cloud, yang mencakup AI Developer Console dan O&M Console, akan menjadi fitur hanya untuk 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 termasuk dalam daftar putih, Anda dapat menginstal dan mengonfigurasi konsol suite AI dari komunitas open-source. Untuk instruksi konfigurasi lengkap, lihat Open-source AI Console.
-
Jika Anda mengirimkan pekerjaan menggunakan Arena CLI, peroleh kubeconfig untuk kluster. Untuk instruksi, lihat Peroleh kubeconfig dan hubungkan 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
-
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 -
Buat set data fashion-mnist.
kubectl create -f fashion-mnist.yaml -
Lihat status PV dan PVC.
-
Periksa status PV.
kubectl get pv fashion-mnist-jackwgOutput 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 ns1Output yang diharapkan:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE fashion-mnist-jackwg-pvc Bound fashion-mnist-jackwg 10Gi RWX oss 8h
Status PV dan PVC keduanya menunjukkan
Bound. -
Langkah 2: Buat set data terakselerasi
Administrator menggunakan AI Dashboard untuk mengakselerasi set data.
- Akses AI Dashboard sebagai administrator.
- Di panel navigasi kiri AI Dashboard, pilih .
-
Pada halaman Dataset List, klik Accelerate di kolom Actions untuk set data target.
Setelah Anda mengakselerasi 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 akselerasi selesai.
Langkah 3: Kembangkan model
Siapkan lingkungan pengembangan dengan Jupyter Notebook:
-
(Opsional) Buat Jupyter Notebook dari gambar kustom.
-
Kembangkan dan uji model Anda di Jupyter Notebook.
-
Dorong kode ke repositori Git dari Jupyter Notebook.
-
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-gambar tersebut tidak memenuhi kebutuhan Anda, Anda dapat membuat gambar kustom.
-
Buat file bernama
Dockerfileberdasarkan templat berikut.Lihat Buat dan gunakan notebook untuk persyaratan gambar kustom.
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 -
Bangun 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 -
Dorong 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 -
Buat rahasia tarik gambar untuk menarik gambar dari registri kontainer pribadi Anda.
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> -
Buat Jupyter Notebook di AI Developer Console.
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
- Akses AI Developer Console
- Di panel navigasi kiri AI Developer Console, klik Notebook.
-
Pada halaman Notebook, klik nama Jupyter Notebook target dengan Status Running.
-
Buka terminal baru dan jalankan perintah berikut untuk memverifikasi bahwa data berhasil dimount:
pwd /root/data ls -alhOutput 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 -
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()PentingDalam kode ini,
dataset_pathdanmodel_pathharus diatur ke path mount sumber data di Notebook. Hal ini memungkinkan Notebook mengakses set data yang dimount ke sistem file lokal. -
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
Dorong kode ke repositori Git Anda langsung dari Notebook.
-
Instal Git.
apt-get update apt-get install git -
Inisialisasi konfigurasi Git dan simpan kredensial Anda.
git config --global credential.helper store git pull ${YOUR_GIT_REPO} -
Dorong kode ke repositori Git.
git push origin fashion-testOutput 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
-
Instal dependensi untuk Arena SDK.
!pip install coloredlogs -
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") # The job is submitted to the demo-ns namespace. 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 of the Git repository. .with_envs({\ "GIT_SYNC_USERNAME":"USERNAME", \ # Username for the Git repository. "GIT_SYNC_PASSWORD":"PASSWORD",\ # Password for the Git repository. "TEST_TMPDIR":"/",\ })\ .with_command("python code/tensorflow-fashion-mnist-sample/tf-distributed-mnist.py").build() # If the training job already exists, delete it 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 # Wait for the training job to start running. 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 # get the training job logs logger = LoggerBuilder().with_accepter(sys.stdout).with_follow().with_since("5m") #jobInfo.get_instances()[0].get_logs(logger) # display the training job information print(str(jobInfo)) # delete the training job #client.training().delete(job_name, job_type) except ArenaException as e: print(e) main()-
namespace: Dalam contoh ini, pekerjaan pelatihan dikirimkan ke namespacedemo-ns. -
with_sync_source: URL repositori Git. -
with_envs: Username dan password untuk repositori Git.
-
-
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-contoh berikut mencakup pelatihan standalone, pelatihan terdistribusi, pelatihan yang dipercepat Fluid, dan penjadwalan yang sadar topologi dengan penjadwal pekerjaan AI.
Contoh 1: Kirimkan pekerjaan pelatihan TensorFlow standalone
Kirimkan pekerjaan pelatihan dengan 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
-
Tabel berikut menjelaskan beberapa parameter utama.
Parameter
Contoh
Wajib
Name
fashion-demo
Ya
Namespace
demo-ns
Ya
PersistentVolumeClaim
fashion-demo-pvc
Ya
Local storage directory
/root/data
Tidak
-
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
Local storage directory
/root/
Tidak
Private Git username
Username untuk repositori Git pribadi Anda.
Tidak
Private Git password or token
Password atau token akses pribadi untuk repositori Git pribadi Anda.
Tidak
-
Kirimkan pekerjaan pelatihan standalone.
Setelah Anda mengonfigurasi parameter pelatihan, klik Submit. Anda kemudian dapat melihat pekerjaan pelatihan di halaman Job List. Tabel berikut menjelaskan parameter pengiriman pekerjaan.
Parameter
Deskripsi
Task Name
Dalam contoh ini, nama pekerjaan adalah fashion-tf-ui.
Job type
Untuk contoh ini, pilih Tensorflow Standalone.
Namespace
Dalam contoh ini, gunakan demo-ns. Ini harus namespace yang sama dengan set data.
Data source configuration
Untuk contoh ini, pilih fashion-demo, yang dikonfigurasi di Langkah 1.
Code configuration
Untuk contoh ini, pilih fashion-git, yang dikonfigurasi di Langkah 2.
Code branch
Dalam contoh ini, gunakan master.
Command
Dalam 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 memberikan username dan password.
Instance count
Nilai default adalah 1.
Image
Dalam contoh ini, gunakan
tensorflow/tensorflow:2.2.2-gpu.Image pull secret
Jika Anda menggunakan gambar dari registri pribadi, Anda harus membuat image pull secret terlebih dahulu.
CPU (cores)
Nilai default adalah 4.
Memory (GB)
Nilai default adalah 8.
-
Setelah mengirimkan pekerjaan, lihat log-nya.
-
Di panel navigasi kiri AI Developer Console, klik Tasks.
-
Di halaman Tasks, klik nama pekerjaan target.
-
Di halaman detail pekerjaan, klik tab Instance. Kemudian, di kolom Actions untuk instance 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
-
-
Lihat metrik pelatihan di TensorBoard.
Teruskan port layanan TensorBoard ke mesin lokal Anda menggunakan kubectl port-forward.
-
Dapatkan detail layanan TensorBoard.
kubectl get svc -n demo-nsOutput 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 -
Teruskan port TensorBoard.
kubectl port-forward svc/tf-dist-arena-tensorboard -n demo-ns 6006:6006Output yang diharapkan:
Forwarding from 127.0.0.1:6006 -> 6006 Forwarding from [::1]:6006 -> 6006 Handling connection for 6006 Handling connection for 6006 -
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
-
Kirimkan 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" -
Dapatkan detail layanan TensorBoard.
kubectl get svc -n demo-nsOutput 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 -
Teruskan port TensorBoard.
kubectl port-forward svc/tf-dist-arena-tensorboard -n demo-ns 6006:6006Output yang diharapkan:
Forwarding from 127.0.0.1:6006 -> 6006 Forwarding from [::1]:6006 -> 6006 Handling connection for 6006 Handling connection for 6006 -
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
-
Menggunakan kembali data dari Langkah 1.
-
Konfigurasikan repositori kode sumber.
Menggunakan kembali kode dari Langkah 2.
-
Kirimkan pekerjaan pelatihan TensorFlow terdistribusi.
Setelah Anda 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.
Data source configuration
Dalam contoh ini, pilih fashion-demo, yang dikonfigurasi di Langkah 1 contoh sebelumnya.
Code configuration
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 melihat TensorBoard, ikuti langkah 2 hingga 4 di Metode 1: Gunakan Arena CLI.
Contoh 3: Kirimkan pekerjaan pelatihan yang dipercepat Fluid
Akselerasi set data dari konsol O&M, kirimkan pekerjaan dengan set data yang dipercepat, dan bandingkan waktu eksekusi:
-
Administrator mengakselerasi set data yang ada dari konsol O&M.
-
Developer mengirimkan pekerjaan pelatihan yang menggunakan set data yang dipercepat.
-
Bandingkan waktu eksekusi pekerjaan menggunakan perintah
arena list.
-
Akselerasi set data yang ada.
Lewati langkah ini jika Anda sudah mengakselerasi fashion-demo-pvc di Langkah 2: Buat set data. Lihat Kelola set data.
-
Kirimkan pekerjaan yang menggunakan set data yang dipercepat.
Kirimkan pekerjaan pelatihan ke namespace demo-ns. Perbedaan utama untuk set data yang dipercepat:
-
--data: Nama PersistentVolumeClaim (PVC) yang dipercepat. Dalam contoh ini, yaitufashion-demo-pvc-acc. -
--env=DATASET_PATH: Path ini dibentuk dengan menambahkan nama PVC (fashion-demo-pvc-acc) ke path mount (/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" -
-
Bandingkan waktu eksekusi kedua pekerjaan pelatihan.
arena list -n demo-nsOutput 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.8Dengan kode dan sumber daya yang sama, pekerjaan yang dipercepat Fluid selesai dalam 33 detik dibandingkan 3 menit untuk pekerjaan standar.
Contoh 4: Percepat pekerjaan pelatihan terdistribusi dengan menggunakan penjadwal pekerjaan AI
Penjadwal pekerjaan AI adalah plugin ACK untuk beban kerja AI dan data besar, yang mendukung Gang Scheduling, Capacity Scheduling, dan penjadwalan yang sadar topologi. Contoh ini menunjukkan penjadwalan yang sadar topologi GPU.
Penjadwal menggunakan informasi topologi tingkat node (tautan GPU seperti NVLink dan PCIe Switch, atau arsitektur CPU NUMA) untuk mengoptimalkan penjadwalan pekerjaan AI. Lihat Penjadwalan yang sadar topologi GPU dan Penjadwalan yang sadar topologi CPU.
Aktifkan penjadwalan yang sadar topologi GPU dan bandingkan kinerja pekerjaan.
-
Buat pekerjaan pelatihan tanpa penjadwalan yang sadar 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" -
Buat pekerjaan pelatihan dengan penjadwalan yang sadar topologi diaktifkan.
Beri label node. Ganti cn-beijing.192.168.XX.XX dengan nama node aktual Anda.
kubectl label node cn-beijing.192.168.XX.XX ack.node.gpu.schedule=topology --overwriteBuat pekerjaan pelatihan. Bendera
--gputopology=truemengaktifkan 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 -
Bandingkan kinerja kedua pekerjaan.
-
Bandingkan waktu eksekusi.
arena list -n demo-nsOutput 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 -
Lihat throughput pekerjaan yang sadar topologi.
arena logs tensorflow-topo-4-vgg16 -n demo-nsOutput yang diharapkan:
100 images/sec: 251.7 +/- 0.1 (jitter = 1.2) 7.262 ---------------------------------------------------------------- total images/sec: 1006.44 -
Lihat throughput pekerjaan standar.
arena logs tensorflow-4-vgg16-image-warned -n demo-nsOutput 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 yang sadar topologi diaktifkan |
251.7 |
1006.44 |
44 |
|
Penjadwalan yang sadar topologi dinonaktifkan |
56.4 |
225.50 |
120 |
Node dengan penjadwalan yang sadar topologi diaktifkan tidak lagi mendukung penjadwalan GPU standar. Untuk mengembalikannya, ubah label node:
kubectl label node cn-beijing.192.168.XX.XX0 ack.node.gpu.schedule=default --overwrite
Langkah 5: Kelola model
- Akses AI Developer Console
- Di panel navigasi kiri AI Developer Console, klik Model Manage.
-
Di halaman Model Management, klik Create Model.
-
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.
-
Klik OK. Model baru muncul dalam daftar.
Untuk mengevaluasi model, klik New Model Evaluation di baris model tersebut.
Langkah 6: Evaluasi model
Kirimkan pekerjaan evaluasi model dengan Arena atau AI Developer Console. Contoh ini mengevaluasi checkpoint dari pelatihan Fashion-MNIST:
-
Kirimkan pekerjaan pelatihan dengan checkpointing diaktifkan menggunakan Arena.
-
Kirimkan pekerjaan evaluasi model menggunakan Arena.
-
Bandingkan hasil evaluasi di AI Developer Console.
-
Kirimkan pekerjaan pelatihan dengan checkpointing diaktifkan.
Kirimkan pekerjaan pelatihan dengan Arena. Pekerjaan ini menghasilkan checkpoint ke volume
fashion-demo-pvc.arena \ submit \ tfjob \ -n demo-ns \ # Set the namespace as needed. --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} \ # Enter your Git username. --env=GIT_SYNC_PASSWORD=${GIT_PASSWORD} \ # Enter your Git password. --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" -
Kirimkan pekerjaan evaluasi model.
-
Bangun gambar evaluasi.
Di direktori kubeai-sdk, jalankan perintah berikut untuk membangun dan mendorong gambar.
docker build . -t ${DOCKER_REGISTRY}:fashion-mnist docker push ${DOCKER_REGISTRY}:fashion-mnist -
Dapatkan detail layanan MySQL.
kubectl get svc -n kube-ai ack-mysqlOutput yang diharapkan:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ack-mysql ClusterIP 172.16.XX.XX <none> 3306/TCP 28h -
Kirimkan pekerjaan evaluasi model dengan 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"CatatanAnda dapat memperoleh alamat IP dan port layanan MySQL dari langkah sebelumnya.
-
-
Bandingkan hasil evaluasi.
-
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.
-
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: Terapkan model
Terapkan model yang telah Anda latih sebagai layanan inferensi TensorFlow Serving. Arena juga mendukung framework lain seperti Triton dan Seldon (lihat dokumentasi serve Arena).
Contoh ini menggunakan model dari Langkah 4, yang disimpan dalam PVC fashion-demo-pvc dari Langkah 2. Jika model Anda menggunakan jenis penyimpanan berbeda, buat PVC yang sesuai terlebih dahulu.
-
Terapkan 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 -
Dapatkan nama layanan inferensi yang diterapkan.
arena serve list -n demo-nsOutput yang diharapkan:
NAME TYPE VERSION DESIRED AVAILABLE ADDRESS PORTS GPU fashion-mnist Tensorflow 202111031203 1 1 172.16.XX.XX GRPC:8500,RESTFUL:8501 1Anda dapat menggunakan nilai ADDRESS dan PORTS dalam output untuk memanggil layanan dari dalam kluster.
-
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_ipdengan ADDRESS (172.16.XX.XX) yang dikembalikan pada langkah sebelumnya. -
Atur
server_http_portke 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 yang rusak 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=