Contoh: Membangun dan menyebarkan keterampilan kustom dengan perancang Azure Machine Learning (Diarsipkan)

Contoh ini diarsipkan dan tidak didukung. Ini menjelaskan cara menggunakan perancang Azure Machine Learning adalah kanvas interaktif yang mudah digunakan untuk membuat model pembelajaran mesin untuk tugas-tugas seperti regresi dan klasifikasi. Memanggil model yang dibuat oleh perancang dalam alur pengayaan Cognitive Search memerlukan beberapa langkah tambahan. Dalam contoh ini, Anda akan membuat model regresi sederhana untuk memprediksi harga mobil dan memanggil titik akhir inferensi sebagai keterampilan AML.

Ikuti tutorial Regresi - Prediksi Harga Mobil (Tingkat Lanjut) dalam contoh alur & himpunan data halaman dokumentasi untuk membuat model yang memprediksi harga mobil dengan fitur yang berbeda.

Penting

Menyebarkan model setelah proses inferensi real time akan menghasilkan titik akhir yang valid, tetapi bukan yang dapat Anda gunakan dengan keterampilan AML di Cognitive Search.

Mendaftarkan model dan mengunduh aset

Setelah Anda memiliki model yang dilatih, mendaftarkan model terlatih dan ikuti langkah-langkah untuk mengunduh semua file di folder trained_model_outputs atau hanya mengunduh file score.py dan conda_env.yml dari halaman artefak model. Anda akan mengedit skrip penilaian sebelum model diterapkan sebagai titik akhir inferensi waktu nyata.

Alur pengayaan Cognitive Search bekerja pada satu dokumen dan menghasilkan permintaan yang berisi input untuk satu prediksi. score.py yang diunduh menerima daftar rekaman dan mengembalikan daftar prediksi sebagai string JSON berseri. Anda akan membuat dua perubahan pada score.py

  • Edit skrip untuk bekerja dengan satu rekaman input, bukan daftar
  • Edit skrip untuk mengembalikan objek JSON dengan satu properti, harga yang diprediksi.

Buka score.py yang diunduh dan edit fungsi run(data). Fungsi saat ini disiapkan untuk mengharapkan input berikut seperti yang dijelaskan dalam file _samples.json model.

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

Perubahan Anda akan memastikan bahwa model dapat menerima input yang dihasilkan oleh Cognitive Search selama pengindeksan, yang merupakan satu rekaman.

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

Ganti baris 27 hingga 30 dengan


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

Anda juga perlu mengedit output yang dihasilkan skrip dari string ke objek JSON. Edit pernyataan pengembalian (baris 37) dalam file asli ke:

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

Berikut adalah fungsi run yang diperbarui dengan perubahan format input dan output yang diprediksi yang akan menerima satu rekaman sebagai input dan mengembalikan objek JSON dengan harga yang diprediksi.

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

Mendaftarkan dan menyebarkan model

Dengan perubahan yang disimpan, Anda sekarang dapat mendaftarkan model di portal. Pilih model pendaftaran dan berikan nama yang valid. Pilih Other untuk Kerangka Kerja Model, Custom untuk Nama Kerangka Kerja dan 1.0 untuk Versi Kerangka Kerja. Pilih opsi Upload folder dan pilih folder dengan score.py yang diperbarui dan conda_env.yaml.

Pilih model dan pilih tindakan Deploy. Langkah penyebaran diasumsikan bahwa Anda sudah memiliki kluster inferensi AKS yang sudah disediakan. Instans kontainer saat ini tidak didukung dalam Cognitive Search.

  1. Berikan nama titik akhir yang valid
  2. Pilih tipe pengolahan Azure Kubernetes Service
  3. Pilih nama komputasi untuk kluster inferensi Anda
  4. Alihkan enable authentication ke aktif
  5. Pilih Key-based authentication untuk jenis
  6. Pilih score.py yang diperbarui untuk entry script file
  7. Pilih conda_env.yaml untuk conda dependencies file
  8. Pilih tombol untuk mengaktifkan endpoint baru Anda.

Untuk mengintegrasikan endpoint yang baru dibuat dengan Cognitive Search

  1. Menambahkan file JSON yang berisi satu rekaman mobil ke kontainer blob
  2. Atur alur pengayaan AI menggunakan wizard Impor data. Pastikan untuk memilih JSON sebagai parsing mode
  3. Pada tab Add Enrichments, pilihlah satu keterampilan Extract people names sebagai placeholder.
  4. Tambahkan bidang baru ke indeks dengan nama predicted_price dan tipe Edm.Double, atur properti 'dapat diambil' ke true.
  5. Menyelesaikan proses impor data

Menambahkan Keterampilan AML ke set keterampilan

Dari daftar kumpulan keterampilan, pilih kumpulan keterampilan yang Anda buat. Anda sekarang akan mengedit set keterampilan untuk mengganti keterampilan identifikasi orang dengan keterampilan AML untuk memprediksi harga. Pada tab Definisi Skillset (JSON), pilih Azure Machine Learning (AML) dari menu tarik-turun keterampilan. Pilih ruang kerja, agar keterampilan AML menemukan titik akhir Anda, ruang kerja dan layanan pencarian harus berada di langganan Azure yang sama. Pilih titik akhir yang Anda buat sebelumnya dalam tutorial. Validasi bahwa skill dilengkapi dengan URI dan informasi autentikasi sesuai dengan konfigurasi ketika Anda mengerahkan titik akhir. Salin template keterampilan dan ganti keterampilan dalam kumpulan keterampilan. Sunting keterampilan menjadi:

  1. Atur nama ke nama yang valid
  2. Menambahkan deskripsi
  3. Atur tingkat paralelisme ke 1
  4. Atur konteks ke /document
  5. Atur input ke semua input yang diperlukan, lihat contoh definisi keterampilan di bawah ini
  6. Atur output untuk menangkap harga yang diprediksi yang telah dikembalikan.
{
      "@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"
        }
      ]
    }

Memperbarui pemetaan bidang output pengindeks

Pemetaan bidang keluaran pengindeks menentukan pengayaan apa yang disimpan dalam indeks. Ganti bagian pemetaan bidang output pengindeks dengan cuplikan di bawah ini:

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

Anda sekarang dapat menjalankan pengindeks dan memvalidasi bahwa properti predicted_price diisi dalam indeks dengan hasil dari output keterampilan AML Anda.