Udostępnij za pośrednictwem


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.

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.

  1. Podaj prawidłową nazwę punktu końcowego
  2. Wybierz typ obliczeniowy Azure Kubernetes Service
  3. Wybierz nazwę obliczeniową klastra wnioskowania
  4. Przełącz się enable authentication do pozycji włączonej
  5. Wybierz Key-based authentication typ
  6. Wybierz zaktualizowany score.py element dla entry script file
  7. Wybierz element conda_env.yaml dla conda dependencies file
  8. Wybierz przycisk wdróż, aby wdrożyć nowy punkt końcowy.

Aby zintegrować nowo utworzony punkt końcowy z usługą Cognitive Search

  1. Dodawanie pliku JSON zawierającego pojedynczy rekord samochodowy do kontenera obiektów blob
  2. Skonfiguruj potok wzbogacania sztucznej inteligencji przy użyciu kreatora importu danych. Pamiętaj, aby wybrać jako JSONparsing mode
  3. Add Enrichments Na karcie wybierz pojedynczą umiejętność Extract people names jako symbol zastępczy.
  4. Dodaj nowe pole do indeksu o nazwie predicted_price typu Edm.Double, ustaw właściwość Możliwe do pobrania na wartość true.
  5. 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:

  1. Ustaw nazwę na prawidłową nazwę
  2. Dodawanie opisu
  3. Ustaw stopieńOfParallelism na 1
  4. Ustaw kontekst na /document
  5. Ustaw dane wejściowe na wszystkie wymagane dane wejściowe, zobacz przykładową definicję umiejętności poniżej
  6. 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.