Cara mengoprasikan alur pelatihan dengan titik akhir batch

BERLAKU UNTUK:Ekstensi ml Azure CLI v2 (saat ini)Python SDK azure-ai-ml v2 (saat ini)

Dalam artikel ini, Anda akan mempelajari cara mengoprasikan alur pelatihan di bawah titik akhir batch. Alur menggunakan beberapa komponen (atau langkah- langkah) yang mencakup pelatihan model, pra-pemrosesan data, dan evaluasi model.

Anda akan belajar untuk:

  • Membuat dan menguji alur pelatihan
  • Menyebarkan alur ke titik akhir batch
  • Mengubah alur dan membuat penyebaran baru di titik akhir yang sama
  • Uji penyebaran baru dan atur sebagai penyebaran default

Tentang contoh ini

Contoh ini menyebarkan alur pelatihan yang mengambil data pelatihan input (berlabel) dan menghasilkan model prediktif, bersama dengan hasil evaluasi dan transformasi yang diterapkan selama pra-pemrosesan. Alur akan menggunakan data tabular dari UCI Heart Disease Data Set untuk melatih model XGBoost. Kami menggunakan komponen pra-pemrosesan data untuk memproses data sebelum dikirim ke komponen pelatihan agar sesuai dan mengevaluasi model.

Visualisasi alur adalah sebagai berikut:

Cuplikan layar alur yang menunjukkan komponen praproscesing dan pelatihan.

Contoh dalam artikel ini didasarkan pada sampel kode yang terkandung dalam repositori azureml-examples . Untuk menjalankan perintah secara lokal tanpa harus menyalin/menempelkan YAML dan file lainnya, pertama-tama kloning repositori lalu ubah direktori ke folder:

git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli

File untuk contoh ini ada di:

cd endpoints/batch/deploy-pipelines/training-with-components

Ikuti di buku catatan Jupyter

Anda dapat mengikuti versi Python SDK dari contoh ini dengan membuka notebook sdk-deploy-and-test.ipynb di repositori kloning.

Prasyarat

Sebelum mengikuti langkah-langkah dalam artikel ini, pastikan Anda memiliki prasyarat berikut:

  • Langganan Azure. Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum Anda memulai. Coba versi gratis atau berbayar Azure Machine Learning.

  • Ruang kerja Azure Machine Learning. Jika Anda tidak memilikinya, gunakan langkah-langkah dalam artikel Mengelola ruang kerja Azure Pembelajaran Mesin untuk membuatnya.

  • Pastikan Anda memiliki izin berikut di ruang kerja:

    • Membuat atau mengelola titik akhir dan penyebaran batch: Gunakan peran Pemilik, Kontributor, atau Kustom yang memungkinkan Microsoft.MachineLearningServices/workspaces/batchEndpoints/*.

    • Membuat penyebaran ARM di grup sumber daya ruang kerja: Gunakan peran Pemilik, Kontributor, atau Kustom yang memungkinkan Microsoft.Resources/deployments/write dalam grup sumber daya tempat ruang kerja disebarkan.

  • Anda perlu menginstal perangkat lunak berikut untuk bekerja dengan Azure Pembelajaran Mesin:

    Azure CLI dan mlekstensi untuk Azure Pembelajaran Mesin.

    az extension add -n ml
    

    Catatan

    Penyebaran komponen alur untuk Titik Akhir Batch diperkenalkan dalam ekstensi versi 2.7 ml untuk Azure CLI. Gunakan az extension update --name ml untuk mendapatkan versi terakhirnya.

Menyambungkan ke ruang kerja Anda

Ruang kerja adalah sumber daya tingkat teratas untuk Azure Machine Learning, menyediakan tempat terpusat untuk bekerja dengan semua artefak yang Anda buat saat Anda menggunakan Azure Machine Learning. Di bagian ini, kita akan menyambungkan ke ruang kerja tempat Anda akan melakukan tugas penyebaran.

Teruskan nilai untuk ID langganan, ruang kerja, lokasi, dan grup sumber daya Anda dalam kode berikut:

az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>

Membuat komponen alur pelatihan

Di bagian ini, kita akan membuat semua aset yang diperlukan untuk alur pelatihan kita. Kita akan mulai dengan membuat lingkungan yang mencakup pustaka yang diperlukan untuk melatih model. Kita kemudian akan membuat kluster komputasi tempat penyebaran batch akan berjalan, dan akhirnya, kita akan mendaftarkan data input sebagai aset data.

Buat lingkungan

Komponen dalam contoh ini akan menggunakan lingkungan dengan XGBoost pustaka dan scikit-learn . File environment/conda.yml berisi konfigurasi lingkungan:

lingkungan/conda.yml

channels:
- conda-forge
dependencies:
- python=3.8.5
- pip
- pip:
  - mlflow
  - azureml-mlflow
  - datasets
  - jobtools
  - cloudpickle==1.6.0
  - dask==2023.2.0
  - scikit-learn==1.1.2
  - xgboost==1.3.3
  - pandas==1.4
name: mlflow-env

Buat lingkungan sebagai berikut:

  1. Tentukan lingkungan:

    lingkungan/xgboost-sklearn-py38.yml

    $schema: https://azuremlschemas.azureedge.net/latest/environment.schema.json
    name: xgboost-sklearn-py38
    image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
    conda_file: conda.yml
    description: An environment for models built with XGBoost and Scikit-learn.
    
  2. Buat lingkungan:

    az ml environment create -f environment/xgboost-sklearn-py38.yml
    

Membuat kluster komputasi

Titik akhir dan penyebaran batch berjalan pada kluster komputasi. Mereka dapat berjalan pada kluster komputasi Azure Pembelajaran Mesin apa pun yang sudah ada di ruang kerja. Oleh karena itu, beberapa penyebaran batch dapat berbagi infrastruktur komputasi yang sama. Dalam contoh ini, kita akan mengerjakan kluster komputasi Azure Pembelajaran Mesin yang disebut batch-cluster. Mari kita verifikasi bahwa komputasi ada di ruang kerja atau membuatnya sebaliknya.

az ml compute create -n batch-cluster --type amlcompute --min-instances 0 --max-instances 5

Mendaftarkan data pelatihan sebagai aset data

Data pelatihan kami diwakili dalam file CSV. Untuk menimpulkan beban kerja tingkat produksi yang lebih banyak, kita akan mendaftarkan data pelatihan dalam heart.csv file sebagai aset data di ruang kerja. Aset data ini nantinya akan ditunjukkan sebagai input ke titik akhir.

az ml data create --name heart-classifier-train --type uri_folder --path data/train

Membuat alur

Alur yang ingin kami operasionalkan mengambil satu input, data pelatihan, dan menghasilkan tiga output: model terlatih, hasil evaluasi, dan transformasi data yang diterapkan sebagai prapemroseduran. Alur terdiri dari dua komponen:

  • preprocess_job: Langkah ini membaca data input dan mengembalikan data yang disiapkan dan transformasi yang diterapkan. Langkah ini menerima tiga input:
    • data: folder yang berisi data input untuk diubah dan dinilai
    • transformations: (opsional) Jalur ke transformasi yang akan diterapkan, jika tersedia. Jika jalur tidak disediakan, transformasi akan dipelajari dari data input. transformations Karena input bersifat opsional, preprocess_job komponen dapat digunakan selama pelatihan dan penilaian.
    • categorical_encoding: strategi pengodean untuk fitur kategoris (ordinal atau onehot).
  • train_job: Langkah ini akan melatih model XGBoost berdasarkan data yang disiapkan dan mengembalikan hasil evaluasi dan model terlatih. Langkah ini menerima tiga input:
    • data: data yang telah diproscesikan sebelumnya.
    • target_column: kolom yang ingin kita prediksi.
    • eval_size: menunjukkan proporsi data input yang digunakan untuk evaluasi.

Konfigurasi alur ditentukan dalam deployment-ordinal/pipeline.yml file:

deployment-ordinal/pipeline.yml

$schema: https://azuremlschemas.azureedge.net/latest/pipelineComponent.schema.json
type: pipeline

name: uci-heart-train-pipeline
display_name: uci-heart-train
description: This pipeline demonstrates how to train a machine learning classifier over the UCI heart dataset.

inputs:
  input_data:
    type: uri_folder

outputs: 
  model:
    type: mlflow_model
    mode: upload
  evaluation_results:
    type: uri_folder
    mode: upload
  prepare_transformations:
    type: uri_folder
    mode: upload

jobs:
  preprocess_job:
    type: command
    component: ../components/prepare/prepare.yml
    inputs:
      data: ${{parent.inputs.input_data}}
      categorical_encoding: ordinal
    outputs:
      prepared_data:
      transformations_output: ${{parent.outputs.prepare_transformations}}
  
  train_job:
    type: command
    component: ../components/train_xgb/train_xgb.yml
    inputs:
      data: ${{parent.jobs.preprocess_job.outputs.prepared_data}}
      target_column: target
      register_best_model: false
      eval_size: 0.3
    outputs:
      model: 
        mode: upload
        type: mlflow_model
        path: ${{parent.outputs.model}}
      evaluation_results:
        mode: upload
        type: uri_folder
        path: ${{parent.outputs.evaluation_results}}

Catatan

pipeline.yml Dalam file, transformations input hilang dari preprocess_job; oleh karena itu, skrip akan mempelajari parameter transformasi dari data input.

Visualisasi alur adalah sebagai berikut:

Gambar alur yang menunjukkan input pekerjaan, komponen alur, dan output di setiap langkah alur.

Menguji alur

Mari kita uji alur dengan beberapa data sampel. Untuk melakukannya, kita akan membuat pekerjaan menggunakan alur dan kluster komputasi yang batch-cluster dibuat sebelumnya.

File berikut pipeline-job.yml berisi konfigurasi untuk pekerjaan alur:

deployment-ordinal/pipeline-job.yml

$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline

experiment_name: uci-heart-train-pipeline
display_name: uci-heart-train-job
description: This pipeline demonstrates how to train a machine learning classifier over the UCI heart dataset.

compute: batch-cluster
component: pipeline.yml
inputs:
  input_data:
    type: uri_folder
outputs: 
  model:
    type: mlflow_model
    mode: upload
  evaluation_results:
    type: uri_folder
    mode: upload
  prepare_transformations:
    mode: upload

Buat pekerjaan pengujian:

az ml job create -f deployment-ordinal/pipeline-job.yml --set inputs.input_data.path=azureml:heart-classifier-train@latest

Membuat titik akhir batch

  1. Berikan nama untuk titik akhir. Nama titik akhir batch harus unik di setiap wilayah karena namanya digunakan untuk membangun URI pemanggilan. Untuk memastikan keunikan, tambahkan karakter berikutnya ke nama yang ditentukan dalam kode berikut.

    ENDPOINT_NAME="uci-classifier-train"
    
  2. Konfigurasikan titik akhir:

    File endpoint.yml berisi konfigurasi titik akhir.

    endpoint.yml

    $schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json
    name: uci-classifier-train
    description: An endpoint to perform training of the Heart Disease Data Set prediction task.
    auth_mode: aad_token
    
  3. Buat titik akhir:

    az ml batch-endpoint create --name $ENDPOINT_NAME -f endpoint.yml
    
  4. Kueri URI titik akhir:

    az ml batch-endpoint show --name $ENDPOINT_NAME
    

Menyebarkan komponen alur

Untuk menyebarkan komponen alur, kita harus membuat penyebaran batch. Penyebaran adalah sekumpulan sumber daya yang diperlukan untuk menghosting aset yang melakukan pekerjaan aktual.

  1. Konfigurasikan penyebaran:

    File deployment-ordinal/deployment.yml berisi konfigurasi penyebaran. Anda dapat memeriksa skema YAML titik akhir batch lengkap untuk properti tambahan.

    deployment-ordinal/deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/pipelineComponentBatchDeployment.schema.json
    name: uci-classifier-train-xgb
    description: A sample deployment that trains an XGBoost model for the UCI dataset.
    endpoint_name: uci-classifier-train
    type: pipeline
    component: pipeline.yml
    settings:
        continue_on_step_failure: false
        default_compute: batch-cluster
    
  2. Buat penyebaran:

    Jalankan kode berikut untuk membuat penyebaran batch di bawah titik akhir batch dan atur sebagai penyebaran default.

    az ml batch-deployment create --endpoint $ENDPOINT_NAME -f deployment-ordinal/deployment.yml --set-default
    

    Tip

    Perhatikan penggunaan --set-default bendera untuk menunjukkan bahwa penyebaran baru ini sekarang menjadi default.

  3. Penyebaran Anda siap digunakan.

Menguji penyebarannya

Setelah penyebaran dibuat, penyebaran siap untuk menerima pekerjaan. Ikuti langkah-langkah berikut untuk mengujinya:

  1. Penyebaran kami mengharuskan kami menunjukkan satu input data.

    File inputs.yml berisi definisi untuk aset data input:

    inputs.yml

    inputs:
      input_data:
        type: uri_folder
        path: azureml:heart-classifier-train@latest
    

    Tip

    Untuk mempelajari selengkapnya tentang cara menunjukkan input, lihat Membuat pekerjaan dan memasukkan data untuk titik akhir batch.

  2. Anda dapat memanggil penyebaran default sebagai berikut:

    JOB_NAME=$(az ml batch-endpoint invoke -n $ENDPOINT_NAME --f inputs.yml --query name -o tsv)
    
  3. Anda dapat memantau kemajuan acara dan mengalirkan log menggunakan:

    az ml job stream -n $JOB_NAME
    

Perlu disebutkan bahwa hanya input alur yang diterbitkan sebagai input di titik akhir batch. Misalnya, categorical_encoding adalah input dari langkah alur, tetapi bukan input dalam alur itu sendiri. Gunakan fakta ini untuk mengontrol input mana yang ingin Anda ekspos ke klien Anda dan mana yang ingin Anda sembunyikan.

Mengakses output pekerjaan

Setelah pekerjaan selesai, kita dapat mengakses beberapa outputnya. Alur ini menghasilkan output berikut untuk komponennya:

  • preprocess job: output adalah transformations_output
  • train job: output adalah model dan evaluation_results

Anda dapat mengunduh hasil terkait menggunakan:

az ml job download --name $JOB_NAME --output-name transformations
az ml job download --name $JOB_NAME --output-name model
az ml job download --name $JOB_NAME --output-name evaluation_results

Membuat penyebaran baru di titik akhir

Titik akhir dapat menghosting beberapa penyebaran sekaligus, sambil hanya menyimpan satu penyebaran sebagai default. Oleh karena itu, Anda dapat melakukan iterasi atas model yang berbeda, menyebarkan model yang berbeda ke titik akhir Anda dan mengujinya, dan akhirnya, mengalihkan penyebaran default ke penyebaran model yang paling sesuai untuk Anda.

Mari kita ubah cara praproses dilakukan dalam alur untuk melihat apakah kita mendapatkan model yang berkinerja lebih baik.

Mengubah parameter dalam komponen pra-pemrosesan alur

Komponen pra-pemrosesan memiliki input yang disebut categorical_encoding, yang dapat memiliki nilai ordinal atau onehot. Nilai-nilai ini sesuai dengan dua cara berbeda untuk mengodekan fitur kategoris.

  • ordinal: Mengodekan nilai fitur dengan nilai numerik (ordinal) dari [1:n], di mana n adalah jumlah kategori dalam fitur. Pengodean ordinal menyiratkan bahwa ada urutan peringkat alami di antara kategori fitur.
  • onehot: Tidak menyiratkan hubungan urutan peringkat alami tetapi memperkenalkan masalah dimensi jika jumlah kategori besar.

Secara default, kami menggunakan ordinal sebelumnya. Sekarang mari kita ubah pengodean kategoris untuk digunakan onehot dan melihat performa model.

Tip

Atau, kita bisa mengekspos categorial_encoding input ke klien sebagai input ke pekerjaan alur itu sendiri. Namun, kami memilih untuk mengubah nilai parameter dalam langkah pra-pemrosesan sehingga kami dapat menyembunyikan dan mengontrol parameter di dalam penyebaran dan memanfaatkan kesempatan untuk memiliki beberapa penyebaran di bawah titik akhir yang sama.

  1. Ubah alur. Ini terlihat sebagai berikut:

    Konfigurasi alur ditentukan dalam deployment-onehot/pipeline.yml file:

    deployment-onehot/pipeline.yml

    $schema: https://azuremlschemas.azureedge.net/latest/pipelineComponent.schema.json
    type: pipeline
    
    name: uci-heart-train-pipeline
    display_name: uci-heart-train
    description: This pipeline demonstrates how to train a machine learning classifier over the UCI heart dataset.
    
    inputs:
      input_data:
        type: uri_folder
    
    outputs: 
      model:
        type: mlflow_model
        mode: upload
      evaluation_results:
        type: uri_folder
        mode: upload
      prepare_transformations:
        type: uri_folder
        mode: upload
    
    jobs:
      preprocess_job:
        type: command
        component: ../components/prepare/prepare.yml
        inputs:
          data: ${{parent.inputs.input_data}}
          categorical_encoding: onehot
        outputs:
          prepared_data:
          transformations_output: ${{parent.outputs.prepare_transformations}}
      
      train_job:
        type: command
        component: ../components/train_xgb/train_xgb.yml
        inputs:
          data: ${{parent.jobs.preprocess_job.outputs.prepared_data}}
          target_column: target
          eval_size: 0.3
        outputs:
          model: 
            type: mlflow_model
            path: ${{parent.outputs.model}}
          evaluation_results:
            type: uri_folder
            path: ${{parent.outputs.evaluation_results}}
    
  2. Konfigurasikan penyebaran:

    File deployment-onehot/deployment.yml berisi konfigurasi penyebaran. Anda dapat memeriksa skema YAML titik akhir batch lengkap untuk properti tambahan.

    deployment-onehot/deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/pipelineComponentBatchDeployment.schema.json
    name: uci-classifier-train-onehot
    description: A sample deployment that trains an XGBoost model for the UCI dataset using onehot encoding for variables.
    endpoint_name: uci-classifier-train
    type: pipeline
    component: pipeline.yml
    settings:
        continue_on_step_failure: false
        default_compute: batch-cluster
    
  3. Buat penyebaran:

    Jalankan kode berikut untuk membuat penyebaran batch di bawah titik akhir batch dan atur sebagai penyebaran default.

    az ml batch-deployment create --endpoint $ENDPOINT_NAME -f deployment-onehot/deployment.yml
    

    Penyebaran Anda siap digunakan.

  4. Penyebaran Anda siap digunakan.

Menguji penyebaran nondefault

Setelah penyebaran dibuat, penyebaran siap untuk menerima pekerjaan. Kita dapat mengujinya dengan cara yang sama seperti sebelumnya, tetapi sekarang kita akan memanggil penyebaran tertentu:

  1. Panggil penyebaran sebagai berikut, menentukan parameter penyebaran untuk memicu penyebaran uci-classifier-train-onehottertentu :

    DEPLOYMENT_NAME="uci-classifier-train-onehot"
    JOB_NAME=$(az ml batch-endpoint invoke -n $ENDPOINT_NAME -d $DEPLOYMENT_NAME --f inputs.yml --query name -o tsv)
    
  2. Anda dapat memantau kemajuan acara dan mengalirkan log menggunakan:

    az ml job stream -n $JOB_NAME
    

Mengonfigurasi penyebaran baru sebagai penyebaran default

Setelah puas dengan performa penyebaran baru, kita dapat mengatur penyebaran baru ini sebagai default:

az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME

Menghapus penyebaran lama

Setelah selesai, Anda dapat menghapus penyebaran lama jika Anda tidak membutuhkannya lagi:

az ml batch-deployment delete --name uci-classifier-train-xgb --endpoint-name $ENDPOINT_NAME --yes

Membersihkan sumber daya

Setelah selesai, hapus sumber daya terkait dari ruang kerja:

Jalankan kode berikut untuk menghapus titik akhir batch dan penyebaran yang mendasarinya. --yes digunakan untuk mengonfirmasi penghapusan.

az ml batch-endpoint delete -n $ENDPOINT_NAME --yes

(Opsional) Hapus komputasi, kecuali Anda berencana untuk menggunakan kembali kluster komputasi Anda dengan penyebaran nanti.

az ml compute delete -n batch-cluster

Langkah berikutnya