Jack of all trades

master of none. 多芸は無芸を地で行く、自作自演何でも屋。

SQL Server 2017 CTP2.0上でChainerを使用する

先日のエントリで、SQL Server 2017 CTP2.0のMachine Leaning ServicesでPythonのコードを実行する手順を紹介しました。

sadynitro.hatenablog.jp

SQL Server Management Studioで外部スクリプトとしてPythonのコードを実行し、さらにGoogleの提供するオープンソース機械学習ライブラリであるTensorFlow*1をインストールしてPythonのコードで使用するところまで実践しました。

github.com

今回はTensorFlowを使ってさらに…と思っていたんですが、最近の興味と先日の de:code のセッション内容もあってChainerを使ったあれこれを実践してみる方向に切り替えました。

1. Chainerのインストー

ChainerはPreferred Networksが提供するオープンソースの深層学習フレームワークです。最近IntelMicrosoftとの協業でさらに注目度は上がっているように思います。

github.com

先のエントリでTensorFlowをインストールした時と同じく、SQL ServerPython Serviceのフォルダに移動してpipによるインストールを試みます。

cd C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\PYTHON_SERVICES\Scripts
pip install --ignore-installed --upgrade chainer

2. Chainerの動作確認

とりあえずSSMS上でChainerを利用するPythonコードを書いてちゃんと動作することを確認します。

execute sp_execute_external_script
@language = N'Python',
@script = N'
import numpy as np
import chainer.functions as cf

x = np.arange(-1, 4, 2).astype(''f'')
y = cf.sigmoid(x).data

print(x)
print(y)
'

numpy.arangeで適当に生成した配列に対してシグモイド関数を適用するだけのコードです。

f:id:sadynitro:20170614232359p:plain

どうやらちゃんと動いているようです。

3. 外部スクリプトに対するInput・Outputを使用する

SQL Serverのテーブルに対して、pythonのコードにデータを読み込む、pythonのコードからデータを書き込む操作がよくわからなかったのですが、 ちょっと前にポストされた以下の記事に書いてあったのでこれに沿って試してみます。

blogs.msdn.microsoft.com

サンプルデータとしてRatingという名前のテーブルを作りました。

f:id:sadynitro:20170616201606p:plain

お店の口コミサイトのデータみたいなイメージですね。

では、このテーブルのデータをpythonのコードで読み込むために以下のコードを実行します。

execute sp_execute_external_script
  @language = N'Python'
 ,@script = N'
print(InputDataSet)
'
,@input_data_1 = N'SELECT * FROM Rating'
GO

すると以下のようなエラーメッセージが。

メッセージ 39004、レベル 16、状態 20、行 1
'sp_execute_external_script' に HRESULT 0x80004004 を指定して実行中に、'Python' スクリプト エラーが発生しました。
メッセージ 39019、レベル 16、状態 1、行 1
外部スクリプトエラーが発生しました: 
Traceback (most recent call last):
  File "<string>", line 2, in <module>
  File "C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\PYTHON_SERVICES\lib\site-packages\revoscalepy\computecontext\RxInSqlServer.py", line 522, in rx_sql_satellite_pool_call
    exec(inputfile.read())
  File "<string>", line 3, in <module>
  File "C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\PYTHON_SERVICES\lib\site-packages\revoscalepy\computecontext\RxInSqlServer.py", line 474, in rx_sql_satellite_call
    rx_native_call("SqlSatelliteCall", params)
  File "C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\PYTHON_SERVICES\lib\site-packages\revoscalepy\RxSerializable.py", line 19, in rx_native_call
    ret = px_call(functionname, params)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x91 in position 0: invalid start byte

Invalid BXL stream

文字コード絡みのエラーの様なので、日本語データの入った列を除外してみます。

execute sp_execute_external_script
  @language = N'Python'
 ,@script = N'
print(InputDataSet)
'
,@input_data_1 = N'SELECT UserId, ShopId, Rating FROM Rating'
GO

今度はうまくいったようです。テーブルのデータを読み込んで標準出力に出力できています。

f:id:sadynitro:20170616202126p:plain

上記のエラーについては現状解決できていません。どなたかご存じであればご教示いただけると幸い…。

4. SQL Server上のテーブルデータをInputとしてChainerで処理する

とりあえずSQL Serverのテーブルデータを扱えることを確認できたので、これをInputとしてChainerで処理させるコードを試してみます。 InputDataを抽出するクエリでShopId=2のRatingに絞り込み、その平均値をChainerで計算しています。

execute sp_execute_external_script
  @language = N'Python'
 ,@script = N'
import numpy as np
import chainer.functions as cf

r = np.array(InputDataSet.Rating).astype(''f'')

result = cf.average(r)

print(result.data)
'
,@input_data_1 = N'SELECT Rating FROM Rating WHERE ShopId = 2'
GO

f:id:sadynitro:20170616205732p:plain

無事に算出されました。ShopId=2のお店の平均評価は約2.86となっています。

まとめ

SQL Server 2017 CTP2.0上でChainerが実行できることを確認できました。
また、SQL Serverのテーブルデータを利用した処理を記述することもできたので、SQL Serverに蓄積したデータを学習データとして機械学習のモデル構築とか、 もしくは学習済みモデルを搭載してSQL Serverのデータから予測をしたり、分類したりすることもできそうです。

*1:公式サイトでは「for Machine Intelligence」と表現されています。読みは「テンサーフロー」中の人が言ってるんだから間違いない。異論は認めますん。

SQL Server 2017 CTP2.0 on Ubuntu16.04 を Ruby on Railsで利用する

1. SQL Server 2017 CTP2.0 を Ubuntu16.04にインストー

SQL Server 2017 CTP2.0はLinux上でも動作するということで、早速以下のサイトに従ってUbuntu16.04上にインストールしてみました。

Install SQL Server on Ubuntu | Microsoft Docs

※注意:サイトにも記載されていますが、SQL Server on linuxのインストールにはメインメモリが3.25GB以上必要です。不足している場合はインストール時のチェックで弾かれてインストールが実行できません。

無事にインストール完了。

systemctl status mssql-server

を実行すると、サービスが実行中になっていることを確認できます。

f:id:sadynitro:20170429072041p:plain

2. SQL Server Management Studio (SSMS) から接続する

もちろんWindowsクライアント上のSSMSから接続することもできます。

https://docs.microsoft.com/ja-jp/sql/linux/sql-server-linux-develop-use-ssms

SSMSのバージョンはv17.0 RC1(ダウンロードのページで「SQL Server Management Studio - リリース候補」と書かれている方)を使用します(少なくともSQL Server 2014のSSMSだと互換性の問題によるエラーが発生しました。SQL Server 2016のSSMSは未確認。)

Download SQL Server Management Studio (SSMS) | Microsoft Docs

f:id:sadynitro:20170429074326p:plain

接続できました。

3. Ruby on Rails アプリケーションから利用する

単純にUbuntu上で稼働しているのを確認するだけだと面白くないので、何かしらのアプリケーションから利用したいと思います。

on LinuxSQL Serverを利用したアプリケーション開発の為の手順・サンプルコードも既に用意されているので、それに沿って作っていきます。

Ruby Ubuntu

様々な言語に対応したサンプルが用意されていますが、今回はRuby(Ruby on Rails)を選択します。

SSMSを確認するとRailsアプリケーション用のDBが出来上がっています。

f:id:sadynitro:20170429083144p:plain

これで準備完了。rails sを実行します。

rails s -b 0.0.0.0 -p 3000

ブラウザでアプリが実行されていることを確認できます。

f:id:sadynitro:20170429081746p:plain

これだけだとDBサーバーを利用している感が無いので、scaffoldで適当なユーザー管理(CRUD)の仕組みを生成します。

  • モデル名: user
  • カラム
    • name: string
    • age: integer
rails generate scaffold user name:string age:integer

scaffoldの実行が終わったらrake db:migrateを実行。

SSMSからDBの中身を確認するとUsersテーブルが生成されていることを確認できます。

f:id:sadynitro:20170429083742p:plain

rails s を実行して、ブラウザからアクセスするとユーザー管理ページが開きます。

f:id:sadynitro:20170429084041p:plain

適当にユーザーを登録。

f:id:sadynitro:20170429084115p:plain

f:id:sadynitro:20170429084120p:plain

SSMSを確認すると、ちゃんとUsersテーブルにレコードが追加されています。

f:id:sadynitro:20170429084202p:plain

まとめ

公式サイトの手順に従って、SQL Server 2017 CTP2.0をサクッとインストールできました。さらに、用意されたサンプルでサックリRuby on Railsから利用することができました。

何もかもサクサク。

ASP.NET Coreだけでなく、Linux上で動作する様々なアプリケーションフレームワークからSQL Serverが利用される日が来るかもしれませんね。 f:id:sadynitro:20170429084825p:plain

SQL Server 2017 CTP2.0上でPythonのコードを実行する

去る4/19に開催されたMicrosoft Data Ampにて、SQL Server vNextがSQL Server 2017になることが正式に発表されました。それと同時にSQL Server 2017 Community Technology Preview 2.0 (CTP2.0)の提供が開始しています。

blogs.technet.microsoft.com

SQL Server 2017 CTP2.0で提供される目玉機能として、SQL Serverのデータベース上でPythonのコードが実行できるという発表がありました。 現状はWindows OS上で動作するSQL Serverでのみ有効な機能なようです。追々その他の環境でも動作することを期待しています(on Linuxで使いたい)

まだまだ情報は少ないですが、セッション動画内のデモ等を参考に見様見真似で動作確認してみます。

1. SQL Server 2017 CTP2.0をインストール

以下のサイトからインストールメディアをダウンロードします。 www.microsoft.com

setup.exeを実行して新規インストールを開始します。

f:id:sadynitro:20170422141845p:plain

機能の選択画面でデータベースエンジンサービスに加えてMachine Leaningサービスにチェックを付けます。

f:id:sadynitro:20170422141900p:plain

データベースインスタンスのインストールが完了したら、追加でSQL Server Management Studioをインストールします。

f:id:sadynitro:20170422142049p:plain

2. SQL Server Management Studio (SSMS)上でPythonコードを実行してみる

インストールが一通り完了したら、SSMSを起動してクエリエディタ上でPythonコードを実行してみます。 Pythonのコードを実行するには「execute sp_execute_external_script」で外部スクリプトとして記述します。

execute sp_execute_external_script
@language = N'Python',
@script = N'
import sys
import os
print("*****")
print(sys.version)
print("Hello Python!!!")
print(os.getcwd())
print("*****")
'

実行すると恐らく以下のエラーメッセージが表示されます。

メッセージ 39023、レベル 16、状態 1、プロシージャ sp_execute_external_script、行 1 [バッチ開始行 0]
SQL Server のこのインスタンスでは、'sp_execute_external_script' は無効になっています。これを有効にするには、sp_configure の 'external scripts enabled' を使用します。

どうやらデフォルトでは外部スクリプトの実行が無効になっているので有効にしてやる必要があります。

3. 外部スクリプトの実行を有効化する

SQL ServerでRやPythonといった外部スクリプトを実行するためには、グローバル構成設定(sp_configure)にある「external scripts enabled」を有効にする必要があります。 以下のスクリプトを実行して有効化します。

USE master;  
GO  
EXEC sp_configure 'external scripts enabled', '1';

RECONFIGURE

※ 設定変更後にSQL Serverのサービスを再起動する必要があるので注意してください。

4. SQL Server LaunchPadの有効化

外部スクリプトの実行を有効化して再度Pythonコードを実行するスクリプトを実行すると、今度は以下のエラーメッセージが表示されます。

メッセージ 39011、レベル 16、状態 1、行 0
SQL Server が LaunchPad サービスと通信できませんでした。サービスの構成を確認してください。

外部スクリプトを実行するためのサービスと通信するためのサービス(LaunchPadサービス)なるものが必要なようです。

SQL Server 構成マネージャー」を開いてSQL Server LaunchPadを有効化します。 f:id:sadynitro:20170422144315p:plain

5. 再度Pythonコードの実行を試みる

再度Pythonコードを実行するスクリプトを実行すると、今度こそ無事に実行完了して実行結果が返ってきます。間に色々挟まっている所為かレスポンスはかなり遅いですがちゃんとPythonのコードが実行出来ていることを確認できました。 f:id:sadynitro:20170422145731p:plain

6. ついでにTensor Flowを動作させてみる

せっかくPythonコードが実行できることを確認できたので、機械学習用途で利用する為の第一歩としてTensor Flowが動作するか確認してみます。

デフォルトで幾つかのライブラリがインストールされていますが、Tensor Flowは含まれていないようなので、pipでインストールします。 SQL Server 2017のPython環境はデフォルトで「C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\PYTHON_SERVICES」の中に一式収まっているようです。 このフォルダ配下の「Scripts」フォルダの中にpipが存在するので、コマンドプロンプトでこのフォルダに移動し、以下のコマンドを実行することでTensor Flowをインストールできます。

pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-1.0.1-cp35-cp35m-win_amd64.whl

インストールが完了したらTensor Flowが動作していることを確認できる最低限のコードを書いて実行してみます。

execute sp_execute_external_script
@language = N'Python',
@script = N'
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3"

import tensorflow as tf
hello = tf.constant("Hello, TensorFlow!")
sess = tf.Session()
print(sess.run(hello))
'

とりあえずTensor Flowが動作していることが確認できました。 f:id:sadynitro:20170422151008p:plain

7. まとめ

SQL Server 2017 CTP2.0のインストールから外部スクリプトとしてPythonコードを実行できるところまで確認しました。
しかしながら、実用(主に機械学習用途)に際しては最低限以下について確認が必要かなと思っています。

  • DBのテーブルに格納されているデータに対してPythonのコードで必要な操作ができることを確認する
  • Tensor Flow等のライブラリで実際に学習モデルを構築して正常に動作することを確認する

ということで、今後の課題として取り組んでいきたいと思います。乞うご期待。

Visual Studio Team Servicesでデフォルト有効になったNotificationの設定

Visual Studio Team Services(VSTS)のリリースノートにも記載がありましたが、Out of the box notificationがデフォルトで有効化されています。*1

以下は@kkamegawaさんによる該当リリースノートの和訳。

kkamegawa.hatenablog.jp

突然VSTSからメールで通知が来るようになってビックリされた方もいらっしゃるかもしれないので、Notificationの設定についてご紹介します。

チームプロジェクト全体の設定

チームプロジェクト全体の設定画面で「Notification」のタブを選択すると、通知の一覧が表示されます。
各通知の「…」をクリックすると、通知の有効・無効設定や通知の設定内容を参照することができます。
デフォルトで全て有効になっていますが、不要であれば無効にしておくとよいでしょう。

f:id:sadynitro:20170411221337p:plain

また「+NEW」ボタンをクリックすると、新たに通知を設定することができます。
設定の1画面目で通知の分類とテンプレートを選択します。

f:id:sadynitro:20170411221601p:plain

2画面目で通知の条件を設定して完了です。

f:id:sadynitro:20170411221608p:plain

ユーザー個別の設定

通知の設定はユーザー個別に設定することもできます。
チームプロジェクト全体で通知を幾つか設定しておいて、ユーザーによっては一部の通知だけ受け取ったり、全て無効にしたりという設定が可能です。

設定画面を開くには画面右上のアイコンをクリックして「Notification setting」を選択します。

f:id:sadynitro:20170411221539p:plain

通知の一覧が表示されるので、右側にあるトグルで通知のON/OFFを設定します。 ちなみにチームプロジェクト全体の設定で無効になっている通知は一覧に表示されません。*2

f:id:sadynitro:20170411221829p:plain

以上、VSTSのNotification設定の紹介でした。
冒頭でも述べた通り、いきなりメール通知が来てビックリされた方もいらっしゃると思いますが、Notificationの機能はService Hooksと同様に便利な機能なので、本記事を参考に適切に設定していただければと思います。

*1:VSTSのテナントによって更新が反映されるタイミングが異なるので、4/11現在でまだ反映されていない可能性があります。

*2:Extensionsに関する通知についてはチームプロジェクト全体の設定に入っていなくても勝手に表示されます。

SQLServer2016の製品版自習書と業務で使用するT-SQLの強化ポイント備忘録

不意に、手元にダウンロードしていたSQLServer2016の自習書がCTP時のものだったことに気付いたので、製品版の自習書を探して入手。

SQL Server 2016 - マイクロソフト クラウド プラットフォーム

SQLServer2016におけるT-SQLの新機能について、R統合やJSON対応が目玉として注目される中、どっちかというと業務ではこっちの方が必須になるであろう強化ポイントがあったので備忘録として書き残すことにします。

オブジェクトの存在を確認して存在する場合は削除するクエリ

とても地味ですが絶対使います。
例として「'obj1'という名前のオブジェクトが存在するかチェックして、存在する場合は削除する」というクエリを書くとします。 SQLServer2014までは以下のような感じです。

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'obj1'))  
  DROP TABLE obj1

SQLServer2016からは以下のようにかなり簡潔に書けます。

DROP TABLE IF EXISTS obj1

バージョンアップごとの自習書確認のすゝめ

本エントリーは本当に1機能をピックアップしただけの備忘録なので、どっちかというと冒頭に記載した自習書を確認することをお勧めします。
最上位エディションでしか使えない機能やゴリゴリの分析機能だけでなく、T-SQLSQLServerのバージョンが上がるごとにちょっとずつ便利な機能が追加されているので、冒頭に記載した自習書等を確認して有用な情報を仕入れることをおすすめします。