仮想マシンで、SQL Server 2017 の ML サービスの In-Database Python Analytics for SQL Developers のチュートリアルの、モデルの作成と保存 (Step 5: Train and Save a Model using T-SQL) を実行しようとしたところ、エラーが発生してしまい、モデルを作成することができない状態が発生していました。
チュートリアルには、以下のようなクエリを実行する箇所があります。
DECLARE @model VARBINARY(MAX); EXEC TrainTipPredictionModelSciKitPy @model OUTPUT; INSERT INTO nyc_taxi_models (name, model) VALUES('SciKit_model', @model);
これで、学習用データをもとにモデルを作成しているのですが、メモリが少ない環境では、以下のようなエラーが発生するようです。
メッセージ 39004、レベル 16、状態 20、行 2
‘sp_execute_external_script’ に HRESULT 0x80004004 を指定して実行中に、’Python’ スクリプト エラーが発生しました。
メッセージ 39019、レベル 16、状態 2、行 2
外部スクリプトエラーが発生しました:
Invalid BXL stream
メッセージ 515、レベル 16、状態 2、行 3
テーブル ‘Python.dbo.nyc_taxi_models’ の列 ‘model’ に値 NULL を挿入できません。この列では NULL 値が許可されていません。INSERT は失敗します。
ステートメントは終了されました。
今回の環境は 4 GB のメモリ (通称 : 1/2 かずあきさん) で動作させているのですが、同程度のメモリサイズの環境で、デフォルトの設定でチュートリアルを実行しようとすると再現するかと思います。
デフォルトの設定では、リソースガバナーの「外部リソースプール」の設定により、ML サービスのような外部リソースに割り当て可能なメモリについては「20%」に制限が行われています。
この設定を変更することで、ML サービスから実行される Python への割り当てが許可されるメモリ量が増えるので、4GB の環境でもモデルの作成ができるようになるかと。
新しくチュートリアルを動作するように設定をしていた環境で、モデルの作成ができなくてちょっと悩みました。
(環境の差を確認していたら、仮想マシンのメモリの割り当てサイズが違っていたので気づきました)