Udostępnij za pośrednictwem


Przykład: tworzenie i wdrażanie umiejętności niestandardowych za pomocą projektanta usługi Azure Machine Learning (zarchiwizowane)

Ten przykład jest zarchiwizowany i niedostępny. Opisano, jak używać projektanta usługi Azure Machine Learning jako łatwej w użyciu interaktywnej kanwy do tworzenia modeli uczenia maszynowego dla zadań takich jak regresja i klasyfikacja. Wywołanie modelu utworzonego przez projektanta w pipeline wzbogacania wyszukiwania kognitywnego wymaga wykonania kilku dodatkowych kroków. W tym przykładzie utworzysz prosty model regresji, aby przewidzieć cenę samochodu, i wywołasz punkt końcowy wnioskowania jako funkcję Azure Machine Learning.

Postępuj zgodnie z samouczkiem Regresja (zaawansowane) - przewidywanie cen samochodów na stronie dokumentacji przykłady potoków i & zestawy danych, aby utworzyć model, który przewiduje cenę samochodu, biorąc pod uwagę różne cechy.

Ważny

Wdrożenie modelu zgodnie z procesem 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 wytrenowaniu modelu zarejestruj wytrenowany model i wykonaj kroki, aby pobrać wszystkie pliki w folderze trained_model_outputs lub pobierz tylko pliki score.py i conda_env.yml ze strony artefaktów modeli. Będziesz edytować skrypt oceniania przed wdrożeniem modelu jako punkt końcowy do wnioskowania w czasie rzeczywistym.

Potoki wzbogacania usługi Cognitive Search działają na jednym dokumencie i generują żądanie zawierające dane wejściowe dla pojedynczego przewidywania. Pobrany score.py 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 jedną właściwością: przewidywaną ceną.

Otwórz pobrany score.py, a następnie edytuj funkcję run(data). Funkcja jest obecnie skonfigurowana, aby oczekiwać następujących danych wejściowych zgodnie z opisem w pliku _samples.json modelu.

[
  {
    "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 będzie mógł akceptować dane wejściowe generowane 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 funkcja run ze zmianami w formacie wejściowym i przewidywanymi danymi wyjściowymi, które zaakceptują pojedynczy rekord jako dane wejściowe i zwracają 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 model rejestru i podaj prawidłową nazwę. Wybierz Other dla struktury modelu, Custom dla nazwy struktury i 1.0 dla wersji struktury. Wybierz opcję Upload folder, a następnie folder zawierający zaktualizowaną score.py i conda_env.yaml.

Wybierz model, a następnie kliknij akcję Deploy. W kroku wdrażania założono, że masz już uruchomiony klaster do wnioskowania w usłudze AKS. Wystąpienia kontenerów obecnie nie są 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 enable authentication na włączone
  5. Wybierz Key-based authentication dla typu
  6. Wybierz zaktualizowaną score.py dla entry script file
  7. Wybierz 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. Dodaj plik JSON zawierający pojedynczy rekord samochodu do kontenera blob
  2. Konfigurowanie przepływu pracy wzbogacania AI z użyciem kreatora importu danych. Pamiętaj, aby wybrać JSON jako parsing mode
  3. Na karcie Add Enrichments 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ść Pobieranie na 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ściami AML w celu przewidywania cen. Na karcie Definicja zestawu umiejętności (JSON) wybierz pozycję Azure Machine Learning (AML) z listy rozwijanej umiejętności. Wybierz obszar roboczy. Aby funkcja AML mogła znaleźć punkt końcowy, obszar roboczy i usługa wyszukiwania muszą znajdować się w tej samej subskrypcji platformy Azure. Wybierz punkt końcowy, który utworzyłeś wcześniej w samouczku. Zweryfikuj, czy funkcja jest wypełniona danymi URI i uwierzytelniania, jak skonfigurowano podczas wdrażania punktu końcowego. Skopiuj szablon umiejętności i zastąp umiejętność w pakiecie umiejętności. Edytuj umiejętność, aby:

  1. Ustaw nazwę na prawidłową nazwę
  2. Dodawanie opisu
  3. Ustaw degreesOfParallelism na 1
  4. Ustaw kontekst na /document
  5. Ustaw wszystkie wymagane dane wejściowe, zobacz przykładową definicję umiejętności poniżej
  6. Ustaw dane wyjściowe na przechwytywanie przewidywanej ceny zwróconej.
{
      "@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 zweryfikować, czy właściwość predicted_price jest wypełniona w indeksie wynikiem danych wyjściowych umiejętności AML.