Estos contenidos se han traducido de forma automática para su comodidad, pero Huawei Cloud no garantiza la exactitud de estos. Para consultar los contenidos originales, acceda a la versión en inglés.
Cómputo
Elastic Cloud Server
Bare Metal Server
Auto Scaling
Image Management Service
Dedicated Host
FunctionGraph
Cloud Phone Host
Huawei Cloud EulerOS
Redes
Virtual Private Cloud
Elastic IP
Elastic Load Balance
NAT Gateway
Direct Connect
Virtual Private Network
VPC Endpoint
Cloud Connect
Enterprise Router
Enterprise Switch
Global Accelerator
Gestión y gobernanza
Cloud Eye
Identity and Access Management
Cloud Trace Service
Resource Formation Service
Tag Management Service
Log Tank Service
Config
Resource Access Manager
Simple Message Notification
Application Performance Management
Application Operations Management
Organizations
Optimization Advisor
Cloud Operations Center
Resource Governance Center
Migración
Server Migration Service
Object Storage Migration Service
Cloud Data Migration
Migration Center
Cloud Ecosystem
KooGallery
Partner Center
User Support
My Account
Billing Center
Cost Center
Resource Center
Enterprise Management
Service Tickets
HUAWEI CLOUD (International) FAQs
ICP Filing
Support Plans
My Credentials
Customer Operation Capabilities
Partner Support Plans
Professional Services
Análisis
MapReduce Service
Data Lake Insight
CloudTable Service
Cloud Search Service
Data Lake Visualization
Data Ingestion Service
GaussDB(DWS)
DataArts Studio
IoT
IoT Device Access
Otros
Product Pricing Details
System Permissions
Console Quick Start
Common FAQs
Instructions for Associating with a HUAWEI CLOUD Partner
Message Center
Seguridad y cumplimiento
Security Technologies and Applications
Web Application Firewall
Host Security Service
Cloud Firewall
SecMaster
Data Encryption Workshop
Database Security Service
Cloud Bastion Host
Data Security Center
Cloud Certificate Manager
Blockchain
Blockchain Service
Servicios multimedia
Media Processing Center
Video On Demand
Live
SparkRTC
Almacenamiento
Object Storage Service
Elastic Volume Service
Cloud Backup and Recovery
Storage Disaster Recovery Service
Scalable File Service
Volume Backup Service
Cloud Server Backup Service
Data Express Service
Dedicated Distributed Storage Service
Contenedores
Cloud Container Engine
SoftWare Repository for Container
Application Service Mesh
Ubiquitous Cloud Native Service
Cloud Container Instance
Bases de datos
Relational Database Service
Document Database Service
Data Admin Service
Data Replication Service
GeminiDB
GaussDB
Distributed Database Middleware
Database and Application Migration UGO
TaurusDB
Middleware
Distributed Cache Service
API Gateway
Distributed Message Service for Kafka
Distributed Message Service for RabbitMQ
Distributed Message Service for RocketMQ
Cloud Service Engine
EventGrid
Dedicated Cloud
Dedicated Computing Cluster
Aplicaciones empresariales
ROMA Connect
Message & SMS
Domain Name Service
Edge Data Center Management
Meeting
AI
Face Recognition Service
Graph Engine Service
Content Moderation
Image Recognition
Data Lake Factory
Optical Character Recognition
ModelArts
ImageSearch
Conversational Bot Service
Speech Interaction Service
Huawei HiLens
Developer Tools
SDK Developer Guide
API Request Signing Guide
Terraform
Koo Command Line Interface
Distribución de contenido y cómputo de borde
Content Delivery Network
Intelligent EdgeFabric
CloudPond
Soluciones
SAP Cloud
High Performance Computing
Servicios para desarrolladores
ServiceStage
CodeArts
CodeArts PerfTest
CodeArts Req
CodeArts Pipeline
CodeArts Build
CodeArts Deploy
CodeArts Artifact
CodeArts TestPlan
CodeArts Check
Cloud Application Engine
aPaaS MacroVerse
KooPhone
KooDrive
Centro de ayuda/ ModelArts/ Prácticas recomendadas/ Entrenamiento de modelos/ Uso de un algoritmo personalizado para crear un modelo de reconocimiento de dígitos escrito a mano

Uso de un algoritmo personalizado para crear un modelo de reconocimiento de dígitos escrito a mano

Actualización más reciente 2024-09-20 GMT+08:00

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.

  1. Paso 1 Preparar los datos de entrenamiento: Descargar el conjunto de datos del MNIST.
  2. Paso 2 Preparar los archivos de entrenamiento y de inferencia: Escribir código de entrenamiento y de inferencia.
  3. 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.
  4. Paso 4 Crear un trabajo de entrenamiento: Entrenar un modelo.
  5. 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.
  6. 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.
  7. 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.
    1. 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.
    2. Configure los parámetros de la siguiente manera en la página mostrada:

      Authorized User: All users.

      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
    3. 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.

Figura 3 Conjunto de datos del MNIST
  • 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
NOTA:

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.

NOTA:

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.

  1. 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.
  2. 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.
  3. Cargue el script de entrenamiento train.py en la carpeta mnist-code.
  4. 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

  1. Inicie sesión en la consola de gestión de ModelArts y seleccione la misma región que el bucket del OBS.
  2. 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.
  3. 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.
  4. 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á.

  5. 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.

  6. 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.
  7. 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.
    Figura 4 Ruta de salida

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.

  1. 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.
  2. 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
  3. 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
  4. 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

  1. 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.
  2. 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 Ejemplo

    Figura 9 Resultados de predicción

Paso 7 Lanzar recursos

Si ya no necesita usar este modelo y servicio en tiempo real, lance los recursos para detener la facturación.
  • 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.

Utilizamos cookies para mejorar nuestro sitio y tu experiencia. Al continuar navegando en nuestro sitio, tú aceptas nuestra política de cookies. Descubre más

Comentarios

Comentarios

Comentarios

0/500

Seleccionar contenido

Enviar el contenido seleccionado con los comentarios