Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
BERLAKU UNTUK:
Ekstensi ml Azure CLI v2 (saat ini)
Python SDK azure-ai-ml v2 (saat ini)
Titik Akhir Batch dapat digunakan untuk menyebarkan model mahal, seperti model bahasa, melalui data teks. Dalam tutorial ini, Anda mempelajari cara menyebarkan model yang dapat melakukan ringkasan teks urutan panjang teks menggunakan model dari HuggingFace. Ini juga menunjukkan cara melakukan pengoptimalan inferensi menggunakan HuggingFace optimum dan accelerate pustaka.
Tentang sampel ini
Model yang akan kita kerjakan dibangun menggunakan transformer pustaka populer dari HuggingFace bersama dengan model yang telah dilatih sebelumnya dari Facebook dengan arsitektur BART. Ini diperkenalkan dalam makalah BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation. Model ini memiliki batasan berikut, yang penting untuk diingat untuk penyebaran:
- Ini dapat bekerja dengan urutan hingga 1.024 token.
- Sistem ini dirancang untuk merangkum teks dalam bahasa Inggris.
- Kita akan menggunakan Torch sebagai backend.
Contoh dalam artikel ini didasarkan pada sampel kode yang terkandung dalam repositori azureml-examples . Untuk menjalankan perintah secara lokal tanpa harus menyalin atau menempelkan YAML dan file lainnya, gunakan perintah berikut untuk mengkloning repositori dan masuk ke folder untuk bahasa pengkodian Anda:
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
File untuk contoh ini ada di:
cd endpoints/batch/deploy-models/huggingface-text-summarization
Ikuti di Jupyter Notebooks
Anda dapat mengikuti sampel ini di Jupyter Notebook. Di repositori kloning, buka buku catatan: text-summarization-batch.ipynb.
Prasyarat
Langganan Azure. Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum Anda memulai.
Ruang kerja Azure Machine Learning. Untuk membuat ruang kerja, lihat Mengelola ruang kerja Azure Pembelajaran Mesin.
Izin berikut di ruang kerja Azure Pembelajaran Mesin:
- Untuk membuat atau mengelola titik akhir dan penyebaran batch: Gunakan Pemilik, Kontributor, atau peran kustom yang telah diberi
Microsoft.MachineLearningServices/workspaces/batchEndpoints/*izin. - Untuk membuat penyebaran Azure Resource Manager di grup sumber daya ruang kerja: Gunakan Peran Pemilik, Kontributor, atau kustom yang telah diberi
Microsoft.Resources/deployments/writeizin di grup sumber daya tempat ruang kerja disebarkan.
- Untuk membuat atau mengelola titik akhir dan penyebaran batch: Gunakan Pemilik, Kontributor, atau peran kustom yang telah diberi
Azure Pembelajaran Mesin CLI atau Azure Pembelajaran Mesin SDK untuk Python:
Jalankan perintah berikut untuk menginstal Azure CLI dan
mlekstensi untuk Azure Pembelajaran Mesin:az extension add -n mlPenyebaran komponen alur untuk titik akhir batch diperkenalkan dalam ekstensi versi 2.7
mluntuk Azure CLI.az extension update --name mlGunakan perintah untuk mendapatkan versi terbaru.
Menyambungkan ke ruang kerja Anda
Ruang kerja adalah sumber daya tingkat teratas untuk Azure Machine Learning. Ini menyediakan tempat terpusat untuk bekerja dengan semua artefak yang Anda buat saat Anda menggunakan Azure Pembelajaran Mesin. Di bagian ini, Anda menyambungkan ke ruang kerja tempat Anda melakukan tugas penyebaran.
Dalam perintah berikut, masukkan ID langganan, nama ruang kerja, nama grup sumber daya, dan lokasi Anda:
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Mendaftarkan model
Karena ukurannya, model ini tidak disertakan dalam repositori ini. Sebagai gantinya, Anda dapat mengunduh salinan dari hub model HuggingFace. Anda memerlukan paket transformers dan torch diinstal di lingkungan yang Anda gunakan.
%pip install transformers torch
Gunakan kode berikut untuk mengunduh model ke folder model:
from transformers import pipeline
model = pipeline("summarization", model="facebook/bart-large-cnn")
model_local_path = 'model'
summarizer.save_pretrained(model_local_path)
Kita sekarang dapat mendaftarkan model ini di registri Azure Pembelajaran Mesin:
MODEL_NAME='bart-text-summarization'
az ml model create --name $MODEL_NAME --path "model"
Membuat titik akhir
Kita akan membuat titik akhir batch bernama text-summarization-batch tempat untuk menyebarkan model HuggingFace untuk menjalankan ringkasan teks pada file teks dalam bahasa Inggris.
Tentukan nama titik akhir. Nama titik akhir berakhir di URI yang terkait dengan titik akhir Anda. Karena itu, nama titik akhir batch harus unik dalam wilayah Azure. Misalnya, hanya ada satu titik akhir batch dengan nama
mybatchendpointdiwestus2.Mengonfigurasi titik akhir batch Anda
File YAML berikut mendefinisikan titik akhir batch:
endpoint.yml
$schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json name: text-summarization-batch description: A batch endpoint for summarizing text using a HuggingFace transformer model. auth_mode: aad_tokenBuat titik akhir:
Membuat penyebaran
Mari kita buat penyebaran yang menghosting model:
Kita perlu membuat skrip penilaian yang dapat membaca file CSV yang disediakan oleh penyebaran batch dan mengembalikan skor model dengan ringkasan. Skrip berikut melakukan tindakan ini:
-
initMenunjukkan fungsi yang mendeteksi konfigurasi perangkat keras (CPU vs GPU) dan memuat model yang sesuai. Baik model maupun tokenizer dimuat dalam variabel global. Kami tidak menggunakanpipelineobjek dari HuggingFace untuk memperhitungkan batasan dalam urutan lengh model yang saat ini kami gunakan. - Perhatikan bahwa kami melakukan pengoptimalan model untuk meningkatkan performa menggunakan
optimumdanacceleratepustaka. Jika model atau perangkat keras tidak mendukungnya, kami akan menjalankan penyebaran tanpa pengoptimalan tersebut. -
runMenunjukkan fungsi yang dijalankan untuk setiap batch mini yang disediakan penyebaran batch. - Fungsi
runmembaca seluruh batch menggunakandatasetspustaka. Teks yang perlu kita ringkas ada di kolomtext. - Metode ini
runmelakukan iterasi pada setiap baris teks dan menjalankan prediksi. Karena ini adalah model yang sangat mahal, menjalankan prediksi di seluruh file akan menghasilkan pengecualian di luar memori. Perhatikan bahwa model tidak dijalankan denganpipelineobjek daritransformers. Ini dilakukan untuk memperhitungkan urutan teks yang panjang dan batasan token 1024 dalam model yang mendasar yang kami gunakan. - Ini mengembalikan ringkasan teks yang disediakan.
code/batch_driver.py
import os import time import torch import subprocess import mlflow from pprint import pprint from transformers import AutoTokenizer, BartForConditionalGeneration from optimum.bettertransformer import BetterTransformer from datasets import load_dataset def init(): global model global tokenizer global device cuda_available = torch.cuda.is_available() device = "cuda" if cuda_available else "cpu" if cuda_available: print(f"[INFO] CUDA version: {torch.version.cuda}") print(f"[INFO] ID of current CUDA device: {torch.cuda.current_device()}") print("[INFO] nvidia-smi output:") pprint( subprocess.run(["nvidia-smi"], stdout=subprocess.PIPE).stdout.decode( "utf-8" ) ) else: print( "[WARN] CUDA acceleration is not available. This model takes hours to run on medium size data." ) # AZUREML_MODEL_DIR is an environment variable created during deployment model_path = os.path.join(os.environ["AZUREML_MODEL_DIR"], "model") # load the tokenizer tokenizer = AutoTokenizer.from_pretrained( model_path, truncation=True, max_length=1024 ) # Load the model try: model = BartForConditionalGeneration.from_pretrained( model_path, device_map="auto" ) except Exception as e: print( f"[ERROR] Error happened when loading the model on GPU or the default device. Error: {e}" ) print("[INFO] Trying on CPU.") model = BartForConditionalGeneration.from_pretrained(model_path) device = "cpu" # Optimize the model if device != "cpu": try: model = BetterTransformer.transform(model, keep_original_model=False) print("[INFO] BetterTransformer loaded.") except Exception as e: print( f"[ERROR] Error when converting to BetterTransformer. An unoptimized version of the model will be used.\n\t> {e}" ) mlflow.log_param("device", device) mlflow.log_param("model", type(model).__name__) def run(mini_batch): resultList = [] print(f"[INFO] Reading new mini-batch of {len(mini_batch)} file(s).") ds = load_dataset("csv", data_files={"score": mini_batch}) start_time = time.perf_counter() for idx, text in enumerate(ds["score"]["text"]): # perform inference inputs = tokenizer.batch_encode_plus( [text], truncation=True, padding=True, max_length=1024, return_tensors="pt" ) input_ids = inputs["input_ids"].to(device) summary_ids = model.generate( input_ids, max_length=130, min_length=30, do_sample=False ) summaries = tokenizer.batch_decode( summary_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False ) # Get results: resultList.append(summaries[0]) rps = idx / (time.perf_counter() - start_time + 00000.1) print("Rows per second:", rps) mlflow.log_metric("rows_per_second", rps) return resultListPetunjuk / Saran
Meskipun file disediakan dalam batch mini oleh penyebaran, skrip penilaian ini memproses satu baris pada satu waktu. Ini adalah pola umum saat berhadapan dengan model mahal (seperti transformator), karena mencoba memuat seluruh batch dan mengirimkannya ke model sekaligus dapat mengakibatkan tekanan memori tinggi pada pelaksana batch (pengecualian OOM).
-
Kita perlu menunjukkan lingkungan mana di mana kita akan menjalankan penyebaran tersebut. Dalam kasus kami, model kami berjalan dan
Torchmemerlukan pustakatransformers, ,acceleratedanoptimumdari HuggingFace. Azure Pembelajaran Mesin sudah memiliki lingkungan dengan dukungan Torch dan GPU yang tersedia. Kita hanya akan menambahkan beberapa dependensi dalam fileconda.yaml.environment/torch200-conda.yaml
name: huggingface-env channels: - conda-forge dependencies: - python=3.8.5 - pip - pip: - torch==2.0 - transformers - accelerate - optimum - datasets - mlflow - azureml-mlflow - azureml-core - azureml-dataset-runtime[fuse]Kita dapat menggunakan file conda yang disebutkan sebelumnya sebagai berikut:
Definisi lingkungan disertakan dalam file penyebaran.
deployment.yml
compute: azureml:gpu-cluster environment: name: torch200-transformers-gpu image: mcr.microsoft.com/azureml/openmpi4.1.0-cuda11.8-cudnn8-ubuntu22.04:latestPenting
Lingkungan
torch200-transformers-gpuyang telah kami buat memerlukan perangkat keras yang kompatibel dengan CUDA 11.8 untuk menjalankan Torch 2.0 dan Ubuntu 20.04. Jika perangkat GPU Anda tidak mendukung versi CUDA ini, Anda dapat memeriksa lingkungan conda alternatiftorch113-conda.yaml(juga tersedia di repositori), yang menjalankan Torch 1.3 melalui Ubuntu 18.04 dengan CUDA 10.1. Namun, akselerasi dengan menggunakan pustakaoptimumdanacceleratetidak didukung dalam konfigurasi ini.Setiap penyebaran berjalan pada kluster komputasi. Mereka mendukung kluster Azure Pembelajaran Mesin Compute (AmlCompute) atau kluster Kubernetes. Dalam contoh ini, model kami dapat memperoleh manfaat dari akselerasi GPU, itulah sebabnya kami menggunakan kluster GPU.
az ml compute create -n gpu-cluster --type amlcompute --size STANDARD_NV6 --min-instances 0 --max-instances 2Catatan
Anda tidak dikenakan biaya untuk komputasi pada saat ini, karena kluster tetap pada nol simpul sampai titik akhir batch dipanggil dan pekerjaan penilaian batch dikirimkan. Pelajari selengkapnya tentang mengelola dan mengoptimalkan biaya untuk AmlCompute.
Sekarang, mari kita buat penyebaran.
Untuk membuat penyebaran baru di bawah titik akhir yang dibuat, buat
YAMLkonfigurasi seperti berikut ini. Anda dapat memeriksa skema YAML titik akhir batch lengkap untuk properti tambahan.deployment.yml
$schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json endpoint_name: text-summarization-batch name: text-summarization-optimum description: A text summarization deployment implemented with HuggingFace and BART architecture with GPU optimization using Optimum. type: model model: azureml:bart-text-summarization@latest compute: azureml:gpu-cluster environment: name: torch200-transformers-gpu image: mcr.microsoft.com/azureml/openmpi4.1.0-cuda11.8-cudnn8-ubuntu22.04:latest conda_file: environment/torch200-conda.yaml code_configuration: code: code scoring_script: batch_driver.py resources: instance_count: 2 settings: max_concurrency_per_instance: 1 mini_batch_size: 1 output_action: append_row output_file_name: predictions.csv retry_settings: max_retries: 1 timeout: 3000 error_threshold: -1 logging_level: infoKemudian, buat penyebaran dengan perintah berikut:
az ml batch-deployment create --file deployment.yml --endpoint-name $ENDPOINT_NAME --set-defaultPenting
Anda akan melihat dalam penyebaran ini nilai tinggi dalam
timeoutparameterretry_settings. Alasannya melibatkan sifat model yang kita jalankan. Model ini sangat membutuhkan sumber daya, dan inferensi pada satu data dapat memakan waktu hingga 60 detik. Parametertimeoutmengontrol berapa lama waktu yang diperlukan bagi pengelolaan batch untuk menunggu skrip penilaian selesai memproses setiap batch mini. Karena model kami menjalankan prediksi berturut-turut, pemrosesan file panjang dapat memakan waktu. Perhatikan juga bahwa jumlah file per batch diatur ke 1 (mini_batch_size=1). Ini lagi-lagi terkait dengan sifat pekerjaan yang kita lakukan. Memproses satu file pada satu waktu per batch cukup mahal untuk membenarkannya. Anda akan melihat ini menjadi pola dalam pemrosesan NLP.Meskipun Anda dapat memanggil penyebaran tertentu di dalam titik akhir, Anda biasanya ingin memanggil titik akhir itu sendiri dan membiarkan titik akhir memutuskan penyebaran mana yang akan digunakan. Penyebaran tersebut diberi nama penyebaran "default". Ini memberi Anda kemungkinan mengubah penyebaran default dan karenanya mengubah model yang melayani penyebaran tanpa mengubah kontrak dengan pengguna yang memanggil titik akhir. Gunakan instruksi berikut untuk memperbarui penyebaran default:
Pada titik ini, titik akhir batch kami siap digunakan.
Menguji penyebaran
Untuk menguji titik akhir kami, kita akan menggunakan sampel himpunan data BillSum: Corpus untuk Ringkasan Otomatis Undang-Undang AS. Sampel ini disertakan dalam repositori dalam folder data. Perhatikan bahwa format data adalah CSV dan konten yang akan diringkas berada di bawah kolom text, seperti yang diharapkan oleh model.
Mari kita panggil titik akhir:
JOB_NAME=$(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input data --input-type uri_folder --query name -o tsv)Catatan
Utilitas
jqmungkin tidak diinstal pada setiap penginstalan. Anda bisa mendapatkan instruksi di tautan ini.Petunjuk / Saran
Perhatikan bahwa dengan menunjukkan jalur lokal sebagai input, data diunggah ke akun penyimpanan default Azure Pembelajaran Mesin.
Pekerjaan batch dimulai segera setelah perintah kembali. Anda dapat memantau status pekerjaan hingga selesai:
Setelah penyebaran selesai, kita dapat mengunduh prediksi:
Pertimbangan saat menyebarkan model yang memproses teks
Seperti disebutkan dalam beberapa catatan di sepanjang tutorial ini, teks pemrosesan dapat memiliki beberapa kekhasan yang memerlukan konfigurasi khusus untuk penyebaran batch. Perhatikan pertimbangan berikut saat merancang penyebaran batch:
- Beberapa model NLP mungkin sangat mahal dalam hal memori dan waktu komputasi. Jika demikian, pertimbangkan untuk mengurangi jumlah file yang disertakan pada setiap batch mini. Dalam contoh sebelumnya, angka diambil ke minimum, 1 file per batch. Meskipun ini mungkin bukan kasus Anda, pertimbangkan berapa banyak file yang dapat dicetak model Anda setiap saat. Perlu diingat bahwa hubungan antara ukuran input dan jejak memori model Anda mungkin tidak linier untuk model pembelajaran mendalam.
- Jika model Anda bahkan tidak dapat menangani satu file pada satu waktu (seperti dalam contoh ini), pertimbangkan untuk membaca data input dalam baris/gugus. Terapkan batching di tingkat baris jika Anda perlu mencapai throughput atau pemanfaatan perangkat keras yang lebih tinggi.
- Tetapkan
timeoutnilai penyebaran Anda dengan tepat ke seberapa mahal model Anda dan berapa banyak data yang anda harapkan untuk diproses. Ingatlah bahwatimeoutmenunjukkan waktu penyebaran batch akan menunggu skrip penilaian Anda berjalan untuk batch tertentu. Jika batch Anda memiliki banyak file atau file dengan banyak baris, ini berdampak pada nilai parameter ini yang tepat.
Pertimbangan untuk model MLflow yang memproses teks
Pertimbangan yang sama yang disebutkan sebelumnya berlaku untuk model MLflow. Namun, karena Anda tidak diharuskan untuk memberikan skrip penilaian untuk penyebaran model MLflow Anda, beberapa rekomendasi yang disebutkan mungkin memerlukan pendekatan yang berbeda.
- Model MLflow di Titik Akhir Batch mendukung pembacaan data tabular sebagai data input, yang mungkin berisi urutan teks yang panjang. Lihat Dukungan jenis file untuk detail tentang jenis file mana yang didukung.
- Penyebaran batch memanggil fungsi prediksi model MLflow Anda dengan konten seluruh file sebagai kerangka data Pandas. Jika data input Anda berisi banyak baris, kemungkinan menjalankan model kompleks (seperti yang disajikan dalam tutorial ini) menghasilkan pengecualian di luar memori. Jika ini adalah kasus Anda, Anda dapat mempertimbangkan:
- Sesuaikan bagaimana model Anda menjalankan prediksi dan menerapkan batching. Untuk mempelajari cara menyesuaikan inferensi model MLflow, lihat Mencatat model kustom.
- Tulis skrip penilaian dan muat model Anda menggunakan
mlflow.<flavor>.load_model(). Lihat Menggunakan model MLflow dengan skrip penilaian untuk detailnya.