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ş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ın az 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 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

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

  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 westus2adı mybatchendpoint 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 accelerate kitaplıklarını kullanarak optimum 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ş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 transformersyürütülmediğine pipeline 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).

  2. Dağıtımı hangi ortamda çalıştıracağımızı belirtmemiz gerekir. Bizim örneğimizde modelimiz üzerinde Torch çalışır ve HuggingFace'den , accelerateve optimum kitaplıklarını transformersgerektirir. Azure Machine Learning'de Torch ve GPU desteğine sahip bir ortam zaten vardır. Bir dosyaya yalnızca birkaç bağımlılık conda.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]
    
  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 ve accelerate kitaplıklarının kullanılması optimum bu yapılandırmada desteklenmeyecektir.

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

  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 parametresinde timeout retry_settingsiç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.

  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. 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. öğ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

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.