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.
Editar o script de pontuação para uso no Cognitive Search
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.
- Forneça um nome de ponto de extremidade válido
- Selecione o tipo de computação de
Azure Kubernetes Service
- Selecione o nome de computação para seu cluster de inferência
- Alterne
enable authentication
para ativado - Selecione
Key-based authentication
para o tipo - Selecione o
score.py
atualizado paraentry script file
- Selecione o
conda_env.yaml
paraconda dependencies file
- Selecione o botão implantar para implantar o novo ponto de extremidade.
Indexar com o Cognitive Search
Para integrar o ponto de extremidade recém-criado com o Cognitive Search
- Adicione um arquivo JSON contendo um único registro de automóvel a um contêiner de blob
- Configure um pipeline de enriquecimento de IA usando o Assistente de importação de dados. Certifique-se de selecionar
JSON
comoparsing mode
- Na guia
Add Enrichments
, selecione uma única habilidadeExtract people names
como um espaço reservado. - Adicione um novo campo ao índice chamado
predicted_price
do tipoEdm.Double
, defina a propriedade recuperável como true. - 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:
- Defina um nome válido como nome
- Adicione uma descrição
- Defina degreesOfParallelism como 1
- Defina o contexto como
/document
- Defina as entradas para todas as entradas necessárias, consulte a definição de habilidade de exemplo abaixo
- 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.