Przykład: tworzenie i wdrażanie niestandardowej umiejętności za pomocą projektanta usługi Azure Machine Learning (zarchiwizowanego)
Ten przykład jest zarchiwizowane i poza pomocą techniczną. Wyjaśniono, jak używać projektanta usługi Azure Machine Learning , jest łatwym w użyciu interaktywnym kanwą do tworzenia modeli uczenia maszynowego na potrzeby zadań, takich jak regresja i klasyfikacja. Wywołanie modelu utworzonego przez projektanta w potoku wzbogacania wyszukiwania poznawczego wymaga wykonania kilku dodatkowych kroków. W tym przykładzie utworzysz prosty model regresji, aby przewidzieć cenę samochodu i wywołać punkt końcowy wnioskowania jako umiejętności AML.
Postępuj zgodnie z samouczkiem Regresja — przewidywanie cen samochodów (zaawansowane) w przykładach potoków & stronie dokumentacji zestawów danych , aby utworzyć model, który przewiduje cenę samochodu, biorąc pod uwagę różne funkcje.
Ważne
Wdrożenie modelu po procesie wnioskowania w czasie rzeczywistym spowoduje prawidłowy punkt końcowy, ale nie taki, którego można użyć z umiejętnościami AML w usłudze Cognitive Search.
Rejestrowanie modelu i pobieranie zasobów
Po wytrenowanym modelu zarejestruj wytrenowany model i wykonaj kroki, aby pobrać wszystkie pliki w trained_model_outputs
folderze lub pobrać tylko score.py
pliki i conda_env.yml
ze strony artefaktów modeli. Skrypt oceniania zostanie edytowany przed wdrożeniem modelu jako punkt końcowy wnioskowania w czasie rzeczywistym.
Edytowanie skryptu oceniania do użycia z usługą Cognitive Search
Potoki wzbogacania wyszukiwania poznawczego działają na jednym dokumencie i generują żądanie zawierające dane wejściowe dla pojedynczego przewidywania. Pobrany score.py
kod akceptuje listę rekordów i zwraca listę przewidywań jako serializowany ciąg JSON. Zostaną wprowadzone dwie zmiany w score.py
- Edytowanie skryptu w celu pracy z pojedynczym rekordem wejściowym, a nie listą
- Edytuj skrypt, aby zwrócić obiekt JSON z pojedynczą właściwością, przewidywaną cenę.
Otwórz pobrany score.py
plik i edytuj run(data)
funkcję. Funkcja jest obecnie skonfigurowana, aby oczekiwać następujących danych wejściowych zgodnie z opisem w pliku modelu _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
}
]
Zmiany zapewnią, że model może akceptować dane wejściowe wygenerowane przez usługę Cognitive Search podczas indeksowania, co jest pojedynczym rekordem.
{
"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
}
Zamień wiersze od 27 do 30 na
for key, val in data.items():
input_entry[key].append(decode_nan(val))
Należy również edytować dane wyjściowe generowane przez skrypt na podstawie ciągu do obiektu JSON. Edytuj instrukcję return (wiersz 37) w oryginalnym pliku, aby:
output = result.data_frame.values.tolist()
return {
"predicted_price": output[0][-1]
}
Oto zaktualizowana run
funkcja ze zmianami w formacie wejściowym i przewidywanymi danymi wyjściowymi, która zaakceptuje pojedynczy rekord jako dane wejściowe i zwróci obiekt JSON z przewidywaną ceną.
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]
}
Rejestrowanie i wdrażanie modelu
Po zapisaniu zmian można teraz zarejestrować model w portalu. Wybierz pozycję Zarejestruj model i podaj prawidłową nazwę. Wybierz Other
opcję Struktura modelu, Custom
nazwę struktury i 1.0
wersję struktury.
Upload folder
Wybierz opcję i wybierz folder ze zaktualizowanymi score.py
elementami i conda_env.yaml
.
Wybierz model i wybierz Deploy
akcję. W kroku wdrażania założono, że masz aprowizowany klaster wnioskowania usługi AKS. Wystąpienia kontenerów nie są obecnie obsługiwane w usłudze Cognitive Search.
- Podaj prawidłową nazwę punktu końcowego
- Wybierz typ obliczeniowy
Azure Kubernetes Service
- Wybierz nazwę obliczeniową klastra wnioskowania
- Przełącz się
enable authentication
do pozycji włączonej - Wybierz
Key-based authentication
typ - Wybierz zaktualizowany
score.py
element dlaentry script file
- Wybierz element
conda_env.yaml
dlaconda dependencies file
- Wybierz przycisk wdróż, aby wdrożyć nowy punkt końcowy.
Integracja z usługą Cognitive Search
Aby zintegrować nowo utworzony punkt końcowy z usługą Cognitive Search
- Dodawanie pliku JSON zawierającego pojedynczy rekord samochodowy do kontenera obiektów blob
- Skonfiguruj potok wzbogacania sztucznej inteligencji przy użyciu kreatora importu danych. Pamiętaj, aby wybrać jako
JSON
parsing mode
-
Add Enrichments
Na karcie wybierz pojedynczą umiejętnośćExtract people names
jako symbol zastępczy. - Dodaj nowe pole do indeksu o nazwie
predicted_price
typuEdm.Double
, ustaw właściwość Możliwe do pobrania na wartość true. - Ukończ proces importowania danych
Dodawanie umiejętności AML do zestawu umiejętności
Z listy zestawów umiejętności wybierz utworzony zestaw umiejętności. Teraz zmodyfikujesz zestaw umiejętności, aby zastąpić umiejętności identyfikacji osób umiejętnością AML w celu przewidywania cen.
Na karcie Definicja zestawu umiejętności (JSON) wybierz Azure Machine Learning (AML)
z listy rozwijanej umiejętności. Wybierz obszar roboczy, aby umiejętności AML odnajdywać punkt końcowy, obszar roboczy i usługa wyszukiwania muszą znajdować się w tej samej subskrypcji platformy Azure.
Wybierz punkt końcowy utworzony wcześniej w samouczku.
Sprawdź, czy umiejętność została wypełniona informacjami o identyfikatorze URI i uwierzytelnieniu zgodnie z konfiguracją podczas wdrażania punktu końcowego. Skopiuj szablon umiejętności i zastąp umiejętności w zestawie umiejętności.
Edytuj umiejętności, aby:
- Ustaw nazwę na prawidłową nazwę
- Dodawanie opisu
- Ustaw stopieńOfParallelism na 1
- Ustaw kontekst na
/document
- Ustaw dane wejściowe na wszystkie wymagane dane wejściowe, zobacz przykładową definicję umiejętności poniżej
- Ustaw dane wyjściowe, aby przechwycić zwróconą przewidywaną cenę.
{
"@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"
}
]
}
Aktualizowanie mapowań pól wyjściowych indeksatora
Mapowania pól wyjściowych indeksatora określają, jakie wzbogacenia są zapisywane w indeksie. Zastąp sekcję mapowań pól wyjściowych indeksatora poniższym fragmentem kodu:
"outputFieldMappings": [
{
"sourceFieldName": "/document/predicted_price",
"targetFieldName": "predicted_price"
}
]
Możesz teraz uruchomić indeksator i sprawdzić, czy predicted_price
właściwość jest wypełniona w indeksie wynikiem danych wyjściowych umiejętności AML.