Esta guía utiliza el conjunto de datos de código abierto Fashion-MNIST para mostrar cómo los desarrolladores usan Cloud Native AI Suite. Aprenderá a ejecutar cargas de trabajo de aprendizaje profundo en ACK, optimizar el entrenamiento distribuido, depurar modelos y desplegar el modelo entrenado en el clúster.
Contexto
El paquete de IA nativa de la nube ofrece componentes que se despliegan de forma independiente (K8s Helm charts) para acelerar la ingeniería de IA.
Cloud Native AI Suite cuenta con dos roles de usuario: administrador y desarrollador.
Administrador: gestiona usuarios, permisos, recursos del clúster, almacenamiento externo y conjuntos de datos. También supervisa el uso del clúster mediante el panel de control.
Desarrollador: envía trabajos con los recursos del clúster. Requiere una cuenta creada por un administrador con los permisos correspondientes. Para desarrollar, utiliza herramientas como Arena CLI y Jupyter Notebook.
Requisitos previos
Asegúrese de que un administrador haya completado las siguientes tareas:
-
Un Kubernetes cluster is created.
Cada nodo del clúster tiene como mínimo 300 GB de espacio en disco.
Para obtener los mejores resultados de aceleración de datos, utilice cuatro instancias, cada una equipada con ocho GPU V100.
Para lograr los mejores resultados de detección de topología, utilice dos instancias V100.
Tiene acceso al AI Dashboard.
-
Tiene acceso al AI Developer Console.
NotaA partir del 22 de enero de 2025, la AI Console de Alibaba Cloud, que incluye AI Developer Console y AI Dashboard, será una función disponible solo por lista blanca. Este cambio no afecta los despliegues existentes. Los usuarios que no estén en la lista blanca pueden instalar y configurar AI Console desde la comunidad de código abierto. Para más detalles, consulte AI Console de código abierto.
Se descargó el conjunto de datos Fashion MNIST y uploaded to OSS.
Cuenta con la URL del repositorio de Git, el nombre de usuario y la contraseña del código de prueba.
Un cliente kubectl está connected to the cluster.
Entorno del tutorial
Utilice Cloud Native AI Suite para desarrollar, entrenar, acelerar, evaluar y desplegar una carga de trabajo Fashion-MNIST en su clúster de ACK.
Primero, un administrador debe completar Step 1: Create an account and allocate resources for the developer y Step 2: Create a dataset. Después podrá continuar con los pasos restantes.
Envíe comandos de Arena desde una terminal de Jupyter Notebook (recomendado) o desde un servidor de salto del clúster.
El clúster utilizado en este tutorial consta de los siguientes nodos:
|
Nombre del host |
IP |
Rol |
GPU |
vCPU |
Memoria |
|
cn-beijing.192.168.0.13 |
192.168.0.13 |
servidor de salto |
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 |
Objetivos
Al terminar esta guía, usted podrá:
Gestionar un conjunto de datos.
Configurar un entorno de desarrollo con Jupyter Notebook.
Enviar un trabajo de entrenamiento independiente.
Enviar un trabajo de entrenamiento distribuido.
Acelerar un trabajo de entrenamiento con Fluid.
Acelerar un trabajo de entrenamiento con ACK AI Task Scheduler.
Gestionar un modelo.
Evaluar un modelo.
Desplegar un servicio de inference.
Paso 1: crear una cuenta y asignar recursos
Solicite a su administrador los siguientes recursos:
Un nombre de usuario y una contraseña.
Una cuota de recursos.
-
El endpoint de AI Developer Console (si envía trabajos mediante la consola).
NotaLa AI Console de Alibaba Cloud, que incluye AI Developer Console y O&M Console, será una función restringida por lista de permitidos a partir del 22 de enero de 2025. Si ya desplegó AI Developer Console u O&M Console antes de esa fecha, su uso no se verá afectado. Si no está en la lista de permitidos, puede instalar y configurar la consola del paquete de IA desde la comunidad de código abierto. Para ver las instrucciones detalladas de configuración, consulte AI Console de código abierto.
Si envía un trabajo con Arena CLI, obtenga el archivo kubeconfig del clúster. Para consultar las instrucciones, vea Obtain the kubeconfig and connect to a cluster.
Paso 2: crear un conjunto de datos
Los administradores gestionan los conjuntos de datos. Este ejemplo utiliza el conjunto de datos fashion-mnist.
Paso 1: crear el conjunto de datos fashion-mnist
-
Cree el archivo fashion-mnist.yaml con base en el siguiente ejemplo de YAML.
Este ejemplo crea un volumen persistente (PV) y una solicitud de volumen persistente (PVC) de tipo 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 -
Cree el conjunto de datos fashion-mnist.
kubectl create -f fashion-mnist.yaml -
Consulte el estado del PV y del PVC.
-
Compruebe el estado del PV.
kubectl get pv fashion-mnist-jackwgSalida esperada:
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 -
Compruebe el estado del PVC.
kubectl get pvc fashion-mnist-jackwg-pvc -n ns1Salida esperada:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE fashion-mnist-jackwg-pvc Bound fashion-mnist-jackwg 10Gi RWX oss 8h
Tanto el PV como el PVC muestran el estado
Bound. -
Paso 2: crear un conjunto de datos acelerado
Los administradores utilizan AI Dashboard para acelerar los conjuntos de datos.
Access the AI Dashboard como administrador.
En el panel de navegación izquierdo de AI Dashboard, seleccione .
-
En la página Dataset List, haga clic en Accelerate en la columna Actions del conjunto de datos deseado.
Una vez que acelera el conjunto de datos, su información se actualiza en la página Dataset List. La lista incluye columnas como Task name, Namespace, Data source, Accelerated y Status. Para el conjunto de datos acelerado, la columna Accelerated muestra Sí y su Status cambia de NotReady a Ready cuando finaliza la aceleración.
Paso 3: desarrollar el modelo
Configure un entorno de desarrollo con Jupyter Notebook:
(Opcional) Cree un Jupyter Notebook a partir de una imagen personalizada.
Desarrolle y pruebe su modelo en un Jupyter Notebook.
Envíe el código a un repositorio de Git desde Jupyter Notebook.
Envíe un trabajo de entrenamiento con Arena SDK.
(Opcional) Paso 1: crear un notebook a partir de una imagen personalizada
AI Developer Console proporciona Jupyter Notebooks con imágenes precompiladas para distintas versiones de TensorFlow y PyTorch. Si estas imágenes no cubren sus necesidades, cree una imagen personalizada.
-
Cree un archivo llamado
Dockerfilecon base en la siguiente plantilla.Consulte Create and use notebooks para conocer los requisitos de las imágenes personalizadas.
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 -
Compile la imagen a partir del Dockerfile.
docker build -f dockerfile .Salida esperada:
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 -
Envíe la imagen a su registro de contenedores.
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 -
Cree un secret de extracción de imágenes para descargar la imagen desde su registro de contenedores privado.
Consulte Crear un Secret para extraer una imagen de un registro privado.
kubectl create secret docker-registry regcred \ --docker-server=<your-registry-server> \ --docker-username=<your-username> \ --docker-password=<your-password> \ --docker-email=<your-email-address> -
Cree un Jupyter Notebook en AI Developer Console.
Consulte Create and use notebooks.
Configure los parámetros del Jupyter Notebook de la siguiente manera: en la sección Notebook Basic Information de la izquierda, establezca Notebook Name y Notebook Image (puede elegir una imagen personalizada), y especifique Namespace e Image Pull Secret. En Data Configuration, seleccione el conjunto de datos para mostrar la solicitud de volumen persistente y el directorio de almacenamiento local correspondientes. Si habilita Workspace PVC, debe especificar Target PVC y Mount Path. En la sección Notebook Resource Configuration de la derecha, configure CPU (Cores), Memory (GB) y GPU (Units). Cuando termine la configuración, haga clic en Create Notebook.
Paso 2: desarrollar y probar en un notebook
En el panel de navegación izquierdo de AI Developer Console, haga clic en Notebook.
En la página Notebook, haga clic en el nombre del Jupyter Notebook deseado cuyo Status sea Running.
-
Abra una nueva terminal y ejecute los siguientes comandos para comprobar que los datos se montaron correctamente:
pwd /root/data ls -alhSalida esperada:
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 -
En su entorno de Jupyter Notebook, cree un nuevo archivo de notebook para desarrollar el modelo fashion-mnist e inicialícelo con el siguiente código:
#!/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()ImportanteEn el código,
dataset_pathymodel_pathdeben apuntar a las rutas de montaje del origen de datos en el Notebook. Así, el Notebook podrá acceder al conjunto de datos montado en el sistema de archivos local. -
En el Notebook correspondiente, haga clic en el ícono
para ejecutar el código.Salida esperada:
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
Paso 3: enviar el código a un repositorio de Git
Envíe el código a su repositorio de Git directamente desde el Notebook.
-
Instale Git.
apt-get update apt-get install git -
Inicialice la configuración de Git y almacene sus credenciales.
git config --global credential.helper store git pull ${YOUR_GIT_REPO} -
Envíe el código al repositorio de Git.
git push origin fashion-testSalida esperada:
Total 0 (delta 0), reused 0 (delta 0) To codeup.aliyun.com:60b4cf5c66bba1c04b442e49/tensorflow-fashion-mnist-sample.git * [new branch] fashion-test -> fashion-test
Paso 4: enviar un trabajo de entrenamiento con Arena SDK
-
Instale las dependencias de Arena SDK.
!pip install coloredlogs -
Cree un nuevo archivo de Python e inicialícelo con el siguiente código:
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: en este ejemplo, el trabajo de entrenamiento se envía al namespacedemo-ns.with_sync_source: la URL del repositorio de Git.with_envs: el nombre de usuario y la contraseña del repositorio de Git.
-
En el Notebook correspondiente, haga clic en el ícono
para ejecutar el código.Salida esperada:
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" }
Paso 4: Entrenar el modelo
A continuación se presentan ejemplos que abarcan el entrenamiento independiente, el entrenamiento distribuido, el entrenamiento acelerado con Fluid y la programación consciente de topología mediante el programador de trabajos de IA.
Ejemplo 1: Enviar un trabajo de entrenamiento independiente de TensorFlow
Envíe un trabajo de entrenamiento con la CLI de Arena o con AI Developer Console.
Método 1: Usar la CLI de Arena
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"
Método 2: Usar AI Developer Console
-
La siguiente tabla describe algunos de los parámetros clave.
Parámetro
Ejemplo
Obligatorio
Name
fashion-demo
Sí
Namespace
demo-ns
Sí
PersistentVolumeClaim
fashion-demo-pvc
Sí
Local storage directory
/root/data
No
-
Configure a source code repository.
Parámetro
Ejemplo
Obligatorio
Name
fashion-git
Sí
Git URL
https://codeup.aliyun.com/60b4cf5c66bba1c04b442e49/tensorflow-fashion-mnist-sample.git
Sí
Default branch
master
No
Local storage directory
/root/
No
Private Git username
El nombre de usuario de su repositorio Git privado.
No
Private Git password or token
La contraseña o el token de acceso personal de su repositorio Git privado.
No
-
Submit a standalone training job.
Después de configurar los parámetros de entrenamiento, haga clic en Submit. Luego podrá consultar el trabajo de entrenamiento en la página Job List. La siguiente tabla describe los parámetros para enviar el trabajo.
Parámetro
Descripción
Task Name
En este ejemplo, el nombre del trabajo es fashion-tf-ui.
Job type
Para este ejemplo, seleccione Tensorflow Standalone.
Namespace
En este ejemplo, utilice demo-ns. Debe ser el mismo namespace que el del conjunto de datos.
Data source configuration
Para este ejemplo, seleccione fashion-demo, configurado en Step 1.
Code configuration
Para este ejemplo, seleccione fashion-git, configurado en Step 2.
Code branch
En este ejemplo, utilice master.
Command
En este ejemplo, utilice
"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
Si utiliza un repositorio privado, debe proporcionar el nombre de usuario y la contraseña.
Instance count
El valor predeterminado es 1.
Image
En este ejemplo, utilice
tensorflow/tensorflow:2.2.2-gpu.Image pull secret
Si utiliza una imagen de un registro privado, primero debe crear un image pull secret.
CPU (cores)
El valor predeterminado es 4.
Memory (GB)
El valor predeterminado es 8.
Consulte Parámetros de la CLI de Arena para TFJob.
-
Una vez enviado el trabajo, consulte sus registros.
En el panel de navegación izquierdo de AI Developer Console, haga clic en Tasks.
En la página Tasks, haga clic en el nombre del trabajo objetivo.
-
En la página de detalles del trabajo, haga clic en la pestaña Instance. Después, en la columna Actions de la instancia objetivo, haga clic en Logs.
El siguiente fragmento muestra la salida de registros de este ejemplo:
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
-
Consulte las métricas de entrenamiento en TensorBoard.
Reenvíe el puerto del servicio de TensorBoard a su computadora local mediante kubectl port-forward.
-
Obtenga los detalles del servicio de TensorBoard.
kubectl get svc -n demo-nsSalida esperada:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE tf-dist-arena-tensorboard NodePort 172.16.XX.XX <none> 6006:32226/TCP 80m -
Reenvíe el puerto de TensorBoard.
kubectl port-forward svc/tf-dist-arena-tensorboard -n demo-ns 6006:6006Salida esperada:
Forwarding from 127.0.0.1:6006 -> 6006 Forwarding from [::1]:6006 -> 6006 Handling connection for 6006 Handling connection for 6006 -
En un navegador web, abra
http://localhost:6006/para consultar el panel de TensorBoard.La pestaña GRAPHS muestra el grafo computacional del modelo, donde se aprecian las conexiones y el flujo de datos entre capas como Conv1, flatten y Softmax. El panel lateral proporciona las propiedades detalladas del nodo seleccionado.
-
Ejemplo 2: Enviar un trabajo de entrenamiento distribuido de TensorFlow
Método 1: Usar la CLI de Arena
-
Envíe el trabajo de entrenamiento.
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" -
Obtenga los detalles del servicio de TensorBoard.
kubectl get svc -n demo-nsSalida esperada:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE tf-dist-arena-tensorboard NodePort 172.16.204.248 <none> 6006:32226/TCP 80m -
Reenvíe el puerto de TensorBoard.
kubectl port-forward svc/tf-dist-arena-tensorboard -n demo-ns 6006:6006Salida esperada:
Forwarding from 127.0.0.1:6006 -> 6006 Forwarding from [::1]:6006 -> 6006 Handling connection for 6006 Handling connection for 6006 -
En un navegador web, abra
http://localhost:6006/para consultar el panel de TensorBoard.La pestaña SCALARS muestra gráficas de métricas como accuracy y cross_entropy durante el entrenamiento. En el panel lateral puede filtrar por ejecuciones de train y test, además de ajustar las opciones de visualización de Smoothing y de los ejes.
Método 2: Usar AI Developer Console
-
Reutiliza los datos de Step 1.
-
Configure a source code repository.
Reutiliza el código de Step 2.
-
Submit the distributed TensorFlow training job.
Después de configurar los parámetros de entrenamiento, haga clic en Submit. Luego podrá consultar el trabajo en la página Job List. La siguiente tabla describe los parámetros clave del trabajo.
Parámetro
Descripción
Task Name
En este ejemplo, utilice fashion-ps-ui.
Job type
Seleccione TF Distributed.
Namespace
En este ejemplo, utilice demo-ns. Debe ser el mismo namespace que el del conjunto de datos.
Data source configuration
Para este ejemplo, seleccione fashion-demo, configurado en Step 1 del ejemplo anterior.
Code configuration
Para este ejemplo, seleccione fashion-git, configurado en Step 2 del ejemplo anterior.
Command
En este ejemplo, utilice
" export TEST_TMPDIR=/root/ && python code/tensorflow-fashion-mnist-sample/tf-distributed-mnist.py --log_dir=/training_logs".Image
En Task Resource Configuration, dentro de la pestaña Worker, establezca Image como
tensorflow/tensorflow:1.5.0-devel-gpu.En Task Resource Configuration, dentro de la pestaña PS, establezca Image como
tensorflow/tensorflow:1.5.0-devel.
Consulte Parámetros de la CLI de Arena para TFJob.
Para consultar TensorBoard, siga los pasos 2 al 4 del apartado Método 1: Usar la CLI de Arena.
Ejemplo 3: Enviar un trabajo de entrenamiento acelerado con Fluid
Acelere un conjunto de datos desde la consola de operaciones y mantenimiento, envíe un trabajo con dicho conjunto de datos y compare los tiempos de ejecución:
Un administrador acelera un conjunto de datos existente desde la consola de operaciones y mantenimiento.
Un desarrollador envía un trabajo de entrenamiento que utiliza el conjunto de datos acelerado.
Compare los tiempos de ejecución de los trabajos con el comando
arena list.
-
Acelere un conjunto de datos existente.
Omita este paso si ya aceleró fashion-demo-pvc en Step 2: Create a dataset. Consulte Manage datasets.
-
Envíe un trabajo que utilice el conjunto de datos acelerado.
Envíe el trabajo de entrenamiento al namespace demo-ns. Estas son las diferencias clave para los conjuntos de datos acelerados:
--data: el nombre del PersistentVolumeClaim (PVC) acelerado. En este ejemplo, esfashion-demo-pvc-acc.--env=DATASET_PATH: esta ruta se forma al agregar el nombre del PVC (fashion-demo-pvc-acc) a la ruta de montaje (/root/data/) especificada en el parámetro--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" -
Compare los tiempos de ejecución de ambos trabajos de entrenamiento.
arena list -n demo-nsSalida esperada:
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.8Con el mismo código y los mismos recursos, el trabajo acelerado con Fluid finalizó en 33 segundos, mientras que el trabajo estándar tardó 3 minutos.
Ejemplo 4: Acelerar un trabajo de entrenamiento distribuido con el programador de trabajos de IA
El programador de trabajos de IA es un plugin de ACK diseñado para cargas de trabajo de IA y big data. Admite Gang Scheduling, Capacity Scheduling y programación consciente de topología. Este ejemplo demuestra la programación consciente de topología de GPU.
El programador utiliza información de topología a nivel de nodo (enlaces de GPU como NVLink y PCIe Switch, o la arquitectura NUMA de CPU) para optimizar la programación de los trabajos de IA. Consulte GPU topology-aware scheduling y CPU topology-aware scheduling.
Habilite la programación consciente de topología de GPU y compare el rendimiento de los trabajos.
-
Cree un trabajo de entrenamiento sin programación consciente de topología.
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" -
Cree un trabajo de entrenamiento con la programación consciente de topología habilitada.
Etiquete el nodo. Reemplace cn-beijing.192.168.XX.XX por el nombre real de su nodo.
kubectl label node cn-beijing.192.168.XX.XX ack.node.gpu.schedule=topology --overwriteCree el trabajo de entrenamiento. La bandera
--gputopology=truehabilita la detección de topología en 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 -
Compare el rendimiento de ambos trabajos.
-
Compare los tiempos de ejecución.
arena list -n demo-nsSalida esperada:
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 -
Consulte el rendimiento del trabajo con detección de topología.
arena logs tensorflow-topo-4-vgg16 -n demo-nsSalida esperada:
100 images/sec: 251.7 +/- 0.1 (jitter = 1.2) 7.262 ---------------------------------------------------------------- total images/sec: 1006.44 -
Consulte el rendimiento del trabajo estándar.
arena logs tensorflow-4-vgg16-image-warned -n demo-nsSalida esperada:
100 images/sec: 56.4 +/- 0.2 (jitter = 1.5) 7.261 ---------------------------------------------------------------- total images/sec: 225.50
-
La siguiente tabla resume la comparación de rendimiento entre ambos trabajos.
|
Trabajo de entrenamiento |
Rendimiento por GPU (imágenes/seg) |
Rendimiento total de GPU (imágenes/seg) |
Duración (segundos) |
|
Programación consciente de topología habilitada |
251.7 |
1006.44 |
44 |
|
Programación consciente de topología deshabilitada |
56.4 |
225.50 |
120 |
Un nodo con la programación consciente de topología habilitada deja de admitir la programación estándar de GPU. Para restaurarla, modifique la etiqueta del nodo:
kubectl label node cn-beijing.192.168.XX.XX0 ack.node.gpu.schedule=default --overwrite
Paso 5: Gestionar el modelo
En el panel de navegación izquierdo de AI Developer Console, haga clic en Model Manage.
En la página Model Management, haga clic en Create Model.
-
En el cuadro de diálogo Create, configure Model Name, Model Version y Job Name.
En este ejemplo, el nombre del modelo es fashion-mnist-demo, la versión del modelo es v1 y el trabajo de entrenamiento es tf-single.
-
Haga clic en OK. El nuevo modelo aparecerá en la lista.
Para evaluar el modelo, haga clic en New Model Evaluation en la fila correspondiente.
Paso 6: Evaluar el modelo
Envíe trabajos de evaluación de modelos con Arena o con AI Developer Console. Este ejemplo evalúa un checkpoint del entrenamiento de Fashion-MNIST:
Envíe un trabajo de entrenamiento con la generación de checkpoints habilitada mediante Arena.
Envíe un trabajo de evaluación del modelo mediante Arena.
Compare los resultados de la evaluación en AI Developer Console.
-
Envíe un trabajo de entrenamiento con la generación de checkpoints habilitada.
Envíe un trabajo de entrenamiento con Arena. El trabajo guardará los checkpoints en el volumen
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" -
Envíe un trabajo de evaluación del modelo.
-
Compile la imagen de evaluación.
En el directorio kubeai-sdk, ejecute los siguientes comandos para compilar y enviar la imagen.
docker build . -t ${DOCKER_REGISTRY}:fashion-mnist docker push ${DOCKER_REGISTRY}:fashion-mnist -
Obtenga los detalles del servicio de MySQL.
kubectl get svc -n kube-ai ack-mysqlSalida esperada:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ack-mysql ClusterIP 172.16.XX.XX <none> 3306/TCP 28h -
Envíe un trabajo de evaluación del modelo con 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"NotaPuede obtener la dirección IP y el puerto del servicio de MySQL en el paso anterior.
-
-
Compare los resultados de la evaluación.
-
En el panel de navegación izquierdo de AI Developer Console, haga clic en Model Management.
La página muestra una lista de trabajos de evaluación de modelos. La lista incluye columnas como Name, Model name, Model version, Namespace, Status, Creation time y End time. Para los trabajos finalizados, la columna Status muestra Complete. Puede comparar los resultados de varios trabajos si hace clic en el botón Compare Metrics en la parte superior de la página.
-
En Tasks, haga clic en el nombre de un trabajo para consultar sus métricas.
Los resultados de la evaluación muestran las siguientes métricas: accuracy, precision, recall, F1_score y AUC. Una curva ROC también permite visualizar el rendimiento de clasificación del modelo.
Un gráfico de barras compara visualmente el rendimiento de los trabajos seleccionados con base en métricas como AUC y accuracy.
-
Paso 7: Desplegar el modelo
Despliegue el modelo entrenado como un servicio de inference de TensorFlow Serving. Arena también admite otros frameworks como Triton y Seldon (consulte Documentación de Arena serve).
Este ejemplo utiliza el modelo de Step 4, almacenado en el PVC fashion-demo-pvc de Step 2. Si su modelo usa un tipo de almacenamiento distinto, cree primero el PVC correspondiente.
-
Despliegue el modelo de TensorFlow en TensorFlow Serving con 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 -
Obtenga el nombre del servicio de inference desplegado.
arena serve list -n demo-nsSalida esperada:
NAME TYPE VERSION DESIRED AVAILABLE ADDRESS PORTS GPU fashion-mnist Tensorflow 202111031203 1 1 172.16.XX.XX GRPC:8500,RESTFUL:8501 1Utilice los valores de ADDRESS y PORTS de la salida para invocar el servicio desde dentro del clúster.
-
En Jupyter, cree un nuevo archivo Notebook para enviar solicitudes al servicio HTTP de TensorFlow Serving.
Este ejemplo utiliza el Jupyter Notebook creado en Step 3: Develop the model para enviar las solicitudes.
En el siguiente código de inicialización, reemplace el valor de
server_ippor el valor de ADDRESS (172.16.XX.XX) obtenido en el paso anterior.Establezca
server_http_portcon el puerto RESTFUL (8501) obtenido en el paso anterior.
El código de inicialización del archivo Notebook es el siguiente:
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)Haga clic en el ícono
en Jupyter Notebook para ver a continuación la salida: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)
Preguntas frecuentes
-
¿Cómo instalo software en la consola de Jupyter Notebook?
Para instalar software, ejecute el siguiente comando en la consola de Jupyter Notebook.
apt-get install <software-name> -
¿Cómo corrijo los caracteres ilegibles en la consola de Jupyter Notebook?
Edite el archivo /etc/locale para que contenga lo siguiente y luego vuelva a abrir la 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=