Sdílet prostřednictvím


Příklad: Sestavení a nasazení vlastní dovednosti pomocí návrháře služby Azure Machine Learning (archivováno)

Tento příklad je archivován a není podporován. Vysvětluje, jak používat návrháře služby Azure Machine Learning , který je snadno použitelným interaktivním plátnem k vytváření modelů strojového učení pro úlohy, jako je regrese a klasifikace. Vyvolání modelu vytvořeného návrhářem v kanálu rozšiřování kognitivního vyhledávání vyžaduje několik dalších kroků. V tomto příkladu vytvoříte jednoduchý regresní model, který předpovídá cenu automobilu a vyvolá koncový bod odvozování jako dovednost AML.

Postupujte podle kurzu Regrese - Automobile Price Prediction (Advanced) kurzu v příklady kanálů & datových sadách dokumentaci a vytvořte model, který predikuje cenu automobilu vzhledem k různým funkcím.

Důležitý

Nasazení modelu po procesu odvozování v reálném čase způsobí platný koncový bod, ale ne ten, který můžete použít s dovedností AML ve službě Cognitive Search.

Registrace modelu a stažení aktiv

Jakmile máte natrénovaný model, zaregistrujte natrénovaný model a postupujte podle pokynů ke stažení všech souborů ve složce trained_model_outputs nebo stažení pouze score.py a conda_env.yml souborů ze stránky artefaktů modelů. Před nasazením modelu jako koncového bodu pro odvozování v reálném čase upravíte bodovací skript.

Kanály rozšiřování kognitivního vyhledávání fungují na jednom dokumentu a generují požadavek, který obsahuje vstupy pro jednu předpověď. Stažený score.py přijme seznam záznamů a vrátí seznam předpovědí jako serializovaný řetězec JSON. V score.py provedete dvě změny.

  • Upravte skript tak, aby fungoval s jedním vstupním záznamem, ne se seznamem.
  • Upravte skript tak, aby vrátil objekt JSON s jednou vlastností, předpovězenou cenou.

Otevřete stažený score.py a upravte funkci run(data). Funkce je nyní nastavena tak, aby očekávala následující vstup, jak je popsáno v souboru _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
  }
]

Vaše změny zajistí, že model může přijmout vstup vygenerovaný službou Cognitive Search během indexování, což je jeden záznam.

{
    "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
}

Nahrazení řádků 27 až 30


    for key, val in data.items():
        input_entry[key].append(decode_nan(val))

Budete také muset upravit výstup, který skript vygeneruje z řetězce do objektu JSON. Upravte návratový příkaz (řádek 37) v původním souboru tak, aby:

    output = result.data_frame.values.tolist()
    return {
        "predicted_price": output[0][-1]
    }

Tady je aktualizovaná funkce run se změnami ve vstupním formátu a predikovaným výstupem, který přijme jeden záznam jako vstup a vrátí objekt JSON s předpokládanou cenou.

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]
    }

Registrace a nasazení modelu

S uloženými změnami teď můžete model zaregistrovat na portálu. Vyberte model registrace a zadejte mu správný název. Zvolte Other pro Model Framework, Custom pro název architektury a 1.0 pro verzi frameworku. Vyberte možnost Upload folder a vyberte složku s aktualizovanými score.py a conda_env.yaml.

Vyberte model a aktivujte akci Deploy. Krok nasazení předpokládá, že máte zřízený inference cluster AKS. Instance kontejnerů se v současné době ve službě Cognitive Search nepodporují.

  1. Zadejte platný název koncového bodu.
  2. Vyberte typ výpočtu Azure Kubernetes Service
  3. Vyberte název výpočetního objektu pro cluster odvozování.
  4. Přepněte enable authentication na zapnuto
  5. Výběr Key-based authentication pro typ
  6. Výběr aktualizovaného score.py pro entry script file
  7. Vyberte conda_env.yaml pro conda dependencies file
  8. Výběrem tlačítka Nasadit nasaďte nový koncový bod.

Integrace nově vytvořeného koncového bodu se službou Cognitive Search

  1. Přidání souboru JSON obsahujícího jeden záznam automobilu do kontejneru objektů blob
  2. Nakonfigurujte kanál rozšiřování AI pomocí průvodce importem dat. Nezapomeňte vybrat JSON jako parsing mode.
  3. Na kartě Add Enrichments vyberte jednu dovednost Extract people names jako zástupný symbol.
  4. Přidejte nové pole do indexu s názvem predicted_price typu Edm.Double, nastavte Vlastnost Retrievable na true.
  5. Dokončení procesu importu dat

Přidání dovednosti AML do sady dovedností

V seznamu sad dovedností vyberte sadu dovedností, kterou jste vytvořili. Sadu dovedností teď upravíte tak, aby nahradila identifikační dovednosti lidí dovednostmi AML, abyste mohli předpovídat ceny. Na kartě Definice sady dovedností (JSON) vyberte v rozevíracím seznamu dovedností Azure Machine Learning (AML). Vyberte pracovní prostor, aby dovednost AML objevila váš koncový bod, pracovní prostor a vyhledávací služba musí být ve stejném předplatném Azure. Vyberte koncový bod, který jste vytvořili dříve v kurzu. Ověřte, že se dovednost naplní identifikátorem URI a ověřovacími informacemi, jak je nakonfigurované při nasazení koncového bodu. Zkopírujte šablonu dovedností a nahraďte dovednost v sadě dovedností. Upravte dovednosti tak, aby:

  1. Nastavení názvu na platný název
  2. Přidání popisu
  3. Nastavte stupně paralelismu na 1
  4. Nastavení kontextu na /document
  5. Nastavte vstupy na všechny požadované vstupy, viz definice ukázkové dovednosti níže.
  6. Nastavte výstupy tak, aby zachytily vrácenou předpokládanou cenu.
{
      "@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"
        }
      ]
    }

Aktualizace mapování výstupních polí indexeru

Mapování výstupních polí indexeru určuje, jaká obohacení se uloží do indexu. Část mapování výstupních polí indexeru nahraďte následujícím fragmentem kódu:

"outputFieldMappings": [
    {
      "sourceFieldName": "/document/predicted_price",
      "targetFieldName": "predicted_price"
    }
  ]

Teď můžete spustit indexer a ověřit, že je vlastnost predicted_price naplněna v indexu s výsledkem výstupu dovednosti AML.