Partilhar via


Exemplo: Criar e implantar uma habilidade personalizada com o designer do Azure Machine Learning (Arquivado)

Este exemplo está arquivado e sem suporte. Ele explicou como usar o designer do Azure Machine Learning , que é uma tela interativa fácil de usar, para criar modelos de aprendizagem automática para tarefas como regressão e classificação. Invocar o modelo criado pelo designer em um pipeline de enriquecimento da Pesquisa Cognitiva requer algumas etapas adicionais. Neste exemplo, você criará um modelo de regressão simples para prever o preço de um automóvel e invocar o ponto de extremidade de inferência como uma habilidade AML.

Siga o tutorial Regression - Automobile Price Prediction (Advanced) no exemplos pipelines & datasets página de documentação para criar um modelo que prevê o preço de um automóvel dadas as diferentes características.

Importante

Implantar o modelo seguindo o processo de inferência em tempo real resultará em um ponto de extremidade válido, mas não um que você possa usar com a habilidade AML na Pesquisa Cognitiva.

Registrar modelo e baixar ativos

Depois de ter um modelo treinado, registe o modelo treinado e siga as etapas para baixar todos os ficheiros na pasta trained_model_outputs ou baixar apenas os ficheiros score.py e conda_env.yml da página de artefactos do modelo. Você irá editar o script de pontuação antes que o modelo seja implantado como uma interface de inferência em tempo real.

Os pipelines de enriquecimento da Pesquisa Cognitiva funcionam em um único documento e geram uma solicitação que contém as entradas para uma única previsão. O score.py baixado aceita uma lista de registros e retorna uma lista de previsões como uma cadeia de caracteres JSON serializada. Você fará duas alterações no score.py

  • Edite o script para trabalhar com um único registro de entrada, não com uma lista
  • Edite o script para retornar um objeto JSON com uma única propriedade, o preço previsto.

Abra o score.py baixado e edite a função run(data). A função está atualmente configurada para esperar a seguinte entrada, conforme descrito no arquivo de _samples.json do modelo.

[
  {
    "symboling": 2,
    "make": "mitsubishi",
    "fuel-type": "gas",
    "aspiration": "std",
    "num-of-doors": "two",
    "body-style": "hatchback",
    "drive-wheels": "fwd",
    "engine-location": "front",
    "wheel-base": 93.7,
    "length": 157.3,
    "width": 64.4,
    "height": 50.8,
    "curb-weight": 1944,
    "engine-type": "ohc",
    "num-of-cylinders": "four",
    "engine-size": 92,
    "fuel-system": "2bbl",
    "bore": 2.97,
    "stroke": 3.23,
    "compression-ratio": 9.4,
    "horsepower": 68.0,
    "peak-rpm": 5500.0,
    "city-mpg": 31,
    "highway-mpg": 38,
    "price": 6189.0
  },
  {
    "symboling": 0,
    "make": "toyota",
    "fuel-type": "gas",
    "aspiration": "std",
    "num-of-doors": "four",
    "body-style": "wagon",
    "drive-wheels": "fwd",
    "engine-location": "front",
    "wheel-base": 95.7,
    "length": 169.7,
    "width": 63.6,
    "height": 59.1,
    "curb-weight": 2280,
    "engine-type": "ohc",
    "num-of-cylinders": "four",
    "engine-size": 92,
    "fuel-system": "2bbl",
    "bore": 3.05,
    "stroke": 3.03,
    "compression-ratio": 9.0,
    "horsepower": 62.0,
    "peak-rpm": 4800.0,
    "city-mpg": 31,
    "highway-mpg": 37,
    "price": 6918.0
  },
  {
    "symboling": 1,
    "make": "honda",
    "fuel-type": "gas",
    "aspiration": "std",
    "num-of-doors": "two",
    "body-style": "sedan",
    "drive-wheels": "fwd",
    "engine-location": "front",
    "wheel-base": 96.5,
    "length": 169.1,
    "width": 66.0,
    "height": 51.0,
    "curb-weight": 2293,
    "engine-type": "ohc",
    "num-of-cylinders": "four",
    "engine-size": 110,
    "fuel-system": "2bbl",
    "bore": 3.15,
    "stroke": 3.58,
    "compression-ratio": 9.1,
    "horsepower": 100.0,
    "peak-rpm": 5500.0,
    "city-mpg": 25,
    "highway-mpg": 31,
    "price": 10345.0
  }
]

Suas alterações garantirão que o modelo possa aceitar a entrada gerada pela Pesquisa Cognitiva durante a indexação, que é um único registro.

{
    "symboling": 2,
    "make": "mitsubishi",
    "fuel-type": "gas",
    "aspiration": "std",
    "num-of-doors": "two",
    "body-style": "hatchback",
    "drive-wheels": "fwd",
    "engine-location": "front",
    "wheel-base": 93.7,
    "length": 157.3,
    "width": 64.4,
    "height": 50.8,
    "curb-weight": 1944,
    "engine-type": "ohc",
    "num-of-cylinders": "four",
    "engine-size": 92,
    "fuel-system": "2bbl",
    "bore": 2.97,
    "stroke": 3.23,
    "compression-ratio": 9.4,
    "horsepower": 68.0,
    "peak-rpm": 5500.0,
    "city-mpg": 31,
    "highway-mpg": 38,
    "price": 6189.0
}

Substitua as linhas 27 a 30 por


    for key, val in data.items():
        input_entry[key].append(decode_nan(val))

Você também precisará editar a saída que o script gera de uma cadeia de caracteres para um objeto JSON. Edite a instrução return (linha 37) no arquivo original para:

    output = result.data_frame.values.tolist()
    return {
        "predicted_price": output[0][-1]
    }

Aqui está a função run atualizada com as alterações no formato de entrada e a saída prevista que aceitará um único registro como entrada e retornará um objeto JSON com o preço previsto.

def run(data):
    data = json.loads(data)
    input_entry = defaultdict(list)
    # data is now a JSON object not a list of JSON objects
    for key, val in data.items():
        input_entry[key].append(decode_nan(val))

    data_frame_directory = create_dfd_from_dict(input_entry, schema_data)
    score_module = ScoreModelModule()
    result, = score_module.run(
        learner=model,
        test_data=DataTable.from_dfd(data_frame_directory),
        append_or_result_only=True)
    #return json.dumps({"result": result.data_frame.values.tolist()})
    output = result.data_frame.values.tolist()
    # return the last column of the the first row of the dataframe
    return  {
        "predicted_price": output[0][-1]
    }

Registrar e implantar o modelo

Com as alterações guardadas, já pode registar o modelo no portal. Selecione o modelo de registro e forneça um nome válido. Escolha Other para Model Framework, Custom para Framework Name e 1.0 para Framework Version. Selecione a opção Upload folder e selecione a pasta com o score.py e conda_env.yamlatualizados.

Selecione o modelo e escolha a ação Deploy. A etapa de implantação pressupõe que você tenha um cluster de inferência AKS provisionado. Atualmente, não há suporte para instâncias de contêiner na Pesquisa Cognitiva.

  1. Forneça um nome de ponto de extremidade válido
  2. Selecione o tipo de computação do Azure Kubernetes Service
  3. Selecione o nome de computação para o cluster de inferência
  4. Ativar enable authentication
  5. Selecione Key-based authentication para o tipo
  6. Selecione o score.py atualizado para entry script file
  7. Selecione conda_env.yaml para conda dependencies file
  8. Selecione o botão implantar para implantar seu novo ponto de extremidade.

Para integrar o endpoint recém-criado com a Pesquisa Cognitiva

  1. Adicionar um arquivo JSON contendo um único registro de automóvel a um contêiner de blob
  2. Configure um pipeline de enriquecimento de IA usando o assistente Importar dados. Certifique-se de selecionar JSON como o parsing mode
  3. Na guia Add Enrichments, selecione uma única habilidade Extract people names como espaço reservado.
  4. Adicione um novo campo ao índice chamado predicted_price do tipo Edm.Double, defina a propriedade Retrievable como true.
  5. Conclua o processo de importação de dados

Adicione a habilidade AML ao conjunto de habilidades

Na lista de conjuntos de habilidades, selecione o conjunto de habilidades que você criou. Agora você editará o conjunto de habilidades para substituir a habilidade de identificação de pessoas pela habilidade AML para prever preços. Na guia Definição de conjunto de habilidades (JSON), selecione Azure Machine Learning (AML) na lista suspensa de habilidades. Selecione o espaço de trabalho, para que a função AML descubra o seu ponto de extremidade, o espaço de trabalho e o serviço de pesquisa precisam estar na mesma subscrição Azure. Selecione o ponto de extremidade que você criou anteriormente no tutorial. Valide se o skill está preenchido com o URI e as informações de autenticação conforme configurado quando implantou o endpoint. Copie o modelo de habilidade e substitua a habilidade no conjunto de habilidades. Edite a habilidade para:

  1. Defina o nome para ser válido
  2. Adicionar uma descrição
  3. Defina a variável grausDeParalelismo como 1
  4. Defina o contexto para /document
  5. Defina as entradas para todas as entradas necessárias, veja a definição de habilidade de exemplo abaixo
  6. Defina as saídas para capturar o preço previsto retornado.
{
      "@odata.type": "#Microsoft.Skills.Custom.AmlSkill",
      "name": "AMLdemo",
      "description": "AML Designer demo",
      "context": "/document",
      "uri": "Your AML endpoint",
      "key": "Your AML endpoint key",
      "resourceId": null,
      "region": null,
      "timeout": "PT30S",
      "degreeOfParallelism": 1,
      "inputs": [
        {
          "name": "symboling",
          "source": "/document/symboling"
        },
        {
          "name": "make",
          "source": "/document/make"
        },
        {
          "name": "fuel-type",
          "source": "/document/fuel-type"
        },
        {
          "name": "aspiration",
          "source": "/document/aspiration"
        },
        {
          "name": "num-of-doors",
          "source": "/document/num-of-doors"
        },
        {
          "name": "body-style",
          "source": "/document/body-style"
        },
        {
          "name": "drive-wheels",
          "source": "/document/drive-wheels"
        },
        {
          "name": "engine-location",
          "source": "/document/engine-location"
        },
        {
          "name": "wheel-base",
          "source": "/document/wheel-base"
        },
        {
          "name": "length",
          "source": "/document/length"
        },
        {
          "name": "width",
          "source": "/document/width"
        },
        {
          "name": "height",
          "source": "/document/height"
        },
        {
          "name": "curb-weight",
          "source": "/document/curb-weight"
        },
        {
          "name": "engine-type",
          "source": "/document/engine-type"
        },
        {
          "name": "num-of-cylinders",
          "source": "/document/num-of-cylinders"
        },
        {
          "name": "engine-size",
          "source": "/document/engine-size"
        },
        {
          "name": "fuel-system",
          "source": "/document/fuel-system"
        },
        {
          "name": "bore",
          "source": "/document/bore"
        },
        {
          "name": "stroke",
          "source": "/document/stroke"
        },
        {
          "name": "compression-ratio",
          "source": "/document/compression-ratio"
        },
        {
          "name": "horsepower",
          "source": "/document/horsepower"
        },
        {
          "name": "peak-rpm",
          "source": "/document/peak-rpm"
        },
        {
          "name": "city-mpg",
          "source": "/document/city-mpg"
        },
        {
          "name": "highway-mpg",
          "source": "/document/highway-mpg"
        },
        {
          "name": "price",
          "source": "/document/price"
        }
      ],
      "outputs": [
        {
          "name": "predicted_price",
          "targetName": "predicted_price"
        }
      ]
    }

Atualizar os mapeamentos de campo de saída do indexador

Os mapeamentos de campo de saída do indexador determinam quais enriquecimentos são salvos no índice. Substitua a seção de mapeamentos de campo de saída do indexador pelo trecho abaixo:

"outputFieldMappings": [
    {
      "sourceFieldName": "/document/predicted_price",
      "targetFieldName": "predicted_price"
    }
  ]

Agora podeis executar o vosso indexador e validar se a propriedade predicted_price está preenchida no índice com o resultado da saída da vossa função AML.