Snowpark ML: Snowflakeにおけるエンドツーエンドの機械学習¶
注釈
Snowpark ML Modeling API はパッケージバージョン1.1.1の時点で一般公開であり、Snowparkモデルレジストリはパッケージバージョン1.2.0の時点でプレビューとして利用可能です。近日提供予定のSnowpark ML 特徴量のドキュメントをいち早く入手するには、Snowflakeの担当者にお問い合わせください。
Snowpark ML は、モデル開発と運用のためのコンポーネントを含む、Snowflake内にあるエンドツーエンド ML ワークフローのためのPythonライブラリと基になるインフラストラクチャです。Snowpark ML では、前処理、特徴量エンジニアリング、トレーニングに使い慣れたPythonフレームワークを使用できます。データ移動、サイロ化、ガバナンスのトレードオフなしに、モデルを完全にSnowflakeで展開し、管理することができます。
Tip
Snowpark ML でのエンドツーエンドのワークフローの例については、 Snowpark ML を使用した機械学習入門 をご参照ください。
Snowpark ML の主な構成要素¶
Snowpark ML は、エンドツーエンドの機械学習開発と管理プロセスの各段階をサポートする APIs を提供し、その中には以下の主要な機能が含まれています。
また、Snowpark ML はモデルが データにアクセスする 方法も提供します。
Snowpark ML モデリング¶
Snowpark ML Modeling は、scikit-learn、xgboost、lightgbmなどの一般的な機械学習フレームワークを使用して、データの前処理、特徴量エンジニアリング、Snowflakeでのモデル学習をサポートします。この API には、Snowparkに最適化されたウェアハウスが提供するコンピューティングリソースを使用して、スケーラブルなデータ変換を提供できる前処理モジュールも含まれています。
Snowpark ML Operations¶
Snowpark ML Operations(MLOps)は、 Snowpark ML モデルレジストリ を採用しており、Snowpark ML 開発 API を補完します。モデルレジストリは、Snowflakeにおけるモデルのセキュアな展開と管理を可能にし、Snowflakeの内部と外部の両方でトレーニングされたモデルをサポートします。
Snowpark ML Data Access¶
Snowpark ML Data Accessは、機械学習モデルにデータをフィードするためのシンプルで高性能な方法を提供します。
FileSet API は、クエリやSnowpark DataFrame からSnowflake内部ステージにデータを具体化するための、 Python fsspec 準拠の API を提供します。また、データを処理したり、 PyTorch や TensorFlow にフィード したりするための便利なメソッドも提供します。
フレームワークコネクタ のセットは、ネイティブデータローダー形式で、PytorchとTensorflowフレームワーク用に最適化された安全で高パフォーマンスのデータプロビジョニングを提供します。
Snowpark ML のインストール¶
重要
Snowpark Connector for Python ライブラリへの最近の変更により、 PyArrow への依存関係が削除されました。Snowpark ML は PyArrow を必要としますが、Snowpark ML 1.1.2以前では明示的な依存関係はありません。以前のバージョンを使用していて、最近Snowpark Connector for Pythonをアップグレードしている場合は、 PyArrow の手動インストールが必要になる場合があります。これを行うには、プロジェクトでcondaとpipのどちらを使用しているかによって、以下のコマンドのいずれかを使用します。
conda install pyarrow
python -m pip install pyarrow
Snowpark ML のすべての特徴量は、単一のパッケージ、 snowflake-ml-python
で提供されます。
Snowpark ML は、Snowflake condaチャネルから conda
コマンドを使用するか、Python Package Index(PyPI)から pip
を使用してインストールすることができます。Condaがお勧めです。
Snowflake condaチャネルからのSnowpark ML のインストール¶
警告
ARMベースのMac(M1またはM2チップ搭載)上のCondaからSnowpark ML をインストールするには、Conda環境を作成する際にシステムアーキテクチャを指定する必要があります。このためには、 conda create
コマンドで CONDA_SUBDIR=osx-arm64
を CONDA_SUBDIR=osx-arm64 conda create --name snowpark-ml
と設定します。
Snowpark MLをインストールするconda環境を作成します。既存の環境を使用する場合は、このステップをスキップします。
conda create --name snowpark-ml
Conda環境をアクティブにします。
conda activate snowpark-ml
Snowflake condaチャネルからSnowpark MLをインストールします。
conda install --override-channels --channel https://repo.anaconda.com/pkgs/snowflake/ snowflake-ml-python
Tip
Snowpark ML を操作する場合は、可能な限りSnowflake Condaチャネルからパッケージをインストールして、Snowpark ML で検証済みのパッケージを確実に受け取れるようにしてください。
PyPI からのSnowpark ML のインストール¶
標準のPythonパッケージマネージャー、 pip
を使用して、Pythonパッケージインデックス(PyPI)からSnowpark ML パッケージをインストールできます。
警告
conda環境を使用している場合は、このインストール手順を使用しないでください。代わりに condaの命令 を使用します。
プロジェクトディレクトリに移動し、Python仮想環境を有効にします。
cd ~/projects/ml source .venv/bin/activate
Snowpark ML パッケージをインストールします。
python -m pip install snowflake-ml-python
オプションのモデリング依存関係のインストール¶
Snowpark ML Modeling APIs には、Snowpark ML の依存関係としてインストールされていない依存関係を必要とするものがあります。scikit-learnとxgboostパッケージは、Snowpark ML Modelingをインストールするとデフォルトでインストールされますが、lightgbmはオプションの依存関係です。 snowflake.ml.modeling.lightgbm
名前空間のクラスを使う予定の場合は、ご自身でlightgbmをインストールしてください。
以下のコマンドを使用してconda環境をアクティブ化し、Snowflake condaチャンネルからlightgbmをインストールします。
conda activate snowpark-ml
conda install --override-channels --channel https://repo.anaconda.com/pkgs/snowflake/ lightgbm
以下のコマンドを使用して仮想環境をアクティブ化し、pipを使用してlightgbmをインストールします。
.venv/bin/activate
python -m pip install 'snowflake-ml-python[lightgbm]'
SnowflakeはSnowpark ML にオプションの依存関係を追加することがあります。pipを使ってオプションの依存関係をすべてインストールするには
.venv/bin/activate
python -m pip install 'snowflake-ml-python[all]'
Snowpark Pythonの設定¶
Snowpark PythonはSnowpark ML の依存関係であり、Snowpark ML をインストールすると自動的にインストールされます。ご使用のシステムにSnowpark Pythonが設定されていない場合は、追加の構成ステップが必要になることがあります。Snowpark Pythonの設定手順については、 Snowpark Pythonの開発環境の設定 をご参照ください。
Snowflakeへの接続¶
Snowpark ML では、Snowpark Session
オブジェクトを使用してSnowflakeに接続する必要があります。 snowflake.ml.utils.connection_params
モジュールの SnowflakeLoginOptions
関数を使用して、セッションを作成するための構成設定を取得します。この関数は、 SnowSQL 構成ファイル 内の名前付き接続から、または設定した環境変数から、接続設定を読み取ることができます。これらのパラメーターを含むディクショナリを返し、それを使用して接続を作成することができます。
以下の例では、 SnowSQL 構成ファイルの名前付き接続 myaccount
から接続パラメーターを読み取っています。Snowpark Pythonセッションを作成するには、 Session
クラスのビルダーを作成し、ビルダーの configs
メソッドに接続情報を渡します。
from snowflake.snowpark import Session
from snowflake.ml.utils import connection_params
params = connection_params.SnowflakeLoginOptions("myaccount")
sp_session = Session.builder.configs(params).create()
これで、セッションを必要とするSnowpark ML 関数に渡すことができるようになります。
Tip
既存のPython用Snowflakeコネクタ接続からSnowpark Pythonセッションを作成するには、セッションビルダーに接続オブジェクトを渡します。ここで、 connection
はPython用Snowflakeコネクタ接続です。
session = Session.builder.configs({"connection": connection}).create()
ウェアハウスサイズの指定¶
モデルのトレーニングや推論の実行など、Snowpark ML の多くの部分はSnowflakeウェアハウスでコードを実行します。これらの操作は、接続に使用したセッションにより指定されたウェアハウスで実行されます。たとえば、 SnowSQL 構成ファイル の名前付き接続からセッションを作成する場合は、名前付き構成の warehousename
パラメーターを使用してウェアハウスを指定することができます。
ウェアハウスの設定が構成内に存在しない場合は、ここに示すように、 Session
オブジェクトを作成する際にその設定を追加することができます。
from snowflake.snowpark import Session
from snowflake.ml.utils import connection_params
# Get named connection from SnowQSL configuration file
params = connection_params.SnowflakeLoginOptions("myaccount")
# Add warehouse name for model method calls if it's not already present
if "warehouse" not in params:
params["warehouse"] = "mlwarehouse"
sp_session = Session.builder.configs(params).create()
セッションでウェアハウスが指定されていない場合や別のウェアハウスを使用する場合は、セッションの use_warehouse
メソッドを呼び出します。
sp_session.use_warehouse("mlwarehouse")
コストの考慮事項¶
Snowflakeでモデルをトレーニングして使用すると、仮想ウェアハウスでコードを実行することになり、コンピューティングコストが発生します。これらのコストは、モデルの型や学習予測に使用するデータ量によって異なります。Snowflakeのコンピューティングコストに関する一般的な情報については、 コンピューティングコストについて をご参照ください。
参考文献¶
Snowpark ML ModelingおよびSnowpark ML Opsに関する情報については、以下のリソースをご参照ください。
エンドツーエンド ML ワークフロー
Modeling
データアクセス
ML 操作
Snowflakeの担当者にお問い合わせいただくと、現在開発中の他の特徴量に関するドキュメントをいち早く入手できます。
API 参照情報¶
Snowpark ML API リファレンス には、一般に公開されているすべての機能に関するドキュメントが含まれています。インタラクティブなPythonセッションでPythonの help
関数を使用すると、どのクラスの API の詳細なドキュメントも取得できます。例:
from snowflake.ml.modeling.preprocessing import OneHotEncoder
help(OneHotEncoder)