Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Ş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şturulmuştu. 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 1.024 belirteç içeren dizilerle çalışabilir.
- Metnin İngilizce özetlenmesi konusunda eğitildi.
- 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 veya yapıştırmak zorunda kalmadan komutları yerel olarak çalıştırmak için aşağıdaki komutları kullanarak depoyu kopyalayın ve kodlama dilinizin klasörüne gidin:
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
Azure aboneliği. Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.
Azure Machine Learning çalışma alanı. Çalışma alanı oluşturmak için bkz . Azure Machine Learning çalışma alanlarını yönetme.
Azure Machine Learning çalışma alanında aşağıdaki izinler:
- Toplu iş uç noktalarını ve dağıtımlarını oluşturmak veya yönetmek için: Sahip, Katkıda Bulunan veya izinlere atanmış
Microsoft.MachineLearningServices/workspaces/batchEndpoints/*özel bir rol kullanın. - Çalışma alanı kaynak grubunda Azure Resource Manager dağıtımları oluşturmak için: Çalışma alanının dağıtıldığı kaynak grubunda izin atanmış
Microsoft.Resources/deployments/writebir Sahip, Katkıda Bulunan veya özel rol kullanın.
- Toplu iş uç noktalarını ve dağıtımlarını oluşturmak veya yönetmek için: Sahip, Katkıda Bulunan veya izinlere atanmış
Azure Machine Learning CLI veya Python için Azure Machine Learning SDK'sı:
Azure CLI'yi ve Azure Machine Learning uzantısını
mlyüklemek için aşağıdaki komutu çalıştırın:az extension add -n mlToplu uç noktalar için işlem hattı bileşeni dağıtımları, Azure CLI uzantısının
ml2.7 sürümünde kullanıma sunulmuştur.az extension update --name mlEn son sürümü almak için komutunu kullanın.
Çalışma alanınıza bağlanma
Çalışma alanı, Azure Machine Learning için en üst düzey kaynaktır. Azure Machine Learning'i kullanırken oluşturduğunuz tüm yapıtlarla çalışmak için merkezi bir yer sağlar. Bu bölümde, dağıtım görevlerinizi gerçekleştirdiğiniz çalışma alanına bağlanacaksınız.
Aşağıdaki komutta abonelik kimliğinizi, çalışma alanı adınızı, kaynak grubu adınızı ve konumunuzu girin:
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Modeli kaydetme
Modelin boyutu nedeniyle bu depoya dahil değildir. Bunun yerine HuggingFace modelinin hub'ından bir kopyasını indirebilirsiniz. Kullandığınız ortamda paketlerin transformers ve torch yüklü olması gerekir.
%pip install transformers torch
Modeli bir klasöre modelindirmek 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
Metin dosyalarında metin özetlemeyi İngilizce olarak ç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
mybatchendpointadıwestus2olan 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_tokenUç 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
initiş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 birpipelinenesne kullanmıyoruz. - ve kitaplıklarını kullanarak
optimumperformansı geliştirmek için model iyileştirmeleriacceleratedikkat 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
runişlevi gösterir. - İşlev,
runkitaplığını kullanarak toplu işleminindatasetstamamını okur. Özetlememiz gereken metin sütunundadırtext. - yöntemi,
runmetnin 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 nesnesiylepipelineyürütülmediğinetransformersdikkat 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, pahalı modellerle (transformatörler gibi) ilgilenirken yaygın bir desendir çünkü toplu işlemin tamamını yükleyip bir kerede modele göndermeye çalışmak toplu iş yürütücüsü üzerinde yüksek bellek baskısına neden olabilir (OOM özel durumları).
- 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 ,transformersveacceleratekitaplıklarınıoptimumgerektirir. Azure Machine Learning'de Torch ve GPU desteğine sahip bir ortam zaten vardır. Yalnızca birkaç bağımlılığıconda.yamldosyasına 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.yamlconda ortamını (depoda da mevcuttur) denetleyebilirsiniz. Ancakoptimumveacceleratekütüphanelerini kullanarak hızlandırma bu yapılandırmada desteklenmez.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 2Not
Bir toplu iş uç noktası çağrılana ve toplu puanlama işi gönderilene kadar küme sıfır düğümde kaldığından bu aşamada hesaplama için ücretlendirilmezsiniz. 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
YAMLyapı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: infoArdı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
timeoutparametresinderetry_settingsyüksek bir değer göreceksiniz. Bunun nedeni, çalıştırdığımız modelin niteliğini içerir. Bu çok pahalı bir modeldir ve tek bir satırdaki çıkarım 60 saniyeye kadar sürebilir.timeoutparametresi, Batch Dağıtımı'nın puanlama betiğinin her bir mini-parti işlemi tamamlaması için ne kadar süre beklemesi gerektiğini kontrol eder. 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 da yaptığımız işin doğasıyla ilgili. 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 datadepoya eklenir. Verilerin biçiminin CSV olduğuna ve özetlenecek içeriğin model tarafından beklendiği gibi sütununun textaltı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. Önceki örnekte, sayı toplu iş başına minimum olarak 1 dosya olacak şekilde ayarlandı. 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.
-
timeoutDağı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
Daha önce bahsedilenler MLflow modelleri için de geçerlidir. Bazı öneriler, MLflow modeli dağıtımınız için puanlama betiği sağlamanız gerekmediği için 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 model çıkarımını nasıl özelleştireceğinizi öğrenmek için Özel modelleri kaydetme bölümüne bakın.
- 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.