Toplu iş uç noktalarına dil modelleri dağıtma
ŞUNLAR IÇIN GEÇERLIDIR: Azure CLI ml uzantısı v2 (geçerli)Python SDK azure-ai-ml v2 (geçerli)
Batch Uç Noktaları, dil modelleri gibi pahalı modelleri metin verileri üzerinden dağıtmak için kullanılabilir. Bu öğreticide HuggingFace'den bir model kullanarak uzun metin dizilerinin metin özetlemesi yapabilen bir modeli dağıtmayı öğreneceksiniz. Ayrıca HuggingFace optimum
ve accelerate
kitaplıkları kullanarak çıkarım iyileştirmesi yapmayı da gösterir.
Bu örnek hakkında
Birlikte çalışacağımız model, HuggingFace'deki popüler kitaplık transformatörleri ve BART mimarisi ile Facebook'tan önceden eğitilmiş bir model kullanılarak oluşturuldu. Bart: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation makalesinde tanıtıldı. Bu model, dağıtım için göz önünde bulundurulması gereken aşağıdaki kısıtlamalara sahiptir:
- En fazla 1024 belirteç içeren dizilerle çalışabilir.
- Metnin İngilizce özetlenmesi için eğitilir.
- Torch'ı arka uç olarak kullanacağız.
Bu makaledeki örnek, azureml-examples deposunda yer alan kod örneklerini temel alır. YAML ve diğer dosyaları kopyalamak/yapıştırmak zorunda kalmadan komutları yerel olarak çalıştırmak için önce depoyu kopyalayın ve ardından dizinleri klasöre değiştirin:
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
Bu örnekteki dosyalar şunlardır:
cd endpoints/batch/deploy-models/huggingface-text-summarization
Jupyter Notebooks'ta takip edin
Jupyter Not Defteri'nde bu örneği izleyebilirsiniz. Kopyalanan depoda not defterini açın: text-summarization-batch.ipynb.
Önkoşullar
Bu makaledeki adımları takip etmeden önce aşağıdaki önkoşullara sahip olduğunuzdan emin olun:
Azure aboneliği. Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun. Azure Machine Learning'in ücretsiz veya ücretli sürümünü deneyin.
Azure Machine Learning çalışma alanı. Yoksa, azure machine learning çalışma alanlarını yönetme makalesindeki adımları kullanarak bir tane oluşturun.
Çalışma alanında aşağıdaki izinlere sahip olduğunuzdan emin olun:
Toplu iş uç noktalarını ve dağıtımlarını oluşturma veya yönetme: İzin veren
Microsoft.MachineLearningServices/workspaces/batchEndpoints/*
bir Sahip, Katkıda Bulunan veya Özel rol kullanın.Çalışma alanı kaynak grubunda ARM dağıtımları oluşturma: Çalışma alanının dağıtıldığı kaynak grubunda izin veren
Microsoft.Resources/deployments/write
bir Sahip, Katkıda Bulunan veya Özel rol kullanın.
Azure Machine Learning ile çalışmak için aşağıdaki yazılımı yüklemeniz gerekir:
Azure CLI ve
ml
Azure Machine Learning uzantısı.az extension add -n ml
Not
Batch Uç Noktaları için işlem hattı bileşeni dağıtımları, Azure CLI uzantısının
ml
2.7 sürümünde kullanıma sunulmuştur. Son sürümünü almak için kullanınaz extension update --name ml
.
Çalışma alanınıza bağlanma
Çalışma alanı Azure Machine Learning'in en üst düzey kaynağıdır. Azure Machine Learning'i kullanırken oluşturduğunuz tüm yapıtlarla çalışmak için merkezi bir konum sağlar. Bu bölümde, dağıtım görevlerini gerçekleştirdiğiniz çalışma alanına bağlanacağız.
Abonelik kimliğiniz, çalışma alanınız, konumunuz ve kaynak grubunuzun değerlerini aşağıdaki kodda geçirin:
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Modeli kaydetme
Modelin boyutu nedeniyle bu depoya dahil edilmemiştir. Bunun yerine HuggingFace modelinin hub'ından bir kopyasını indirebilirsiniz. Paketlerin transformers
torch
ve kullandığınız ortamda yüklü olması gerekir.
%pip install transformers torch
Modeli bir klasöre model
indirmek için aşağıdaki kodu kullanın:
from transformers import pipeline
model = pipeline("summarization", model="facebook/bart-large-cnn")
model_local_path = 'model'
summarizer.save_pretrained(model_local_path)
Artık bu modeli Azure Machine Learning kayıt defterine kaydedebiliriz:
MODEL_NAME='bart-text-summarization'
az ml model create --name $MODEL_NAME --path "model"
Uç nokta oluşturma
İngilizce metin dosyalarında metin özetlemesi çalıştırmak için HuggingFace modelinin dağıtılacağı yer adlı text-summarization-batch
bir toplu iş uç noktası oluşturacağız.
Uç noktanın adına karar verin. Uç noktanın adı, uç noktanızla ilişkili URI'de biter. Bu nedenle, toplu uç nokta adlarının bir Azure bölgesinde benzersiz olması gerekir. Örneğin, içinde
westus2
adımybatchendpoint
olan tek bir toplu iş uç noktası olabilir.Toplu iş uç noktanızı yapılandırma
Aşağıdaki YAML dosyası bir toplu iş uç noktasını tanımlar:
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_token
Uç noktayı oluşturun:
Dağıtımı oluşturma
Şimdi modeli barındıran dağıtımı oluşturalım:
Toplu dağıtım tarafından sağlanan CSV dosyalarını okuyabilen ve özetle modelin puanlarını döndürebilen bir puanlama betiği oluşturmamız gerekir. Aşağıdaki betik şu eylemleri gerçekleştirir:
- Donanım yapılandırmasını (CPU ve GPU) algılayan ve modeli uygun şekilde yükleyen bir
init
işlevi gösterir. Hem model hem de belirteç oluşturucu genel değişkenlere yüklenir. Şu anda kullanmakta olduğumuz modelin sıra uzunluklarındaki sınırlamayı hesaba eklemek için HuggingFace'den birpipeline
nesne kullanmıyoruz. - ve
accelerate
kitaplıklarını kullanarakoptimum
performansı geliştirmek için model iyileştirmeleri gerçekleştirdiğimize dikkat edin. Model veya donanım bunu desteklemiyorsa, bu iyileştirmeler olmadan dağıtımı çalıştırırız. - Toplu dağıtımın sağladığı her mini toplu iş için yürütülen bir
run
işlevi gösterir. - İşlev,
run
kitaplığını kullanarak toplu işleminindatasets
tamamını okur. Özetlememiz gereken metin sütunundadırtext
. - yöntemi,
run
metnin satırlarının her biri üzerinde yinelenir ve tahmini çalıştırır. Bu çok pahalı bir model olduğundan, tahminin tüm dosyalar üzerinde çalıştırılması bellek yetersiz özel durumuyla sonuçlanır. Modelin nesnesiyletransformers
yürütülmediğinepipeline
dikkat edin. Bu, uzun metin dizilerini ve kullanmakta olduğumuz temel modelde 1024 belirteci sınırlamasını hesaba katmak için yapılır. - Sağlanan metnin özetini döndürür.
kod/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 resultList
İpucu
Dosyalar dağıtım tarafından mini toplu işlemlerle sağlansa da, bu puanlama betiği her seferinde bir satır işler. Bu, toplu işlemin tamamını yüklemeye ve bir kerede modele göndermeye çalışırken toplu iş yürütücüsü üzerinde yüksek bellek baskısına neden olabileceğinden pahalı modellerle (transformatörler gibi) ilgilenirken yaygın bir desendir (OOM örnekleri).
- Donanım yapılandırmasını (CPU ve GPU) algılayan ve modeli uygun şekilde yükleyen bir
Dağıtımı hangi ortamda çalıştıracağımızı belirtmemiz gerekir. Bizim örneğimizde modelimiz üzerinde
Torch
çalışır ve HuggingFace'den ,accelerate
veoptimum
kitaplıklarınıtransformers
gerektirir. Azure Machine Learning'de Torch ve GPU desteğine sahip bir ortam zaten vardır. Bir dosyaya yalnızca birkaç bağımlılıkconda.yaml
ekleyeceğiz.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]
Daha önce bahsedilen conda dosyasını aşağıdaki gibi kullanabiliriz:
Ortam tanımı dağıtım dosyasına eklenir.
deployment.yml
compute: azureml:gpu-cluster environment: name: torch200-transformers-gpu image: mcr.microsoft.com/azureml/openmpi4.1.0-cuda11.8-cudnn8-ubuntu22.04:latest
Önemli
Oluşturduğumuz ortam
torch200-transformers-gpu
, Torch 2.0 ve Ubuntu 20.04'ü çalıştırmak için CUDA 11.8 uyumlu bir donanım cihazı gerektirir. GPU cihazınız CUDA'nın bu sürümünü desteklemiyorsa CUDA 10.1 ile Ubuntu 18.04 üzerinde Torch 1.3 çalıştıran alternatiftorch113-conda.yaml
conda ortamını (depoda da mevcuttur) denetleyebilirsiniz. Ancak veaccelerate
kitaplıklarının kullanılmasıoptimum
bu yapılandırmada desteklenmeyecektir.Her dağıtım işlem kümelerinde çalışır. Hem Azure Machine Learning İşlem kümelerini (AmlCompute) hem de Kubernetes kümelerini destekler. Bu örnekte modelimiz GPU hızlandırmasından yararlanabilir. Bu nedenle GPU kümesi kullanıyoruz.
az ml compute create -n gpu-cluster --type amlcompute --size STANDARD_NV6 --min-instances 0 --max-instances 2
Not
Bir toplu iş uç noktası çağrılana ve toplu puanlama işi gönderilene kadar küme 0 düğümde kaldığından bu noktada işlem için ücret alınmaz. AmlCompute maliyetini yönetme ve iyileştirme hakkında daha fazla bilgi edinin.
Şimdi dağıtımı oluşturalım.
Oluşturulan uç nokta altında yeni bir dağıtım oluşturmak için aşağıdakine benzer bir
YAML
yapılandırma oluşturun. Ek özellikler için tam toplu iş uç noktası YAML şemasını denetleyebilirsiniz.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: info
Ardından, aşağıdaki komutla dağıtımı oluşturun:
az ml batch-deployment create --file deployment.yml --endpoint-name $ENDPOINT_NAME --set-default
Önemli
Bu dağıtımda parametresinde
timeout
retry_settings
içinde yüksek bir değer göreceksiniz. Bunun nedeni, çalıştırdığımız modelin doğasından kaynaklanır. Bu çok pahalı bir modeldir ve tek bir satırdaki çıkarım 60 saniyeye kadar sürebilir. Parametreler,timeout
Batch Dağıtımı'nın puanlama betiğinin her bir mini toplu işlemi işlemeyi bitirmesi için ne kadar süre beklemesi gerektiğini denetler. Modelimiz tahminleri satır satır çalıştırdığından uzun bir dosyanın işlenmesi zaman alabilir. Ayrıca toplu iş başına dosya sayısının 1 (mini_batch_size=1
) olarak ayarlandığına da dikkat edin. Bu yine yaptığımız işin doğasıyla ilgilidir. Toplu iş başına bir dosyayı tek seferde işlemek, bunu haklı çıkarmak için yeterince pahalıdır. Bunun NLP işlemede bir desen olduğunu fark edeceksiniz.Bir uç noktanın içinde belirli bir dağıtımı çağırabilirsiniz ancak genellikle uç noktanın kendisini çağırmak ve hangi dağıtımın kullanılacağına uç noktanın karar vermesine izin vermek istersiniz. Bu tür bir dağıtım "varsayılan" dağıtım olarak adlandırılır. Bu, varsayılan dağıtımı değiştirme ve dolayısıyla kullanıcının uç noktayı çağırmasıyla yapılan sözleşmeyi değiştirmeden dağıtımı sunan modeli değiştirme olanağı sağlar. Varsayılan dağıtımı güncelleştirmek için aşağıdaki yönergeyi kullanın:
Bu noktada toplu iş uç noktamız kullanılmaya hazırdır.
Dağıtımı test etme
Uç noktamızı test etmek için BillSum: A Corpus for Automatic Summarization of US Legislation adlı veri kümesinin bir örneğini kullanacağız. Bu örnek klasöründeki data
depoya eklenir. Verilerin biçiminin CSV olduğuna ve özetlenecek içeriğin model tarafından beklendiği gibi sütununun text
altında olduğuna dikkat edin.
Şimdi uç noktayı çağıralım:
JOB_NAME=$(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input data --input-type uri_folder --query name -o tsv)
İpucu
Giriş olarak yerel bir yol belirterek verilerin Azure Machine Learning varsayılan depolama hesabına yüklendiğine dikkat edin.
Komut döndürüldüğü anda bir toplu iş başlatılır. İş bitene kadar işin durumunu izleyebilirsiniz:
Dağıtım tamamlandıktan sonra tahminleri indirebilirsiniz:
Metin işleyen modelleri dağıtırken dikkat edilmesi gerekenler
Bu öğreticideki bazı notlarda belirtildiği gibi, metin işlemenin toplu dağıtımlar için belirli yapılandırma gerektiren bazı özellikleri olabilir. Toplu dağıtım tasarlarken aşağıdaki noktaları göz önünde bulundurun:
- Bazı NLP modelleri bellek ve işlem süresi açısından çok pahalı olabilir. Böyle bir durumda, her mini toplu işleme dahil edilen dosya sayısını azaltmayı göz önünde bulundurun. Yukarıdaki örnekte, sayı toplu iş başına en az 1 dosyaya alınmıştır. Bu sizin durumunuz olmasa da, modelinizin her seferinde kaç dosya puan alabileceğini dikkate alın. Girişin boyutuyla modelinizin bellek ayak izi arasındaki ilişkinin derin öğrenme modelleri için doğrusal olmayabileceğini unutmayın.
- Modeliniz aynı anda tek bir dosyayı bile işleyemiyorsa (bu örnekte olduğu gibi), giriş verilerini satırlar/öbekler halinde okumayı göz önünde bulundurun. Daha yüksek aktarım hızı veya donanım kullanımı elde etmeniz gerekiyorsa satır düzeyinde toplu işlem gerçekleştirin.
timeout
Dağıtımınızın değerini modelinizin ne kadar pahalı olduğuna ve işlemeyi beklediğiniz veri miktarına göre ayarlayın. öğesinintimeout
, toplu iş dağıtımının puanlama betiğinizin belirli bir toplu işlem için çalışmasını bekleyeceği süreyi gösterdiğini unutmayın. Toplu işleminizde çok sayıda dosya veya satırı olan dosyalar varsa, bu durum bu parametrenin doğru değerini etkiler.
Metni işleyen MLflow modelleri için dikkat edilmesi gerekenler
Yukarıda bahsedilenler MLflow modelleri için de geçerlidir. Ancak, MLflow modeli dağıtımınız için puanlama betiği sağlamanız gerekmediğinden, belirtilen önerilerden bazıları farklı bir yaklaşım gerektirebilir.
- Batch Uç Noktalarındaki MLflow modelleri, uzun metin dizileri içerebilen tablo verilerinin giriş verileri olarak okunmasını destekler. Hangi dosya türlerinin desteklendiği hakkında ayrıntılı bilgi için bkz . Dosya türleri desteği .
- Toplu dağıtımlar, MLflow modelinizin predict işlevini pandas veri çerçevesi olarak tüm dosyanın içeriğiyle çağırır. Giriş verilerinizde çok sayıda satır varsa, karmaşık bir modelin çalıştırılmasının (bu öğreticide sunulan model gibi) bellek yetersiz özel durumuyla sonuçlanıyor olma olasılığı vardır. Bu sizin durumunuzsa şunları göz önünde bulundurabilirsiniz:
- Modelinizin tahminleri çalıştırma ve toplu işlem uygulama şeklini özelleştirin. MLflow modelinin çıkarımının nasıl özelleştirileceğini öğrenmek için bkz . Özel modelleri günlüğe kaydetme.
- Bir puanlama betiği yazın ve kullanarak
mlflow.<flavor>.load_model()
modelinizi yükleyin. Ayrıntılar için bkz . Puanlama betiğiyle MLflow modellerini kullanma.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin