Python と revoscalepy を使用して、SQL Server でリモートで実行されるモデルを作成します

適用対象: SQL Server 2017 (14.x) 以降

Microsoft の revoscalepy Python ライブラリでは、データの探索、視覚化、変換、解析のためのデータ サイエンス アルゴリズムを提供しています。 このライブラリは、SQL Server での Python による統合シナリオにおいて戦略的に重要です。 マルチコア サーバーでは、revoscalepy 関数を並列で実行できます。 中央サーバーとクライアント ワークステーションを使用した分散アーキテクチャ (それぞれの物理コンピューターが同じ revoscalepy ライブラリを保持) では、ローカルで Python コードを記述できますが、実行はデータが存在するリモートの SQL Server インスタンスに移って行います。

revoscalepy については、次の Microsoft 製品およびディストリビューションを参照してください。

この演習では、rx_lin_mod で線形回帰モデルを作成する方法を学びます。これは、コンピューティング コンテキストを入力として受け入れる revoscalepy のアルゴリズムの1つです。 この演習で実行するコードは、リモート コンピューティング コンテキストを有効にする revoscalepy 関数によって、コードの実行をローカルからリモート コンピューティング環境にシフトします。

このチュートリアルを完了すると、次のことを行うことができます。

  • revoscalepy を使用して線形モデルを作成する
  • ローカルからリモート コンピューティング コンテキストへ操作をシフトする

前提条件

この演習で使用されるサンプル データは、フライトデータ データベースです。

この記事のサンプルコードを実行するには IDE が必要です。また、IDE は Python 実行可能ファイルにリンクされている必要があります。

コンピューティング コンテキスト シフトを実践するには、ローカル ワークステーションと、Machine Learning Services と Python が有効になっている SQL Server データベース エンジン インスタンスが必要です。

ヒント

コンピューターが 2 台ない場合は、関連するアプリケーションをインストールすることによって、1 台の物理コンピューター上でリモート コンピューティング コンテキストをシミュレートできます。 まず、SQL Server Machine Learning Services のインストールを "リモート" インスタンスとして操作します。 次に、の Python クライアント ライブラリのインストールをクライアントとして操作します。 同じマシン上に同じ Python ディストリビューションと Microsoft Python ライブラリのコピーを2つ作成します。 この演習を正常に完了するには、ファイル パスと使用している Python.exe のコピーを記録しておく必要があります。

リモート コンピューティング コンテキストと revoscalepy

このサンプルでは、リモート コンピューティング コンテキストで Python モデルを作成するプロセスを示します。これにより、クライアントから作業を行うことができますが、SQL Server や Spark など、操作が実際に実行されるリモート環境を選択できます。 リモート コンピューティング コンテキストの目的は、データが存在する場所で計算させることです。

SQL Server で Python コードを実行するには、revoscalepy パッケージが必要です。 これは、Microsoft が提供する特殊な Python パッケージで、R 言語用の RevoScaleR パッケージと似ています。 revoscalepy パッケージは、コンピューティング コンテキストの作成をサポートし、ローカル ワークステーションとリモート サーバーの間でデータとモデルを渡すためのインフラストラクチャを提供します。 データベース内コードの実行をサポートする revoscalepy 関数は、RxInSqlServer です。

このレッスンでは、SQL Server のデータを使用して、非常に大規模なデータセットに対する回帰をサポートする revoscalepy の関数である rx_lin_mod で線形モデルをトレーニングします。

このレッスンでは、設定方法の基本を説明し、その後 Python での SQL Server コンピューティング コンテキストの使用についても説明します。

サンプル コードを実行します。

データベースを準備し、トレーニング用のデータをテーブルに格納したら、Python 開発環境を開き、サンプル コードを実行します。

このコードでは、次の手順を実行します。

  1. 必要なライブラリと関数をインポートします。
  2. SQL Server への接続を作成します。 データを操作するためのデータソース オブジェクトを作成します。
  3. ロジスティック回帰アルゴリズムで使用できるように変換を使用してデータを変更します。
  4. rx_lin_mod を呼び出し、モデルに適合する数式を定義します。
  5. 元のデータに基づいて一連の予測を生成します。
  6. 予測値に基づいて概要を作成します。

すべての操作は、コンピューティング コンテキストとして SQL Server のインスタンスを使用して実行されます。

Note

このサンプルをコマンド ラインから実行する方法については、ビデオ「SQL Server 2017 Advanced Analytics with Python」(SQL Server 2017: Python を使用した高度な分析) をご覧ください。

サンプル コード

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)

データ ソースの定義とコンピューティング コンテキストの定義

データ ソースは、コンピューティング コンテキストとは異なります。 データ ソースは、コードで使用されるデータを定義します。 コンピューティング コンテキストは、コードが実行される場所を定義します。 ただし、同じ情報の一部を使用します。

  • sql_querysql_connection_string などの Python 変数は、データのソースと定義します。

    これらの変数を RxSqlServerData コンストラクターに渡して、data_sourceという名前のデータソース オブジェクトを実装します。

  • RxInSqlServer コンストラクターを使用してコンピューティング コンテキスト オブジェクトを作成します。 結果として得られるコンピューティング コンテキスト オブジェクトには、sql_ccという名前が付けられます。

    この例では、データ ソースで使用した同じ接続文字列を再利用します。これは、コンピューティング コンテキストとして使用するのと同じ SQL Server インスタンスにデータがあることを前提としています。

    ただし、データ ソースとコンピューティング コンテキストは、異なるサーバー上に存在している可能性があります。

コンピューティング コンテキストの変更

コンピューティング コンテキストを定義したら、アクティブなコンピューティング コンテキストを設定する必要があります。

既定では、ほとんどの操作はローカルで実行されます。つまり、別のコンピューティング コンテキストを指定しない場合、データはデータ ソースからフェッチされ、コードは現在の Python 環境で実行されます。

アクティブなコンピューティング コンテキストを設定するには、次の 2 つの方法があります。

  • メソッドまたは関数の引数として
  • rx_set_computecontextを呼び出す

コンピューティング コンテキストをメソッドまたは関数の引数として設定する

この例では、個々の rx 関数の引数を使用して、コンピューティング コンテキストを設定します。

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

このコンピューティング コンテキストは rxsummary の呼び出しで再利用されます。

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

Rx_set_compute_context を使用してコンピューティング コンテキストを明示的に設定する

関数 rx_set_compute_context を使用すると、既に定義されているコンピューティング コンテキスト間で切り替えることができます。

アクティブなコンピューティング コンテキストを設定した後は、変更するまでアクティブ状態のままになります。

並列処理とストリーミングの使用

コンピューティング コンテキストを定義する場合、コンピューティング コンテキストによるデータの処理方法を制御するパラメーターを設定することもできます。 これらのパラメーターは、データ ソースの種類によって異なります。

SQL Server のコンピューティング コンテキストでは、バッチ サイズを設定したり、実行中のタスクで使用する並列処理の次数に関するヒントを指定したりすることができます。

  • このサンプルは 4 つのプロセッサを搭載したコンピューター上で実行されているため、num_tasks パラメーターを 4 に設定して、リソースを最大限に活用できるようにします。
  • この値を0に設定した場合、SQL Server は既定値を使用します。これは、サーバーの現在の MAXDOP 設定により、できるだけ多くのタスクを並列処理します。 ただし、割り当てられる可能性のあるタスクの正確な数は、サーバーの設定や実行されている他のジョブなど、様々な要因によって異なります。

次のステップ

これらの追加の Python サンプルとチュートリアルでは、より複雑なデータ ソースを使用したエンドツーエンドのシナリオだけでなく、リモート コンピューティング コンテキストの使用についても紹介します。