Aracılığıyla paylaş


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ş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/write bir Sahip, Katkıda Bulunan veya özel rol kullanın.
  • Azure Machine Learning CLI veya Python için Azure Machine Learning SDK'sı:

    Azure CLI'yi ve Azure Machine Learning uzantısını ml yüklemek için aşağıdaki komutu çalıştırın:

    az extension add -n ml
    

    Toplu 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. az extension update --name ml En 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.

  1. 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ı westus2 olan tek bir toplu iş uç noktası olabilir.

    Bu durumda, uç noktanın adını bir değişkene yerleştirelim, böylece daha sonra kolayca başvurabiliriz.

    ENDPOINT_NAME="text-summarization-batch"
    
  2. 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
    
  3. Uç noktayı oluşturun:

    az ml batch-endpoint create --file endpoint.yml  --name $ENDPOINT_NAME
    

Dağıtımı oluşturma

Şimdi modeli barındıran dağıtımı oluşturalım:

  1. 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 bir pipeline nesne kullanmıyoruz.
    • ve kitaplıklarını kullanarak optimum performansı 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 run işlevi gösterir.
    • İşlev, run kitaplığını kullanarak toplu işleminin datasets tamamını okur. Özetlememiz gereken metin sütunundadır text.
    • 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 nesnesiyle pipelineyürütülmediğine transformers 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, 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ı).

  2. Dağıtımı hangi ortamda çalıştıracağımızı belirtmemiz gerekir. Bizim örneğimizde modelimiz üzerinde Torch çalışır ve HuggingFace'den , transformersve accelerate kitaplı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.yaml dosyası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]
    
  3. 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 alternatif torch113-conda.yaml conda ortamını (depoda da mevcuttur) denetleyebilirsiniz. Ancak optimum ve accelerate kütüphanelerini kullanarak hızlandırma bu yapılandırmada desteklenmez.

  4. 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 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.

  5. Ş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 timeout parametresinde retry_settings yü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. timeout parametresi, 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.

  6. 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:

    DEPLOYMENT_NAME="text-summarization-hfbart"
    az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME
    
  7. 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.

  1. Ş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)
    

    Not

    Yardımcı program jq her yüklemede yüklü olmayabilir. Bu bağlantıda yönergeler alabilirsiniz.

    İpucu

    Giriş olarak yerel bir yol belirterek verilerin Azure Machine Learning varsayılan depolama hesabına yüklendiğine dikkat edin.

  2. Komut döndürüldüğü anda bir toplu iş başlatılır. İş bitene kadar işin durumunu izleyebilirsiniz:

    az ml job show -n $JOB_NAME --web
    
  3. Dağıtım tamamlandıktan sonra tahminleri indirebilirsiniz:

    Tahminleri indirmek için aşağıdaki komutu kullanın:

    az ml job download --name $JOB_NAME --output-name score --download-path .
    

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.
  • 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. öğesinin timeout , 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.