SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Server 2017 の ML Services についてまとめてみる

leave a comment

SQL Server 2017 では、Machine Learning Services (ML Services) という新しいサービスが追加され、この機能についても大きな内容としてアナウンスがされています。
Getting started with machine learning in SQL Server

ML Services は、SQL Server 2016 では、R Services と呼ばれていたものであり、SQL Server 2017 では対応言語として、Python が追加されたことにより、名称が ML Services と変更になりました。
ドキュメント上、R Services と書かれているものは、SQL Server 2016 の時の情報になっていることが多いかと思います。

この機能は、Advanced Analytics (AA : 高度な解析基盤) というようなカテゴリで紹介されることもあり、高度な解析を実施するための機能として提供が行われているものになります。

先日、ML Services についてディスカッションする機会があったのですが、「自分の中できちんと整理できていないな」と感じたので、一度まとめてみたいと思います。

■ML Services / ML Server / Microsoft R Open を整理してみる


Advanced Analytics の実行基盤としては、次のようなものがあり、この時点で理解が難解になっている気がしないでもないです…。

  • R Server / R Client を使用した実行基盤
    • Microsoft R Open
    • Microsoft R Server
  • SQL Server に統合されている実行基盤
    • SQL Server 2017 Machine Learning Services (データベース内)
      (SQL Server 2016 R Services)
    • SQL Server 2017 Machine Learning Server (スタンドアロン)
      (SQL Server 2016 R Server)

 

公式ドキュメントの体系としては、次のようになっています。

SQL Server に統合されている話なのか、R Server としての話のどちらを指しているドキュメントなのかがわからなくなった場合は、URL を確認するとよさそうですね。

URL が r-server となっているものは、R Server / R Open のドキュメントとなっており、advanced-analytics となっているものが、SQL Server に統合されたものを指していますので。

 

機能の母体としては、「Revolution Analytics 社」の「Revolution R」(RR) という製品がもとになっています。
R については、The R Project for Statistical Computing で公開されている「オープンソース R」ではなく、この R を拡張した 「Revolution R Open」がもとになったものが利用されています。
(Revolution R Open は、Microsoft R Open となり、microsoft-r-open  で公開されています)

なお、Revolution Analytics 社は、2015 年 1 月に Microsoft に買収が行われ、Revolution Analytics が提供していた R の製品については現在は、Microsoft から提供されています。
Microsoft to acquire Revolution Analytics to help customers find big data value with advanced statistical analysis

 

Revolution R の詳細については、Microsoft R Server(旧 Revolution R) を見るとよいかと。
次の図のように製品の変更がどのようになったのかが記載されています。

image

 

 

Revolution R の実行環境を SQL Server のデータベースエンジンに統合したものが SQL Server 2016 R Services となっており、これが、SQL Server 2017 では、SQL Server 2017 ML Services となっています。

SQL Server には統合しておらず、単体で使用できる実行環境が Microsoft R Open / Microsoft R Server となっており、Revolution Analytics 社が提供していた製品については、現在は、このブランド名で提供が行われていることになります。

R Open / R Server については、Microsoft R Application Network (MRAN) で情報が公開されており、R Open のダウンロードについてはこちらから行うことができます。

2017/8 末時点では、Microsoft R Open / Microsoft R Server の今後のロードマップについてはアナウンスはされていないかと。

 

各製品の特徴を整理してみると次のようになるのではないでしょうか。

  • Microsoft R Open
    • R の実行環境
      • 2017/8 時点では、Python の実行環境は含まれていない
    • Revolution R Open を Microsoft R Server のブランドで提供を行っているもの
    • R 3.4.0 を拡張した R の実行環境 (Microsoft が提供している R の拡張ディストリビューション)
    • オープンソースであり、microsoft-r-open でソースコードが公開されている
    • Windows / Linux 上で動作
    • クライアント環境でのローカル実行を想定したもの (スタンドアロンクライアント)

 

  • Microsoft R Server
    • R の実行環境
      • 2017/8 時点では、Python の実行環境は含まれていない
    • Revolution R Enterprise (RRE) を Microsoft R Server のブランドで提供を行っている商用ソフトウェア
      • Microsoft R Open for Microsoft R Server 2016 との違いは正直よくわからない…
        • R Open ベースの Server か、RRE ベースの Server かの違いだとは思うのです
        • あと、Microsoft R Server を単体で購入する方法もよくわからないです…

    • Microsoft R Server といった場合は、Linux 環境向けの製品となる
    • リモートアクセスや、複数のノード間でワークロードを分散させての実行を想定したもの

 

  • SQL Server 2017 Machine Learning Services (データベース内)
    • SQL Server のデータベースエンジンに統合された、R / Python の実行環境の利用
      • SQL Server Launchpad サービスが追加され、Transact SQL をインタフェースとして、R / Python スクリプトを実行することができる
        • sp_execute_external_script (Transact-SQL)
        • 上記のストアドプロシージャをアプリケーションから直接コールするのではなく、ラップしたユーザーストアドプロシージャから呼び出すのが、一般的とかんがえられる
          • ストアドプロシージャの実行制限による利用者の制限
          • ENCRYPTION を使用してストアドプロシージャを作成することで、スクリプトの隠蔽
      • データベースのアクセスロジックを R / Python スクリプト内に明示的に記載することなく、スクリプト内でデータを利用することができる
    • Enterprise Edition ~  Express with Advanced Services で使用することができる

  • SQL Server 2017 Machine Learning Server (スタンドアロン)
    • SQL Server のデータベースエンジンとは統合せず、単体で R / Python の実行環境として利用
      • Machine Learning Services としてインストールした場合は「C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER」配下に、R / Python のモジュールがインストールされる。
      • Launchpad サービスが追加されるが、Machine Learning Server としてインストールした場合には、「C:\Program Files\Microsoft SQL Server\140」に、共通コンポーネントとしてインストールされ、SQL Server とは異なる単体の実行環境として動作する
    • R / Python からデータベースにアクセスする場合は、R / Python のスクリプト内にデータベースへのアクセスロジックからコーディングする必要がある
      • R / Python に外部からアクセスするためのインタフェースを独自に構築する必要がある
    • SQL Server 2017 RC2 時点では、SQL Server Enterprise Edition on Windows での利用することが可能
      • スタンドアロンの実行環境については、Enterprise Edition でのみ使用することができる
    • スタンドアロンでの実行環境となるるため、分散性については「Microsoft R Server」の方が利点がある。

 

SQL Server 2017 では、PREDICT (Transact-SQL) という構文が追加されています。
この構文では、ML Services を介さずに、C++ でネイティブコンパイルされた SQL Server にロードされたモジュールを使用することで、シリアライズされたモデルを使用することができます。

この手法は Native scoring と呼ばれています。
Native scoring の情報に記載されていますが、PREDICT では、すべてのモデルが使用できるわけではなく RevoScaleR (RevoscalePy) / MicrosoftML のパッケージで作成されたモデル (アルゴリズム) をシリアライズされたもののみ、使用することが可能となっています。

For all of these scoring methods, you must use a model that was trained using one of the supported RevoScaleR or MicrosoftML algorithms.

 

利用できるモデルには、制限はありますがネイティブコンパイルされたモジュールは SQL Server on Linux にみ組み込まれています。
RC2 時点では、In-Database の ML Services が動作しない Linux 版でもこの方法であれば、学習済みモデルを利用することができますので、方法として覚えておくとよいかと。

 

■Standard Edition と Enterprise Edition の ML Services の違い

Standard Edition と Enterprise Edition の ML Services の違いですが、Differences in machine learning features between editions of SQL Server に記載されている、次の内容が該当しているようです。

Has all the capabilities of in-database analytics included with Enterprise Edition, except for resource governance. Performance and scale is also limited: the data that can be processed must fit in server memory, and processing is limited to a single compute thread, even when using the RevoScaleR functions.

Standard Edition の場合、RevoScaleR / RevoscalePy の機能を使用することはできるが、パフォーマンスとスケールの制限、処理できるデータがメモリに収まる必要があるというような制限があるようです。
シングルスレッド動作/マルチスレッド動作の違いもあるかと思いますので、本格的な処理を作成した場合にレスポンスの差を取得してみる必要があるのかと。

stackoverflow に Editions and Supported Features for SQL Server 2016 の質問が上がっているのですが、具体的な機能の差については言及されていない感じなのですよね。

ML Services (R Services) のメモリの制御については、リソースガバナーーの外部プールとして制御が行われているのですが、Enterprise Edition 以外では、リソースがバナーが使うことができないため、利用可能なメモリについては、結構シビアなのですよね。
リソース ガバナー リソース プール
Resource Governance for R Services

下の画像は、Enterprise Edition のリソースガバナーの設定となります。

image

R / Python は、「外部リソース プール」による制御対象となっているのですが、この値は初期値では、20% というリミットがかかっており、使用可能なメモリの制限が行われています。
Enterprise Edition では、リソースがバナーの機能を使用することができるため、設定を変更することができるのですが、それ以外のエディションでは、設定変更ができないため、20% 以上のメモリを使用するといったことはできまません。
(ML Services (In-Database) で、メモリ制限を緩和させる機能は、Enterprise Edition でのみ使用可能)

 

ML Services のアーキテクチャについては、Components in SQL Server to support Python integration / Components in SQL Server to support R に記載されています。

BXLServer.exe が SQL Server と、Python 間のデータの受け渡しを対応しているようですが、max server memory の 20% 程度、このプロセスがメモリを使用すると「ERROR: failure to allocate requested memory.」のエラーが発生し、ストアドプロシージャの実行がエラーとなっていました。
(ポート接続の流れを見ていると、BXLServer.exe が、TCP 1433 で SQL Serfger に接続を行っている事が確認できます)

RC2 で検証をした限りでは、R と Python のどちらを使用するかによっても、挙動が変わっているように見えました。今回は、Express と Enterprise の 2 種類で検証をしたのですが、大量のデータを外部スクリプトに渡した場合、R の場合は、Express だとメモリのリミットに達して、Enterprise より早い時間でメモリ要求のエラーが出たのですが、Enterprise の場合は、XDF ファイルにデータを出力 / データを適当なサイズでチャンクしながら処理が実行されているような動きをしており、ドキュメントに書かれている Standard と Enterprise のメモリ制限の動作をしているように見受けられました。
しかし、Python で実行した場合には、Express / Enterprise ともに、XDF ファイルへの出力が同じように実施され、メモリ部s区のエラーについても似たようなタイミングに発生しており、メモリ制限については、リソースガバナーの設定で行われているような印象を受けました。

どちらのエディションも Revoscale R / Revoscale Py の関数は使用できるようですが、エディションによる性能やリソースの差は結構使い込まないとどこが違うかということをいうのが難しそうですね。

 

■SQL Server / R Server で使用されている、R / Python の特徴って?

はじめにサービスで使われている R / Python の特徴をまとめてみたいと思います。

Microsoft から提供されている R の実行環境については、Revolution R (RR) がベースになっています。
Python の実行環境については、Python 3.5 が利用された Anaconda ディストリビューションが使用されていますので、基本的な内容については、これらの情報をキャッチアップする形になるかと。

Microsoft R Open 独自の内容としては、RevoScaleR package / revoscalepy package というようなパッケージが導入されていることが、特徴としてあげられることが多いかと思います。

RevoscalePy については、RevoscaleR を Python 向けに移植したものとなっているはずですので、片方の情報を追っていれば相互に補完ができそうではありました。

RevoscaleR は、High Performance Computing (HPC)、High Performance Analytics (HPA) に対応するため拡張されているパッケージですので、単純なパッケージを使用するよりは、速度のメリットがあるのではないでしょうか。
RevoscaleR については、RのffとbigmemoryとRevoScaleRとを比較してみた が参考になります。

RevoScaleR の HPA 向けのアルゴリズムとしては、機械学習で使用される線形回帰等も含まれていますので、この辺のパッケージを有効に使うのもポイントとなるのでしょうね。

他にも MicrosoftML package / microsoftml package というような機械学習向けのパッケージも入っているようですので、これも有効に活用するとメリットが出てきそうですね。

デフォルトで含まれていないパッケージについては、個別に導入することも可能ですので、追加で必要なパッケージがある場合には、手動でインストールすることが可能です。

ML Services では GPU と絡めた情報発信が行われることがありますが、R に機械学習 / 深層学習の GPU 対応されたパッケージがあれば、SQL Server 2016 でも実行できたのではないかなと。

Python であれば、機械学習 / 深層学習向けのパッケージで GPU対応されているもの (CNTK / TensorFlow / Chainer 等) が多いのかもしれない (R と Python でどの程度 GPU に対応されたパッケージ数に差があるのか調べているわけではないのでイメージですが) ので、そういったものを容易に利用することができますよというアナウンスが正しいのかもしれないですね。

 

■ML Service の機械学習って?

SQL Server 2017 の Machine Learning Services は機械学習を実行するために使用可能なサービスということになります。

しかし、サービスとしてデフォルトで含まれている内容としては「機械学習を実行するための基盤」となり、Azure Machine Learning のように、簡単に機械学習が使えるというような機能が提供されているわけではないという認識でいます。

Azure Machine Learning Service (Azure ML) であれば、次のような特徴があるかと。

  • デフォルトでアルゴリズムが準備されており、ブラウザからのドラッグアンドドロップで機械学習モデルが作成できる
  • 作成した機械学習のモデルを使用するための、インタフェースを Web 経由で提供することができる

SQL Server の ML Services は次のような特徴があるのではないでしょうか。

  • 機械学習を行うためのモデルを R または Python のスクリプトを使用することでコーディングすることができる
  • 作成した機械学習のモデルをシリアライズして、SQL Server のバイナリデータとして格納しておくことができる
  • 機械学習のモデルを利用するための、インタフェースを Transact-SQL で提供することができる
  • モデルにデータを渡す際には、データセットを直接渡すのでなく、データ取得のための Transact-SQL を指定することができる
  • データベースエンジンに統合されており、データアクセスの際のセキュリティや、バイナリデータとして格納した学習済みモデルのセキュリティにには、データベースのセキュリティ機能を利用することができる

 

ML Services の機械学習については、学習モデルの作成については、自分で R または Python のスクリプトをコーディングする必要がありますので、R / Python を使用して機械学習を実行するためのスキルは必須となってきます。
(データサイエンティスト/機械学習エンジニアのような方が既にいて、既存の学習済みモデルがあるようであれば、それを再利用することも可能です)

今まで機械学習の経験がなく、学習モデルを自分で作成する必要がある場合、その作成/学習のコストについては、Azure ML より高いものとなるのではないでしょうか。

 

しかし、SQL Server のデータベースエンジンに統合されていることにより、享受できるメリットもいくつか出てくるのではと思います。

学習モデルについては、SQL Server の varbinary(max) に格納しておくことができますので、利用できるモデルのセキュリティモデルについては、テーブルのデータへのアクセス方法を使用することができます。

次の画像は de:code 2017 のキーノート の内容となります。
image

SQL Server の ML Serivces については、「Inteligence Database + App」 というような形で説明が行われています。

従来型の高度なデータ解析の基盤としては、データベースサーバーと分析を行うための基盤 (仕組み) が異なる環境に構築がされており、データベースと解析を行うレイヤーが分かれているというような構成があったかと思います。

SQL Server 2017 では、ML Services を使用することで、データベース内にデータの解析を行うための基盤を構築することができ、データをサーバーから出すことができないような環境に対して、よりセキュアな環境としてのデータ分析基盤を提供することが可能というような説明が行われています。
(データベースサーバー内に R/Python の実行環境を構築し、サーバー内で実行される外部スクリプトからデータ分析を行う場合との対比については、どのようなメリットがあるかの理解をしておく必要がありますが)

作成した機械学習のモデルを使用する方法としては、Transact-SQL をインタフェースとすることができます。
Python 単体で機械学習の仕組みを作成した場合、作成されている機械学習のモデルを外部から利用するためのインタフェースを Django 等で構築する必要があったかもしれません。

SQL Server の ML Services については、SQL 経由でダイレクトに機械学習のモデルを使用することが可能です。
機械学習のモデルにデータを渡す際には、SQL 文を渡すことになるため、データに関しては、SQL Server と ML Services のプロセス間通信となるかと思いますので、データが流れる経路についても限定的なものにできるのかと。

インタフェースとして提供されている SQL の実行方法には次の 2 種類があります。

sp_execute_external_script については、SQL Server 2016 の R Services から導入されている R / Python のスクリプトを SQL Server から呼び出すためのストアドプロシージャとなります。
実際には、このストアドを単体で直接呼び出すというよりは、ユーザーストアドプロシージャでラップして、実行時には必要なパラメーター以外は見せないようにすることになると思いますが。

PREDICT については、SQL Server 2017 から追加されており、R / Python のモデルをストアドプロシージャを介さずに、直接 SQL から呼び出すというようなものとなっています。

ストアドプロシージャの実行権限やテーブルのアクセス権限を調整することで、ユーザーが利用可能なモデル等の制御ができるようになるというような特徴もありますね。

 

実際のところを書いてしまうと、R でも機械学習のモデルを作成することはできるはずです。
そのため、SQL Server 2016 の時代から、Intelligence Database を実現することはできていたはずではないでしょうか。
しかし、SQL Server 2016 がリリースされた後の様子を見ていると、SQL Server の R の事例というのはほとんど聞いたことがなく、どの程度使われていた機能なのかは正直よくわかっていません…。
(SQL Server 内のデータで分析を行っていた既存の方が、SQL Server の R Services に乗り換えるメリットが訴求できていないということもあるのでしょうけど)

R, Python Duel As Top Analytics, Data Science software – KDnuggets 2016 Software Poll Results の 2016 年のアンケート調査によると、データ解析に使用される言語のシェアとしては、R が 1 位、Python が 2 位となっており、2015 年との比較で言うと Python の利用者数はかなり多くなっているようですので、R と Python の両方がサポートされることで、利用者が増える可能性は大きくあるのではないでしょうか。
IEEE Spectrum の Interactive: The Top Programming Languages 2017 でも Enterprise で見た場合は、Python がランキングトップに来ており、利用されているシーンが増えているのかと。
(サイエンティスト も Enterprise にカテゴライズされているみたいですね )

データ分析を専門に行っていない場合、R より、Python の方がなじみのあるケースの方が多い思います。

今回の ML Services で Python がサポートされたことにより、利用されるシチュエーションが増えてくれるといいですね。

 


■参考資料

イベントの関連セッション

 

日本語の情報で一番まとまっているものは、de:code 2016 の SQL Server 2016 R Services、Microsoft R Server の構成と実行アーキテクチャ / SQL Server 2016 R Services + Microsoft R Server 技術資料 になるかと。

Written by masayuki.ozawa

9月 2nd, 2017 at 4:05 pm

Leave a Reply

*