サードパーティパッケージの使用

ステージを使用して、サードパーティのパッケージをインポートできます。Python UDFsを作成するときにインストールするAnacondaパッケージを指定することもできます。

このトピックの内容:

Snowflakeステージを介したパッケージのインポート

Snowflakeステージを使用してパッケージをインポートできます。 一般的な制限 で定義されたガイドラインに従う任意のPythonコードを取り込むことができます。詳細については、 ステージからアップロードされたコードを使用したPython UDFの作成 をご参照ください。

Anacondaのサードパーティパッケージの使用

便宜上、Anacondaによって構築および提供されている多くの人気のあるオープンソースのサードパーティPythonパッケージが、Snowflake仮想ウェアハウス内ですぐに使用できるようになっています。Snowflakeの標準的な消費ベースの価格設定を除けば、Anacondaパッケージのそのような使用に追加費用はかかりません。Anacondaパッケージは現在Snowpark Container Services(SPCS)内では使用できません。SPCS のコンテナイメージでPythonパッケージを使用する必要がある場合は、pipを使用して PyPi からそのようなパッケージをインストールできます。

Anacondaのサードパーティパッケージのリストを表示するには、 Anaconda Snowflakeチャネル をご参照ください。

新しいパッケージの追加をリクエストするには、Snowflakeコミュニティの Snowflakeのアイデア ページにアクセスします。 Python Packages & Libraries カテゴリを選択し、誰かがすでにリクエストを送信しているかどうかを確認します。リクエスト済みの場合は、それに投票します。それ以外の場合は、 New Idea をクリックして提案を送信します。

はじめるにあたり

Snowflake内でAnacondaが提供するパッケージの使用を開始する前に、 Snowflakeサードパーティ規約 に同意する必要があります。

注釈

規約に同意するには、組織管理者(ORGADMIN ロールを使用)である必要があります。Snowflake アカウントで規約に同意する必要があるのは一度だけです。 アカウントの ORGADMIN ロールの有効化 をご参照ください。

  1. Snowsight にサインインします。

  2. Admin » Billing & Terms を選択します。

  3. Anaconda セクションで、 Enable を選択します。

  4. Anaconda Packages ダイアログで、リンクをクリックして Snowflakeサードパーティ規約ページ を確認します。

  5. 規約に同意する場合は、 Acknowledge & Continue を選択します。

利用規約に同意しようとしたときにエラーが表示された場合は、ユーザープロファイルに名、姓、または電子メールアドレスが含まれていない可能性があります。管理者ロールを持っている場合は、 ユーザープロファイルにユーザー詳細を追加する を参照して、 Snowsight を使用してプロファイルを更新してください。または、アカウント管理者に連絡して アカウントを更新してください

パッケージの表示と使用

利用可能なパッケージの表示

Information Schemaの PACKAGES ビューをクエリすると、使用可能なすべてのパッケージとそのバージョン情報を表示できます。

select * from information_schema.packages where language = 'python';
Copy

numpy などの特定のパッケージに関するバージョン情報を表示するには、次のコマンドを使用します。

select * from information_schema.packages where (package_name = 'numpy' and language = 'python');
Copy

注釈

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

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 py38_env -c https://repo.anaconda.com/pkgs/snowflake python=3.8 numpy pandas
Copy

プラットフォームの違いにより、ローカルのconda環境がサーバー環境と完全に同じでない場合があることに注意してください。

ベストプラクティス

create function ステートメント内で、パッケージ仕様(例えば、 packages = ('numpy','pandas'))は、UDFが直接使用している最上位のパッケージのみを指定する必要があります。Anacondaはパッケージの依存関係管理を実行し、必要な依存関係を自動的にインストールします。このため、依存関係パッケージを指定しないでください。

パッケージのバージョンを指定しない場合、Anacondaはパッケージの最新バージョンとその依存関係をインストールします。通常、特定のパッケージバージョンを指定する必要はありません。 create function コマンドを使用してUDFを作成すると、バージョン解決が1回実行されることに注意してください。その後、結果のバージョン解決は凍結され、この特定のUDFが実行されるときに同じパッケージのセットが使用されます。

create function ステートメント内でパッケージ仕様を使用する方法の例については、 インラインハンドラーでのパッケージのインポート をご参照ください。

サードパーティパッケージの既知の問題

単一行予測によるパフォーマンス

Scikit-learnやTensorFlowなどの一部のデータサイエンスフレームワークは、単一行のML予測を行うときに遅くなる可能性があります。

パフォーマンスを向上させるには、単一行の予測ではなくバッチ予測を実行します。これを行うには、入力データセットをSnowflake配列に変換し、配列を予測コードにフィードします。バッチ処理は、 表形式のPython UDTFsARRAY_AGG 関数、 表形式のJava UDFs (UDTFs)、または 表形式 JavaScript UDFs (UDTFs) を使用して実行できます。

ベクトル化されたPython UDFs を使用することもできます。これを使用して、入力行をバッチで受け取るPython関数を定義できます。この関数では、機械学習またはデータサイエンスライブラリの動作が最適化されています。詳細については、 ベクトル化されたPython UDFs をご参照ください。

データサイエンスライブラリからのオンデマンドでのデータのダウンロード

NLTKKerasspaCy などの一部のデータサイエンスライブラリは、追加のコーパス、データ、またはモデルをオンデマンドでダウンロードする機能を提供します。

ただし、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(...)
Copy
import xgboost as xgb
model = xgb.XGBRegressor(n_jobs=1)
Copy

TensorFlow/Keras

予測にTensorflow/Kerasを使用する場合は、Model.predictではなくModel.predict_on_batchを使用してください。

例:

import keras
model = keras.models.load_model(...)
model.predict_on_batch(np.array([input]))
Copy