Uzak model dağıtımı sorunlarını giderme

Azure Machine Learning kullanarak Azure Container Instances 'a (ACI) ve Azure Kubernetes Service'e (AKS) model dağıtırken karşılaşabileceğiniz yaygın hataları gidermeyi ve çözmeyi öğrenin.

Not

Azure Kubernetes Service'e (AKS) model dağıtıyorsanız, bu küme için Azure İzleyici'yi etkinleştirmenizi öneririz. Bu genel olarak kümenin durumunu ve kaynak kullanımını anlamanıza yardımcı olur. Ayrıca aşağıdaki kaynakları da yararlı bulabilirsiniz:

İyi durumda olmayan veya aşırı yüklenmiş olan bir kümeye model dağıtmaya çalışıyorsanız sorunlarla karşılaşmanız beklenir. AKS kümesi sorunlarını giderme konusunda yardıma ihtiyacınız varsa aks desteğine başvurun.

Önkoşullar

  • Bir Azure aboneliği. Azure Machine Learning'in ücretsiz veya ücretli sürümünü deneyin.

  • Azure Machine Learning SDK'sı.

  • Azure CLI.

  • Azure Machine Learning için CLI uzantısı v1.

    Önemli

    Bu makaledeki Azure CLI komutlarından bazıları Azure Machine Learning için uzantısını veya v1'i kullanır azure-cli-ml. v1 uzantısı desteği 30 Eylül 2025'te sona erecektir. Bu tarihe kadar v1 uzantısını yükleyebilecek ve kullanabileceksiniz.

    30 Eylül 2025'e kadar , veya v2 uzantısına geçmenizi mlöneririz. v2 uzantısı hakkında daha fazla bilgi için bkz . Azure ML CLI uzantısı ve Python SDK v2.

Makine öğrenmesi modellerinin Docker dağıtımına yönelik adımlar

Azure Machine Learning'de yerel olmayan işlemlere bir model dağıttığınızda aşağıdaki işlemler gerçekleşir:

  1. InferenceConfig içindeki Ortamlar nesnenizde belirttiğiniz Dockerfile, kaynak dizininizin içeriğiyle birlikte buluta gönderilir
  2. Kapsayıcı kayıt defterinizde önceden oluşturulmuş bir görüntü yoksa bulutta yeni bir Docker görüntüsü oluşturulur ve çalışma alanınızın varsayılan kapsayıcı kayıt defterinde depolanır.
  3. Kapsayıcı kayıt defterinizdeki Docker görüntüsü işlem hedefinize indirilir.
  4. Çalışma alanınızın varsayılan Blob deposu işlem hedefinize bağlanarak kayıtlı modellere erişmenizi sağlar
  5. Giriş betiğinizin init() işlevi çalıştırılarak web sunucunuz başlatılır
  6. Dağıtılan modeliniz bir istek aldığında, işleviniz run() bu isteği işler

Yerel dağıtım kullanırken temel fark, kapsayıcı görüntüsünün yerel makinenizde yerleşik olmasıdır. Bu nedenle yerel dağıtım için Docker'ın yüklü olması gerekir.

Bu üst düzey adımları anlamak, hataların nerede olduğunu anlamanıza yardımcı olacaktır.

Dağıtım günlüklerini alma

Hata ayıklamanın ilk adımı dağıtım günlüklerinizi almaktır. İlk olarak, çalışma alanınıza bağlanmak için buradaki yönergeleri izleyin.

ŞUNLAR IÇIN GEÇERLIDIR: Azure CLI ml uzantısı v1

Dağıtılan bir web hizmetindeki günlükleri almak için şunları yapın:

az ml service get-logs --verbose --workspace-name <my workspace name> --name <service name>

Yerel olarak hata ayıklama

Modeli ACI veya AKS'ye dağıtırken sorun yaşıyorsanız, bunu yerel bir web hizmeti olarak dağıtın. Yerel web hizmetinin kullanılması sorunları gidermeyi kolaylaştırır. Yerel olarak dağıtım sorunlarını gidermek için yerel sorun giderme makalesine bakın.

Azure Machine Learning çıkarımı HTTP sunucusu

Yerel çıkarım sunucusu, giriş betiğinizde (score.py ) hızlı bir şekilde hata ayıklamanıza olanak tanır. Temel alınan puan betiğinde hata olması durumunda sunucu modeli başlatamıyor veya hizmet veremiyor. Bunun yerine, bir özel durum ve sorunların oluştuğu konum oluşturur. Azure Machine Learning çıkarım HTTP Sunucusu hakkında daha fazla bilgi edinin

  1. azureml-inference-server-http Paketi pypi akışından yükleyin:

    python -m pip install azureml-inference-server-http
    
  2. Sunucuyu başlatın ve giriş betiği olarak ayarlayın score.py :

    azmlinfsrv --entry_script score.py
    
  3. kullanarak curlsunucuya puanlama isteği gönderin:

    curl -p 127.0.0.1:5001/score
    

Kapsayıcı zamanlanamaz

Azure Kubernetes Service işlem hedefine bir hizmet dağıtırken, Azure Machine Learning hizmeti istenen kaynak miktarıyla zamanlamayı dener. Kümede 5 dakika sonra uygun miktarda kaynağa sahip düğüm yoksa dağıtım başarısız olur. Hata iletisi: Couldn't Schedule because the kubernetes cluster didn't have available resources after trying for 00:05:00. Daha fazla düğüm ekleyerek, düğümlerinizin SKU'sunu değiştirerek veya hizmetinizin kaynak gereksinimlerini değiştirerek bu hatayı giderebilirsiniz.

Hata iletisi genellikle hangi kaynağa daha fazla ihtiyacınız olduğunu gösterir; örneğin, hizmetin GPU gerektirdiğini ve kümede kullanılabilir GPU'ları olmayan üç düğüm olduğunu belirten 0/3 nodes are available: 3 Insufficient nvidia.com/gpu bir hata iletisi görürseniz. Gpu SKU kullanıyorsanız daha fazla düğüm ekleyerek, kullanmıyorsanız GPU özellikli bir SKU'ya geçerek veya ortamınızı GPU gerektirmemesi için değiştirerek bu sorun giderilebilir.

Hizmet başlatma başarısız oluyor

Görüntü başarıyla oluşturulduktan sonra sistem dağıtım yapılandırmanızı kullanarak bir kapsayıcı başlatmayı dener. Kapsayıcı başlatma işleminin bir parçası olarak puanlama betiğinizde init() işlevi sistem tarafından çağrılır. İşlevde yakalanmamış özel durumlar varsa hata iletisinde init() CrashLoopBackOff hatası görebilirsiniz.

Docker günlüğünü inceleme makalesindeki bilgileri kullanın.

azureml-fe-aci kapsayıcısı başlatılamıyor

Azure Container Instance işlem hedefine bir hizmet dağıtırken, Azure Machine Learning çıkarım isteğinin adına azureml-fe-aci sahip bir ön uç kapsayıcısı oluşturmayı dener. Kilitleniyorsa azureml-fe-aci , komutunu çalıştırarak az container logs --name MyContainerGroup --resource-group MyResourceGroup --subscription MySubscription --container-name azureml-fe-acigünlükleri görebilirsiniz. Düzeltmeyi yapmak için günlüklerdeki hata iletisini izleyebilirsiniz.

için en yaygın hata azureml-fe-aci , sağlanan SSL sertifikasının veya anahtarının geçersiz olmasıdır.

İşlev başarısız oluyor: get_model_path()

Genellikle puanlama init() betiğindeki işlevde Model.get_model_path () işlevi, kapsayıcıdaki bir model dosyasını veya model dosyalarının klasörünü bulmak için çağrılır. Model dosyası veya klasörü bulunamazsa işlev başarısız olur. Bu hatanın hatalarını ayıklamanın en kolay yolu, Container Shell'de aşağıdaki Python kodunu çalıştırmaktır:

ŞUNUN IÇIN GEÇERLIDIR: Python SDK azureml v1

from azureml.core.model import Model
import logging
logging.basicConfig(level=logging.DEBUG)
print(Model.get_model_path(model_name='my-best-model'))

Bu örnek, puanlama betiğinizin model dosyasını veya klasörünü bulmayı beklediği kapsayıcıda yerel yolu ( /var/azureml-appgöreli olarak) yazdırır. Ardından, dosya veya klasörün gerçekten olması beklenen yerde olup olmadığını doğrulayabilirsiniz.

Günlüğe kaydetme düzeyini DEBUG olarak ayarlamak, ek bilgilerin günlüğe kaydedilmesine neden olabilir ve bu da hatayı belirlemede yararlı olabilir.

İşlev başarısız oluyor: run(input_data)

Hizmet başarıyla dağıtılırsa ancak puanlama uç noktasına veri gönderdiğinizde kilitleniyorsa, bunun yerine ayrıntılı hata iletisi döndürmesi için işlevinize run(input_data) hata yakalama deyimi ekleyebilirsiniz. Örneğin:

def run(input_data):
    try:
        data = json.loads(input_data)['data']
        data = np.array(data)
        result = model.predict(data)
        return json.dumps({"result": result.tolist()})
    except Exception as e:
        result = str(e)
        # return error message back to the client
        return json.dumps({"error": result})

Not: Çağrıdan run(input_data) hata iletileri döndürülmesi yalnızca hata ayıklama amacıyla yapılmalıdır. Güvenlik nedeniyle, üretim ortamında hata iletilerini bu şekilde döndürmemelisiniz.

HTTP durum kodu 502

502 durum kodu, hizmetin bir özel durum oluşturduğunu veya score.py dosyasının yönteminde run() kilitlendiğini gösterir. Dosyada hata ayıklamak için bu makaledeki bilgileri kullanın.

HTTP durum kodu 503

Azure Kubernetes Service dağıtımları, ek yükü desteklemek için çoğaltmaların eklenmesini sağlayan otomatik ölçeklendirmeyi destekler. Otomatik ölçeklendirici, yükteki aşamalı değişiklikleri işlemek için tasarlanmıştır. saniye başına isteklerde büyük ani artışlar alırsanız, istemciler 503 http durum kodu alabilir. Otomatik ölçeklendirici hızlı tepki vermesine rağmen, AKS'nin daha fazla kapsayıcı oluşturması önemli miktarda zaman alır.

Ölçeği artırma/azaltma kararları geçerli kapsayıcı çoğaltmalarının kullanımına bağlıdır. Meşgul olan çoğaltmaların (bir isteği işleme) toplam geçerli çoğaltma sayısına bölünmesi geçerli kullanımdır. Bu sayı değerini aşarsa autoscale_target_utilization, daha fazla çoğaltma oluşturulur. Daha düşükse çoğaltmalar azaltılır. Çoğaltma ekleme kararları istekli ve hızlıdır (yaklaşık 1 saniye). Çoğaltmaları kaldırma kararları muhafazakardır (yaklaşık 1 dakika). Varsayılan olarak, otomatik ölçeklendirme hedef kullanımı %70'e ayarlanır ve bu da hizmetin saniye başına isteklerdeki ani artışları (RPS) %30'a kadar işleyebileceği anlamına gelir.

503 durum kodunu önlemeye yardımcı olabilecek iki şey vardır:

İpucu

Bu iki yaklaşım tek tek veya birlikte kullanılabilir.

  • Otomatik ölçeklendirmenin yeni çoğaltmalar oluşturduğu kullanım düzeyini değiştirin. değerini daha düşük bir değere ayarlayarak kullanım hedefini autoscale_target_utilization ayarlayabilirsiniz.

    Önemli

    Bu değişiklik çoğaltmaların daha hızlı oluşturulmasına neden olmaz. Bunun yerine, daha düşük bir kullanım eşiğinde oluşturulurlar. Hizmet %70 kullanılana kadar beklemek yerine değerin %30 olarak değiştirilmesi, %30 kullanım gerçekleştiğinde çoğaltmaların oluşturulmasına neden olur.

    Web hizmeti zaten geçerli maksimum çoğaltmaları kullanıyorsa ve hala 503 durum kodu görüyorsanız, maksimum çoğaltma sayısını artırmak için değeri artırın autoscale_max_replicas .

  • En az çoğaltma sayısını değiştirin. En düşük çoğaltmaların artırılması, gelen ani artışları işlemek için daha büyük bir havuz sağlar.

    En az çoğaltma sayısını artırmak için daha yüksek bir değere ayarlayın autoscale_min_replicas . Aşağıdaki kodu kullanarak gerekli çoğaltmaları hesaplayabilir ve değerleri projenize özgü değerlerle değiştirebilirsiniz:

    from math import ceil
    # target requests per second
    targetRps = 20
    # time to process the request (in seconds)
    reqTime = 10
    # Maximum requests per container
    maxReqPerContainer = 1
    # target_utilization. 70% in this example
    targetUtilization = .7
    
    concurrentRequests = targetRps * reqTime / targetUtilization
    
    # Number of container replicas
    replicas = ceil(concurrentRequests / maxReqPerContainer)
    

    Not

    Yeni minimum çoğaltmaların işleyebileceğinden daha büyük istek artışları alırsanız, yeniden 503'ler alabilirsiniz. Örneğin, hizmetinize yönelik trafik arttıkça en düşük çoğaltmaları artırmanız gerekebilir.

, ve için ayarları autoscale_target_utilizationhakkında daha fazla bilgi için bkz. AksWebservice modül autoscale_min_replicas başvurusu. autoscale_max_replicas

HTTP durum kodu 504

504 durum kodu, isteğin zaman aşımına uğradı olduğunu gösterir. Varsayılan zaman aşımı 1 dakikadır.

Gereksiz çağrıları kaldırmak için score.py değiştirerek zaman aşımını artırabilir veya hizmeti hızlandırmayı deneyebilirsiniz. Bu eylemler sorunu çözmezse, score.py dosyasında hata ayıklamak için bu makaledeki bilgileri kullanın. Kod yanıt vermeyen bir durumda veya sonsuz bir döngüde olabilir.

Diğer hata iletileri

Aşağıdaki hatalar için şu eylemleri gerçekleştirin:

Hata Çözüm
409 çakışma hatası Bir işlem zaten devam ederken, aynı web hizmetindeki tüm yeni işlemler 409 çakışma hatasıyla yanıt verir. Örneğin, web hizmeti oluşturma veya güncelleştirme işlemi sürüyorsa ve yeni bir Delete işlemi tetiklerseniz bir hata oluşur.
Web hizmeti dağıtılırken görüntü oluşturma hatası Görüntü yapılandırması için Conda dosyasına pip bağımlılığı olarak "pynacl==1.2.1" ekleyin
['DaskOnBatch:context_managers.DaskOnBatch', 'setup.py']' died with <Signals.SIGKILL: 9> Dağıtımınızda kullanılan VM'lerin SKU'sunu daha fazla belleğe sahip olacak şekilde değiştirin.
FPGA hatası FPGA kotası için istekte bulunana ve onaylanana kadar modelleri FPGA'lara dağıtamazsınız. Erişim istemek için kota isteği formunu doldurun: https://forms.office.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR2nac9-PZhBDnNSV2ITz0LNUN0U5S0hXRkNITk85QURTWk9ZUUFUWkkyTC4u

Gelişmiş hata ayıklama

Model dağıtımınızda yer alan Python kodunda etkileşimli hata ayıklaması yapmanız gerekebilir. Örneğin, giriş betiği başarısız oluyorsa ve neden ek günlük kaydıyla belirlenemiyorsa. Visual Studio Code ve hata ayıklamayı kullanarak Docker kapsayıcısının içinde çalışan koda ekleyebilirsiniz.

Daha fazla bilgi için VS Code'da etkileşimli hata ayıklama kılavuzunu ziyaret edin.

Model dağıtımı kullanıcı forumu

Sonraki adımlar

Dağıtım hakkında daha fazla bilgi edinin: