Snowpark ML を実行するための Windows ローカル環境を用意してみた

2024.01.29

こんにちは!よしななです。 今回は、Snowpark ML を Windows ローカル環境で実行する機会があったのですが、環境構築で詰まったので備忘録として手順をのこします。

目次

  • 実行環境
  • Python のインストール
  • pyenv のインストール
  • Git Bash のインストール
  • Jupyter Notebook の起動
  • Snowpark ML 環境のセットアップ
  • まとめ

実行環境

  • OS
    • windows 11
  • 実行コンソール
    • vscode

※環境セットアップ後、Snowpark ML 上でダイヤモンドデータセットを用いてダイヤモンドの価格予測モデルを構築するため、合わせてライブラリ等のインポートを行っています。

動作確認用のコードは以下 URL から一部引用・改変します。
https://quickstarts.snowflake.com/guide/intro_to_machine_learning_with_snowpark_ml_for_python/index.html?index=..%2F..index#0

python のインストール

まずは、モデルの構築に必要な Python をインストールしていきます。
今回の環境構築に使用する Snowpark ML の Python 対応バージョンは Python 3.8,3.9,3.10 となります。
現在、Python 3.8,3.9,3.10 はインストーラの配布が終了となっているため、pyenv を使用して Python の インストールを行います。
pyenv のインストールには Python が必要なので、Python をインストールしていきます。

以下のサイトから python の最新バージョン python 3.12.1(2024/1/24 時点)をインストールします。
https://www.python.org/downloads/

インストール後、環境変数の設定を実施
windows 設定画面から環境変数の編集を検索し、以下の画面から変更ができます。

フォルダから pip ファイルの配置パスをコピー、環境変数編集画面に貼り付けます。
C:\Users{ユーザー名}\AppData\Local\Programs\Python\Python312\Scripts


こちらで pip コマンドを使用してインストールができます。

こちらで python のインストールが完了となります。

pyenv のインストール

参考サイト

こちらの Developer IO 記事の まずはpyenvのセットアップ を参考にしています。
https://dev.classmethod.jp/articles/pyenv-and-poetry/

コマンドプロンプトを開き、pyenv のインストールをしていきます。
次に、コマンドプロンプトを起動し、pip install で pyenv のインストールをしていきます。

pip install pyenv-win --target $env:USERPROFILE\.pyenv

管理者権限で Powershell を起動し、以下のコードを1行ずつ実行していきます。こちらで環境変数の追加ができます。

[System.Environment]::SetEnvironmentVariable('PYENV',$env:USERPROFILE + "\.pyenv\pyenv-win\","User")
[System.Environment]::SetEnvironmentVariable('PATH', $env:USERPROFILE + "\.pyenv\pyenv-win\bin;" + $env:USERPROFILE + "\.pyenv\pyenv-win\shims;" + $env:Path,"Machine")

ここまでで、pyenv のインストールが完了となります。

Git bash インストール

vscode 上で Linux を動かすために Git bash をインストールします。
以下のサイトから インストーラをダウンロードしていきます。
https://gitforwindows.org/

Git bash のインストールが完了したら、vscode を開きます。 ターミナルを開き、以下の画像のようにクリックすると、Git Bash が選べるようになります。 こちらで Git Bash に切り替えてください。

こちらで、Bashを実行できるターミナル環境が用意できました。 次に、Git Bash を用いて Jupyter Notebook を起動します。

Jupyter Notebook の起動

それでは、Snowpark ML を動かすためのコンソールである Jupyter Notebook を起動していきます。
Jupyter Notebook 上で、ダイヤモンドデータセットを用いた価格予測モデルを構築していきます。

まず、作業用ディレクトリを作成していきます。

mkdir snowparkml
cd snowparkml

次に、作業用ディレクトリで仮想環境を作成し、有効化します。

python -m venv snowparkml-env
source snowparkml-env/Scripts/activate

次に、ダイヤモンドデータセットを用いた価格予測モデルで使用するライブラリをまとめた、requirements.txt を作成していきます。
以下の通り、テキストデータを作成しその中にインポートが必要なライブラリを記述していきます。
実際に環境構築をする際は、構築する環境に合わせてテキストデータを必要なライブラリに書き換えてください。

pandas==1.5.3
pyarrow==10.0.1
snowflake-snowpark-python==1.8.0
notebook==7.0.0
snowflake-ml-python==1.2.0
numpy==1.26.2
xgboost==1.7.3
seaborn==0.13.1
scikit-learn==1.3.0
joblib==1.1.1
cachetools==4.2.2

テキストデータの作成が完了したら、pip install で requirements.txt をインポートします。
この作業で 機械学習モデルの構築に必要なライブラリのインポートが完了となります。

pip install -r requirements.txt

ここまで完了したら、Jupyter Notebook の軌道に必要な作業は完了となります。
以下のコマンドを叩いて Jupyter Notebook を起動してください。

jupyter notebook

成功すると、ブラウザ上で Jupyter Notebook が起動されます。
次に、起動した Jupyter Notebook で Snowpark ML 環境のセットアップを行います。

Snowpark ML 環境のセットアップ

Snowflake のサインイン

Snowpark ML をローカル環境でセットアップするために、まずは Snowflake 上でリソースの作成を行います。
Snowflake のサインインを行います。
現在、Snowflake では 30日間 $400 分無料トライアルを実施しているため、以下の URL からサインインを実施します。

https://signup.snowflake.com/

ユーザー名、メールアドレスなどは自分のものを入力してください。
完了したら次へ進むをクリックします。

次に、Snowflake Edition と クラウドプロパイダーを選択します。
今回はそれぞれエンタープライズと AWS を選択します。
完了したら次へ進むをクリックします。

次項以降は該当の選択肢を選んでください。



こちらでサインイン作業は完了となります。
次回以降は、以下の URL からワークスペースへログインができるようになります。
https://spn.snowflake.com/s/login/

ワークスペースのログインを行い、リソースの作成をしていきます。

リソースの作成

作成するリソースは以下となります。

  • 実行用ウェアハウス
    • 個人でXS Standardサイズを作成
  • データベース
    • 個人で作成
  • スキーマ・テーブル・内部ステージ・ファイル形式オブジェクト
    • 上記データベース内に個人で作成
  • Snowpark ML実行用ロール・ユーザー
    • 個人ごとに作成

ロール以外の作成

ロール以外のリソース作成を作成します。以下のコードを Snowflake 上の WorkSheet 上で実行します。
<ユーザー名>を個人が分かるものに置き換えてお使い下さい。
※エディタなどで置換してください。例: <ユーザー名> を NYOSHIDA に置換

USE ROLE ACCOUNTADMIN;
CREATE OR REPLACE WAREHOUSE ML_HOL_WH_<ユーザー名>;
CREATE OR REPLACE DATABASE ML_HOL_DB_<ユーザー名>;
USE DATABASE ML_HOL_DB_<ユーザー名>;
CREATE OR REPLACE SCHEMA ML_HOL_SCHEMA;
CREATE OR REPLACE STAGE ML_HOL_ASSETS;

CREATE FILE FORMAT IF NOT EXISTS ML_HOL_DB_<ユーザー名>.ML_HOL_SCHEMA.CSVFORMAT 
    SKIP_HEADER = 1 
    TYPE = 'CSV';

CREATE STAGE IF NOT EXISTS ML_HOL_DB_<ユーザー名>.ML_HOL_SCHEMA.DIAMONDS_ASSETS 
    FILE_FORMAT = ML_HOL_DB_<ユーザー名>.ML_HOL_SCHEMA.CSVFORMAT 
    URL = 's3://sfquickstarts/intro-to-machine-learning-with-snowpark-ml-for-python/diamonds.csv';
    -- https://sfquickstarts.s3.us-west-1.amazonaws.com/intro-to-machine-learning-with-snowpark-ml-for-python/diamonds.csv

LS @DIAMONDS_ASSETS;

ロールの作成

ロールのリソース作成を作成します。以下のコードを Snowflake 上の WorkSheet 上で実行します。
前項と同様に、<ユーザー名>を個人が分かるものに置き換えてお使い下さい。
PASSWORD = '任意のパスワード' は自分で生成したパスワードを入力してください。

-- ROLEの作成
CREATE ROLE SNOWPARK_ROLE_<ユーザー名>;

-- ウェアハウスへのUSAGEアクセス権の付与
GRANT USAGE ON warehouse ML_HOL_WH_<ユーザー名> TO ROLE SNOWPARK_ROLE_<ユーザー名>;

-- データベースへのUSAGEアクセス権の付与
GRANT USAGE ON DATABASE ML_HOL_DB_<ユーザー名> TO ROLE SNOWPARK_ROLE_<ユーザー名>;

-- スキーマへのアクセス権の付与
GRANT ALL PRIVILEGES ON SCHEMA ML_HOL_DB_<ユーザー名>.ML_HOL_SCHEMA TO ROLE SNOWPARK_ROLE_<ユーザー名>;

-- SQL操作用の権限の付与
GRANT CREATE TABLE ON SCHEMA ML_HOL_DB_<ユーザー名>.ML_HOL_SCHEMA TO ROLE SNOWPARK_ROLE_<ユーザー名>;
GRANT CREATE VIEW ON SCHEMA ML_HOL_DB_<ユーザー名>.ML_HOL_SCHEMA TO ROLE SNOWPARK_ROLE_<ユーザー名>;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA ML_HOL_DB_<ユーザー名>.ML_HOL_SCHEMA TO ROLE SNOWPARK_ROLE_<ユーザー名>;

-- ステージへの権限の付与
GRANT ALL PRIVILEGES on STAGE ML_HOL_DB_<ユーザー名>.ML_HOL_SCHEMA.ML_HOL_ASSETS to role SNOWPARK_ROLE_<ユーザー名>;
GRANT ALL PRIVILEGES on STAGE ML_HOL_DB_<ユーザー名>.ML_HOL_SCHEMA.DIAMONDS_ASSETS to role SNOWPARK_ROLE_<ユーザー名>;

-- スキーマ内でのUDFの作成権限の付与
GRANT CREATE FUNCTION ON SCHEMA ML_HOL_DB_<ユーザー名>.ML_HOL_SCHEMA TO ROLE SNOWPARK_ROLE_<ユーザー名>;

-- ユーザーの作成
CREATE USER SNOWPARK_OPERATOR_<ユーザー名>
    PASSWORD = '任意のパスワード'
    DEFAULT_ROLE = 'SNOWPARK_ROLE_<ユーザー名>'
    MUST_CHANGE_PASSWORD = FALSE;

-- ユーザーへのロールの付与
GRANT ROLE SNOWPARK_ROLE_<ユーザー名> TO USER SNOWPARK_OPERATOR_<ユーザー名>;

-- SYSADMINでリソースが見られるように親子関係の作成
GRANT ROLE SNOWPARK_ROLE_<ユーザー名> TO ROLE SYSADMIN;

実際に Notebook 上で接続してみる

リソースの作成が完了したら、Jupyter Notebook 画面を開いて、Jupyter Notebook 上に以下の接続情報で Snowpark および Snowflake MLを使って Snowflake に接続します。

  • SNOWPARK_OPERATOR_<ユーザー名>ユーザー
  • SNOWPARK_ROLE_<ユーザー名>ロール
  • ML_HOL_WH_<ユーザー名>ウェアハウス
  • ML_HOL_DB_<ユーザー名>データベース
  • ML_HOL_SCHEMA_<ユーザー名>スキーマ

接続のため、以下の情報を Jupyter Notebook 上の次のセルに入力して実行します。

YOUR_NAME = "{分かりやすい名前}"
ACCOUNT = "取得したアカウントID"
PASSOWRD = "設定したパスワード"

詳細は以下となります。

  • YOUR_NAME: 予め作成したリソース名に使ったユーザー名
    • <ユーザー名>で入力したユーザー名を入力してください。
  • ACCOUNT: orgname-account_name形式のアカウント識別子

ACCOUNT の情報は、以下の通り Snowpark 上で取得が可能です。
以下の図の通り、コンソール左下から取得できます。
xxxxxxx.xxxxxxx で ACCOUNT 情報がコピーされるので、. を - に置き換えてから
入力してください。

  • PASSOWRD: SNOWPARK_OPERATOR_<ユーザー名>ユーザーのパスワード
    • こちらは、ロールの作成で任意入力したパスワードを入れてください。

実行したら以下のコードを次のセルに入力し、実行してください。
Snowpark の接続が実行されます。

# Snowpark for Python
from snowflake.snowpark import Session
from snowflake.snowpark.version import VERSION
from snowflake.snowpark.types import StructType, StructField, DoubleType, IntegerType, StringType, FloatType
import snowflake.snowpark.functions as F

# data science libs
import numpy as np

# misc
import json

connection_parameters = {
    "account": ACCOUNT,
    "user": f"SNOWPARK_OPERATOR_{YOUR_NAME}",
    "password": PASSOWRD,
    "role": f"SNOWPARK_ROLE_{YOUR_NAME}",
    "warehouse": f"ML_HOL_WH_{YOUR_NAME}",
    "database": f"ML_HOL_DB_{YOUR_NAME}",
    "schema": f"ML_HOL_SCHEMA",
} 

session = Session.builder.configs(connection_parameters).create()
session.sql_simplifier_enabled = True

snowflake_environment = session.sql('SELECT current_user(), current_version()').collect()
snowpark_version = VERSION

# Current Environment Details
print('\nConnection Established with the following parameters:')
print('User                        : {}'.format(snowflake_environment[0][0]))
print('Role                        : {}'.format(session.get_current_role()))
print('Database                    : {}'.format(session.get_current_database()))
print('Schema                      : {}'.format(session.get_current_schema()))
print('Warehouse                   : {}'.format(session.get_current_warehouse()))
print('Snowflake version           : {}'.format(snowflake_environment[0][1]))
print('Snowpark for Python version : {}.{}.{}'.format(snowpark_version[0],snowpark_version[1],snowpark_version[2]))

問題なく接続ができると、以下の結果が次のセルに出力されます。

Connection Established with the following parameters:
User                        : SNOWPARK_OPERATOR_{ユーザー名}
Role                        : "SNOWPARK_ROLE_{ユーザー名}"
Database                    : "ML_HOL_DB_{ユーザー名}"
Schema                      : "ML_HOL_SCHEMA"
Warehouse                   : "ML_HOL_WH_{ユーザー名}"
Snowflake version           : 8.4.1
Snowpark for Python version : 1.8.0

こちらで、Snowpark ML を実行するための Windows ローカル環境を用意してみたは完了となります。
Jupyter Notebook 上で Snowpark ML が使用できるようになりました!

まとめ

今回、requirements.txt のことを初めて知りました。いままで Notebook 上で一つずつインポートしていたのでとても便利だなと思いました。これから環境構築のスタンダートにしたいです。 今後も開発が便利になるような機能があればこちらで紹介していきます!