Melatih model PyTorch dalam skala besar dengan Azure Machine Learning

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

Dalam artikel ini, Anda mempelajari cara melatih, menyetel hiperparameter, dan menyebarkan model PyTorch dengan menggunakan Azure Machine Learning Python SDK v2.

Anda menggunakan skrip contoh untuk mengklasifikasikan gambar ayam dan kalkun dan membangun jaringan saraf deep learning (DNN) berdasarkan tutorial pembelajaran transfer dari PyTorch. Pembelajaran transfer adalah teknik yang menerapkan pengetahuan yang diperoleh dari pemecahan satu masalah ke masalah lain tetapi masih terkait. Pembelajaran transfer mempersingkat proses pelatihan dengan membutuhkan lebih sedikit data, waktu, dan sumber daya komputasi daripada pelatihan dari awal. Untuk mempelajari selengkapnya tentang pembelajaran transfer, lihat Pembelajaran mendalam vs. pembelajaran mesin.

Baik Anda melatih model PyTorch pembelajaran mendalam dari bawah ke atas atau Anda membawa model yang ada ke cloud, gunakan Azure Machine Learning untuk menskalakan pekerjaan pelatihan sumber terbuka dengan menggunakan sumber daya komputasi cloud elastis. Anda dapat membuat, menyebarkan, membuat versi, dan memantau model tingkat produksi dengan Azure Machine Learning.

Prasyarat

  • Langganan Azure. Jika Anda belum memilikinya, buat akun gratis.
  • Python 3.10 atau yang lebih baru.
  • Jalankan kode dalam artikel ini dengan menggunakan instans komputasi Azure Machine Learning atau notebook Jupyter Anda sendiri.
    • Instans komputasi Azure Pembelajaran Mesin—tidak ada unduhan atau penginstalan yang diperlukan:
      • Selesaikan Panduan Cepat: Memulai dengan Azure Machine Learning untuk membuat server notebook khusus yang sudah dilengkapi dengan SDK dan repositori sampel.
      • Di bawah tab Sampel di bagian Buku Catatan ruang kerja Anda, temukan buku catatan yang telah selesai dan diperluas dengan menavigasi ke direktori ini: SDK v2/sdk/python/jobs/single-step/pytorch/train-hyperparameter-tune-deploy-with-pytorch
    • Server notebook Jupyter Anda:

Anda juga dapat menemukan versi notebook Jupyter lengkap dari panduan ini di halaman sampel GitHub.

Menyiapkan pekerjaan

Bagian ini menyiapkan pekerjaan untuk pelatihan dengan memuat paket Python yang diperlukan, menyambungkan ke ruang kerja, membuat sumber daya komputasi untuk menjalankan pekerjaan perintah, dan membuat lingkungan untuk menjalankan pekerjaan.

Sambungkan ke workspace

Pertama, sambungkan ke ruang kerja Azure Machine Learning Anda. Ruang kerja adalah sumber daya tingkat atas untuk layanan. Ini menyediakan tempat terpusat untuk bekerja dengan semua artefak yang Anda buat saat Anda menggunakan Azure Machine Learning.

Gunakan DefaultAzureCredential untuk mengakses ruang kerja. Kredensial ini menangani sebagian besar skenario autentikasi Azure SDK.

Jika DefaultAzureCredential tidak berfungsi untuk Anda, lihat paket azure.identity atau Siapkan autentikasi untuk kredensial lain yang tersedia.

# Handle to the workspace
from azure.ai.ml import MLClient

# Authentication package
from azure.identity import DefaultAzureCredential

credential = DefaultAzureCredential()

Petunjuk / Saran

Jika Anda lebih suka menggunakan browser untuk masuk dan mengautentikasi, gunakan InteractiveBrowserCredential sebagai gantinya:

from azure.identity import InteractiveBrowserCredential
credential = InteractiveBrowserCredential()

Selanjutnya, dapatkan pegangan ke ruang kerja dengan menyediakan ID langganan Anda, nama grup sumber daya, dan nama ruang kerja. Untuk menemukan parameter ini:

  1. Cari nama ruang kerja Anda di sudut kanan atas toolbar studio Azure Pembelajaran Mesin.
  2. Pilih nama ruang kerja Anda untuk menampilkan grup sumber daya dan ID langganan Anda.
  3. Salin nilai untuk grup sumber daya dan ID langganan Anda ke dalam kode.
# Get a handle to the workspace
ml_client = MLClient(
    credential=credential,
    subscription_id="<SUBSCRIPTION_ID>",
    resource_group_name="<RESOURCE_GROUP>",
    workspace_name="<AML_WORKSPACE_NAME>",
)

Hasil menjalankan skrip ini adalah referensi ruang kerja yang bisa Anda gunakan untuk mengelola sumber daya dan tugas lain.

Catatan

Membuat MLClient tidak menghubungkan klien ke ruang kerja. Inisialisasi klien ditunda dan menunggu sampai perlu melakukan panggilan untuk pertama kalinya. Dalam artikel ini, panggilan ini terjadi selama pembuatan komputasi.

Membuat sumber daya komputasi untuk menjalankan pekerjaan

Azure Pembelajaran Mesin memerlukan sumber daya komputasi untuk menjalankan pekerjaan. Sumber daya ini dapat berupa mesin tunggal atau multinode dengan OS Linux atau Windows, atau kain komputasi tertentu seperti Spark.

Dalam contoh skrip berikut, Anda menyediakan kluster komputasi Linux. Untuk daftar lengkap ukuran dan harga VM, lihat halaman harga Azure Machine Learning . Karena Anda memerlukan kluster GPU untuk contoh ini, pilih Standard_NC4as_T4_v3 model dan buat komputasi Azure Machine Learning.

from azure.ai.ml.entities import AmlCompute

gpu_compute_target = "gpu-cluster"

try:
    # let's see if the compute target already exists
    gpu_cluster = ml_client.compute.get(gpu_compute_target)
    print(
        f"You already have a cluster named {gpu_compute_target}, we'll reuse it as is."
    )

except Exception:
    print("Creating a new gpu compute target...")

    # Let's create the Azure ML compute object with the intended parameters
    gpu_cluster = AmlCompute(
        # Name assigned to the compute cluster
        name="gpu-cluster",
        # Azure ML Compute is the on-demand VM service
        type="amlcompute",
        # VM Family
        size="STANDARD_NC4AS_T4_V3",
        # Minimum running nodes when there is no job running
        min_instances=0,
        # Nodes in cluster
        max_instances=4,
        # How many seconds will the node running after the job termination
        idle_time_before_scale_down=180,
        # Dedicated or LowPriority. The latter is cheaper but there is a chance of job termination
        tier="Dedicated",
    )

    # Now, we pass the object to MLClient's create_or_update method
    gpu_cluster = ml_client.begin_create_or_update(gpu_cluster).result()

print(
    f"AMLCompute with name {gpu_cluster.name} is created, the compute size is {gpu_cluster.size}"
)

Membuat lingkungan pekerjaan

Untuk menjalankan pekerjaan Azure Pembelajaran Mesin, Anda memerlukan lingkungan. Lingkungan Azure Machine Learning merangkum dependensi, seperti runtime perangkat lunak dan pustaka, yang diperlukan untuk menjalankan skrip pelatihan pembelajaran mesin Anda pada sumber daya komputasi Anda. Lingkungan ini mirip dengan lingkungan Python di komputer lokal Anda.

Azure Machine Learning memungkinkan Anda menggunakan lingkungan yang dikumpulkan (atau siap pakai) atau membuat lingkungan kustom dengan menggunakan gambar Docker atau konfigurasi Conda. Dalam artikel ini, Anda menggunakan kembali lingkungan Azure Machine Learning yang terkurasikan. Gunakan versi terbaru lingkungan ini dengan menggunakan direktif @latest .

curated_env_name = "AzureML-acpt-pytorch-2.8-cuda12.6@latest"

Konfigurasikan dan kirim pekerjaan pelatihan Anda

Di bagian ini, Anda memperkenalkan data untuk pelatihan. Anda kemudian membahas cara menjalankan pekerjaan pelatihan dengan menggunakan skrip pelatihan yang Anda sediakan. Anda belajar membangun pekerjaan pelatihan dengan mengonfigurasi perintah untuk menjalankan skrip pelatihan. Kemudian, Anda mengirimkan tugas pelatihan untuk dijalankan di Azure Machine Learning.

Mendapatkan data pelatihan

Himpunan data ini terdiri dari sekitar 120 gambar pelatihan masing-masing untuk dua kelas (kalkun dan ayam), dengan 100 gambar validasi untuk setiap kelas. Gambar adalah subkumpulan dari Open Images v5 Dataset. Skrip pelatihan pytorch_train.py mengunduh dan mengekstrak himpunan data.

Menyiapkan skrip pelatihan

Di bagian prasyarat, Anda menyediakan skrip pelatihan pytorch_train.py. Dalam praktiknya, Anda harus dapat mengambil skrip pelatihan kustom apa adanya dan menjalankannya dengan Azure Pembelajaran Mesin tanpa harus mengubah kode Anda.

Skrip pelatihan yang disediakan mengunduh data, melatih model, dan mendaftarkan model.

Membangun tugas pelatihan

Sekarang setelah Anda memiliki semua aset yang diperlukan untuk menjalankan pekerjaan Anda, buat dengan menggunakan Azure Machine Learning Python SDK v2. Untuk contoh ini, buat command.

Azure Machine Learning command adalah sumber daya yang menyebutkan semua detail yang diperlukan untuk menjalankan kode pelatihan Anda di cloud. Detail ini mencakup input dan output, jenis perangkat keras yang akan digunakan, perangkat lunak untuk diinstal, dan cara menjalankan kode Anda. command berisi informasi untuk menjalankan satu perintah.

Mengonfigurasi perintah

Gunakan tujuan command umum untuk menjalankan skrip pelatihan dan melakukan tugas yang Anda inginkan. Buat command objek untuk menentukan detail konfigurasi pekerjaan pelatihan Anda.

from azure.ai.ml import command
from azure.ai.ml import Input

job = command(
    inputs=dict(
        num_epochs=30, learning_rate=0.001, momentum=0.9, output_dir="./outputs"
    ),
    compute=gpu_compute_target,
    environment=curated_env_name,
    code="./src/",  # location of source code
    command="python pytorch_train.py --num_epochs ${{inputs.num_epochs}} --output_dir ${{inputs.output_dir}}",
    experiment_name="pytorch-birds",
    display_name="pytorch-birds-image",
)
  • Input untuk perintah ini mencakup jumlah epoch, tingkat pembelajaran, momentum, dan direktori output.
  • Untuk nilai parameter:
    1. Berikan kluster komputasi gpu_compute_target = "gpu-cluster" yang Anda buat untuk menjalankan perintah ini.
    2. Sediakan lingkungan yang telah Anda kurasi dan inisialisasi sebelumnya.
    3. Jika Anda tidak menggunakan buku catatan yang telah selesai di folder Sampel, tentukan lokasi file pytorch_train.py .
    4. Konfigurasikan tindakan baris perintah itu sendiri. Dalam hal ini, perintahnya adalah python pytorch_train.py. Anda dapat mengakses input dan output dalam perintah melalui ${{ ... }} notasi.
    5. Konfigurasikan metadata seperti nama tampilan dan nama eksperimen. Eksperimen adalah kontainer untuk semua iterasi yang Anda lakukan pada proyek tertentu. Semua pekerjaan yang Anda kirimkan di bawah nama eksperimen yang sama muncul di samping satu sama lain di studio Azure Machine Learning.

Kirim tugas

Sekarang, kirimkan pekerjaan untuk dijalankan di Azure Machine Learning. Kali ini, gunakan create_or_update pada ml_client.jobs.

ml_client.jobs.create_or_update(job)

Ketika pekerjaan selesai, ia mendaftarkan model di ruang kerja Anda sebagai hasil dari pelatihan. Ini juga menghasilkan tautan untuk melihat pekerjaan di studio Azure Machine Learning.

Peringatan

Azure Machine Learning menjalankan skrip pelatihan dengan menyalin seluruh direktori sumber. Jika Anda memiliki data sensitif yang tidak ingin Anda unggah, gunakan file .ignore atau jangan sertakan dalam direktori sumber.

Apa yang terjadi selama eksekusi pekerjaan

Saat pekerjaan dijalankan, pekerjaan melewati tahapan berikut:

  • Persiapan: Proses membuat gambar Docker sesuai dengan lingkungan yang Anda tentukan. Ini mengunggah gambar ke registri kontainer ruang kerja dan menyimpannya untuk dijalankan nanti. Proses ini juga mengalirkan log ke riwayat pekerjaan, sehingga Anda dapat melihatnya untuk memantau kemajuan. Jika Anda menentukan lingkungan terkurasi, prosesnya menggunakan gambar cache yang mendukung lingkungan terkurasi.

  • Penskalakan: Kluster mencoba meningkatkan skala jika memerlukan lebih banyak simpul untuk menjalankan eksekusi daripada yang saat ini tersedia.

  • Berjalan: Proses mengunggah semua skrip di folder skrip src ke target komputasi. Ini memasang atau menyalin gudang data. Program ini melaksanakan skrip. Proses mengalirkan output dari stdout dan folder ./logs ke riwayat pekerjaan. Anda dapat menggunakan output ini untuk memantau pekerjaan.

Menyetel hiperparameter model

Anda melatih model dengan satu set parameter. Sekarang, lihat apakah Anda dapat lebih meningkatkan akurasi model Anda. Menyetel dan mengoptimalkan hiperparameter model Anda dengan menggunakan kemampuan Azure Machine Learning sweep .

Untuk menyetel hiperparameter model, tentukan ruang parameter untuk dicari selama pelatihan. Gantilah beberapa parameter yang diteruskan ke job pelatihan dengan masukan khusus dari paket azure.ml.sweep.

Karena skrip pelatihan menggunakan jadwal laju pembelajaran untuk mengurangi laju pembelajaran setiap beberapa epoch, Anda dapat melakukan penyetelan pada laju pembelajaran awal dan parameter momentum.

from azure.ai.ml.sweep import Uniform

# we will reuse the command_job created before. we call it as a function so that we can apply inputs
job_for_sweep = job(
    learning_rate=Uniform(min_value=0.0005, max_value=0.005),
    momentum=Uniform(min_value=0.9, max_value=0.99),
)

Kemudian, konfigurasikan sweep pada pekerjaan perintah dengan menggunakan beberapa parameter pra-khusus sweep, seperti metrik utama untuk dipantau dan algoritma pengambilan sampel yang akan digunakan.

Dalam kode berikut, pengambilan sampel acak mencoba serangkaian konfigurasi hiperparameter yang berbeda dalam upaya untuk memaksimalkan metrik utama, best_val_acc.

Anda juga menentukan kebijakan penghentian dini, BanditPolicy, untuk mengakhiri proses yang berkinerja buruk lebih awal. Mengakhiri setiap eksekusi BanditPolicy yang tidak masuk dalam batas toleransi kelonggaran metrik evaluasi utama. Anda menerapkan kebijakan ini setiap epoch (karena best_val_acc metrik dilaporkan setiap epoch dan evaluation_interval=1). Evaluasi kebijakan pertama tertunda hingga setelah 10 epoch pertama (delay_evaluation=10).

from azure.ai.ml.sweep import BanditPolicy

sweep_job = job_for_sweep.sweep(
    compute="gpu-cluster",
    sampling_algorithm="random",
    primary_metric="best_val_acc",
    goal="Maximize",
    max_total_trials=8,
    max_concurrent_trials=4,
    early_termination_policy=BanditPolicy(
        slack_factor=0.15, evaluation_interval=1, delay_evaluation=10
    ),
)

Sekarang, kirimkan pekerjaan ini seperti sebelumnya. Kali ini, Anda menjalankan pekerjaan pembersihan yang menyapu atas pekerjaan kereta Anda.

returned_sweep_job = ml_client.create_or_update(sweep_job)

# stream the output and wait until the job is finished
ml_client.jobs.stream(returned_sweep_job.name)

# refresh the latest status of the job after streaming
returned_sweep_job = ml_client.jobs.get(name=returned_sweep_job.name)

Anda dapat memantau pekerjaan dengan menggunakan tautan antarmuka pengguna studio yang disajikan selama pekerjaan berjalan.

Menemukan model terbaik

Setelah semua eksekusi selesai, temukan eksekusi yang menghasilkan model dengan akurasi tertinggi.

from azure.ai.ml.entities import Model

if returned_sweep_job.status == "Completed":

    # First let us get the run which gave us the best result
    best_run = returned_sweep_job.properties["best_child_run_id"]

    # lets get the model from this run
    model = Model(
        # the script stores the model as "outputs"
        path="azureml://jobs/{}/outputs/artifacts/paths/outputs/".format(best_run),
        name="run-model-example",
        description="Model created from run.",
        type="custom_model",
    )

else:
    print(
        "Sweep job status: {}. Please wait until it completes".format(
            returned_sweep_job.status
        )
    )

Menyebarkan model sebagai titik akhir online

Sekarang Anda dapat menyebarkan model Anda sebagai titik akhir online—yaitu, sebagai layanan web di cloud Azure.

Untuk menyebarkan layanan pembelajaran mesin, Anda biasanya memerlukan:

  • Aset model yang ingin Anda sebarkan. Aset ini mencakup file model dan metadata yang sudah Anda daftarkan dalam pekerjaan pelatihan Anda.
  • Beberapa kode program untuk dijalankan sebagai layanan. Kode menjalankan model pada permintaan input tertentu (skrip entri). Skrip ini menerima data yang dikirimkan ke layanan web yang disebarkan dan meneruskannya ke model. Setelah model memproses data, skrip mengembalikan respons model ke klien. Skrip ini khusus untuk satu model Anda dan harus dapat memahami data yang diharapkan dan dikembalikan oleh model tersebut. Saat Anda menggunakan model MLFlow, Azure Pembelajaran Mesin secara otomatis membuat skrip ini untuk Anda.

Untuk informasi selengkapnya tentang penyebaran, lihat Menyebarkan dan menilai model pembelajaran mesin dengan titik akhir online terkelola menggunakan Python SDK v2.

Membuat titik akhir online baru

Sebagai langkah pertama untuk menyebarkan model Anda, buat titik akhir online Anda. Nama titik akhir harus unik di seluruh wilayah Azure. Untuk artikel ini, buat nama unik dengan menggunakan pengidentifikasi unik universal (UUID).

import uuid

# Creating a unique name for the endpoint
online_endpoint_name = "aci-birds-endpoint-" + str(uuid.uuid4())[:8]
from azure.ai.ml.entities import ManagedOnlineEndpoint

# create an online endpoint
endpoint = ManagedOnlineEndpoint(
    name=online_endpoint_name,
    description="Classify turkey/chickens using transfer learning with PyTorch",
    auth_mode="key",
    tags={"data": "birds", "method": "transfer learning", "framework": "pytorch"},
)

endpoint = ml_client.begin_create_or_update(endpoint).result()

print(f"Endpoint {endpoint.name} provisioning state: {endpoint.provisioning_state}")

Setelah Anda membuat titik akhir, dapatkan titik akhir tersebut sebagai berikut:

endpoint = ml_client.online_endpoints.get(name=online_endpoint_name)

print(
    f'Endpint "{endpoint.name}" with provisioning state "{endpoint.provisioning_state}" is retrieved'
)

Menyebarkan model ke titik akhir

Sebarkan model dengan menggunakan skrip entri. Endpoint dapat memiliki beberapa penggunaan. Dengan menggunakan aturan, titik akhir dapat mengarahkan lalu lintas ke penyebaran ini.

Dalam kode berikut, Anda membuat sebuah penyebaran tunggal yang menangani 100% lalu lintas masuk. Kode ini menggunakan nama warna arbitrer biru untuk penyebaran. Anda juga dapat menggunakan nama lain seperti hijau atau merah untuk penyebaran.

Kode untuk menyebarkan model ke titik akhir:

  • Menggunakan versi terbaik dari model yang Anda daftarkan sebelumnya.
  • Menilai model dengan menggunakan file score.py .
  • Menggunakan lingkungan terkurasi (yang Anda tentukan sebelumnya) untuk melakukan inferensi.
from azure.ai.ml.entities import (
    ManagedOnlineDeployment,
    Model,
    Environment,
    CodeConfiguration,
)

online_deployment_name = "aci-blue"

# create an online deployment.
blue_deployment = ManagedOnlineDeployment(
    name=online_deployment_name,
    endpoint_name=online_endpoint_name,
    model=model,
    environment=curated_env_name,
    code_configuration=CodeConfiguration(code="./score/", scoring_script="score.py"),
    instance_type="STANDARD_NC4AS_T4_V3",
    instance_count=1,
)

blue_deployment = ml_client.begin_create_or_update(blue_deployment).result()

Catatan

Harapkan proses penyebaran ini memerlukan waktu untuk diselesaikan.

Menguji model yang disebarkan

Setelah Anda menyebarkan model ke titik akhir, gunakan invoke metode pada titik akhir untuk memprediksi output model yang disebarkan.

Untuk menguji titik akhir, gunakan gambar sampel untuk prediksi. Pertama, tampilkan gambar.

# install pillow if PIL cannot imported
%pip install pillow
import json
from PIL import Image
import matplotlib.pyplot as plt

%matplotlib inline
plt.imshow(Image.open("test_img.jpg"))

Buat fungsi untuk memformat dan mengubah ukuran gambar.

# install torch and torchvision if needed
%pip install torch
%pip install torchvision

import torch
from torchvision import transforms


def preprocess(image_file):
    """Preprocess the input image."""
    data_transforms = transforms.Compose(
        [
            transforms.Resize(256),
            transforms.CenterCrop(224),
            transforms.ToTensor(),
            transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]),
        ]
    )

    image = Image.open(image_file)
    image = data_transforms(image).float()
    image = torch.tensor(image)
    image = image.unsqueeze(0)
    return image.numpy()

Format gambar dan konversikan ke file JSON.

image_data = preprocess("test_img.jpg")
input_data = json.dumps({"data": image_data.tolist()})
with open("request.json", "w") as outfile:
    outfile.write(input_data)

Panggil titik akhir dengan JSON ini dan cetak hasilnya.

# test the blue deployment
result = ml_client.online_endpoints.invoke(
    endpoint_name=online_endpoint_name,
    request_file="request.json",
    deployment_name=online_deployment_name,
)

print(result)

Membersihkan sumber daya

Jika Anda tidak memerlukan titik akhir lagi, hapus untuk berhenti menggunakan sumber daya. Pastikan tidak ada deployment lain yang menggunakan titik akhir sebelum Anda menghapusnya.

ml_client.online_endpoints.begin_delete(name=online_endpoint_name)

Catatan

Harapkan pembersihan ini akan memerlukan waktu untuk diselesaikan.

Dalam artikel ini, Anda melatih dan mendaftarkan jaringan neural pembelajaran mendalam menggunakan PyTorch di Azure Pembelajaran Mesin. Anda juga menyebarkan model ke titik akhir online. Untuk mempelajari selengkapnya tentang Azure Machine Learning, lihat artikel berikut ini: