Melatih model PyTorch dalam skala besar dengan Azure Machine Learning
BERLAKU UNTUK: Python SDK azure-ai-ml v2 (saat ini)
Dalam artikel ini, Anda akan belajar melatih, menyetel hiperparameter, dan menyebarkan model PyTorch menggunakan Azure Pembelajaran Mesin Python SDK v2.
Anda akan menggunakan contoh skrip untuk mengklasifikasikan gambar ayam dan kalkun untuk membangun jaringan neural pembelajaran mendalam (DNN) berdasarkan tutorial pembelajaran transfer 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 melatih model pembelajaran mendalam PyTorch dari awal atau membawa model yang sudah ada ke cloud, Anda dapat menggunakan Azure Machine Learning untuk meningkatkan skala pekerjaan pelatihan sumber terbuka 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.
- Jalankan kode dalam artikel ini menggunakan instans komputasi Azure Pembelajaran Mesin atau notebook Jupyter Anda sendiri.
- Instans komputasi Azure Pembelajaran Mesin—tidak ada unduhan atau penginstalan yang diperlukan:
- Selesaikan Mulai Cepat: Mulai menggunakan Azure Pembelajaran Mesin untuk membuat server notebook khusus yang telah dimuat sebelumnya 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:
- Instans komputasi Azure Pembelajaran Mesin—tidak ada unduhan atau penginstalan yang diperlukan:
Anda juga dapat menemukan versi notebook Jupyter lengkap dari panduan ini di halaman sampel GitHub.
Sebelum dapat menjalankan kode dalam artikel ini untuk membuat kluster GPU, Anda harus meminta peningkatan kuota untuk ruang kerja Anda.
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.
Menyambungkan ke ruang kerja
Pertama, Anda perlu menyambungkan ke ruang kerja Azure Pembelajaran Mesin Anda. Ruang kerja adalah sumber daya tingkat atas untuk layanan. Ini memberi Anda tempat terpusat untuk bekerja dengan semua artefak yang Anda buat saat menggunakan Azure Pembelajaran Mesin.
Kami menggunakan DefaultAzureCredential
untuk mendapatkan akses ke ruang kerja. Kredensial ini harus mampu menangani sebagian besar skenario autentikasi Azure SDK.
Jika DefaultAzureCredential
tidak berfungsi untuk Anda, lihat paket azure.identity atau Menyiapkan autentikasi untuk kredensial yang tersedia lainnya.
# Handle to the workspace
from azure.ai.ml import MLClient
# Authentication package
from azure.identity import DefaultAzureCredential
credential = DefaultAzureCredential()
Jika Anda lebih suka menggunakan browser untuk masuk dan mengautentikasi, Anda harus membatalkan komentar kode berikut dan menggunakannya sebagai gantinya.
# Handle to the workspace
# from azure.ai.ml import MLClient
# Authentication package
# from azure.identity import InteractiveBrowserCredential
# credential = InteractiveBrowserCredential()
Selanjutnya, dapatkan handel ke ruang kerja dengan memberikan ID langganan, nama grup sumber daya, dan nama ruang kerja Anda. Untuk menemukan parameter ini:
- Cari nama ruang kerja Anda di sudut kanan atas toolbar studio Azure Pembelajaran Mesin.
- Pilih nama ruang kerja Anda untuk menampilkan grup sumber daya dan ID langganan Anda.
- 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 handel ruang kerja yang dapat Anda gunakan untuk mengelola sumber daya dan pekerjaan lain.
Catatan
Membuat MLClient
tidak menghubungkan klien ke ruang kerja. Inisialisasi klien malas dan menunggu untuk pertama kalinya perlu melakukan panggilan. Dalam artikel ini, 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 multi-simpul dengan OS Linux atau Windows, atau kain komputasi tertentu seperti Spark.
Dalam contoh skrip berikut, kami menyediakan kluster komputasi Linux. Anda dapat melihat halaman harga Azure Pembelajaran Mesin untuk daftar lengkap ukuran dan harga VM. Karena kita memerlukan kluster GPU untuk contoh ini, mari kita pilih STANDARD_NC6
model dan buat komputasi Azure Pembelajaran Mesin.
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_NC6s_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 Pembelajaran Mesin 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 Pembelajaran Mesin memungkinkan Anda menggunakan lingkungan yang dikumpulkan (atau siap) atau membuat lingkungan kustom menggunakan gambar Docker atau konfigurasi Conda. Dalam artikel ini, Anda menggunakan kembali lingkungan AzureML-pytorch-1.9-ubuntu18.04-py37-cuda11-gpu
Azure Pembelajaran Mesin yang dikumpulkan. Gunakan versi terbaru lingkungan ini menggunakan arahan @latest
.
curated_env_name = "AzureML-acpt-pytorch-1.13-cuda11.7@latest"
Mengonfigurasi dan mengirimkan pekerjaan pelatihan Anda
Di bagian ini, kita mulai dengan memperkenalkan data untuk pelatihan. Kami kemudian membahas cara menjalankan pekerjaan pelatihan, menggunakan skrip pelatihan yang telah kami sediakan. Anda akan belajar membangun pekerjaan pelatihan dengan mengonfigurasi perintah untuk menjalankan skrip pelatihan. Kemudian, Anda akan mengirimkan pekerjaan pelatihan untuk dijalankan di Azure Pembelajaran Mesin.
Mendapatkan data pelatihan
Anda dapat menggunakan himpunan data dalam file zip ini. 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, kami 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 pekerjaan pelatihan
Sekarang setelah Anda memiliki semua aset yang diperlukan untuk menjalankan pekerjaan Anda, saatnya untuk membuatnya menggunakan Azure Pembelajaran Mesin Python SDK v2. Untuk contoh ini, kami membuat command
.
Azure Pembelajaran Mesin command
adalah sumber daya yang menentukan 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. berisi command
informasi untuk menjalankan satu perintah.
Mengonfigurasi perintah
Anda akan menggunakan 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:
- Berikan kluster komputasi
gpu_compute_target = "gpu-cluster"
yang Anda buat untuk menjalankan perintah ini. - Berikan lingkungan
AzureML-pytorch-1.9-ubuntu18.04-py37-cuda11-gpu
yang dikumpulkan yang Anda inisialisasi sebelumnya. - Jika Anda tidak menggunakan buku catatan yang telah selesai di folder Sampel, tentukan lokasi file pytorch_train.py .
- 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. - Konfigurasikan metadata seperti nama tampilan dan nama eksperimen, di mana eksperimen adalah kontainer untuk semua iterasi yang dilakukan seseorang pada proyek tertentu. Semua pekerjaan yang dikirimkan dengan nama eksperimen yang sama akan dicantumkan di samping satu sama lain di studio Azure Pembelajaran Mesin.
- Berikan kluster komputasi
Mengirimkan pekerjaan
Sekarang saatnya untuk mengirimkan pekerjaan untuk dijalankan di Azure Pembelajaran Mesin. Kali ini, Anda menggunakan create_or_update
pada ml_client.jobs
.
ml_client.jobs.create_or_update(job)
Setelah selesai, pekerjaan mendaftarkan model di ruang kerja Anda (sebagai hasil pelatihan) dan menghasilkan tautan untuk melihat pekerjaan di studio Azure Pembelajaran Mesin.
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 akan melalui tahapan berikut:
Persiapan: Gambar docker dibuat sesuai dengan lingkungan yang ditentukan. Gambar diunggah ke registri kontainer ruang kerja dan di-cache untuk dijalankan nantinya. Log juga dialirkan ke riwayat pekerjaan dan dapat dilihat untuk memantau kemajuan. Jika lingkungan yang dikumpulkan ditentukan, pencadangan gambar yang di-cache yang digunakan lingkungan yang dikumpulkan.
Penskalakan: Kluster mencoba meningkatkan skala jika memerlukan lebih banyak simpul untuk menjalankan eksekusi daripada yang saat ini tersedia.
Berjalan: Semua skrip dalam src folder skrip diunggah ke target komputasi, penyimpanan data dipasang atau disalin, dan skrip dijalankan. Output dari stdout dan folder ./logs dialirkan ke riwayat pekerjaan dan dapat digunakan untuk memantau pekerjaan.
Menyetel hiperparameter model
Anda melatih model dengan satu set parameter, sekarang mari kita lihat apakah Anda dapat lebih meningkatkan akurasi model Anda. Anda dapat menyetel dan mengoptimalkan hiperparameter model Anda menggunakan kemampuan Azure Pembelajaran Mesinsweep
.
Untuk menyetel hiperparameter model, tentukan ruang parameter untuk mencari selama pelatihan. Anda melakukan ini dengan mengganti beberapa parameter yang diteruskan ke pekerjaan pelatihan dengan input khusus dari azure.ml.sweep
paket.
Karena skrip pelatihan menggunakan jadwal tingkat pembelajaran untuk merusak tingkat pembelajaran setiap beberapa epoch, Anda dapat menyetel tingkat 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, Anda dapat mengonfigurasi pembersihan pada pekerjaan perintah, menggunakan beberapa parameter khusus sapuan, seperti metrik utama untuk ditonton dan algoritma pengambilan sampel yang akan digunakan.
Dalam kode berikut, kami menggunakan pengambilan sampel acak untuk mencoba set konfigurasi hiperparameter yang berbeda dalam upaya untuk memaksimalkan metrik utama kami, best_val_acc
.
Kami juga mendefinisikan kebijakan penghentian dini, BanditPolicy
, untuk mengakhiri eksekusi yang berkinerja buruk lebih awal.
Mengakhiri BanditPolicy
eksekusi apa pun yang tidak termasuk dalam faktor kelemahan metrik evaluasi utama kami. Anda menerapkan kebijakan ini setiap epoch (karena kami melaporkan metrik kami best_val_acc
setiap epoch dan evaluation_interval
=1). Perhatikan bahwa kami menunda evaluasi kebijakan pertama 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, Anda dapat mengirimkan 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, Anda dapat menemukan 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 yang akan dijalankan sebagai layanan. Kode menjalankan model pada permintaan input tertentu (skrip entri). Skrip entri 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 khusus untuk model Anda dan harus memahami data yang diharapkan dan dikembalikan model. 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 perlu membuat titik akhir online Anda. Nama titik akhir harus unik di seluruh wilayah Azure. Untuk artikel ini, Anda membuat nama unik 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 membuat titik akhir, Anda dapat mengambilnya 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
Anda sekarang dapat menyebarkan model dengan skrip entri. Titik akhir dapat memiliki beberapa penyebaran. Dengan menggunakan aturan, titik akhir kemudian dapat mengarahkan lalu lintas ke penyebaran ini.
Dalam kode berikut, Anda akan membuat satu penyebaran yang menangani 100% lalu lintas masuk. Kami menentukan nama warna arbitrer aci-blue untuk penyebaran. Anda juga dapat menggunakan nama lain seperti aci-green atau aci-red untuk penyebaran.
Kode untuk menyebarkan model ke titik akhir:
- Menyebarkan versi terbaik model yang Anda daftarkan sebelumnya.
- Menilai model, menggunakan file score.py .
- Menggunakan lingkungan yang dikumpulkan (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_NC6s_v3",
instance_count=1,
)
blue_deployment = ml_client.begin_create_or_update(blue_deployment).result()
Catatan
Harapkan penyebaran ini membutuhkan sedikit waktu untuk menyelesaikannya.
Menguji model yang disebarkan
Sekarang setelah Anda menyebarkan model ke titik akhir, Anda dapat memprediksi output model yang disebarkan, menggunakan invoke
metode pada titik akhir.
Untuk menguji titik akhir, mari kita gunakan gambar sampel untuk prediksi. Pertama, mari kita 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)
Anda kemudian dapat memanggil titik akhir dengan JSON ini dan mencetak 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 penyebaran lain yang menggunakan titik akhir sebelum Anda menghapusnya.
ml_client.online_endpoints.begin_delete(name=online_endpoint_name)
Catatan
Harapkan pembersihan ini membutuhkan sedikit waktu untuk menyelesaikannya.
Langkah berikutnya
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. Lihat artikel lainnya ini untuk mempelajari selengkapnya tentang Azure Machine Learning.