サードパーティパッケージの使用¶
ステージを使用して、サードパーティのパッケージをインポートできます。Python UDFsを作成するときにインストールするAnacondaパッケージを指定することもできます。
このトピックの内容:
アーティファクトリポジトリ概要¶
アーティファクトリポジトリを使用すると、Snowpark Pythonのユーザー定義関数(UDFs)とストアドプロシージャ内で、Python Package Index(PyPI)からPythonパッケージを直接使用できるので、SnowflakeでのPythonを使用したアプリケーションの構築とスケーリングが簡単になります。
始めましょう¶
Snowflakeのデフォルトのアーティファクトリポジトリ(snowflake.snowpark.pypi_shared_repository)を使用して、PyPI パッケージに接続し、Snowpark UDFs とプロシージャ内にインストールします。
このリポジトリを使用する前に、アカウント管理者(ACCOUNTADMIN ロールが付与されているユーザー)から SNOWFLAKE.PYPI_REPOSITORY_USER データベースロールを自分のロールに付与してもらう必要があります。
GRANT DATABASE ROLE SNOWFLAKE.PYPI_REPOSITORY_USER TO ROLE some_user_role;
アカウント管理者は、アカウント内のすべてのユーザーにこのデータベースロールを付与することもできます。
GRANT DATABASE ROLE SNOWFLAKE.PYPI_REPOSITORY_USER TO ROLE PUBLIC;
このロールがあれば、リポジトリからパッケージをインストールできます。UDF を作成するときは、ARTIFACT_REPOSITORY パラメーターをアーティファクトリポジトリ名に設定します。また、PACKAGES パラメーターはアーティファクトリポジトリから派生するパッケージの名前のリストに設定します。次の例では、アーティファクトリポジトリが PyPI で構成されているため、パッケージ scikit-learn は PyPI をソースとしています。
CREATE OR REPLACE FUNCTION sklearn_udf()
RETURNS FLOAT
LANGUAGE PYTHON
RUNTIME_VERSION = 3.9
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_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();
注釈
パッケージのバージョンを指定するには、次のように追加します。
PACKAGES = ('scikit-learn==1.5')
x86用にのみビルドされたパッケージ¶
パッケージがx86専用に構築されている場合は、次の例のように、x86 CPU アーキテクチャを使用するウェアハウス(MEMORY_1X_x86 または MEMORY_16X_x86)のいずれかを選択してから 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
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();
詳細については、 Snowpark用に最適化されたウェアハウス をご参照ください。
アーティファクトリポジトリは、以下のような UDF およびストアドプロシージャクライアント APIs で使用できます。
使用する場合は、以下のパラメーターを指定してください。
ARTIFACT_REPOSITORY
PACKAGES
そして、PACKAGES フィールドにパッケージ名を入力します。
次の例をご参照ください。
... ARTIFACT_REPOSITORY="snowflake.snowpark.pypi_shared_repository", PACKAGES=["urllib3", "requests"], ...
トラブルシューティング¶
関数またはプロシージャ作成部分のパッケージインストールが失敗した場合は、ローカルで次のpipコマンドを実行して、パッケージ仕様が有効かどうかを確認します。
pip install <package name> --only-binary=:all: --python-version 3.9 –platform <platform_tag>
制限事項¶
プライベートリポジトリへのアクセスはサポートされていません。
ノートブックではこの機能を直接使用することはできません。ただし、ノートブック内で PyPI を使用する UDF またはストアドプロシージャは使用できます。
匿名ストアドプロシージャ内でアーティファクトリポジトリを使用することはできません。
注釈
Snowflakeは、外部ソースからのPythonパッケージのセキュリティをチェックしたり、キュレーションしたりすることはありません。あなたには、これらのパッケージを評価し、安全で信頼できるものであることを確認する責任があります。
Snowflakeは、事前に通知することなく、有害または危険な可能性のあるパッケージをブロックまたは削除する権利を留保します。これはプラットフォームの完全性を守るためです。
Snowflakeステージを介したパッケージのインポート¶
Snowflakeステージを使用してパッケージをインポートできます。一般的な制限 で定義されたガイドラインに従う任意のPythonコードを取り込むことができます。詳細については、 ステージからアップロードされたコードを使用したPython UDF の作成 をご参照ください。
純粋なPythonパッケージまたはネイティブコード付きのパッケージはSnowflakeステージを通してのみアップロードできます。
例として、以下の 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ロールの有効化 を参照してください。
Sign in to Snowsight。
In the navigation menu, select 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]))