サードパーティパッケージの使用¶
ステージを使用して、サードパーティのパッケージをインポートできます。Python UDFsを作成するときにインストールするAnacondaパッケージを指定することもできます。
このトピックの内容:
アーティファクトリポジトリ概要¶
アーティファクトリポジトリでは、Pythonパッケージインデックス(PyPI)にあるPythonパッケージをSnowpark Pythonユーザー定義の関数(UDFs)やストアドプロシージャ内で直接使用することができます。これにより、SnowflakeでPythonを利用したアプリケーションの構築と拡張が容易になります。
始めましょう¶
Snowflakeには snowflake.snowpark.pypi_shared_repository
というデフォルトのアーティファクトリポジトリがあり、Snowpark UDFs およびプロシージャ内の PyPI パッケージの接続とインストールに使用します。ユーザーがこのリポジトリを使用するためには、アカウント管理者(ACCOUNTADMIN ロールを付与されたユーザー)が SNOWFLAKE.PYPI_REPOSITORY_USER データベースロールをユーザーのロールに付与する必要があります。
GRANT DATABASE ROLE SNOWFLAKE.PYPI_REPOSITORY_USER TO ROLE some_user_role;
このロールをアカウント内の全ユーザーに付与するために、アカウント管理者は SNOWFLAKE.PYPI_REPOSITORY_USER データベースロールを PUBLIC ロールに付与することができます。
GRANT DATABASE ROLE SNOWFLAKE.PYPI_REPOSITORY_USER TO ROLE PUBLIC;
その後、リポジトリからパッケージをインストールします。UDF を作成するときは、 ARTIFACT_REPOSITORY
パラメーターにアーティファクトリポジトリ名をセットします。また、 ARTIFACT_REPOSITORY_PACKAGES
パラメーターに、アーティファクトリポジトリから取得するパッケージ名のリストをセットします。以下の例では、アーティファクトリポジトリが PyPI で構成されているため、パッケージ scikit-learn
は PyPI からソースされています。
注釈
パッケージのバージョンを指定するには、次のように追加します。
ARTIFACT_REPOSITORY_PACKAGES = ('scikit-learn==1.5')
CREATE OR REPLACE FUNCTION sklearn_udf()
RETURNS FLOAT
LANGUAGE PYTHON
RUNTIME_VERSION = 3.9
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
ARTIFACT_REPOSITORY_PACKAGES = ('scikit-learn')
HANDLER = 'udf'
AS
$$
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
def udf():
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)
model = RandomForestClassifier()
model.fit(X_train, y_train)
return model.score(X_test, y_test)
$$;
SELECT sklearn_udf();
x86用にのみビルドされたパッケージ¶
パッケージがx86用にのみビルドされている場合は、x86 CPU アーキテクチャを使用するウェアハウスの一つを選択してください: MEMORY_1X_x86
、 MEMORY_16X_x86
。詳細については、 Snowpark用に最適化されたウェアハウス をご参照ください。
そして、次を指定します: RESOURCE_CONSTRAINT=(architecture='x86')
。下の例をご覧ください。
CREATE OR REPLACE FUNCTION pymeos_example()
RETURNS STRING
LANGUAGE PYTHON
HANDLER='main'
RUNTIME_VERSION='3.11'
ARTIFACT_REPOSITORY=snowflake.snowpark.pypi_shared_repository
ARTIFACT_REPOSITORY_PACKAGES=('pymeos') -- dependency pymeos-cffi is x86 only
RESOURCE_CONSTRAINT=(architecture='x86')
AS $$
def main() -> str:
from pymeos import pymeos_initialize, pymeos_finalize, TGeogPointInst, TGeogPointSeq
# Always initialize MEOS library
pymeos_initialize()
sequence_from_string = TGeogPointSeq(
string='[Point(10.0 10.0)@2019-09-01 00:00:00+01, Point(20.0 20.0)@2019-09-02 00:00:00+01, Point(10.0 10.0)@2019-09-03 00:00:00+01]')
sequence_from_points = TGeogPointSeq(instant_list=[TGeogPointInst(string='Point(10.0 10.0)@2019-09-01 00:00:00+01'),
TGeogPointInst(string='Point(20.0 20.0)@2019-09-02 00:00:00+01'),
TGeogPointInst(string='Point(10.0 10.0)@2019-09-03 00:00:00+01')],
lower_inc=True, upper_inc=True)
speed = sequence_from_points.speed()
# Call finish at the end of your code
pymeos_finalize()
return speed
$$;
SELECT pymeos_example();
アーティファクトリポジトリは、以下のような UDF およびストアドプロシージャクライアント APIs で使用できます。
使用する場合は、以下のパラメーターを指定してください。
ARTIFACT_REPOSITORY
ARTIFACT_REPOSITORY_PACKAGES
そして、 ARTIFACT_REPOSITORY_PACKAGES
フィールドにパッケージ名を入力してください。
以下の例をご参照ください。
... ARTIFACT_REPOSITORY="snowflake.snowpark.pypi_shared_repository", ARTIFACT_REPOSITORY_PACKAGES=["urllib3", "requests"], ...
トラブルシューティング¶
関数またはプロシージャの作成部分でパッケージのインストールに失敗しました。以下のpipコマンドをローカルで実行して、パッケージの指定が有効かどうかを確認できます。
pip install <package name> --only-binary=:all: --python-version 3.9 –platform <platform_tag>
制限事項¶
現在、Snowflakeはバイナリ配布(ホイールファイル)のみを許可しています。
プライベートリポジトリへのアクセスはサポートされていません。
この機能はNotebooksでは直接使用できません。しかし、ノートブック内で PyPI パッケージを使用する UDF やストアドプロシージャを使用することはできます。
匿名ストアドプロシージャ内でアーティファクトレポを使用することはできません。
注釈
Snowflakeは、外部ソースからのPythonパッケージのセキュリティチェックやキュレーションは行いません。あなたは、これらのパッケージが安全で信頼できるものであることを評価し、保証する責任があります。
Snowflakeは、事前に通知することなく、有害または危険な可能性のあるパッケージをブロックまたは削除する権利を留保します。これはプラットフォームの完全性を守るためです。
Snowflakeステージを介したパッケージのインポート¶
Snowflakeステージを使用してパッケージをインポートできます。 一般的な制限 で定義されたガイドラインに従う任意のPythonコードを取り込むことができます。詳細については、 ステージからアップロードされたコードを使用したPython UDF の作成 をご参照ください。
純粋なPythonパッケージまたはネイティブコード付きのパッケージはSnowflakeステージを通してのみアップロードできます。アップロードしたパッケージにx86 CPU アーキテクチャへの依存関係がある場合、 Snowpark用に最適化されたウェアハウス を使用し、 RESOURCE_CONSTRAINT
ウェアハウスプロパティを使用し、 CPU アーキテクチャをx86とする必要があります。
例として、以下の SQL を使用することができます。これは、x86 CPU アーキテクチャを持つ so_warehouse
という名前のウェアハウスを作成するものです。
CREATE WAREHOUSE so_warehouse WITH
WAREHOUSE_SIZE = 'LARGE'
WAREHOUSE_TYPE = 'SNOWPARK-OPTIMIZED'
RESOURCE_CONSTRAINT = 'MEMORY_16X_X86';
Stageからインポートしてネイティブ・コードを含むパッケージをインストールするには、以下の例を使用します。
CREATE or REPLACE function native_module_test_zip()
RETURNS string
LANGUAGE python
RUNTIME_VERSION=3.9
RESOURCE_CONSTRAINT=(architecture='x86')
IMPORTS=('@mystage/mycustompackage.zip')
HANDLER='compute'
as
$$
def compute():
import mycustompackage
return mycustompackage.mycustompackage()
$$;
Anacondaのサードパーティパッケージの使用¶
便宜上、Anacondaによって構築および提供されている多くの人気のあるオープンソースのサードパーティPythonパッケージが、Snowflake仮想ウェアハウス内ですぐに使用できるようになっています。Snowflakeの標準的な消費ベースの価格設定を除けば、Anacondaパッケージのそのような使用に追加費用はかかりません。Snowflake Notebooks を除き、Anaconda パッケージは現在 Snowpark Container Services (SPCS) 内では使用できません。SPCS のコンテナイメージで Python パッケージを使用するには、pip を使用して PyPi からこれらのパッケージをインストールします。
Anacondaのサードパーティパッケージのリストを表示するには、 Anaconda Snowflakeチャネル をご参照ください。
新しいパッケージの追加をリクエストするには、Snowflakeコミュニティの Snowflakeのアイデア ページにアクセスします。 Python Packages & Libraries カテゴリを選択し、誰かがすでにリクエストを送信しているかどうかを確認します。リクエスト済みの場合は、それに投票します。それ以外の場合は、 New Idea をクリックして提案を送信します。
アップロードしたパッケージに x86 CPU アーキテクチャへの依存がある場合、 Snowpark用に最適化されたウェアハウス を使用し、 RESOURCE_CONSTRAINT ウェアハウスプロパティを使用し CPU アーキテクチャを x86 とする必要があります。
はじめるにあたり¶
Snowflake内でAnacondaが提供するパッケージの使用を開始する前に、 外部製品規約 に同意する必要があります。
注釈
条件を受け入れるには、 ORGADMIN ロールを使用する必要があります。お客様のSnowflakeアカウントでは、 External Offerings Terms に一度だけ同意する必要があります。ORGADMIN ロールにアクセスできない場合は、 アカウントのORGADMINロールの有効化 を参照してください。
Snowsight にサインインします。
Admin » Terms を選択します。
Anaconda セクションで、 Enable を選択します。
Anaconda Packages ダイアログで、リンクをクリックして 外部製品規約ページ を確認します。
規約に同意する場合は、 Acknowledge & Continue を選択します。
外部提供条件 に同意しようとした際にエラーが発生した場合、ユーザープロファイルの姓、名、電子メールアドレスなどの情報が不足していることが原因である可能性があります。管理者権限がある場合は、 Snowsight を使用してプロファイルを更新する ユーザープロファイルにユーザー詳細を追加する を参照してください。または、アカウント管理者に連絡して アカウントを更新してください。
パッケージの表示と使用¶
利用可能なパッケージの表示¶
Information Schemaの PACKAGES ビューをクエリすると、使用可能なすべてのパッケージとそのバージョン情報を表示できます。
select * from information_schema.packages where language = 'python';
numpy
などの特定のパッケージに関するバージョン情報を表示するには、次のコマンドを使用します。
select * from information_schema.packages where (package_name = 'numpy' and language = 'python');
注釈
Anaconda Snowflakeチャネルの一部のパッケージは、UDFsが制限されたエンジン内で実行されるため、Snowflake UDFs内での使用を目的としていません。詳細については、 優れたセキュリティプラクティスに準拠する をご参照ください。
Python UDFsを呼び出すクエリがSnowflakeウェアハウス内で実行されると、ユーザーに代わってAnacondaパッケージをシームレスにインストールし、仮想ウェアハウスにキャッシュします。
インポートされたパッケージの表示¶
DESCRIBE FUNCTION コマンドを実行すると、UDFまたはUDTFが使用しているパッケージとモジュールのリストを表示できます。Pythonでハンドラーが実装されているUDFに対してDESCRIBE FUNCTIONコマンドを実行すると、インポートされたモジュールとパッケージのリスト、インストールされたパッケージ、関数シグネチャ、およびその戻り値の型など、いくつかのプロパティの値が返されます。
UDFの識別子を指定するときは、関数パラメータ型がある場合は必ず含めてください。
desc function stock_sale_average(varchar, number, number);
Anacondaパッケージの使用¶
インポートされたAnacondaパッケージをPython UDF で使用する方法の例については、 インラインハンドラーでのパッケージのインポート をご参照ください。
パッケージポリシーの設定¶
パッケージポリシーを使用して、アカウントレベルでAnacondaからサードパーティPythonパッケージの許可リストとブロックリストを設定できます。これにより、より厳しい監査やセキュリティ要件に対応できるようになり、環境内で利用可能なパッケージやブロックされるパッケージをより細かく制御できるようになります。詳細については、 パッケージポリシー をご参照ください。
コールドウェアハウスでのパフォーマンス¶
より効率的なリソース管理のために、新しくプロビジョニングされた仮想ウェアハウスにはAnacondaパッケージがプレインストールされていません。代わりに、Anacondaパッケージは、UDFが初めて使用されるときにオンデマンドでインストールされます。パッケージは、同じウェアハウスでの将来のUDF実行のためにキャッシュされます。ウェアハウスが一時停止されると、キャッシュは削除されます。これにより、最初にUDFを使用したとき、またはウェアハウスを再開した後に、パフォーマンスが低下する可能性があります。追加の遅延は約30秒になる可能性があります。
ローカル開発とテスト¶
開発とテストのためにローカルマシン上にconda環境を作成できるように、AnacondaはSnowflake Python UDF環境でサポートされているパッケージとバージョンのサブセットをミラーリングするSnowflakeチャネルを作成しました。Snowflake condaチャネルは、Anacondaの利用規約の補足組み込みソフトウェア条項に基づいて、無料でローカルテストおよび開発に使用できます。
例えば、Snowflakeチャネルを使用してローカルで新しいconda環境を作成するには、コマンドラインで次のように入力します。
conda create --name py39_env -c https://repo.anaconda.com/pkgs/snowflake python=3.9 numpy pandas
プラットフォームの違いにより、ローカルのconda環境がサーバー環境と完全に同じでない場合があることに注意してください。
ベストプラクティス¶
create function
ステートメント内で、パッケージ仕様(例えば、 packages = ('numpy','pandas')
)は、UDFが直接使用している最上位のパッケージのみを指定する必要があります。Anacondaはパッケージの依存関係管理を実行し、必要な依存関係を自動的にインストールします。このため、依存関係パッケージを指定しないでください。
パッケージのバージョンを指定しない場合、Anacondaはパッケージの最新バージョンとその依存関係をインストールします。通常、特定のパッケージバージョンを指定する必要はありません。 create function
コマンドを使用してUDFを作成すると、バージョン解決が1回実行されることに注意してください。その後、結果のバージョン解決は凍結され、この特定のUDFが実行されるときに同じパッケージのセットが使用されます。
create function
ステートメント内でパッケージ仕様を使用する方法の例については、 インラインハンドラーでのパッケージのインポート をご参照ください。
サードパーティパッケージの既知の問題¶
単一行予測によるパフォーマンス¶
Scikit-learnやTensorFlowなどの一部のデータサイエンスフレームワークは、単一行のML予測を行うときに遅くなる可能性があります。パフォーマンスを向上させるには、単一行の予測ではなくバッチ予測を実行します。これを行うためには、ベクトル化されたPython UDFs を使用することもできます。これを使用して、入力行をバッチで受け取るPython関数を定義できます。この関数では、機械学習またはデータサイエンスライブラリの動作が最適化されています。詳細については、 ベクトル化されたPython UDFs をご参照ください。
データサイエンスライブラリからのオンデマンドでのデータのダウンロード¶
NLTK、 Keras、 spaCy などの一部のデータサイエンスライブラリは、追加のコーパス、データ、またはモデルをオンデマンドでダウンロードする機能を提供します。
ただし、Snowflakeのセキュリティ上の制約により、オンデマンドダウンロードはPython UDFsでは機能しません。これにより、ネットワークアクセスやファイルへの書き込みなどの一部の機能が無効になります。
この問題を回避するには、データをローカル環境にダウンロードしてから、Snowflakeステージを介してUDFに提供します。
XGBoost¶
並列予測またはトレーニングのために UDF または UDTF で XGBoost を使用する場合は、各 XGBoost インスタンスの並行性数を1に設定する必要があります。これにより、Snowflake環境で実行するときにXGBoostが最適なパフォーマンスになるように構成されます。
例:
import xgboost as xgb
model = xgb.Booster()
model.set_param('nthread', 1)
model.load_model(...)
import xgboost as xgb
model = xgb.XGBRegressor(n_jobs=1)
TensorFlow/Keras¶
予測にTensorflow/Kerasを使用する場合は、Model.predictではなくModel.predict_on_batchを使用してください。
例:
import keras
model = keras.models.load_model(...)
model.predict_on_batch(np.array([input]))