Azure Machine Learning çıkarımı HTTP sunucusu ile hata ayıklama puanlama betiği
Azure Machine Learning çıkarımı HTTP sunucusu, puanlama işlevinizi bir HTTP uç noktası olarak kullanıma sunan ve Flask sunucu kodunu ve bağımlılıklarını tek bir pakete sarmalayan bir Python paketidir. Azure Machine Learning ile bir modeli dağıtırken kullanılan çıkarım için önceden oluşturulmuş Docker görüntülerine dahildir. Paketi tek başına kullanarak modeli üretim için yerel olarak dağıtabilir ve ayrıca puanlama (giriş) betiğinizi yerel bir geliştirme ortamında kolayca doğrulayabilirsiniz. Puanlama betiğinde bir sorun varsa, sunucu bir hata ve hatanın oluştuğu konumu döndürür.
Sunucu, sürekli tümleştirme ve dağıtım işlem hattında doğrulama geçitleri oluşturmak için de kullanılabilir. Örneğin, adayı betik ile sunucuyu başlatabilir ve test paketini yerel uç noktada çalıştırabilirsiniz.
Bu makale temelde çıkarım sunucusunu kullanarak yerel olarak hata ayıklamak isteyen kullanıcıları hedefler, ancak çıkarım sunucusunu çevrimiçi uç noktalarla nasıl kullanacağınızı anlamanıza da yardımcı olur.
Çevrimiçi uç nokta yerel hata ayıklama
Uç noktaları buluta dağıtmadan önce yerel olarak hata ayıklamak, kod ve yapılandırmanızdaki hataları daha önce yakalamanıza yardımcı olabilir. Uç noktalarda yerel olarak hata ayıklamak için şunları kullanabilirsiniz:
- Azure Machine Learning çıkarımı HTTP sunucusu
- yerel uç nokta
Bu makalede Azure Machine Learning çıkarımı HTTP sunucusuna odaklanmaktadır.
Aşağıdaki tabloda, sizin için en uygun olanı seçmenize yardımcı olacak senaryolara genel bir bakış sağlanmaktadır.
Senaryo | Çıkarım HTTP sunucusu | Yerel uç nokta |
---|---|---|
Docker görüntüsü yeniden derlemesi olmadan yerel Python ortamını güncelleştirme | Yes | Hayır |
Puanlama betiğini güncelleştirme | Yes | Yes |
Dağıtım yapılandırmalarını güncelleştirme (dağıtım, ortam, kod, model) | Hayır | Evet |
VS Code Hata Ayıklayıcısını Tümleştirme | Yes | Yes |
Çıkarım HTTP sunucusunu yerel olarak çalıştırarak, dağıtım kapsayıcısı yapılandırmalarından etkilenmeden puanlama betiğinizde hata ayıklamaya odaklanabilirsiniz.
Önkoşullar
- Gerekli: Python >=3.8
- Anaconda
İpucu
Azure Machine Learning çıkarımı HTTP sunucusu Windows ve Linux tabanlı işletim sistemlerinde çalışır.
Yükleme
Not
Paket çakışmalarını önlemek için sunucuyu sanal bir ortama yükleyin.
yüklemek azureml-inference-server-http package
için cmd/terminalinizde aşağıdaki komutu çalıştırın:
python -m pip install azureml-inference-server-http
Puanlama betiğinizde yerel olarak hata ayıklama
Puanlama betiğinizde yerel olarak hata ayıklamak için sunucunun sahte puanlama betiğiyle nasıl davrandığını test edebilir, azureml-inference-server-http paketiyle hata ayıklamak için VS Code kullanabilir veya sunucuyu örnek depomuzdan gerçek bir puanlama betiği, model dosyası ve ortam dosyasıyla test edebilirsiniz.
Sahte puanlama betiğiyle sunucu davranışını test etme
Dosyalarınızı tutmak için bir dizin oluşturun:
mkdir server_quickstart cd server_quickstart
Paket çakışmalarını önlemek için bir sanal ortam oluşturun ve etkinleştirin:
python -m venv myenv source myenv/bin/activate
İpucu
Test ettikten sonra Python sanal ortamını devre dışı bırakmak için komutunu çalıştırın
deactivate
.azureml-inference-server-http
Paketi pypi akışından yükleyin:python -m pip install azureml-inference-server-http
Giriş betiğinizi (
score.py
) oluşturun. Aşağıdaki örnek, temel bir giriş betiği oluşturur:echo ' import time def init(): time.sleep(1) def run(input_data): return {"message":"Hello, World!"} ' > score.py
Sunucuyu (azmlinfsrv) başlatın ve giriş betiği olarak ayarlayın
score.py
:azmlinfsrv --entry_script score.py
Not
Sunucu 0.0.0.0 üzerinde barındırılır, yani barındırma makinesinin tüm IP adreslerini dinler.
kullanarak
curl
sunucuya puanlama isteği gönderin:curl -p 127.0.0.1:5001/score
Sunucu bu şekilde yanıt vermelidir.
{"message": "Hello, World!"}
Test ettikten sonra sunucuyu sonlandırmak için basabilirsiniz Ctrl + C
.
Artık puanlama betiğini (score.py
) değiştirebilir ve sunucuyu yenidenazmlinfsrv --entry_script score.py
() çalıştırarak değişikliklerinizi test edebilirsiniz.
Visual Studio Code ile tümleştirme
Azureml-inference-server-http paketiyle hata ayıklamak için Visual Studio Code (VS Code) ve Python Uzantısı'nı kullanmanın iki yolu vardır (Başlatma ve Ekleme modları).
Başlatma modu: VS Code'da öğesini ayarlayın
launch.json
ve VS Code içinde Azure Machine Learning çıkarım HTTP sunucusunu başlatın.VS Code'ı başlatın ve betiği (
score.py
) içeren klasörü açın.VS Code'da bu çalışma alanı için aşağıdaki yapılandırmayı
launch.json
ekleyin:launch.json
{ "version": "0.2.0", "configurations": [ { "name": "Debug score.py", "type": "python", "request": "launch", "module": "azureml_inference_server_http.amlserver", "args": [ "--entry_script", "score.py" ] } ] }
VS Code'da hata ayıklama oturumu başlatın. "Çalıştır" -> "Hata Ayıklamayı Başlat" (veya
F5
) öğesini seçin.
Ekleme modu: Azure Machine Learning çıkarım HTTP sunucusunu bir komut satırında başlatın ve işleme eklemek için VS Code + Python Uzantısı'nı kullanın.
Not
Linux ortamı kullanıyorsanız, önce komutunu çalıştırarak
sudo apt-get install -y gdb
paketini yükleyingdb
.VS Code'da bu çalışma alanı için aşağıdaki yapılandırmayı
launch.json
ekleyin:launch.json
{ "version": "0.2.0", "configurations": [ { "name": "Python: Attach using Process Id", "type": "python", "request": "attach", "processId": "${command:pickProcess}", "justMyCode": true }, ] }
ÇıKARıM sunucusunu CLI ()
azmlinfsrv --entry_script score.py
kullanarak başlatın.VS Code'da hata ayıklama oturumu başlatın.
- VS Code'da "Çalıştır" -> "Hata Ayıklamayı Başlat" (veya
F5
) öğesini seçin. - CLI'da görüntülenen günlükleri (çıkarım sunucusundan) kullanarak işlem kimliğini
azmlinfsrv
(gunicorn
değil) girin.
Not
İşlem seçici görüntülenmiyorsa, alanına işlem kimliğini
processId
launch.json
el ile girin.- VS Code'da "Çalıştır" -> "Hata Ayıklamayı Başlat" (veya
Her iki şekilde de kesme noktası ayarlayabilir ve adım adım hata ayıklayabilirsiniz.
Uçtan uca örnek
Bu bölümde, sunucuyu örnek depomuzda örnek dosyalarla (puanlama betiği, model dosyası ve ortam) yerel olarak çalıştıracağız. Örnek dosyalar, çevrimiçi uç nokta kullanarak makine öğrenmesi modelini dağıtma ve puanlandırma makalemizde de kullanılır
Örnek depoyu kopyalayın.
git clone --depth 1 https://github.com/Azure/azureml-examples cd azureml-examples/cli/endpoints/online/model-1/
conda ile sanal ortam oluşturma ve etkinleştirme. Bu örnekte, paketin
azureml-inference-server-http
bağımlı kitaplığı olarak eklendiğindenazureml-defaults
paketconda.yml
aşağıdaki gibi otomatik olarak yüklenir.# Create the environment from the YAML file conda env create --name model-env -f ./environment/conda.yml # Activate the new environment conda activate model-env
Puanlama betiğinizi gözden geçirin.
çevrimiçi puanlama/score.py
import os import logging import json import numpy import joblib def init(): """ This function is called when the container is initialized/started, typically after create/update of the deployment. You can write the logic here to perform init operations like caching the model in memory """ global model # AZUREML_MODEL_DIR is an environment variable created during deployment. # It is the path to the model folder (./azureml-models/$MODEL_NAME/$VERSION) # Please provide your model's folder name if there is one model_path = os.path.join( os.getenv("AZUREML_MODEL_DIR"), "model/sklearn_regression_model.pkl" ) # deserialize the model file back into a sklearn model model = joblib.load(model_path) logging.info("Init complete") def run(raw_data): """ This function is called for every invocation of the endpoint to perform the actual scoring/prediction. In the example we extract the data from the json input and call the scikit-learn model's predict() method and return the result back """ logging.info("model 1: request received") data = json.loads(raw_data)["data"] data = numpy.array(data) result = model.predict(data) logging.info("Request processed") return result.tolist()
Puanlama betiği ve model dosyası belirterek çıkarım sunucusunu çalıştırın. Belirtilen model dizini (
model_dir
parametre) değişken olarakAZUREML_MODEL_DIR
tanımlanır ve puanlama betiğinde alınır. Bu durumda, alt dizin puanlama betiğinde olarakmodel/sklearn_regression_model.pkl
belirtildiğinden geçerli dizini (./
) belirtiriz.azmlinfsrv --entry_script ./onlinescoring/score.py --model_dir ./
Örnek başlangıç günlüğü , sunucu başlatılırsa ve puanlama betiği başarıyla çağrılırsa gösterilir. Aksi takdirde, günlükte hata iletileri olur.
Puanlama betiğini örnek verilerle test edin. Başka bir terminal açın ve komutunu çalıştırmak için aynı çalışma dizinine geçin. Sunucuya
curl
örnek bir istek göndermek ve bir puanlama sonucu almak için komutunu kullanın.curl --request POST "127.0.0.1:5001/score" --header "Content-Type:application/json" --data @sample-request.json
Puanlama betiğinizde sorun yoksa puanlama sonucu döndürülür. Yanlış bir şey bulursanız puanlama betiğini güncelleştirmeyi deneyebilir ve güncelleştirilmiş betiği test etmek için sunucuyu yeniden başlatabilirsiniz.
Sunucu Yolları
Sunucu bu yollarda 5001 numaralı bağlantı noktasını (varsayılan olarak) dinliyor.
Veri Akışı Adı | Rota |
---|---|
Canlılık Yoklaması | 127.0.0.1:5001/ |
Puan | 127.0.0.1:5001/score |
OpenAPI (swagger) | 127.0.0.1:5001/swagger.json |
Sunucu parametreleri
Aşağıdaki tablo, sunucu tarafından kabul edilen parametreleri içerir:
Parametre | Zorunlu | Varsayılan | Açıklama |
---|---|---|---|
entry_script | True | Yok | Puanlama betiğinin göreli veya mutlak yolu. |
model_dir | False | Yok | Çıkarım için kullanılan modeli tutan dizinin göreli veya mutlak yolu. |
port | False | 5001 | Sunucunun sunum bağlantı noktası. |
worker_count | False | 1 | Eşzamanlı istekleri işleyecek çalışan iş parçacığı sayısı. |
appinsights_instrumentation_key | False | Yok | Günlüklerin yayımlanacağı uygulama içgörülerinin izleme anahtarı. |
access_control_allow_origins | False | Yok | Belirtilen kaynaklar için CORS'yi etkinleştirin. Birden çok kaynağı "," ile ayırın. Örnek: "microsoft.com, bing.com" |
İstek akışı
Aşağıdaki adımlar, Azure Machine Learning çıkarım HTTP sunucusunun (azmlinfsrv) gelen istekleri nasıl işlediğini açıklar:
- Python CLI sarmalayıcı, sunucunun ağ yığınının etrafında yer alır ve sunucuyu başlatmak için kullanılır.
- İstemci sunucuya bir istek gönderir.
- bir istek alındığında, WSGI sunucusundan geçer ve ardından çalışanlardan birine gönderilir.
- İstekler daha sonra giriş betiğini ve tüm bağımlılıkları yükleyen bir Flask uygulaması tarafından işlenir.
- Son olarak, istek giriş betiğinize gönderilir. Giriş betiği daha sonra yüklenen modele bir çıkarım çağrısı yapar ve bir yanıt döndürür.
Günlükleri anlama
Burada Azure Machine Learning çıkarım HTTP sunucusunun günlüklerini açıklıyoruz. Yerel olarak çalıştırdığınızda azureml-inference-server-http
günlüğü alabilir veya çevrimiçi uç noktalar kullanıyorsanız kapsayıcı günlüklerini alabilirsiniz.
Not
Günlük biçimi 0.8.0 sürümünden bu yana değişti. Günlüğünüzü farklı bir stilde bulursanız paketi en son sürüme güncelleştirin azureml-inference-server-http
.
İpucu
Çevrimiçi uç noktaları kullanıyorsanız çıkarım sunucusundan günlük ile Azure Machine Learning Inferencing HTTP server <version>
başlar.
Başlangıç günlükleri
Sunucu başlatıldığında, sunucu ayarları ilk olarak günlükler tarafından aşağıdaki gibi görüntülenir:
Azure Machine Learning Inferencing HTTP server <version>
Server Settings
---------------
Entry Script Name: <entry_script>
Model Directory: <model_dir>
Worker Count: <worker_count>
Worker Timeout (seconds): None
Server Port: <port>
Application Insights Enabled: false
Application Insights Key: <appinsights_instrumentation_key>
Inferencing HTTP server version: azmlinfsrv/<version>
CORS for the specified origins: <access_control_allow_origins>
Server Routes
---------------
Liveness Probe: GET 127.0.0.1:<port>/
Score: POST 127.0.0.1:<port>/score
<logs>
Örneğin, sunucuyu başlattığınızda uçtan uca örneği takip edin:
Azure Machine Learning Inferencing HTTP server v0.8.0
Server Settings
---------------
Entry Script Name: /home/user-name/azureml-examples/cli/endpoints/online/model-1/onlinescoring/score.py
Model Directory: ./
Worker Count: 1
Worker Timeout (seconds): None
Server Port: 5001
Application Insights Enabled: false
Application Insights Key: None
Inferencing HTTP server version: azmlinfsrv/0.8.0
CORS for the specified origins: None
Server Routes
---------------
Liveness Probe: GET 127.0.0.1:5001/
Score: POST 127.0.0.1:5001/score
2022-12-24 07:37:53,318 I [32726] gunicorn.error - Starting gunicorn 20.1.0
2022-12-24 07:37:53,319 I [32726] gunicorn.error - Listening at: http://0.0.0.0:5001 (32726)
2022-12-24 07:37:53,319 I [32726] gunicorn.error - Using worker: sync
2022-12-24 07:37:53,322 I [32756] gunicorn.error - Booting worker with pid: 32756
Initializing logger
2022-12-24 07:37:53,779 I [32756] azmlinfsrv - Starting up app insights client
2022-12-24 07:37:54,518 I [32756] azmlinfsrv.user_script - Found user script at /home/user-name/azureml-examples/cli/endpoints/online/model-1/onlinescoring/score.py
2022-12-24 07:37:54,518 I [32756] azmlinfsrv.user_script - run() is not decorated. Server will invoke it with the input in JSON string.
2022-12-24 07:37:54,518 I [32756] azmlinfsrv.user_script - Invoking user's init function
2022-12-24 07:37:55,974 I [32756] azmlinfsrv.user_script - Users's init has completed successfully
2022-12-24 07:37:55,976 I [32756] azmlinfsrv.swagger - Swaggers are prepared for the following versions: [2, 3, 3.1].
2022-12-24 07:37:55,977 I [32756] azmlinfsrv - AML_FLASK_ONE_COMPATIBILITY is set, but patching is not necessary.
Günlük biçimi
Çıkarım sunucusundaki günlükler, python paketinin parçası olmadığından başlatıcı betikleri dışında aşağıdaki biçimde oluşturulur:
<UTC Time> | <level> [<pid>] <logger name> - <message>
İşlem <pid>
kimliği ve <level>
günlüğe kaydetme düzeyinin ilk karakteri şöyledir: HATA için E, BİlGİ için I vb.
Python'da önem derecesiyle ilişkili sayılar içeren altı günlük düzeyi vardır:
Günlük düzeyi | Sayısal değer |
---|---|
KRİTİK | 50 |
HATA | 40 |
UYARI | 30 |
INFO | 20 |
HATA AYIKLAMA | 10 |
NOTSET | 0 |
Sorun giderme kılavuzu
Bu bölümde, Azure Machine Learning çıkarım HTTP sunucusu için temel sorun giderme ipuçları sağlayacağız. Çevrimiçi uç nokta sorunlarını gidermek istiyorsanız bkz . Çevrimiçi uç nokta dağıtımı sorunlarını giderme
Temel adımlar
Sorun gidermenin temel adımları şunlardır:
- Python ortamınız için sürüm bilgilerini toplayın.
- Ortam dosyasında belirtilen azureml-inference-server-http python paketi sürümünün başlangıç günlüğünde görüntülenen AzureML Çıkarım HTTP sunucusu sürümüyle eşleştiğinden emin olun. Bazen Pip'in bağımlılık çözümleyicisi yüklenen paketlerin beklenmeyen sürümlerine yol açar.
- Ortamınızda Flask (ve veya bağımlılıkları) belirtirseniz, bunları kaldırın. Bağımlılıklar , ,
Jinja2
,itsdangerous
,Werkzeug
,MarkupSafe
veclick
bağımlılıklarıdırFlask
. Flask, sunucu paketinde bağımlılık olarak listelenir ve sunucumuzun yüklemesine izin vermek en iyisidir. Bu şekilde sunucu Flask'in yeni sürümlerini desteklediğinde bunları otomatik olarak alırsınız.
Sunucu sürümü
Sunucu paketi azureml-inference-server-http
PyPI'da yayımlanır. Değişiklik günlüğümüzü ve önceki tüm sürümleri PyPI sayfamızda bulabilirsiniz. Önceki bir sürümü kullanıyorsanız en son sürüme güncelleştirin.
- 0.4.x: ≤ ve içindeki eğitim görüntülerinde
20220601
azureml-defaults>=1.34,<=1.43
paketlenen sürüm.0.4.13
son kararlı sürümdür. sürümünden0.4.11
önce sunucuyu kullanıyorsanız, 'denjinja2
adMarkup
içeri aktaramama gibi Flask bağımlılık sorunlarını görebilirsiniz. Mümkünse veya0.8.x
sürümüne0.4.13
(en son sürüm) yükseltmeniz önerilir. - 0.6.x: Görüntülerin ≤ 20220516 çıkarıldığında önceden yüklenmiş olan sürüm. En son kararlı sürüm:
0.6.1
. - 0.7.x: Flask 2'yi destekleyen ilk sürüm. En son kararlı sürüm:
0.7.7
. - 0.8.x: Günlük biçimi değişti ve Python 3.6 desteği bırakıldı.
Paket bağımlılıkları
Sunucu azureml-inference-server-http
için en uygun paketler aşağıdaki paketlerdir:
- Şişe
- opencensus-ext-azure
- çıkarım şeması
Python ortamınızda belirttiyseniz azureml-defaults
paket azureml-inference-server-http
bağlıdır ve otomatik olarak yüklenir.
İpucu
Python SDK v1 kullanıyorsanız ve Python ortamınızda açıkça belirtmezseniz azureml-defaults
SDK paketi sizin için ekleyebilir. Ancak, SDK'nın açık olduğu sürüme kilitlenir. Örneğin, SDK sürümü ise 1.38.0
ortamın pip gereksinimlerine eklenir azureml-defaults==1.38.0
.
Sık sorulan sorular
1. Sunucu başlatma sırasında aşağıdaki hatayla karşılaştım:
TypeError: register() takes 3 positional arguments but 4 were given
File "/var/azureml-server/aml_blueprint.py", line 251, in register
super(AMLBlueprint, self).register(app, options, first_registration)
TypeError: register() takes 3 positional arguments but 4 were given
Python ortamınızda Flask 2 yüklü ancak Flask 2'yi azureml-inference-server-http
desteklemeyen bir sürümünü çalıştırıyorsunuz. Flask 2 desteği, içinde azureml-inference-server-http>=0.7.0
de azureml-defaults>=1.44
bulunan öğesine eklenir.
Bu paketi bir AzureML docker görüntüsünde kullanmıyorsanız en son veya
azureml-defaults
sürümünüazureml-inference-server-http
kullanın.Bu paketi bir AzureML docker görüntüsüyle kullanıyorsanız Temmuz 2022'de veya sonrasında yerleşik bir görüntü kullandığınızdan emin olun. Görüntü sürümü kapsayıcı günlüklerinde kullanılabilir. Aşağıdakine benzer bir günlük bulabilmelisiniz:
2022-08-22T17:05:02,147738763+00:00 | gunicorn/run | AzureML Container Runtime Information 2022-08-22T17:05:02,161963207+00:00 | gunicorn/run | ############################################### 2022-08-22T17:05:02,168970479+00:00 | gunicorn/run | 2022-08-22T17:05:02,174364834+00:00 | gunicorn/run | 2022-08-22T17:05:02,187280665+00:00 | gunicorn/run | AzureML image information: openmpi4.1.0-ubuntu20.04, Materializaton Build:20220708.v2 2022-08-22T17:05:02,188930082+00:00 | gunicorn/run | 2022-08-22T17:05:02,190557998+00:00 | gunicorn/run |
Görüntünün derleme tarihi yukarıdaki örnekte
20220708
veya 8 Temmuz 2022'de yer alan "Gerçekleştirme Derlemesi"nin ardından görünür. Bu görüntü Flask 2 ile uyumludur. Kapsayıcı günlüğünüzde bunun gibi bir başlık görmüyorsanız, görüntünüz güncel değildir ve güncelleştirilmelidir. CUDA görüntüsü kullanıyorsanız ve daha yeni bir görüntü bulamıyorsanız, görüntünüzün AzureML Kapsayıcıları'nda kullanım dışı olup olmadığını denetleyin. Varsa, yenilerini bulabilmeniz gerekir.Sunucuyu çevrimiçi uç noktayla kullanıyorsanız, günlükleri Azure Machine Learning stüdyosu'deki çevrimiçi uç nokta sayfasındaki "Dağıtım günlükleri" altında da bulabilirsiniz. SDK v1 ile dağıtım yaparsanız ve dağıtım yapılandırmanızda açıkça bir görüntü belirtmezseniz, varsayılan olarak yerel SDK araç takımınızla eşleşen ve görüntünün en son sürümü olmayan bir
openmpi4.1.0-ubuntu20.04
sürümünü kullanırsınız. Örneğin, SDK 1.43 varsayılan olarak uyumsuz olan öğesini kullanıropenmpi4.1.0-ubuntu20.04:20220616
. Dağıtımınız için en son SDK'yi kullandığınızdan emin olun.Bir nedenle görüntüyü güncelleştiremiyorsanız, eski sürüm sunucusunu ile
Flask 1.0.x
yükleyecek olan veyaazureml-inference-server-http~=0.4.13
sabitleyerekazureml-defaults==1.43
geçici olarak sorundan kaçınabilirsiniz.
2. , , MarkupSafe
click
jinja2
veya ModuleNotFoundError
modüllerinde opencensus
veya başlatma sırasında aşağıdaki ileti gibi bir ImportError
veya ile karşılaştım:
ImportError: cannot import name 'Markup' from 'jinja2'
Sunucunun eski sürümleri (<= 0.4.10), Flask'in bağımlılığını uyumlu sürümlere sabitlemedi. Bu sorun, sunucunun en son sürümünde düzeltildi.
Sonraki adımlar
- Giriş betiği oluşturma ve modelleri dağıtma hakkında daha fazla bilgi için bkz . Azure Machine Learning kullanarak model dağıtma.
- Çıkarım için önceden oluşturulmuş docker görüntüleri hakkında bilgi edinin