Uso de un algoritmo personalizado para crear un modelo de reconocimiento de dígitos escrito a mano
En esta sección se describe cómo modificar un algoritmo local personalizado para entrenar y desplegar los modelos de ModelArts.
Escenarios
En este caso se describe cómo utilizar PyTorch 1.8 para reconocer imágenes de dígitos manuales. En este caso, se utiliza un conjunto de datos oficial del MNIST.
A través de este caso, puede aprender a entrenar trabajos, desplegar un modelo de inferencia y realizar predicciones sobre ModelArts.
Proceso
Antes de realizar las siguientes operaciones, consulte Preparaciones para completar las operaciones necesarias.
- Paso 1 Preparar los datos de entrenamiento: Descargar el conjunto de datos del MNIST.
- Paso 2 Preparar los archivos de entrenamiento y de inferencia: Escribir código de entrenamiento y de inferencia.
- Paso 3 Crear un bucket de OBS y cargar archivos a OBS: Crear un bucket y una carpeta de OBS y cargue el conjunto de datos, el script de entrenamiento, el script de inferencia y el archivo de configuración de inferencia en OBS.
- Paso 4 Crear un trabajo de entrenamiento: Entrenar un modelo.
- Paso 5: Desplegar el modelo para la inferencia: importar el modelo entrenado a ModelArts, crear una aplicación de IA y desplegar la aplicación de IA como un servicio en tiempo real.
- Paso 6 Realizar una predicción: cargar una imagen de dígitos manuales y enviar una solicitud de inferencia para obtener el resultado de la inferencia.
- Paso 7 Lanzar recursos: Detener el servicio y eliminar los datos del OBS para detener la facturación.
Preparaciones
- Ha creado un ID de Huawei y ha habilitado los servicios en Huawei Cloud. Además, la cuenta no está en mora ni congelada.
- Configurar una delegación.
Para utilizar ModelArts, se requiere acceso al Object Storage Service (OBS), SoftWare Repository for Container (SWR) e Intelligent EdgeFabric (IEF). Si es la primera vez que utiliza ModelArts, configure una delegación para autorizar el acceso a estos servicios.
- Inicie sesión en la consola de ModelArts con su cuenta de Huawei Cloud. En el panel de navegación de la izquierda, seleccione Settings. En la página Global Configuration, haga clic en Add Authorization.
- Configure los parámetros de la siguiente manera en la página mostrada:
Agency: Add agency.
Permissions: Common User.
Seleccione "I have read and agree to the ModelArts Service Statement" (He leído y acepto la declaración de servicio de ModelArts) y haga clic en Create.Figura 1 Configuración de una delegación - Después de la configuración, consulte las configuraciones de delegación de su cuenta en la página Global Configuration.
Figura 2 Consulta de configuraciones de agencias
Paso 1 Preparar los datos de entrenamiento
En este caso se utiliza un conjunto de datos del MNIST descargado del sitio web oficial de MNIST. Asegúrese de que los cuatro archivos estén todos descargados.

- train-images-idx3-ubyte.gz: paquete comprimido del conjunto de entrenamiento, que contiene 60,000 muestras.
- train-labels-idx1-ubyte.gz: paquete comprimido de las etiquetas del conjunto de entrenamiento, que contiene las etiquetas de 60,000 muestras
- t10k-images-idx3-ubyte.gz: paquete comprimido del conjunto de validación, que contiene 10,000 muestras.
- t10k-labels-idx1-ubyte.gz: paquete comprimido de las etiquetas del conjunto de validación, que contiene las etiquetas de 10,000 muestras
Si se le pide que introduzca la información de inicio de sesión después de hacer clic en el enlace del sitio web oficial del MNIST, copie y pegue este enlace en el cuadro de direcciones de su navegador: http://yann.lecun.com/exdb/mnist/.
La información de inicio de sesión es necesaria cuando se abre el enlace en modo de HTTPS, que no es necesaria si se abre el enlace en modo de HTTP.
Paso 2 Preparar los archivos de entrenamiento y de inferencia
En este caso, ModelArts proporciona el script de entrenamiento, el script de inferencia y el archivo de configuración de inferencia.
Cuando pegue código desde un archivo .py, cree un archivo .py. De lo contrario, se puede aparece el mensaje de error "SyntaxError: 'gbk' codec can't decode byte 0xa4 in position 324: illegal multibyte sequence".
Cree el script de entrenamiento train.py en el host local. El contenido es el siguiente:
# base on https://github.com/pytorch/examples/blob/main/mnist/main.py from __future__ import print_function import os import gzip import codecs import argparse from typing import IO, Union import numpy as np import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim from torchvision import datasets, transforms from torch.optim.lr_scheduler import StepLR import shutil # Define a network model. class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(1, 32, 3, 1) self.conv2 = nn.Conv2d(32, 64, 3, 1) self.dropout1 = nn.Dropout(0.25) self.dropout2 = nn.Dropout(0.5) self.fc1 = nn.Linear(9216, 128) self.fc2 = nn.Linear(128, 10) def forward(self, x): x = self.conv1(x) x = F.relu(x) x = self.conv2(x) x = F.relu(x) x = F.max_pool2d(x, 2) x = self.dropout1(x) x = torch.flatten(x, 1) x = self.fc1(x) x = F.relu(x) x = self.dropout2(x) x = self.fc2(x) output = F.log_softmax(x, dim=1) return output # Train the model. Set the model to the training mode, load the training data, calculate the loss function, and perform gradient descent. def train(args, model, device, train_loader, optimizer, epoch): model.train() for batch_idx, (data, target) in enumerate(train_loader): data, target = data.to(device), target.to(device) optimizer.zero_grad() output = model(data) loss = F.nll_loss(output, target) loss.backward() optimizer.step() if batch_idx % args.log_interval == 0: print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format( epoch, batch_idx * len(data), len(train_loader.dataset), 100. * batch_idx / len(train_loader), loss.item())) if args.dry_run: break # Validate the model. Set the model to the validation mode, load the validation data, and calculate the loss function and accuracy. def test(model, device, test_loader): model.eval() test_loss = 0 correct = 0 with torch.no_grad(): for data, target in test_loader: data, target = data.to(device), target.to(device) output = model(data) test_loss += F.nll_loss(output, target, reduction='sum').item() pred = output.argmax(dim=1, keepdim=True) correct += pred.eq(target.view_as(pred)).sum().item() test_loss /= len(test_loader.dataset) print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format( test_loss, correct, len(test_loader.dataset), 100. * correct / len(test_loader.dataset))) # The following is PyTorch MNIST. # https://github.com/pytorch/vision/blob/v0.9.0/torchvision/datasets/mnist.py def get_int(b: bytes) -> int: return int(codecs.encode(b, 'hex'), 16) def open_maybe_compressed_file(path: Union[str, IO]) -> Union[IO, gzip.GzipFile]: """Return a file object that possibly decompresses 'path' on the fly. Decompression occurs when argument `path` is a string and ends with '.gz' or '.xz'. """ if not isinstance(path, torch._six.string_classes): return path if path.endswith('.gz'): return gzip.open(path, 'rb') if path.endswith('.xz'): return lzma.open(path, 'rb') return open(path, 'rb') SN3_PASCALVINCENT_TYPEMAP = { 8: (torch.uint8, np.uint8, np.uint8), 9: (torch.int8, np.int8, np.int8), 11: (torch.int16, np.dtype('>i2'), 'i2'), 12: (torch.int32, np.dtype('>i4'), 'i4'), 13: (torch.float32, np.dtype('>f4'), 'f4'), 14: (torch.float64, np.dtype('>f8'), 'f8') } def read_sn3_pascalvincent_tensor(path: Union[str, IO], strict: bool = True) -> torch.Tensor: """Read a SN3 file in "Pascal Vincent" format (Lush file 'libidx/idx-io.lsh'). Argument may be a filename, compressed filename, or file object. """ # read with open_maybe_compressed_file(path) as f: data = f.read() # parse magic = get_int(data[0:4]) nd = magic % 256 ty = magic // 256 assert 1 <= nd <= 3 assert 8 <= ty <= 14 m = SN3_PASCALVINCENT_TYPEMAP[ty] s = [get_int(data[4 * (i + 1): 4 * (i + 2)]) for i in range(nd)] parsed = np.frombuffer(data, dtype=m[1], offset=(4 * (nd + 1))) assert parsed.shape[0] == np.prod(s) or not strict return torch.from_numpy(parsed.astype(m[2], copy=False)).view(*s) def read_label_file(path: str) -> torch.Tensor: with open(path, 'rb') as f: x = read_sn3_pascalvincent_tensor(f, strict=False) assert(x.dtype == torch.uint8) assert(x.ndimension() == 1) return x.long() def read_image_file(path: str) -> torch.Tensor: with open(path, 'rb') as f: x = read_sn3_pascalvincent_tensor(f, strict=False) assert(x.dtype == torch.uint8) assert(x.ndimension() == 3) return x def extract_archive(from_path, to_path): to_path = os.path.join(to_path, os.path.splitext(os.path.basename(from_path))[0]) with open(to_path, "wb") as out_f, gzip.GzipFile(from_path) as zip_f: out_f.write(zip_f.read()) # The above is pytorch mnist. # --- end # Raw MNIST dataset processing def convert_raw_mnist_dataset_to_pytorch_mnist_dataset(data_url): """ raw {data_url}/ train-images-idx3-ubyte.gz train-labels-idx1-ubyte.gz t10k-images-idx3-ubyte.gz t10k-labels-idx1-ubyte.gz processed {data_url}/ train-images-idx3-ubyte.gz train-labels-idx1-ubyte.gz t10k-images-idx3-ubyte.gz t10k-labels-idx1-ubyte.gz MNIST/raw train-images-idx3-ubyte train-labels-idx1-ubyte t10k-images-idx3-ubyte t10k-labels-idx1-ubyte MNIST/processed training.pt test.pt """ resources = [ "train-images-idx3-ubyte.gz", "train-labels-idx1-ubyte.gz", "t10k-images-idx3-ubyte.gz", "t10k-labels-idx1-ubyte.gz" ] pytorch_mnist_dataset = os.path.join(data_url, 'MNIST') raw_folder = os.path.join(pytorch_mnist_dataset, 'raw') processed_folder = os.path.join(pytorch_mnist_dataset, 'processed') os.makedirs(raw_folder, exist_ok=True) os.makedirs(processed_folder, exist_ok=True) print('Processing...') for f in resources: extract_archive(os.path.join(data_url, f), raw_folder) training_set = ( read_image_file(os.path.join(raw_folder, 'train-images-idx3-ubyte')), read_label_file(os.path.join(raw_folder, 'train-labels-idx1-ubyte')) ) test_set = ( read_image_file(os.path.join(raw_folder, 't10k-images-idx3-ubyte')), read_label_file(os.path.join(raw_folder, 't10k-labels-idx1-ubyte')) ) with open(os.path.join(processed_folder, 'training.pt'), 'wb') as f: torch.save(training_set, f) with open(os.path.join(processed_folder, 'test.pt'), 'wb') as f: torch.save(test_set, f) print('Done!') def main(): # Define the preset running parameters of the training job. parser = argparse.ArgumentParser(description='PyTorch MNIST Example') parser.add_argument('--data_url', type=str, default=False, help='mnist dataset path') parser.add_argument('--train_url', type=str, default=False, help='mnist model path') parser.add_argument('--batch-size', type=int, default=64, metavar='N', help='input batch size for training (default: 64)') parser.add_argument('--test-batch-size', type=int, default=1000, metavar='N', help='input batch size for testing (default: 1000)') parser.add_argument('--epochs', type=int, default=14, metavar='N', help='number of epochs to train (default: 14)') parser.add_argument('--lr', type=float, default=1.0, metavar='LR', help='learning rate (default: 1.0)') parser.add_argument('--gamma', type=float, default=0.7, metavar='M', help='Learning rate step gamma (default: 0.7)') parser.add_argument('--no-cuda', action='store_true', default=False, help='disables CUDA training') parser.add_argument('--dry-run', action='store_true', default=False, help='quickly check a single pass') parser.add_argument('--seed', type=int, default=1, metavar='S', help='random seed (default: 1)') parser.add_argument('--log-interval', type=int, default=10, metavar='N', help='how many batches to wait before logging training status') parser.add_argument('--save-model', action='store_true', default=True, help='For Saving the current Model') args = parser.parse_args() use_cuda = not args.no_cuda and torch.cuda.is_available() torch.manual_seed(args.seed) # Set whether to use GPU or CPU to run the algorithm. device = torch.device("cuda" if use_cuda else "cpu") train_kwargs = {'batch_size': args.batch_size} test_kwargs = {'batch_size': args.test_batch_size} if use_cuda: cuda_kwargs = {'num_workers': 1, 'pin_memory': True, 'shuffle': True} train_kwargs.update(cuda_kwargs) test_kwargs.update(cuda_kwargs) # Define the data preprocessing method. transform=transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ]) # Convert the raw MNIST dataset to a PyTorch MNIST dataset. convert_raw_mnist_dataset_to_pytorch_mnist_dataset(args.data_url) # Create a training dataset and a validation dataset. dataset1 = datasets.MNIST(args.data_url, train=True, download=False, transform=transform) dataset2 = datasets.MNIST(args.data_url, train=False, download=False, transform=transform) # Create iterators for the training dataset and the validation dataset. train_loader = torch.utils.data.DataLoader(dataset1, **train_kwargs) test_loader = torch.utils.data.DataLoader(dataset2, **test_kwargs) # Initialize the neural network model and copy the model to the compute device. model = Net().to(device) # Define the training optimizer and learning rate for gradient descent calculation. optimizer = optim.Adadelta(model.parameters(), lr=args.lr) scheduler = StepLR(optimizer, step_size=1, gamma=args.gamma) # Train the neural network and perform validation in each epoch. for epoch in range(1, args.epochs + 1): train(args, model, device, train_loader, optimizer, epoch) test(model, device, test_loader) scheduler.step() # Save the model and make it adapted to the ModelArts inference model package specifications. if args.save_model: # Create the model directory in the path specified in train_url. model_path = os.path.join(args.train_url, 'model') os.makedirs(model_path, exist_ok = True) # Save the model to the model directory based on the ModelArts inference model package specifications. torch.save(model.state_dict(), os.path.join(model_path, 'mnist_cnn.pt')) # Copy the inference code and configuration file to the model directory. the_path_of_current_file = os.path.dirname(__file__) shutil.copyfile(os.path.join(the_path_of_current_file, 'infer/customize_service.py'), os.path.join(model_path, 'customize_service.py')) shutil.copyfile(os.path.join(the_path_of_current_file, 'infer/config.json'), os.path.join(model_path, 'config.json')) if __name__ == '__main__': main()
Cree el script de inferencia customize_service.py en el host local. El contenido es el siguiente:
import os import log import json import torch.nn.functional as F import torch.nn as nn import torch import torchvision.transforms as transforms import numpy as np from PIL import Image from model_service.pytorch_model_service import PTServingBaseService logger = log.getLogger(__name__) # Define model preprocessing. infer_transformation = transforms.Compose([ transforms.Resize(28), transforms.CenterCrop(28), transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ]) # Model inference service class PTVisionService(PTServingBaseService): def __init__(self, model_name, model_path): # Call the constructor of the parent class. super(PTVisionService, self).__init__(model_name, model_path) # Call the customized function to load the model. self.model = Mnist(model_path) # Load labels. self.label = [0,1,2,3,4,5,6,7,8,9] # Receive the request data and convert it to the input format acceptable to the model. def _preprocess(self, data): preprocessed_data = {} for k, v in data.items(): input_batch = [] for file_name, file_content in v.items(): with Image.open(file_content) as image1: # Gray processing image1 = image1.convert("L") if torch.cuda.is_available(): input_batch.append(infer_transformation(image1).cuda()) else: input_batch.append(infer_transformation(image1)) input_batch_var = torch.autograd.Variable(torch.stack(input_batch, dim=0), volatile=True) print(input_batch_var.shape) preprocessed_data[k] = input_batch_var return preprocessed_data # Post-process the inference result to obtain the expected output format. The result is the returned value. def _postprocess(self, data): results = [] for k, v in data.items(): result = torch.argmax(v[0]) result = {k: self.label[result]} results.append(result) return results # Perform forward inference on the input data to obtain the inference result. def _inference(self, data): result = {} for k, v in data.items(): result[k] = self.model(v) return result # Define a network. class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(1, 32, 3, 1) self.conv2 = nn.Conv2d(32, 64, 3, 1) self.dropout1 = nn.Dropout(0.25) self.dropout2 = nn.Dropout(0.5) self.fc1 = nn.Linear(9216, 128) self.fc2 = nn.Linear(128, 10) def forward(self, x): x = self.conv1(x) x = F.relu(x) x = self.conv2(x) x = F.relu(x) x = F.max_pool2d(x, 2) x = self.dropout1(x) x = torch.flatten(x, 1) x = self.fc1(x) x = F.relu(x) x = self.dropout2(x) x = self.fc2(x) output = F.log_softmax(x, dim=1) return output def Mnist(model_path, **kwargs): # Generate a network. model = Net() # Load the model. if torch.cuda.is_available(): device = torch.device('cuda') model.load_state_dict(torch.load(model_path, map_location="cuda:0")) else: device = torch.device('cpu') model.load_state_dict(torch.load(model_path, map_location=device)) # CPU or GPU mapping model.to(device) # Turn the model to inference mode. model.eval() return model
Inferir el archivo de configuración config.json en el host local. El contenido es el siguiente:
{ "model_algorithm": "image_classification", "model_type": "PyTorch", "runtime": "pytorch_1.8.0-cuda_10.2-py_3.7-ubuntu_18.04-x86_64" }
Paso 3 Crear un bucket de OBS y cargar archivos a OBS
Cargue los datos, el archivo de código, el archivo de código de inferencia y el archivo de configuración de inferencia obtenidos en el paso anterior en un bucket de OBS. Al ejecutar un trabajo de entrenamiento en ModelArts, lea los archivos de datos y códigos del bucket del OBS.
- Inicie sesión en la consola de gestión de OBS y cree un bucket y una carpeta de OBS. Para obtener más detalles, consulte Creación de un bucket y Creación de una carpeta.
{OBS bucket} # OBS bucket name, which is customizable, for example, test-modelarts-xx -{OBS folder} # OBS folder name, which is customizable, for example, pytorch - mnist-data # OBS folder, which is used to store the training dataset. The folder name is customizable, for example, mnist-data. - mnist-code # OBS folder, which is used to store training script train.py. The folder name is customizable, for example, mnist-code. - infer # OBS folder, which is used to store inference script customize_service.py and configuration file config.json - mnist-output # OBS folder, which is used to store trained models. The folder name is customizable, for example, mnist-output.
ATENCIóN:
- La región donde reside el bucket de OBS creado debe ser la misma que donde se utiliza ModelArts. De lo contrario, el bucket de OBS estará disponible para entrenamiento. Para obtener más detalles, consulte Comprobación de si el bucket de OBS y ModelArts se encuentran en la misma región
- Al crear un bucket de OBS, no configure la clase de almacenamiento de archivos. De lo contrario, los modelos de entrenamiento fallarán.
- Cargue el paquete de datos de MNIST obtenido en Paso 1 Preparar los datos de entrenamiento en OBS. Para obtener más detalles, consulte Carga de un objeto.
ATENCIóN:
- Al cargar datos en OBS, no los encripte. De lo contrario, el entrenamiento fallará.
- No es necesario que se decompongan. Cargue directamente paquetes comprimidos en el OBS.
- Cargue el script de entrenamiento train.py en la carpeta mnist-code.
- Cargue el script de inferencia customize_service.py y el archivo de configuración de inferencia config.json en la carpeta infer.
Paso 4 Crear un trabajo de entrenamiento
- Inicie sesión en la consola de gestión de ModelArts y seleccione la misma región que el bucket del OBS.
- En el panel de navegación de la izquierda, seleccione Settings y verifique si se ha configurado la autorización de acceso para la cuenta actual. Para obtener más detalles, consulte Configuración de la autorización de acceso. Si ha sido autorizado mediante claves de acceso, borre la autorización y configure la autorización de delegación.
- En el panel de navegación, elija Training Management > Training Jobs. En la página Training Jobs que aparece, haga clic en Create Training Job.
- Establezca los parámetros.
- Algorithm Type: seleccione Custom algorithm.
- Boot Mode: seleccione Preset image y, a continuación, seleccione PyTorch y pytorch_1.8.0-cuda_10.2-py_3.7-ubuntu_18.04-x86_64 en las listas desplegables.
- Code Directory: seleccione el directorio de códigos de OBS creado, por ejemplo, /test-modelarts-xx/pytorch/mnist-code/ (reemplace test-modelarts-xx por su nombre de bucket de OBS).
- Boot File: seleccione el script de entrenamiento train.py cargado en el directorio de códigos.
- Input: Agregue una entrada y defina su nombre como data_url. Configure la ruta de acceso de datos al directorio de OBS. Por ejemplo, /test-modelarts-xx/pytorch/mnist-data/ (reemplace test-modelarts-xx por el nombre del bucket de OBS).
- Output: Agregue una salida y defina su nombre como train_url. Configure la ruta de acceso de datos al directorio de OBS. Por ejemplo, /test-modelarts-xx/pytorch/mnist-output/ (reemplace test-modelarts-xx por el nombre del bucket de OBS). Establezca Predownload en No.
- Resource Type: seleccione GPU y, a continuación, GPU: 1*NVIDIA-V100(16GB) | CPU: 8 vCPUs 64GB (ejemplo). Si existen especificaciones de GPU gratuitas, puede seleccionarlas para el entrenamiento.
- Mantenga la configuración predeterminada para otros parámetros.
NOTA:
El código de ejemplo se ejecuta en un solo nodo con una sola tarjeta. Si selecciona una variante con varias GPU, el entrenamiento fallará.
- Haga clic en Submit, confirme la configuración de parámetros para el trabajo de entrenamiento y haga clic en Yes.
El sistema vuelve automáticamente a la página Training Jobs. Cuando el estado del trabajo de entrenamiento cambia a Completed, se completa el entrenamiento de modelo.
NOTA:
En este caso, el trabajo de entrenamiento durará unos 10 minutos.
- Haga clic en el nombre del trabajo de entrenamiento. En la página de detalles del trabajo que aparece en pantalla, compruebe si hay mensajes de error en los registros. Si es así, el entrenamiento falló. Identifique la causa y localice la falla según los logs.
- En la esquina inferior izquierda de la página de detalles del entrenamiento, haga clic en la ruta de salida del entrenamiento para ir a OBS, como se muestra en Figura 4. Luego, verifique si la carpeta model está disponible y si hay modelos entrenados en ella. Si no existe una carpeta model o un modelo entrenado, la información de entrenamiento puede estar incompleta. En este caso, cargue completamente los datos de entrenamiento y vuelva a entrenar el modelo.
Paso 5: Desplegar el modelo para la inferencia
Una vez finalizado el entrenamiento del modelo, cree una aplicación de IA y desplegarla como un servicio en tiempo real.
- Inicie sesión en la consola de gestión de ModelArts. En el panel de navegación de la izquierda, elija AI Application Management > AI Applications. En la página My AI Applications, haga clic en Create.
- En la página Create, configure los parámetros y haga clic en Create now.
Seleccione Training Job para Meta Model Source. En la lista desplegable, seleccione el trabajo de entrenamiento completado en Paso 4 Crear un trabajo de entrenamiento y seleccione Dynamic loading. Se configurarán automáticamente los valores de AI Engine.
Figura 5 Meta Model Source - En la página AI Applications, si el estado de la aplicación cambia a Normal, se ha creado. Haga clic en el botón de opción situado a la izquierda del nombre de la aplicación de IA para mostrar la lista de versiones en la parte inferior de la página de lista y elija Deploy > Real-Time Services en la columna Operation para desplegar la aplicación de IA como un servicio en tiempo real.
Figura 6 Despliegue de un servicio en tiempo real
- En la página Deploy, configure los parámetros y cree un servicio en tiempo real según se le solicite. En este ejemplo, utilice las especificaciones de CPU. Si existen especificaciones de CPU gratuitas, puede seleccionarlas para el despliegue. (Cada usuario puede desplegar solo un servicio en tiempo real de forma gratuita. Si ha desplegado uno, elimínelo primero antes de desplegar un nuevo de forma gratuita.)
Figura 7 Despliegue de un modelo
Después de enviar la solicitud de despliegue del servicio, el sistema cambia automáticamente a la página Real-Time Services. Cuando el estado del servicio cambia a Running, se despliegue ese servicio.
Paso 6 Realizar una predicción
- En la página Real-Time Services, haga clic en el nombre del servicio en tiempo real. Aparecerá la página de detalles del servicio en tiempo real.
- Haga clic en la ficha Prediction, configure Request Type como multipart/form-data, Request Parameter como image, haga clic en Upload para cargar una imagen de muestra y haga clic en Predict.
Una vez finalizada la predicción, el resultado de la predicción se muestra en el panel Test Result. Según el resultado de la predicción, el dígito de la imagen es 2.
NOTA:
El MNIST utilizado en este caso es un conjunto de datos sencillo utilizado para la demostración, y sus algoritmos son también algoritmos de redes neuronales sencillos utilizados para la enseñanza. Los modelos generados con estos datos y algoritmos solo son aplicables a la enseñanza, pero no a la predicción compleja. La predicción solo es precisa si la imagen utilizada para la predicción es similar a la imagen del conjunto de datos de entrenamiento (caracteres blancos sobre fondo negro).
Figura 8 EjemploFigura 9 Resultados de predicción
Paso 7 Lanzar recursos
- En la página Real-Time Services, localice la fila que contiene el servicio de destino y haga clic en Stop o Delete en la columna Operation.
- En la página AI Applications de AI Application Management, localice la fila que contiene el servicio de destino y haga clic en Delete en la columna Operation.
- En la página Training Jobs, haga clic en Delete en la columna Operation para eliminar el trabajo de entrenamiento finalizado.
- Vaya a OBS y elimine el bucket de OBS, las carpetas y los archivos utilizados en este ejemplo.
Preguntas frecuentes
- ¿Por qué un trabajo de entrenamiento siempre está en cola?
Si el trabajo de entrenamiento está siempre en cola, los recursos seleccionados están limitados en el grupo de recursos y el trabajo debe estar en cola. En este caso, espere recursos. Para obtener más información, consulte ¿Por qué siempre está en cola un trabajo de entrenamiento?.
- ¿Por qué no puedo encontrar mi bucket de OBS creado después de seleccionar una ruta de OBS en ModelArts?
Asegúrese de que el bucket creado se encuentre en la misma región que ModelArts. Para obtener más detalles, consulte Ruta de OBS incorrecta en ModelArts.