Gépi tanulási modellek üzembe helyezése az Azure-ban

Megtudhatja, hogyan helyezheti üzembe webszolgáltatásként a gépi tanulási vagy mély tanulási modelljét az Azure-felhőben.

Tipp

A felügyelt online végpontok (előzetes verzió) lehetőséget biztosítanak a betanított modell üzembe helyezésére anélkül, hogy létre kell hoznia és kezelnie kell a mögöttes infrastruktúrát. További információ: Gépi tanulási modell üzembe helyezése és pontozása felügyelt online végponttal (előzetes verzió).

A munkafolyamat a modell telepítésének helyétől függetlenül hasonló:

  1. A modell regisztrálása
  2. Bejegyzési szkript előkészítése
  3. Következtetési konfiguráció előkészítése
  4. A modell helyi üzembe helyezése annak biztosításához, hogy minden működik
  5. Számítási cél kiválasztása
  6. A modell újra üzembe helyezése a felhőben
  7. Az eredményül kapott webszolgáltatás tesztelése

A gépi tanulás üzembe helyezési munkafolyamatával kapcsolatos fogalmakkal kapcsolatos további információkért lásd: Modellek kezelése,üzembe helyezése és figyelése a Azure Machine Learning.

Előfeltételek

Csatlakozás a munkaterülethez

Ajánlott

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

a munkaterületek, amelyekhez hozzáféréssel rendelkezik.

A modell regisztrálása

Egy üzembe helyezett gépi tanulási szolgáltatás jellemzően a következő összetevőkre van szüksége:

  • erőforrások, amelyek az üzembe helyezni kívánt modellt képviselik (például egy pytorch-modellfájlt)
  • a szolgáltatásban futtatott kód, amely végrehajtja a modellt egy adott bemeneten

Az Azure Machine Learning lehetővé teszi, hogy az üzembe helyezést két különálló összetevőre válassza szét, hogy ugyanazt a kódot megtartsa, de csak frissítse a modellt. Azt a mechanizmust, amellyel a modellt a kódtól elkülönítve tölti fel, "regisztráljuk a modellt".

Amikor regisztrál egy modellt, feltöltjük a modellt a felhőbe (a munkaterület alapértelmezett tárfiókjára), majd csatlakoztatjuk ahhoz a számításhoz, ahol a webszolgáltatás fut.

Az alábbi példák bemutatják, hogyan regisztrálhat egy modellt.

Fontos

Csak olyan modelleket használjon, amelyeket megbízható forrásból hoz létre vagy szerez be. A szerializált modelleket kódként kell kezelni, mivel a biztonsági réseket számos népszerű formátumban észlelték. Emellett a modelleket szándékosan, rosszindulatú szándékkal lehet kitanítani, hogy torzítatlan vagy pontatlan kimenetet szolgáltasson.

Modell regisztrálása helyi fájlból

!wget https://aka.ms/bidaf-9-model -o model.onnx
!az ml model register -n bidaf_onnx -p ./model.onnx

A beállítása a regisztrálni kívánt mappa vagy -p fájl elérési útjára.

A-ről a az ml model register referenciadokumentációban talál további információt.

Modell regisztrálása Azure-beli ML betanítás futtatásakor

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

Tipp

Ha hibaüzenet jelenik meg arról, hogy az ml-bővítmény nincs telepítve, a következő paranccsal telepítheti:

az extension add -n azure-cli-ml

A --asset-path paraméter a modell felhőbeli helyét jelenti. Ebben a példában egyetlen fájl elérési útját használjuk. Ha több fájlt is fel akar foglalni a modellregisztrációba, állítsa be egy, a fájlokat tartalmazó mappa --asset-path elérési útját.

A-ről a az ml model register referenciadokumentációban talál további információt.

Üres bejegyzés parancsfájljának definiálás

A bejegyzés parancsfájlja fogadja az üzembe helyezett webszolgáltatásnak küldött adatokat, majd továbbítja azokat a modellnek. Ezután visszaadja a modell válaszát az ügyfélnek. A szkript a modellre vonatkozik. A bejegyzési szkriptnek meg kell értenie a modell által várt és visszaadott adatokat.

A bejegyzési szkriptben a következő két feladatot kell elvégeznie:

  1. A modell betöltése (egy nevű függvény init() használatával)
  2. A modell futtatása bemeneti adatokon (egy nevű run() függvénnyel)

A kezdeti üzembe helyezéshez használjon egy próbabeviteli szkriptet, amely kinyomtatja a kapott adatokat.

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}"

Mentse a fájlt néven echo_score.py egy nevű source_dir könyvtárba.

Így például, ha egy felhasználó a következővel hívja meg a modellt:

curl -X POST -d '{"this":"is a test"}' -H "Content-Type: application/json" http://localhost:6789/score

A visszaadott érték a következő:

"test is {'this': 'is a test'}"

Következtetési konfiguráció meghatározása

A következtetési konfiguráció ismerteti a Docker-tárolót és a webszolgáltatás inicializálható fájljait. A forráskönyvtárban lévő összes fájl, beleértve az alkönyvtárakat is, tömörítve lesz, és feltöltődik a felhőbe a webszolgáltatás üzembe helyezésekor.

Az alábbi következtetési konfiguráció azt határozza meg, hogy a Machine Learning üzemelő példánya a könyvtárban lévő fájlt fogja használni a bejövő kérések feldolgozásához, és hogy a Docker-rendszerképet fogja használni a környezetben megadott echo_score.py ./source_dir Python-csomagokkal. project_environment

A projektkörnyezet létrehozásakor bármely Azure Machine Learning környezet használható alap Docker-rendszerképként. Felül telepítjük a szükséges függőségeket, és az eredményül kapott Docker-rendszerképet a munkaterülethez társított adattárban tároljuk.

A minimális következtetési konfiguráció a következő ként írható meg:

{
    "entryScript": "echo_score.py",
    "sourceDirectory": "./source_dir",
    "environment": {
        "docker": {
            "arguments": [],
            "baseDockerfile": null,
            "baseImage": "mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.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"
    }
}

Mentse a fájlt dummyinferenceconfig.json néven.

A következtetési konfigurációk alaposabb megvitatásához tekintse meg ezt a cikket.

Üzembe helyezési konfiguráció meghatározása

Az üzembe helyezési konfiguráció határozza meg a webszolgáltatás számára a futtatáshoz szükséges memória és magok mennyiségét, valamint a mögöttes webszolgáltatás konfigurációs adatait. Egy üzembehelyezés-konfigurációval például megadhatja, hogy a szolgáltatásnak 2 gigabájt memóriára, 2 processzormagra és 1 GPU magra van szüksége, és engedélyezni szeretné az automatikus skálázást.

Az üzembe helyezési konfigurációkhoz elérhető lehetőségek a választott számítási céltól függően eltérőek lehetnek. Helyi üzemelő példányban csak azt adhatja meg, hogy melyik porton szolgálja ki a webszolgáltatást.

A dokumentum bejegyzései a következő paraméterekre vannak deploymentconfig.json leképezve: LocalWebservice.deploy_configuration. A következő táblázat a JSON-dokumentumban található entitások és a metódus paraméterei közötti leképezést ismerteti:

JSON-entitás Metódusparaméter Description
computeType NA A számítási cél. Helyi célokhoz az értéknek a következőnek kell lennie: local .
port port A helyi port, amelyen elérhetővé teszi a szolgáltatás HTTP-végpontját.

Ez a JSON egy, a CLI-vel használható üzembe helyezési konfigurációra példa:

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

Mentse ezt a JSON-t egy nevű deploymentconfig.json fájlként.

További információért tekintse meg ezt a referencia-referenciát.

A gépi tanulási modell üzembe helyezése

Most már készen áll a modell üzembe helyezésére.

Cserélje bidaf_onnx:1 le a helyére a modell nevét és verziószámát.

!az ml model deploy -n myservice -m bidaf_onnx:1 --overwrite --ic dummyinferenceconfig.json --dc deploymentconfig.json
!az ml service get-logs -n myservice

Hívás a modellbe

Ellenőrizzük, hogy az echo modell üzembe helyezése sikeresen megtörtént-e. Képesnek kell lennie egy egyszerű élősség-kérésre és egy pontozási kérésre:

!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

Bejegyzési szkript meghatározása

Itt az ideje, hogy ténylegesen betöltse a modellt. Először módosítsa a bejegyzési szkriptet:

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

Mentse a fájlt a score.py fájlban a source_dir fájlban.

Figyelje meg, hogy a környezeti AZUREML_MODEL_DIR változó használatával megkeresi a regisztrált modellt. Most, hogy hozzáadott néhány pip-csomagot.

{
    "entryScript": "score.py",
    "sourceDirectory": "./source_dir",
    "environment": {
        "docker": {
            "arguments": [],
            "baseDockerfile": null,
            "baseImage": "mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.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"
    }
}

Mentse a fájlt a következőként: inferenceconfig.json

Deploy your service again: null

Cserélje bidaf_onnx:1 le a helyére a modell nevét és verziószámát.

!az ml model deploy -n myservice -m bidaf_onnx:1 --overwrite --ic inferenceconfig.json --dc deploymentconfig.json
!az ml service get-logs -n myservice

Ezután ellenőrizze, hogy küldhet-e post kérést a szolgáltatásnak:

!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

Számítási cél kiválasztása

A számítási cél kiválasztásakor tekintse meg az alábbi diagramot.

Számítási cél kiválasztása

A modell gazdagépeként használt számítási cél befolyásolja az üzembe helyezett végpont költségeit és rendelkezésre állását. A táblázat segítségével kiválaszthatja a megfelelő számítási célt.

Számítási cél Alkalmazási cél GPU-támogatás FPGA-támogatás Description
Helyi     webszolgáltatás Tesztelés/hibakeresés     Korlátozott teszteléshez és hibaelhárításhoz használható. A hardvergyorsítás a kódtárak helyi rendszerben való használatától függ.
Azure Kubernetes Service (AKS) Valós idejű következtetés Igen (webszolgáltatás üzembe helyezése) Igen Nagy léptékű éles környezetekben használható. Gyors válaszidőt és az üzembe helyezett szolgáltatás automatikus skálázását biztosítja. Az automatikus fürtméretezés nem támogatott az Azure Machine Learning SDK-val. Az AKS-fürt csomópontjainak a módosításhoz használja az AKS-fürt felhasználói felületét a Azure Portal.

A tervezőben támogatott.
Azure Container Instances Valós idejű következtetés     Kis léptékű, 48 GB RAM-nál kevesebb memóriát igénylő processzoralapú számítási feladatokhoz használható. Nem szükséges hozzá fürtöt felügyelni.

A tervezőben támogatott.
Az Azure Machine Learning számítási fürtjei  Batch-következtetés Igen (gépi tanulási folyamat)   Kötegelt pontozás futtatása kiszolgáló nélküli számításon. Támogatja a normál és az alacsony prioritású virtuális gépeket. A valós idejű deduktencia nem támogatott.

Megjegyzés

Bár az olyan számítási célok, mint a helyi és a Azure Machine Learning számítási fürtök támogatják a GPU-t a betanításhoz és a kísérletezéshez, a WEBszolgáltatásként üzembe helyezett GPU használata csak az AKS-hez támogatott.

Ha GPU-t használ a következtetéshez gépi tanulási folyamatokkal való pontozáshoz, az csak a számítási Azure Machine Learning támogatott.

A fürt termékváltozatának kiválasztásakor először skálázzák fel, majd méretezzák fel horizontálisan. Kezdje egy olyan géppel, amely a modellhez szükséges RAM 150%-ával rendelkezik, profilt kell az eredményről, és keressen egy olyan gépet, amely rendelkezik a szükséges teljesítménnyel. Ha már tudja, növelje a gépek számát, hogy az egyidejű deduktencia-hez illeszkedjen.

Megjegyzés

  • A tárolópéldányok csak 1 GB-nál kisebb méretű kis modellekhez alkalmasak.
  • Egycsomópontos AKS-fürtök használata nagyobb modellek fejlesztéséhez/teszteléséhez.

Újra üzembe helyezés a felhőben

Miután megerősítette, hogy a szolgáltatás helyileg működik, és kiválasztott egy távoli számítási célt, készen áll a felhőben való üzembe helyezésre.

Módosítsa úgy az üzembe helyezési konfigurációt, hogy megfeleljen a kiválasztott számítási célnak, ebben az esetben a Azure Container Instances:

Az üzembe helyezési konfigurációkhoz elérhető lehetőségek a választott számítási céltól függően eltérőek lehetnek.

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

Mentse a fájlt a re-deploymentconfig.json következőként: .

További információért tekintse meg ezt a referencia-referenciát.

Telepítse újra a szolgáltatást:

Cserélje bidaf_onnx:1 le a helyére a modell nevét és verziószámát.

!az ml model deploy -n myaciservice -m bidaf_onnx:1 --overwrite --ic inferenceconfig.json --dc re-deploymentconfig.json
!az ml service get-logs -n myaciservice

Távoli webszolgáltatás hívása

Ha távolról telepíti a telepítést, előfordulhat, hogy a kulcshitelesítés engedélyezve van. Az alábbi példa bemutatja, hogyan kérheti le a szolgáltatáskulcsot a Pythonnal egy következtetési kérés igénylése érdekében.

import requests
import json
from azureml.core import Webservice

service = Webservice(workspace=ws, name="myservice")
scoring_uri = service.scoring_uri

# If the service is authenticated, set the key or token
key, _ = service.get_keys()

# Set the appropriate headers
headers = {"Content-Type": "application/json"}
headers["Authorization"] = f"Bearer {key}"

# Make the request and display the response and logs
data = {
    "query": "What color is the fox",
    "context": "The quick brown fox jumped over the lazy dog.",
}
data = json.dumps(data)
resp = requests.post(scoring_uri, data=data, headers=headers)
print(resp.text)
print(service.get_logs())

Tekintse meg az ügyfélalkalmazásokkal kapcsolatos cikket, amely további, más nyelvű ügyfélprogramokkal kapcsolatos webszolgáltatásokat használ fel.

A szolgáltatás állapotának ismertetése

A modell üzembe helyezése során előfordulhat, hogy a szolgáltatás állapota megváltozik a teljes üzembe helyezés során.

Az alábbi táblázat a különböző szolgáltatás-államokat ismerteti:

Webszolgáltatás állapota Leírás Végső állapot?
Átállás A szolgáltatás üzembe helyezése folyamatban van. Nem
Nem kifogástalan A szolgáltatás telepítve van, de jelenleg nem érhető el. Nem
Nem ütemezhető A szolgáltatás jelenleg nem helyezhető üzembe az erőforrások hiánya miatt. Nem
Sikertelen A szolgáltatás üzembe helyezése hiba vagy összeomlás miatt nem sikerült. Igen
Kifogástalan A szolgáltatás kifogástalan állapotú, és a végpont elérhető. Igen

Tipp

Az üzembe helyezéskor a számítási célokhoz készült Docker-rendszerképeket a rendszer kiépíti és betölti Azure Container Registry (ACR) szolgáltatásból. Alapértelmezés szerint a Azure Machine Learning alapszintű szolgáltatási szintet használó ACR-t hoz létre. Ha a munkaterület ACR-ét standard vagy prémium szintre módosítja, az csökkentheti a rendszerképek számítási célokon való létrehozásához és üzembe helyezéséhez szükséges időt. További információkért lásd a Azure Container Registry rétegeket.

Megjegyzés

Ha AKS-Azure Kubernetes Service helyez üzembe egy modellt, javasoljuk, hogy engedélyezze Azure Monitor fürtön. Ez segít megérteni a fürt általános állapotát és erőforrás-használatát. A következő erőforrásokat is hasznosnak találhatja:

Ha egy modellt egy nem megfelelő vagy túlterhelt fürtön próbál üzembe helyezni, az várhatóan problémákat fog tapasztalni. Ha segítségre van szüksége az AKS-fürtproblémák elhárításához, forduljon az AKS ügyfélszolgálatához.

Erőforrások törlése

# Get the current model id
import os

stream = os.popen(
    'az ml model list --model-name=bidaf_onnx --latest --query "[0].id" -o tsv'
)
MODEL_ID = stream.read()[0:-1]
MODEL_ID
!az ml service delete -n myservice
!az ml service delete -n myaciservice
!az ml model delete --model-id=$MODEL_ID

Egy üzembe helyezett webszolgáltatás törléséhez használja a az ml service delete <name of webservice> parancsot.

Regisztrált modell törlése a munkaterületről: az ml model delete <model id>

További információ a webszolgáltatás és a modell törléséről.

Következő lépések