Verwenden von Python mit revoscalepy, um ein Modell zu erstellen, das remote auf SQL Server ausgeführt wird.

Gilt für: SQL Server 2017 (14.x) und höher

Die revoscalepy-Python-Bibliothek von Microsoft stellt Data Science-Algorithmen für das Durchsuchen von Daten, Visualisierung, Transformationen und Analysen bereit. Diese Bibliothek hat in Python-Integrationsszenarien in SQL Server strategische Bedeutung. Auf einem Multi-Core-Server können revoscalepy-Funktionen parallel ausgeführt werden. In einer verteilten Architektur mit einem zentralen Server und Clientarbeitsstationen (separate physische Computer, die alle über dieselbe revoscalepy-Bibliothek verfügen), können Sie Python-Code schreiben, der lokal startet, aber dann die Ausführung auf eine Remote-SQL Server-Instanz verlagert, auf der sich die Daten befinden.

Sie finden revoscalepy in den folgenden Microsoft-Produkten und -Distributionen:

Diese Übung veranschaulicht, wie ein lineares Regressionsmodell erstellt wird, das auf rx_lin_mod basiert, einem der Algorithmen in revoscalepy, der Computekontext als Eingabe akzeptiert. Der Code, den Sie in dieser Übung ausführen, verschiebt die Codeausführung von einer lokalen in eine Remotecomputingumgebung, die durch revoscalepy-Funktionen aktiviert wird, die einen Remotecomputekontext aktivieren.

In diesem Tutorial lernen Sie Folgendes:

  • Verwenden von revoscalepy zum Erstellen eines linearen Modells
  • Verschieben von Vorgängen von lokalem zu Remotecomputekontext

Voraussetzungen

Die Beispieldaten werden in dieser Übung der flightdata-Datenbank entnommen.

Sie benötigen eine IDE, um den Beispielcode in diesem Artikel auszuführen, und die IDE muss mit der ausführbaren Python-Datei verknüpft werden.

Um eine Verschiebung des Computekontexts zu üben, benötigen Sie eine lokale Arbeitsstation und eine SQL Server-Datenbank-Engine-Instanz, auf denen Machine Learning Services und Python aktiviert sind.

Tipp

Wenn Sie nicht über zwei Computer verfügen, können Sie einen Remotecomputekontext auf einem physischen Computer simulieren, indem Sie relevante Anwendungen installieren. Zuerst fungiert eine Installation von SQL Server Machine Learning Services als „Remoteinstanz“. Zweitens fungiert eine Installation der Python-Clientbibliotheken als Client. Auf demselben Computer verfügen Sie über zwei Kopien derselben Python-Distribution und Microsoft Python-Bibliotheken. Sie müssen Dateipfade nachverfolgen, und welche Kopie von „Python.exe“ Sie zum erfolgreichen Abschluss der Übung verwenden.

Remotecomputekontexte und revoscalepy

Dieses Beispiel veranschaulicht den Prozess der Erstellung eines Python-Modells in einem Remotecomputekontext, in dem Sie von einem Client aus arbeiten, aber eine Remoteumgebung wie SQL Server oder Spark auswählen, in der die Vorgänge tatsächlich ausgeführt werden. Das Ziel des Remotecomputekontexts besteht darin, die Berechnung an den Speicherort der Daten zu bringen.

Zum Ausführen von Python-Code in SQL Server ist das revoscalepy-Paket erforderlich. Dabei handelt es sich um ein von Microsoft bereitgestelltes spezielles Python-Paket, das dem RevoScaleR-Paket für die Sprache R ähnelt. Das revoscalepy-Paket unterstützt die Erstellung von Computekontexten und stellt die Infrastruktur zur Übergabe von Daten und Modellen zwischen einer lokalen Arbeitsstation und einem Remoteserver bereit. Die revoscalepy-Funktion, die die datenbankinterne Codeausführung unterstützt, ist RxInSqlServer.

In dieser Lektion verwenden Sie Daten in SQL Server, um ein lineares Modell basierend auf rx_lin_mod zu trainieren, einer Funktion in revoscalepy, die die Regression über sehr große Datasets unterstützt.

Diese Lektion veranschaulicht auch die Grundlagen der Einrichtung und anschließenden Verwendung eines SQL Server-Computekontexts in Python.

Ausführen des Beispiels

Nachdem Sie die Datenbank vorbereitet und die Daten für das Training in einer Tabelle gespeichert haben, öffnen Sie eine Python-Entwicklungsumgebung, und führen Sie das Codebeispiel aus.

Der Code führt die folgenden Schritte aus:

  1. Importieren der erforderlichen Bibliotheken und Funktionen.
  2. Erstellen einer Verbindung mit SQL Server. Erstellen von Datenquellen-Objekten zum Arbeiten mit den Daten.
  3. Ändern der Daten mithilfe von Transformationen, sodass sie vom logistischen Regressionsalgorithmus verwendet werden können.
  4. Aufrufen von rx_lin_mod und Definieren der Formel zum Anpassen des Modells.
  5. Generieren eines Satzes von Vorhersagen basierend auf den ursprünglichen Daten.
  6. Erstellen einer Zusammenfassung basierend auf den vorhergesagten Werten.

Alle Vorgänge werden mithilfe einer Instanz von SQL Server als Computekontext ausgeführt.

Hinweis

Ein Beispiel für die Ausführung dieses Beispiels über die Befehlszeile finden Sie in diesem Video: Erweiterte Analysen in SQL Server 2017 mit Python.

Beispielcode

from revoscalepy import RxComputeContext, RxInSqlServer, RxSqlServerData
from revoscalepy import rx_lin_mod, rx_predict, rx_summary
from revoscalepy import RxOptions, rx_import

import os

def test_linmod_sql():
    sql_server = os.getenv('PYTEST_SQL_SERVER', '.')
    
    sql_connection_string = 'Driver=SQL Server;Server=' + sqlServer + ';Database=sqlpy;Trusted_Connection=True;'
    print("connectionString={0!s}".format(sql_connection_string))

    data_source = RxSqlServerData(
        sql_query = "select top 10 * from airlinedemosmall",
        connection_string = sql_connection_string,

        column_info = {
            "ArrDelay" : { "type" : "integer" },
            "DayOfWeek" : {
                "type" : "factor",
                "levels" : [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ]
            }
        })

    sql_compute_context = RxInSqlServer(
        connection_string = sql_connection_string,
        num_tasks = 4,
        auto_cleanup = False
        )

    #
    # Run linmod locally
    #
    linmod_local = rx_lin_mod("ArrDelay ~ DayOfWeek", data = data_source)
    #
    # Run linmod remotely
    #
    linmod = rx_lin_mod("ArrDelay ~ DayOfWeek", data = data_source, compute_context = sql_compute_context)

    # Predict results
    # 
    predict = rx_predict(linmod, data = rx_import(input_data = data_source))
    summary = rx_summary("ArrDelay ~ DayOfWeek", data = data_source, compute_context = sql_compute_context)

Definieren einer Datenquelle im Vergleich zum Definieren eines Computekontexts

Eine Datenquelle unterscheidet sich von einem Computekontext. Die Datenquelle definiert die Daten, die in Ihrem Code verwendet werden. Der Computekontext definiert, wo der Code ausgeführt wird. Dabei werden jedoch einige identische Informationen verwendet:

  • Python-Variablen wie sql_query und sql_connection_string definieren die Quelle der Daten.

    Übergeben Sie diese Variablen an den RxSqlServerData-Konstruktor, um das Datenquellenobjekt mit dem Namen data_source zu implementieren.

  • Sie erstellen ein Computekontextobjekt mithilfe des RxInSqlServer-Konstruktors. Das resultierende Computekontextobjekt heißt sql_cc.

    In diesem Beispiel wird die Verbindungszeichenfolge wiederverwendet, die Sie in der Datenquelle verwendet haben, wobei angenommen wird, dass sich die Daten auf derselben SQL Server-Instanz befinden, die Sie als Computekontext verwenden.

    Die Datenquelle und der Computekontext könnten sich jedoch auf unterschiedlichen Servern befinden.

Ändern von Computekontexten

Nachdem Sie einen Computekontext definiert haben, müssen Sie den aktiven Computekontext festlegen.

Standardmäßig werden die meisten Vorgänge lokal ausgeführt. Dies bedeutet, dass die Daten aus der Datenquelle abgerufen werden und der Code in Ihrer aktuellen Python-Umgebung ausgeführt wird, wenn Sie keinen anderen Computekontext angeben.

Es gibt zwei Möglichkeiten, um den aktiven Computekontext festzulegen:

  • Als Argument einer Methode oder Funktion
  • Durch Aufrufen von rx_set_computecontext

Festlegen des Computekontexts als Argument einer Methode oder Funktion

In diesem Beispiel legen Sie den Computekontext fest, indem Sie ein Argument der individuellen rx-Funktion verwenden.

linmod = rx_lin_mod_ex("ArrDelay ~ DayOfWeek", data = data, compute_context = sql_compute_context)

Dieser Computekontext wird im Aufruf von rxsummary wiederverwendet:

summary = rx_summary("ArrDelay ~ DayOfWeek", data = data_source, compute_context = sql_compute_context)

Explizites Festlegen eines Computekontexts mit „rx_set_compute_context“

Die Funktion rx_set_compute_context ermöglicht Ihnen das Umschalten zwischen bereits definierten Computekontexten.

Nachdem Sie den aktiven Computekontext angegeben haben, bleibt er aktiv, bis Sie ihn ändern.

Verwenden von paralleler Verarbeitung und Streaming

Wenn Sie den Computekontext definieren, können Sie auch Parameter festlegen, mit denen gesteuert wird, wie die Daten vom Computekontext verarbeitet werden. Diese Parameter unterscheiden sich je nach Datenquellentyp.

Für SQL Server-Computekontexte können Sie die Batchgröße festlegen oder Hinweise zum Grad der Parallelität angeben, die für die Ausführung von Tasks verwendet werden soll.

  • Das Beispiel wurde auf einem Computer mit vier Prozessoren ausgeführt, sodass der num_tasks-Parameter auf 4 festgelegt ist, um die maximale Verwendung von Ressourcen zu ermöglichen.
  • Wenn Sie diesen Wert auf 0 festlegen, folgt SQL Server dem Standard, d. h., dass unter den aktuellen MAXDOP-Einstellungen für den Server so viele Aufgaben wie möglich parallel ausgeführt werden. Die genaue Anzahl von Aufgaben, die zugeordnet werden könnten, hängt jedoch von vielen anderen Faktoren ab, z. B. von Servereinstellungen und anderen Aufträgen, die ausgeführt werden.

Nächste Schritte

Diese zusätzlichen Python-Beispiele und Tutorials veranschaulichen End-to-End-Szenarien, in denen komplexere Datenquellen verwendet werden, sowie die Verwendung von Remotecomputekontexten.