[PYTHON] [Azure] Erstellen, Bereitstellen und erneutes Lernen eines Modells [ML Studio classic]

Ich kenne das offizielle Dokument nicht.

Ich habe mehrere Male Modelle mit ML Studio classic erstellt und bereitgestellt. Dieses Mal las ich das offizielle Dokument, weil ich es neu lernen wollte, aber ich verstand es nicht gut und ging hin und her. Ich habe es geschafft, also werde ich einen Artikel schreiben, damit ich ihn nicht vergesse. Da ich für diejenigen schreibe, die es zum ersten Mal verwenden, habe ich die Details weggelassen. Bitte verzeihen Sie mir.

Rauer Fluss

  1. Machen Sie ein Lernexperiment
  2. Machen Sie ein Vorhersageexperiment
  3. Setzen Sie Vorhersageexperimente ein
  4. Stellen Sie Re-Learning bereit
  5. Neu lernen
  6. Reflektieren Sie das Ergebnis des erneuten Lernens im Vorhersageexperiment
  7. Testen Sie, ob es reflektiert wird

ist.

Betriebsumgebung

Da Python unterwegs verwendet wird, schreiben Sie die Umgebung und die importierte.

Name
urllib
azure-storage-blob

Über die zu verwendenden Daten

Beginnen wir mit den diesmal verwendeten Daten. Ich möchte wissen, ob ich mich weiterbilden konnte, daher verwende ich Daten, die zu eintönig sind. Schreiben Sie die Trainingsdaten, Testdaten und Umgestaltungsdaten unten.

train1.csv


id,target
1,1
2,1
3,1
4,1
5,1

remodel0.csv


id,target
1,0
2,0
3,0
4,0
5,0

Erwarten Sie im erstellten Modell ein Modell, das immer 1 zurückgibt, unabhängig davon, wie viele Sie eingeben. Selbst wenn Sie die Testdaten eingeben, sollte alles als 1 zurückgegeben werden. Erwarten Sie, dass 0 zurückgegeben wird, indem Sie erfahren, dass alles 0 ist.

Es ist überhaupt kein gutes Modell, daher werde ich es nur zum Testen verwenden.

Erstellen Sie ein Lernexperiment

Nun erstellen wir ein Modell. Nachdem Sie sich bei ML Studio angemeldet haben, wählen Sie "EXPERIMENTS" und klicken Sie unten auf dem Bildschirm auf "NEW". Web services - Microsoft Azure Machine Learning Studio (classic) - Google Chrome 2020_01_21 17_12_54.png

Klicken Sie dann auf "Leeres Experiment". Jetzt können Sie ein Vorhersagemodell erstellen.

Lassen Sie uns tatsächlich ein Modell machen. Suchen Sie einfach in diesem Suchfenster nach dem gewünschten Block und fügen Sie ihn hinzu. キャプチャ.PNG

Diesmal handelt es sich (vorerst) um einen binären Begriff. Platzieren Sie also das Feld, das durch Suchen mit zwei Klassen erstellt wurde. Dieses Mal habe ich "Two-Class Boosted Decision Tree" verwendet. Suchen Sie auf die gleiche Weise nach anderen Blöcken und ordnen Sie sie wie im Bild gezeigt an. キャプチャ.PNG

Als nächstes setzen Sie jeden Block. Klicken Sie auf den Block Einstellungselemente werden auf der rechten Seite angezeigt. Parameter können im Algorithmusblock eingestellt werden. Dieses Mal können Sie es so lassen, wie es ist.

Als nächstes wird Daten importiert. Geben Sie hier die Daten an, die zum Lernen verwendet werden sollen. Beschreiben Sie Ihren Blob-Benutzernamen, Ihren Schlüssel und Ihren Dateipfad. Das Format dieser Daten ist csv, aber da die Datei einen Header hat, überprüfen wir "Datei hat Headerzeile".

Endlich das Zugmodell. Hier geben wir den Spaltennamen des zu lernenden Ziels an. Dieses Mal möchte ich "Ziel" lernen, also fülle ich "Ziel" mit "Spaltenauswahl starten" aus. キャプチャ.PNG

Wenn Sie fertig sind, verbinden wir die Blöcke mit einer Linie. Bitte beachten Sie, dass das Zugmodell nicht durch Linien auf der linken und rechten Seite verbunden werden kann. Wenn Sie es wie folgt anordnen können, klicken Sie unten auf dem Bildschirm auf "RUN", um es auszuführen. キャプチャ.PNG

Wenn alle Kontrollkästchen aktiviert sind, sind Sie fertig. Wenn Sie in der Mitte anhalten, muss etwas nicht stimmen. Der Name der Blob-Datei kann unterschiedlich sein (Erfahrungsgeschichte)

キャプチャ.PNG

Machen Sie ein Vorhersageexperiment. Lassen Sie uns nun etwas machen, das eine Antwort zurückgibt, wenn Sie Daten mit dem zuvor erstellten Modell werfen. Klicken Sie unter "SET UP WEB SERVICE" neben "RUN" auf "Predictiv Web Service". Dann bewegt sich die Box und sieht aus wie die folgende. Bringen Sie "Daten exportieren" aus dem Suchfenster und schreiben Sie den Benutzernamen des Blobs usw. Das Testergebnis wird in den hier geschriebenen Pfad ausgegeben.

キャプチャ.PNG

Lass uns nochmal laufen. キャプチャ.PNG

Wenn es wie zuvor überprüft wird, ist es abgeschlossen. Klicken Sie auf "WEBSERVICE VERWENDEN", wenn Sie fertig sind. キャプチャ.PNG Nach einer Weile ändert sich der Bildschirm und API-SCHLÜSSEL usw. werden angezeigt. Wenn Sie auf "ANFRAGE / ANTWORT" klicken, wird die API angezeigt, die Sie voraussichtlich verwenden werden. Auf dieser Seite können Sie auch einen einfachen Test durchführen. Lassen Sie uns tatsächlich auf die blaue TEST-Schaltfläche klicken und 3 in id und 1 in target eingeben, um zu experimentieren. Nach einer Weile wird das Ergebnis am Ende der Seite zurückgegeben. Der Spaltenname, der Spaltentyp und der Wert werden in einer Liste zurückgegeben.

return


Result: {"Results":{"output1":{"type":"table","value":{"ColumnNames":["id","target","Scored Labels","Scored Probabilities"],"ColumnTypes":["Int32","Int32","Int32","Double"],"Values":[["3","1","1","0.142857149243355"]]}}}}

Da "Scored Labels" das Ergebnis ist, wird in diesem Fall 1 zurückgegeben, was wie erwartet ist.

Ich werde Re-Learning einsetzen

Klicken Sie nun auf "Neueste anzeigen", um zum vorherigen Bildschirm zurückzukehren. キャプチャ.PNG

Gehen Sie dann zur Registerkarte "Trainingsexperiment" und fügen Sie "Web-Service-Eingabe" und "Web-Service-Ausgabe" zu "RUN" hinzu. キャプチャ.PNG

Klicken Sie dann unten unter "WEB-SERVICE EINRICHTEN" auf "Webdienst bereitstellen". キャプチャ.PNG

Die Bereitstellung ist jetzt abgeschlossen. Sie benötigen den API-Schlüssel und die API-URL später. Der API-Schlüssel wird auf dem Bildschirm angezeigt. Die URL finden Sie, indem Sie auf "BATCH EXECTION" klicken. Die URL der zu verwendenden API steht vor "? Api-version ...", dh die URL endet mit "job". Ich bin hier gestolpert. キャプチャ.PNG

Lass uns neu lernen!

Lass uns neu lernen. Das Umlernen selbst wurde mit Python durchgeführt. C # ist ebenfalls ein Beispiel, funktioniert jedoch möglicherweise nur, wenn Sie es an einigen Stellen ändern. (Das war bei Python3.7 der Fall.)

Erstens das Programm, das Sie tatsächlich verwenden.

retrain.py


# python 3.7 also ändere urllib2
import urllib
import urllib.request
import json
import time
from azure.storage.blob import *

def printHttpError(httpError):
    print(f"The request failed with status code: {str(httpError.code)}")
    print(json.loads(httpError.read()))
    return


def processResults(result):
    results = result["Results"]
    for outputName in results:
        result_blob_location = results[outputName]
        sas_token = result_blob_location["SasBlobToken"]
        base_url = result_blob_location["BaseLocation"]
        relative_url = result_blob_location["RelativeLocation"]
        print(f"The results for {outputName} are available at the following Azure Storage location:")
        print(f"BaseLocation: {base_url}")
        print(f"RelativeLocation: {relative_url}")
        print(f"SasBlobToken: {sas_token}")
    return



def uploadFileToBlob(input_file, input_blob_name, storage_container_name, storage_account_name, storage_account_key):
    #Es scheint, dass es keinen BlobService gibt, also ändern Sie ihn
    blob_service = BlockBlobService(account_name=storage_account_name, account_key=storage_account_key)
    print("Uploading the input to blob storage...")
    blob_service.create_blob_from_path(storage_container_name, input_blob_name, input_file)

def invokeBatchExecutionService():

    storage_account_name = "Blob-Benutzername"
    storage_account_key = "Blob-Taste"
    storage_container_name = "Name des Blob-Containers"
    connection_string = f"DefaultEndpointsProtocol=https;AccountName={storage_account_name};AccountKey={storage_account_key}"
    api_key = "API-Schlüssel neu lernen"
    url = "API-URL"



    uploadFileToBlob("Dateipfad zum Hochladen",
                     "Dateipfad nach dem Hochladen", 
                     storage_container_name, storage_account_name, storage_account_key)

    payload =  {
        "Inputs": {
            "input1": { 
                "ConnectionString": connection_string, 
                "RelativeLocation": f"/{storage_container_name}/Dateipfad des zu überarbeitenden Blobs" 
            },
        },
        "Outputs": {
            "output1": { 
                "ConnectionString": connection_string, 
                "RelativeLocation": f"/{storage_container_name}/Blob-Dateipfad zum Umgestalten der Ergebnisse.ilearner" 
            },
        },
        "GlobalParameters": {
        }
    }

    body = str.encode(json.dumps(payload))
    headers = { "Content-Type":"application/json", "Authorization":("Bearer " + api_key)}
    print("Submitting the job...")

    req = urllib.request.Request(url + "?api-version=2.0", body, headers)
    response = urllib.request.urlopen(req)

    result = response.read()
    job_id = result[1:-1] 
    # job_Ich war wütend, weil der Ausweis nicht str war, also habe ich ihn konvertiert
    job_id=job_id.decode('utf-8')
    print(f"Job ID: {job_id}")

    print("Starting the job...")    
    headers = {"Authorization":("Bearer " + api_key)}
    req = urllib.request.Request(f"{url}/{job_id}/start?api-version=2.0", headers=headers, method="POST")
    response = urllib.request.urlopen(req)

    url2 = url + "/" + job_id + "?api-version=2.0"

    while True:
        print("Checking the job status...")
        req = urllib.request.Request(url2, headers = { "Authorization":("Bearer " + api_key) })

        response = urllib.request.urlopen(req)

        result = json.loads(response.read())
        status = result["StatusCode"]
        if (status == 0 or status == "NotStarted"):
            print(f"Job: {job_id} not yet started...")
        elif (status == 1 or status == "Running"):
            print(f"Job: {job_id} running...")
        elif (status == 2 or status == "Failed"):
            print(f"Job: {job_id} failed!")
            print("Error details: " + result["Details"])
            break
        elif (status == 3 or status == "Cancelled"):
            print(f"Job: {job_id} cancelled!")
            break
        elif (status == 4 or status == "Finished"):
            print(f"Job: {job_id} finished!")
        
            processResults(result)
            break
        time.sleep(1) # wait one second
    return

invokeBatchExecutionService()

Es ist fast das gleiche wie das Beispiel, aber einige Änderungen wurden vorgenommen. (Ich habe es in den Kommentaren geschrieben.) Bitte schreiben Sie die URL, den Schlüssel, den Pfad usw. entsprechend der jeweiligen Umgebung neu. Bereiten Sie dann die Daten vor und führen Sie sie aus.

console


>python remodel.py

Uploading the input to blob storage...
Submitting the job...
Job ID: ID
Starting the job...
Checking the job status...
JobID not yet started...
Checking the job status...
JobID running...
Checking the job status...
JobID running...
Checking the job status...
JobID running...
Checking the job status...
JobID running...
Checking the job status...
JobID running...
Checking the job status...
JobID running...
Checking the job status...
JobID running...
Checking the job status...
JobID finished!
The results for output1 are available at the following Azure Storage location:
BaseLocation: URL
RelativeLocation: PATH
SasBlobToken: KEY

Sie sollten das Ergebnis wie oben erhalten. Die folgenden drei werden später verwendet.

Reflexion des Umlernens

Nun, ich habe den Umbau durchgeführt, aber er wurde noch nicht reflektiert. Öffnen Sie in diesem Bildschirm "New Web Services Experience". Wenn zu diesem Zeitpunkt "[Predictive Exp.]" Nach dem Modellnamen oben auf der Seite nicht hinzugefügt wird, klicken Sie auf "Experiment erstellt am ... [Predictive Exp.]", Um es zu verschieben.

キャプチャ.PNG

キャプチャ.PNG

Ich denke, es ist in Ordnung, das vorhandene zu überschreiben, aber die meiste Zeit werde ich es behalten. Erstellen Sie also einen neuen Endpunkt. Drücken Sie die linke Taste auf diesem Bildschirm ... キャプチャ.PNG (Ich fürchte, die Pfeile sind unordentlich.) Klicken Sie auf "+ NEU" und speichern Sie den Endpunkt unter dem Namen, den Sie verwenden möchten. キャプチャ.PNG

Wenn Sie auf den erstellten Endpunktnamen klicken, gelangen Sie zu einem Bildschirm wie dem oben genannten. Öffnen Sie daher die Registerkarte "Verbrauchen". キャプチャ.PNG

Wenn Sie es öffnen, werden verschiedene KEYs und URLs angezeigt. Dieses Mal werden wir "Primärschlüssel" und "Patch" verwenden. ``

Verwenden Sie sie, um den folgenden Code auszuführen.

update.py


import urllib
import urllib.request
import json 

data =  {
            "Resources": [
                {
                    "Name": "Modellname",
                    "Location": 
			            {
                            "BaseLocation": "Ergebnis URL",
                            "RelativeLocation": "Ergebnispfad",
                            "SasBlobToken": "Ergebnis SCHLÜSSEL"
			            }
                }
            ]
        }

body = str.encode(json.dumps(data))

url = "Patch-Wert"
api_key = "Primärschlüsselwert" # Replace this with the API key for the web service
headers = {'Content-Type':'application/json', 'Authorization':('Bearer '+ api_key)}

req = urllib.request.Request(url, body, headers)
req.get_method = lambda: 'PATCH'
response = urllib.request.urlopen(req)
result = response.read()
print(result) 

Es ist so. Wenn Sie die API-Hilfe unter Patch auf der vorherigen Seite öffnen, gibt es ein Beispiel. Ich denke, Sie sollten es so schreiben, wie es ist. Lass es uns laufen.

b'' wird zurückgegeben. Das war's? Aber das scheint in Ordnung zu sein. Stellen Sie dies schließlich bereit. Das Bereitstellungsverfahren ist

Hast du neu gelernt?

Lassen Sie uns testen, indem Sie die Registerkarte "Test" oben auf der Seite öffnen. Möglicherweise müssen Sie neu laden. id = 3, target = 1. キャプチャ.PNG Es scheint, dass es richtig 0 ist. War gut…

Zusammenfassung

Ich habe es geschafft, das umgeschulte Modell bereitzustellen. Verringert sich die Genauigkeit des von Ihnen verwendeten Modells? Wenn Sie dies glauben, lernen Sie das Modell neu und verwenden Sie es weiter!

Recommended Posts

[Azure] Erstellen, Bereitstellen und erneutes Lernen eines Modells [ML Studio classic]
Erstellen und Bereitstellen von Django-Apps (PTVS) mithilfe des Azure Table-Speichers
[Ubuntu] Installieren Sie Android Studio und erstellen Sie eine Verknüpfung
[Azure] Bereitstellen eines lokal erstellten ML-Modells in der Cloud
Erstellen Sie mit PyQt5 und PyQtGraph einen 3D-Modell-Viewer
Erstellen Sie ein Bereitstellungsskript mit Stoff und Küche und verwenden Sie es erneut
Erstellen Sie ein Modell für Ihren Django-Zeitplan
Erstellen und Bereitstellen von Flask-Apps mit PTVS
Implementieren Sie ein Modell mit Status und Verhalten
Erstellen Sie eine REST-API mit dem in Lobe und TensorFlow Serving erlernten Modell.