Makine öğrenmesi modellerini Azure'a dağıtma

Makine öğrenmesi veya derin öğrenme modelinizi Azure buluta bir web hizmeti olarak dağıtmayı öğrenin.

Not

Azure Machine Learning Uç noktalar (önizleme) gelişmiş, daha basit bir dağıtım deneyimi sağlar. Uç noktalar hem gerçek zamanlı hem de toplu çıkarım senaryolarını destekler. Uç noktalar, işlem türleri arasında model dağıtımlarını çağırmak ve yönetmek için birleşik bir arabirim sağlar. Bkz. Uç Azure Machine Learning (önizleme)?.

Model dağıtmak için iş akışı

Modeli nerede dağıtırsanız dağıtın benzer bir iş akışı kullanılır:

  1. Modeli kaydedin.
  2. Giriş betiği hazırlama.
  3. Çıkarım yapılandırmasını hazırlama.
  4. Her şeyin çalışır olduğundan emin olmak için modeli yerel olarak dağıtın.
  5. İşlem hedefi seçin.
  6. Modeli buluta dağıtma.
  7. Sonuçta elde edilen web hizmetini test edin.

Makine öğrenmesi dağıtım iş akışında yer alan kavramlar hakkında daha fazla bilgi için bkz.Azure Machine Learning.

Önkoşullar

Önemli

Bu makaledeki Azure CLI komutları için , azure-cli-ml veya v1 uzantısını Azure Machine Learning. Uzantıyı kullanan gelişmiş v2 CLI ml (önizleme) artık kullanılabilir ve önerilir. Uzantılar uyumsuzdur, bu nedenle v2 CLI komutları bu makaledeki adımlar için çalışmaz. Ancak makine öğrenmesi çalışma alanları ve temel alınan tüm kaynaklar herhangi biri ile etkileşime olabilir; başka bir kullanıcı v1 CLI ile çalışma alanı oluşturabilir ve başka bir kullanıcı v2 CLI ile aynı çalışma alanına iş gönderebilirsiniz.

Hangi uzantıları yüklemiş olduğunu bulmak için az extension list kullanın. Uzantılar listesi içeriyorsa, azure-cli-ml bu makaledeki adımlar için doğru uzantıya sahipsinizdir.

Farklı uzantıları yükleme ve kullanma hakkında daha fazla bilgi için aşağıdaki makalelere bakın:

Çalışma alanınıza bağlanma

Erişiminiz olan çalışma alanlarını görmek için aşağıdaki komutları kullanın:

az login
az account set -s <subscription>
az ml workspace list --resource-group=<resource-group>

Modeli kaydetme

Dağıtılan makine öğrenmesi hizmeti için tipik bir durum, aşağıdaki bileşenlere ihtiyacınız olduğudur:

  • Dağıtılmasını istediğiniz modeli temsil eden kaynaklar (örneğin: pytorch model dosyası).
  • Hizmette çalıştıracak ve modeli verilen bir girişte yürüten kod.

Azure Machine Learnings, dağıtımı iki ayrı bileşene ayırmanızı sağlar; böylece aynı kodu tutabilirsiniz ancak modeli güncelleştirebilirsiniz. Bir modeli kodunuzdan ayrı olarak karşıya yüklediğiniz mekanizmayı "modeli kaydetme" olarak tanımlarız.

Bir modeli kaydettirdikten sonra modeli buluta yükleriz (çalışma alanınıza varsayılan depolama hesabında) ve ardından web hizmetinizin çalıştır olduğu aynı işleme bağlarız.

Aşağıdaki örneklerde bir modelin nasıl kaydedildiklerinden örnekler verilmiştir.

Önemli

Yalnızca bir güvenilen kaynaktan oluşturduğunuz veya aldığınız modelleri kullanmanız gerekir. Bir dizi popüler biçimde güvenlik açıkları bulunduğundan, serileştirilmiş modelleri kod olarak değerlendirmelisiniz. Ayrıca, modeller taraflı veya hatalı çıktılar sağlamak üzere kötü amaçlı olarak kötü amaçlı olarak eğitilmiş olabilir.

Aşağıdaki komutlar bir modeli indirir ve ardından modeli çalışma alanınıza Azure Machine Learning alır:

wget https://aka.ms/bidaf-9-model -O model.onnx --show-progress
az ml model register -n bidaf_onnx \
    -p ./model.onnx \
    -g <resource-group> \
    -w <workspace-name>

Bir -p klasörün veya kaydetmek istediğiniz bir dosyanın yoluna ayarlayın.

hakkında daha fazla bilgi az ml model register için başvuru belgelerine bakın.

Eğitim çalıştırması için Azure ML modeli kaydetme

Daha önce bir Azure Machine Learning eğitim işiyle oluşturulmuş bir modeli kaydetmeniz gerekirse, denemeyi, çalıştırmayı ve modelin yolunu belirterek:

az ml model register -n bidaf_onnx --asset-path outputs/model.onnx --experiment-name myexperiment --run-id myrunid --tag area=qna

--asset-pathparametresi, modelin bulut konumunu ifade eder. Bu örnekte, tek bir dosyanın yolu kullanılır. Model kaydına birden çok dosya eklemek için, --asset-path dosyaları içeren klasörün yoluna ayarlayın.

hakkında daha fazla bilgi az ml model register için başvuru belgelerine bakın.

Sahte bir giriş betiği tanımlama

Giriş betiği, dağıtılan bir web hizmetine gönderilen verileri alır ve modele geçirir. Ardından modelin yanıtını istemciye döndürür. Betik modelinize özeldir. Giriş betiği, modelin beklediğiniz ve döndüren verileri anlamanız gerekir.

Giriş betiğinde gerçekleştirmeniz gereken iki şey:

  1. Modelinizi yükleme (adlı bir işlev init() kullanarak)
  2. Modelinizi giriş verileri üzerinde çalıştırma (adlı bir işlev run() kullanarak)

İlk dağıtımınız için aldığı verileri yazdıran sahte bir giriş betiği kullanın.

import json


def init():
    print("This is init")


def run(data):
    test = json.loads(data)
    print(f"received data {test}")
    return f"test is {test}"

Bu dosyayı adlı dizinin echo_score.py içinde olarak source_dir kaydedin. Bu sahte betik, modeli kullanmamaları için bu betike göndermekte olduğu verileri döndürür. Ancak puanlama betiği çalıştırmayı test etmek için yararlıdır.

Çıkarım yapılandırması tanımlama

Çıkarım yapılandırması, web hizmetinizi başlatma sırasında kullanmak üzere Docker kapsayıcısını ve dosyalarını açıklar. Alt dizinler de dahil olmak üzere kaynak dizininizin içindeki tüm dosyalar sıkıştırılır ve web hizmetinizi dağıtarak buluta karşıya yükler.

Aşağıdaki çıkarım yapılandırması, makine öğrenmesi dağıtımının gelen istekleri işlemek için dizinde dosyasını ve ortamda belirtilen Python paketleriyle Docker görüntüsünü kullanacağız echo_score.py ./source_dir project_environment belirtir.

Proje ortamınızı oluştururken Azure Machine Learning temel Docker görüntüsü olarak herhangi bir çıkarım ortamını kullanabilirsiniz. Gerekli bağımlılıkları en üst düzeye yükecek ve sonuçta elde edilen Docker görüntüsünü çalışma alanınız ile ilişkili depoda depola yapacağız.

Not

Azure machine learning çıkarım kaynak dizini karşıya yüklemesi .gitignore veya .amlignore ile ilgili değil

En düşük çıkarım yapılandırması şu şekilde yaz olabilir:

{
    "entryScript": "echo_score.py",
    "sourceDirectory": "./source_dir",
    "environment": {
        "docker": {
            "arguments": [],
            "baseDockerfile": null,
            "baseImage": "mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04",
            "enabled": false,
            "sharedVolumes": true,
            "shmSize": null
        },
        "environmentVariables": {
            "EXAMPLE_ENV_VAR": "EXAMPLE_VALUE"
        },
        "name": "my-deploy-env",
        "python": {
            "baseCondaEnvironment": null,
            "condaDependencies": {
                "channels": [],
                "dependencies": [
                    "python=3.6.2",
                    {
                        "pip": [
                            "azureml-defaults"
                        ]
                    }
                ],
                "name": "project_environment"
            },
            "condaDependenciesFile": null,
            "interpreterPath": "python",
            "userManagedDependencies": false
        },
        "version": "1"
    }
}

Bu dosyayı adıyla dummyinferenceconfig.json kaydedin.

Çıkarım yapılandırmaları hakkında daha ayrıntılı bilgi için bu makaleye bakın.

Dağıtım yapılandırması tanımlama

Dağıtım yapılandırması, Web hizmeti 'nin çalışması için gereken bellek miktarını ve çekirdekleri belirler. Ayrıca temel alınan Web hizmeti 'nin yapılandırma ayrıntılarını da sağlar. Örneğin, bir dağıtım yapılandırması, hizmetinizin 2 gigabayt bellek, 2 CPU çekirdeği, 1 GPU çekirdeği ihtiyacı olduğunu ve otomatik ölçeklendirmeyi etkinleştirmek istediğinizi belirtmenize olanak tanır.

Bir dağıtım yapılandırması için kullanılabilen seçenekler, seçtiğiniz işlem hedefine bağlı olarak farklılık gösterir. Bir yerel dağıtımda, her türlü, Web sitenizin hangi bağlantı noktası üzerinde sunulacak olduğunu belirtebilirsiniz.

deploymentconfig.jsonBelgedeki girişler LocalWebservice.deploy_configurationparametrelerine eşlenir. Aşağıdaki tabloda, JSON belgesindeki varlıklar ve yöntemin parametreleri arasındaki eşleme açıklanmaktadır:

JSON varlığı Yöntem parametresi Description
computeType NA Bilgi işlem hedefi. Yerel hedefler için değer olmalıdır local .
port port Hizmetin HTTP uç noktasının sergilebileceği yerel bağlantı noktası.

Bu JSON, CLı ile kullanılacak örnek bir dağıtım yapılandırması örneğidir:

{
    "computeType": "local",
    "port": 32267
}

Bu JSON dosyasını adlı bir dosya olarak kaydedin deploymentconfig.json .

Daha fazla bilgi için bkz. dağıtım şeması.

Machine Learning modelinizi dağıtma

Artık modelinizi dağıtmaya hazırsınız.

bidaf_onnx:1Modelinizin adı ve sürüm numarası ile değiştirin.

az ml model deploy -n myservice \
    -m bidaf_onnx:1 \
    --overwrite \
    --ic dummyinferenceconfig.json \
    --dc deploymentconfig.json \
    -g <resource-group> \
    -w <workspace-name>

Modelinize çağrı

Yankı modelinizin başarıyla dağıtılıp dağıtılmadığını kontrol edelim. Bir Puanlama isteği ve basit bir istek da yapabilmelisiniz:

curl -v http://localhost:32267
curl -v -X POST -H "content-type:application/json" \
    -d '{"query": "What color is the fox", "context": "The quick brown fox jumped over the lazy dog."}' \
    http://localhost:32267/score

Giriş betiği tanımlama

Artık modelinize gerçekten yükleme zamanı. İlk olarak, giriş betiğinizi değiştirin:

import json
import numpy as np
import os
import onnxruntime
from nltk import word_tokenize
import nltk


def init():
    nltk.download("punkt")
    global sess
    sess = onnxruntime.InferenceSession(
        os.path.join(os.getenv("AZUREML_MODEL_DIR"), "model.onnx")
    )


def run(request):
    print(request)
    text = json.loads(request)
    qw, qc = preprocess(text["query"])
    cw, cc = preprocess(text["context"])

    # Run inference
    test = sess.run(
        None,
        {"query_word": qw, "query_char": qc, "context_word": cw, "context_char": cc},
    )
    start = np.asscalar(test[0])
    end = np.asscalar(test[1])
    ans = [w for w in cw[start : end + 1].reshape(-1)]
    print(ans)
    return ans


def preprocess(word):
    tokens = word_tokenize(word)

    # split into lower-case word tokens, in numpy array with shape of (seq, 1)
    words = np.asarray([w.lower() for w in tokens]).reshape(-1, 1)

    # split words into chars, in numpy array with shape of (seq, 1, 1, 16)
    chars = [[c for c in t][:16] for t in tokens]
    chars = [cs + [""] * (16 - len(cs)) for cs in chars]
    chars = np.asarray(chars).reshape(-1, 1, 1, 16)
    return words, chars

Bu dosyayı içinde olduğu gibi kaydedin score.py source_dir .

AZUREML_MODEL_DIRKayıtlı modelinizi bulmak için ortam değişkeninin kullanımına dikkat edin. Artık bazı PIP paketleri ekledik.

{
    "entryScript": "score.py",
    "sourceDirectory": "./source_dir",
    "environment": {
        "docker": {
            "arguments": [],
            "baseDockerfile": null,
            "baseImage": "mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04",
            "enabled": false,
            "sharedVolumes": true,
            "shmSize": null
        },
        "environmentVariables": {
            "EXAMPLE_ENV_VAR": "EXAMPLE_VALUE"
        },
        "name": "my-deploy-env",
        "python": {
            "baseCondaEnvironment": null,
            "condaDependencies": {
                "channels": [],
                "dependencies": [
                    "python=3.6.2",
                    {
                        "pip": [
                            "azureml-defaults",
                            "nltk",
                            "numpy",
                            "onnxruntime"
                        ]
                    }
                ],
                "name": "project_environment"
            },
            "condaDependenciesFile": null,
            "interpreterPath": "python",
            "userManagedDependencies": false
        },
        "version": "2"
    }
}

Bu dosyayı farklı kaydet inferenceconfig.json

Yeniden dağıtın ve hizmetinizi çağırın

Hizmetinizi yeniden dağıtın:

bidaf_onnx:1Modelinizin adı ve sürüm numarası ile değiştirin.

az ml model deploy -n myservice \
    -m bidaf_onnx:1 \
    --overwrite \
    --ic inferenceconfig.json \
    --dc deploymentconfig.json \
    -g <resource-group> \
    -w <workspace-name>

Sonra hizmete bir post isteği gönderemeyeceğinizi doğrulayın:

curl -v -X POST -H "content-type:application/json" \
    -d '{"query": "What color is the fox", "context": "The quick brown fox jumped over the lazy dog."}' \
    http://localhost:32267/score

İşlem hedefi seçin

Modelinizi barındırmak için kullanabileceğiniz işlem hedefi, dağıtılan uç noktanın maliyetini ve kullanılabilirliğini etkiler. Uygun bir işlem hedefi seçmek için bu tabloyu kullanın.

İşlem hedefi Kullanıldığı yerler GPU desteği FPGA desteği Description
Yerel   web   hizmeti Test etme/hata ayıklama     Sınırlı test ve sorun giderme için kullanın. Donanım hızlandırma, yerel sistemde kitaplıkların kullanımına bağlıdır.
Azure Kubernetes Service (AKS) Gerçek zamanlı çıkarım

Üretim iş yükleri için önerilir.
Evet (web hizmeti dağıtımı) Evet Yüksek ölçekli üretim dağıtımları için kullanın. Dağıtılan hizmetin hızlı yanıt süresi ve otomatik ölçeklendirmesi sağlar. Küme otomatik ölçeklendirme, Azure Machine Learning SDK'sı aracılığıyla desteklenmez. AKS kümesinde düğümleri değiştirmek için aks kümenizin kullanıcı arabirimini Azure portal.

Tasarımcıda desteklenen.
Azure Container Instances Gerçek zamanlı çıkarım

Yalnızca geliştirme ve test amacıyla önerilir.
    48 GB'den az RAM gerektiren düşük ölçekli CPU tabanlı iş yükleri için kullanın. Bir kümeyi yönetmenizi gerektirmez.

Tasarımcıda desteklenen.
Azure Machine Learning işlem kümeleri Toplu   çıkarım Evet (makine öğrenmesi işlem hattı)   Sunucusuz işlemde toplu puanlama çalıştırma. Normal ve düşük öncelikli VM'leri destekler. Gerçek zamanlı çıkarım desteği yoktur.
Azure Arc özellikli Kubernetes Gerçek zamanlı çıkarım

Toplu çıkarım
Yes Yok Şirket içinde yönetilen şirket içi, bulut ve uç Kubernetes kümelerinde çıkarım iş yüklerini Azure Arc

Not

Yerel ve Azure Machine Learning gibi işlem hedefleri eğitim ve deneme için GPU desteğine sahip olsa da, web hizmeti olarak dağıtıldığında çıkarım için GPU kullanmak yalnızca AKS üzerinde de kullanılabilir.

Bir makine öğrenmesi işlem hattı ile puanlama yalnızca işlem hattında puanlama için GPU Azure Machine Learning kullanılır.

Küme SKU'su seçerken, önce ölçeğini ölçeklendirin ve sonra ölçeğini ölçeklendirin. Modelinizin gerektirdiği RAM'in %150'sinde olan bir makineyle çalışmaya başlayabilir, sonucun profilini oluşturun ve ihtiyacınız olan performansa sahip bir makine bulun. Bunu öğrendikte, eş zamanlı çıkarım ihtiyacınıza uyacak şekilde makine sayısını artır.

Not

  • Kapsayıcı örnekleri yalnızca boyutu 1 GB'ın altında olan küçük modeller için uygundur.
  • Daha büyük modelleri geliştirme ve test etmek için tek düğümlü AKS kümelerini kullanın.

Buluta Dağıt

Hizmetinizin yerel olarak çalışıp çalışmadığını ve bir uzak işlem hedefi seçtiğinizi doğruladıktan sonra, buluta dağıtım yapmaya hazırlanın.

Dağıtım yapılandırmanızı seçtiğiniz işlem hedefine karşılık gelecek şekilde değiştirin, bu durumda Azure Container Instances:

Bir dağıtım yapılandırması için kullanılabilen seçenekler, seçtiğiniz işlem hedefine bağlı olarak farklılık gösterir.

{
    "computeType": "aci",
    "containerResourceRequirements":
    {
        "cpu": 0.5,
        "memoryInGB": 1.0
    },
    "authEnabled": true,
    "sslEnabled": false,
    "appInsightsEnabled": false
}

Bu dosyayı olarak kaydedin re-deploymentconfig.json .

Daha fazla bilgi için Bu başvuruyabakın.

Hizmetinizi yeniden dağıtın:

bidaf_onnx:1Modelinizin adı ve sürüm numarası ile değiştirin.

az ml model deploy -n myservice \
    -m bidaf_onnx:1 \
    --overwrite \
    --ic inferenceconfig.json \
    --dc re-deploymentconfig.json \
    -g <resource-group> \
    -w <workspace-name>

Hizmet günlüklerini görüntülemek için aşağıdaki komutu kullanın:

az ml service get-logs -n myservice \
    -g <resource-group> \
    -w <workspace-name>

Uzak Web hizmeti 'nizi çağırma

Uzaktan dağıtırken, anahtar kimlik doğrulaması etkinleştirmiş olabilirsiniz. Aşağıdaki örnekte, bir çıkarım isteği oluşturmak için Python ile hizmet anahtarınızı nasıl alacağınız gösterilmektedir.

[! Not defteri-Python [] (~/azureml-examples-Main/Python-SDK/Tutorials/Deploy-Local/1.deploy-Local.ipynb? Name = Call-Remote-Web-Service-Code)]

[! Not defteri-Python [] (~/azureml-examples-Main/Python-SDK/Tutorials/Deploy-Local/1.deploy-Local.ipynb? Name = Call-Remote-WebService-PRINT-logs)]

Diğer dillerdeki diğer örnek istemciler için Web hizmetlerini kullanmak üzere istemci uygulamalardaki makaleye bakın.

Hizmet durumunu anlama

Model dağıtımı sırasında hizmet durumu değişikliğini tam olarak dağıttığında görebilirsiniz.

Aşağıdaki tabloda farklı hizmet durumları açıklanmaktadır:

Web hizmeti durumu Açıklama Son durum?
Kta Hizmet, dağıtım sürecinde. Hayır
Uygun Değil Hizmet dağıtıldı, ancak şu anda ulaşılamaz durumda. Hayır
Unschedulable Kaynak eksikliği nedeniyle hizmet şu anda dağıtılamıyor. Hayır
Başarısız Hizmet bir hata veya kilitlenme nedeniyle dağıtılamadı. Yes
Sağlam Hizmet sağlıklı ve uç nokta kullanılabilir. Yes

İpucu

Dağıtım sırasında, işlem hedefleri için Docker görüntüleri Azure Container Registry (ACR) ile oluşturulur ve yüklenir. varsayılan olarak, Azure Machine Learning temel hizmet katmanını kullanan bir acr oluşturur. Çalışma alanınızın ACR 'sini standart veya Premium katmana değiştirmek, görüntü oluşturma ve işlem hedeflerinize dağıtmak için geçen süreyi azaltabilir. Daha fazla bilgi için bkz. Azure Container Registry hizmet katmanları.

Not

Azure Kubernetes Service 'e (AKS) bir model dağıtıyorsanız, bu küme için Azure izleyicisini etkinleştirmenizi öneririz. Bu, genel küme durumunu ve kaynak kullanımını anlamanıza yardımcı olur. Aşağıdaki kaynakların yararlı olduğunu da görebilirsiniz:

Bir modeli sağlıksız veya aşırı yüklenmiş bir kümeye dağıtmaya çalışıyorsanız, sorun yaşanması beklenmektedir. AKS kümesi sorunlarını gidermek için yardıma ihtiyacınız varsa lütfen AKS desteğiyle iletişime geçin.

Kaynakları silme

[! Not defteri-Python [] (~/azureml-examples-Main/Python-SDK/Tutorials/Deploy-Local/2.deploy-Local-cli.ipynb? ad = Delete-Resource-Code)]

az ml service delete -n myservice
az ml service delete -n myaciservice
az ml model delete --model-id=<MODEL_ID>

Dağıtılan bir Web hizmetini silmek için kullanın az ml service delete <name of webservice> .

Çalışma alanınızdan kayıtlı bir modeli silmek için şunu kullanın az ml model delete <model id>

Bir Web hizmetini silme ve bir modeli silmehakkında daha fazla bilgi edinin.

Sonraki adımlar