Compartilhar 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 é uma tela interativa fácil de usar para criar modelos de machine learning para tarefas como regressão e classificação. Invocar o modelo criado pelo designer em um pipeline de enriquecimento do Cognitive Search 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 Regressão – previsão de preço de automóvel (avançado) na página de documentação deexemplos de pipelines e conjuntos de dados para criar um modelo que prevê o preço de um automóvel, considerando os diferentes recursos.

Importante

A implantação do modelo após o processo de inferência em tempo real resultará em um ponto de extremidade válido, mas não um que pode ser usado com a habilidade AML no Cognitive Search.

Registrar o modelo e baixar ativos

Quando você tiver um modelo treinado, registre o modelo treinado e siga as etapas para baixar todos os arquivos na trained_model_outputs pasta ou baixar apenas os score.py arquivosconda_env.yml da página modelos de artefatos. Você editará o script de pontuação antes do modelo ser implantado como um ponto de extremidade de inferência em tempo real.

As pipelines de enriquecimento do Cognitive Search funcionam em um único documento e geram uma solicitação que contém as entradas para uma única previsão. O que foi baixado score.py 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 uma lista
  • Edite o script para retornar um objeto JSON com uma única propriedade, o preço previsto.

Abra o que foi baixado score.py e edite a run(data) função. A função é atualmente configurada para esperar a entrada a seguir, conforme descrito no arquivo do modelo _samples.json.

[
  {
    "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 pelo Cognitive Search 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 de 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 de retorno (linha 37) no arquivo original para:

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

Aqui está a run função atualizada com as alterações no formato de entrada e a saída prevista que aceitará um único registro como uma 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]
    }

Registre e implante o modelo

Com suas alterações salvas, agora você pode registrar o modelo no portal. Selecione registrar modelo e forneça um nome válido. Escolha Other para estrutura de modelo, Custom para nome da estrutura e 1.0 versão do Framework. Selecione a Upload folder opção e selecione a pasta com a atualização score.py e conda_env.yaml.

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

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

Para integrar o ponto de extremidade recém-criado com o Cognitive Search

  1. Adicione 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 de importação de dados. Certifique-se de selecionar JSON como parsing mode
  3. Na guia Add Enrichments, selecione uma única habilidade Extract people names como um espaço reservado.
  4. Adicione um novo campo ao índice chamado predicted_price do tipo Edm.Double, defina a propriedade recuperável como true.
  5. Conclua o processo de importação de dados

Adicionar a habilidade AML ao conjunto de habilidades

Na lista 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 os 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 habilidade AML descubra seu ponto de extremidade, o espaço de trabalho e o serviço de pesquisa precisam estar na mesma assinatura do Azure. Selecione o ponto de extremidade que você criou anteriormente no tutorial. Valide se a habilidade está preenchida com o URI e as informações de autenticação conforme configurado quando você implantou o ponto de extremidade. Copie o modelo de habilidade e substitua a habilidade no conjunto de habilidades. Edite a habilidade para:

  1. Defina um nome válido como nome
  2. Adicione uma descrição
  3. Defina degreesOfParallelism como 1
  4. Defina o contexto como /document
  5. Defina as entradas para todas as entradas necessárias, consulte 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 mapeamentos de campo de saída do indexador pelo trecho abaixo:

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

Agora você pode executar o indexador e validar se a predicted_price propriedade é populada no índice com o resultado da saída de sua habilidade de AML.