pipでSnowpark ML Modeling用のローカル開発環境を準備する

クイックスタート実施を題材に、ローカルのSnowpark ML開発環境の準備について、pipで行う場合をご紹介します。
2023.11.14

データアナリティクス事業本部 機械学習チームの鈴木です。

現在パブリックプレビュー版のSnowpark ML Modelingですが、既にクイックスタートも公開されております。

今回はローカル環境にpipでJupyter環境を準備する方法について、このクイックスタート実施を題材にしつつ整理してみたのでご紹介します。

この記事の内容

今回はSnowpark MLのローカル開発環境をpipで準備する方法をまとめましたのでご紹介します。

以下の『Intro to Machine Learning with Snowpark ML for Python』はSnowpark MLを使ったデータの前処理〜モデルの作成・デプロイまでが学べるクイックスタートです。Snowpark ML ModelingはSnowpark MLの主要な機能の一つで、クイックスタートでは主にこの機能を使った開発が紹介されています。

今回はこのクイックスタートを行うための準備を目標とします。一部クイックスタート固有の作業が出てきますが、自身の環境を作成したい場合は適宜読み替えて頂ければと思います。

Snowpark MLのローカル開発環境はcondaまたはpipで構築する2つの方法がドキュメントで紹介されており、この記事はpipで構築例になります。

Snowpark MLを使った開発にはSnowpark Pythonも必要ですので、合わせて準備を行いました。

ガイドは以下を参考にしました。

補足事項として、Snowpark Python単体の時はPandasのバージョンは2系で問題なかったのですが、Snowpark MLは1系に依存していることがpipしてみると分かったのでそれを踏まえて環境構築しています。

なお、記事執筆時点ではSnowpark ML Modelingはパブリックプレビューですのでご注意ください。

前提

以下に記載の通り、事前準備をしました。

実行環境

  • macOS Ventura バージョン13.6(Apple M1チップ)
  • Python 3.10.13

特に自分のローカル環境ではpyenvを使ってPythonのバージョン指定をできるようにしていたので、以下のようにしてバージョン指定をしました。

pyenv local 3.10.13

python --version
# Python 3.10.13

pip -V
# pip 23.0.1 from ローカルのパス/pip (python 3.10)

クイックスタートから引用するコードについて

以降の内容では、『Intro to Machine Learning with Snowpark ML for Python クイックスタート』のコードを引用します。このコードはApache-2.0 licenseです。

引用元のノートブックとライセンス表記については、以下のレポジトリをご確認ください。

やってみた

1. Python環境のセットアップ

まずは作業用ディレクトリを作成しました。

mkdir snowparkml
cd snowparkml

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

python -m venv snowparkml

source snowparkml/bin/activate

次にrequirements.txtを準備しました。今回は以下のようにしました。

requirements.txt

pandas==1.5.3
pyarrow<10.1.0,>=10.0.1
snowflake-snowpark-python==1.5.1
notebook==7.0.0
snowflake-ml-python==1.0.10

必要なライブラリをインストールしました。

pip install -r requirements.txt

ポイントとしては、requirements.txtについて、使用するsnowflake-ml-pythonは記事執筆時点で最新の1.0.10にしました。依存関係として、snowflake-ml-python/requirements.txtに記載のpandasを確認すると1.5.3になっていたため、pandasのバージョンも合わせました。

Seabornなど、開発を進める中で追加で必要になるライブラリが出てくると思いますので、その時は適宜requirements.txtに追加してインストールする形になります。

2. Anacondaのサードパーティパッケージの使用への同意

snowflake DOCUMENTATIONのうち、『Anacondaのサードパーティパッケージの使用』に記載の方法でSnowflakeサードパーティ規約に同意する必要があります。

Billing & Termsを開き、Anacondaの欄のEnableをクリックしました。

Billing & Terms

ポップアップで規約の確認と同意を求められるので、確認の上問題なければAcknowledge & Continueをクリックしました。

Anaconda Packages

しばらくして画面をリロードすると、以下のようになりました。

承認

3. Jupyter Notebook環境の起動確認

インストールしたライブラリが使えるか確認しました。

ローカルのPython環境から以下のコマンドを実行しました。

jupyter notebook

ブラウザでJupyter Notebookが起動するので、新しいノートブックを作成し、Python 3(ipykernel)を選択しました。

新しいノートブックを作成

カーネルの選択

ノートブックが起動したら、以下のようにOneHotEncoderが読み込めるか確認しました。

from snowflake.ml.modeling.preprocessing import OneHotEncoder

help(OneHotEncoder)

処理が成功し、ちゃんと読み込めていそうでした。

コードの実行

4. Snowflake環境の準備(ウェアハウスなど)

Snowflake側のデータベースやウェアハウスの作成をします。これは次に行うロールの作成のため必要になります。(アクセス権限を追加するため)

この記事では具体的にクイックスタートの以下のページの記載のまま、リソースの作成をしました。自分の課題のために作成する場合は、必要な箇所を適宜読み替えてお試しください。

Intro to Machine Learning with Snowpark ML for Python - 2. Set up the Snowflake environment』のSQLを使いました。

SnowSightよりSQLワークシートを開き、以下のSQLを実行しました。

USE ROLE ACCOUNTADMIN;
CREATE OR REPLACE WAREHOUSE ML_HOL_WH; --by default, this creates an XS Standard Warehouse
CREATE OR REPLACE DATABASE ML_HOL_DB;
CREATE OR REPLACE SCHEMA ML_HOL_SCHEMA;
CREATE OR REPLACE STAGE ML_HOL_ASSETS; --to store model assets

-- create csv format
CREATE FILE FORMAT IF NOT EXISTS ML_HOL_DB.ML_HOL_SCHEMA.CSVFORMAT 
    SKIP_HEADER = 1 
    TYPE = 'CSV';

-- create external stage with the csv format to stage the diamonds dataset
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;

データはステージの作成までにとどめられていますが、これはクイックスタートの中盤でSnowpark Pythonでデータを読み込んで続きの処理を行うためです。

実行すると以下のようになりました。

実行結果

ウェアハウスも作成されていました。

作成されたウェアハウス

5. Snowflake環境の準備(ロール・ユーザー)

以下のようにSNOWPARK_ROLEロールを付与したSNOWPARK_OPERATORユーザーを作成しました。GRANT ALL PRIVILEGESで少し広めに権限を与えているところはありますが、ひとまず以下で作成したユーザーでクイックスタートを進めることができました。

-- 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 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;

終わりに

以上にてpipでの開発環境の準備は終わりになります。

Snowpark MLの使い心地についてはクイックスタートが非常にわかりやすかったのでぜひお試し頂ければと思います。

クイックスタートを通して分かるSnowpark ML Modelingのポイントについては以下の記事にまとめましたのでご確認ください。

参考になりましたら幸いです。