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.
Editar o script de pontuação para uso com a Pesquisa Cognitiva
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.yaml
atualizados.
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.
- Forneça um nome de ponto de extremidade válido
- Selecione o tipo de computação do
Azure Kubernetes Service
- Selecione o nome de computação para o cluster de inferência
- Ativar
enable authentication
- Selecione
Key-based authentication
para o tipo - Selecione o
score.py
atualizado paraentry script file
- Selecione
conda_env.yaml
paraconda dependencies file
- Selecione o botão implantar para implantar seu novo ponto de extremidade.
Integre com a Pesquisa Cognitiva
Para integrar o endpoint recém-criado com a Pesquisa Cognitiva
- Adicionar 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 Importar dados. Certifique-se de selecionar
JSON
como oparsing mode
- Na guia
Add Enrichments
, selecione uma única habilidadeExtract people names
como espaço reservado. - Adicione um novo campo ao índice chamado
predicted_price
do tipoEdm.Double
, defina a propriedade Retrievable como true. - 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:
- Defina o nome para ser válido
- Adicionar uma descrição
- Defina a variável grausDeParalelismo como 1
- Defina o contexto para
/document
- Defina as entradas para todas as entradas necessárias, veja 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 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.