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

ステージを使用して、サードパーティのパッケージをインポートできます。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;
Copy

アカウント管理者は、アカウント内のすべてのユーザーにこのデータベースロールを付与することもできます。

GRANT DATABASE ROLE SNOWFLAKE.PYPI_REPOSITORY_USER TO ROLE PUBLIC;
Copy

このロールがあれば、リポジトリからパッケージをインストールできます。UDF を作成するときは、ARTIFACT_REPOSITORY パラメーターをアーティファクトリポジトリ名に設定します。また、PACKAGES パラメーターはアーティファクトリポジトリから派生するパッケージの名前のリストに設定します。次の例では、アーティファクトリポジトリが PyPI で構成されているため、パッケージ scikit-learn は PyPI をソースとしています。

CREATE OR REPLACE FUNCTION sklearn_udf()
  RETURNS FLOAT
  LANGUAGE PYTHON
  RUNTIME_VERSION = 3.12
  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();
Copy

注釈

パッケージのバージョンを指定するには、次のように追加します。

PACKAGES = ('scikit-learn==1.5')
Copy

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

詳細については、 Snowpark用に最適化されたウェアハウス をご参照ください。

アーティファクトリポジトリは、以下のような UDF およびストアドプロシージャクライアント APIs で使用できます。

使用する場合は、以下のパラメーターを指定してください。

  • ARTIFACT_REPOSITORY

  • PACKAGES

そして、PACKAGES フィールドにパッケージ名を入力します。

次の例をご参照ください。

...
ARTIFACT_REPOSITORY="snowflake.snowpark.pypi_shared_repository",
PACKAGES=["urllib3", "requests"],
...
Copy

トラブルシューティング

関数またはプロシージャ作成部分のパッケージインストールが失敗した場合は、ローカルで次のpipコマンドを実行して、パッケージ仕様が有効かどうかを確認します。

pip install <package name> --only-binary=:all: --python-version 3.12 –platform <platform_tag>
Copy

制限事項

  • プライベートリポジトリへのアクセスはサポートされていません。

  • ノートブックではこの機能を直接使用することはできません。ただし、ノートブック内で 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';
Copy

Stageからインポートしてネイティブ・コードを含むパッケージをインストールするには、以下の例を使用します。

CREATE or REPLACE function native_module_test_zip()
  RETURNS string
  LANGUAGE python
  RUNTIME_VERSION=3.12
  RESOURCE_CONSTRAINT=(architecture='x86')
  IMPORTS=('@mystage/mycustompackage.zip')
  HANDLER='compute'
  as
  $$
  def compute():
      import mycustompackage
      return mycustompackage.mycustompackage()
  $$;
Copy

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

Snowflakeは、Anacondaによって構築されたPythonパッケージの厳選されたセットへのアクセスを提供します。これらのパッケージは、追加費用なしでSnowflakeのPython機能に直接統合されます。

ライセンス規約

  • Snowflake: 本ドキュメントに記載されているAnacondaの使用制限を含む、既存のSnowflakeカスタマー契約に準拠します。Snowflake内での使用については、Anacondaの個別の規約は適用されません。

  • ローカル開発: Snowflakeの `Anaconda専用リポジトリから<https://repo.anaconda.com/pkgs/snowflake/>`_ :Anacondaの組み込みエンドカスタマー規約およびリポジトリに掲載されたAnacondaの利用規約に準拠します。ローカルでの使用は、Snowflakeでのデプロイを想定したワークロードの開発/テストに限定されます。

ユーザーガイドライン

許可された用途

  • Snowflake内: サポートされているすべてのPython機能で自由にパッケージを使用できます。

    注釈

    CREATE TABLE ステートメントの DEFAULT 句内で UDF を呼び出すことはできません。ただし、 Snowpark Container Services の Snowflake Notebooks で自由に利用できるパッケージは例外です。

  • ローカル開発: SnowflakeのAnaconda専用リポジトリからパッケージを使用して、Snowflake向けのワークロードを開発またはテストします。

禁止されている用途

以下のようなパッケージの使用は禁止されています。

  • Snowflakeに関係のないプロジェクトにパッケージを使用する。

  • パッケージコンテンツを外部でホストまたはミラーする。

  • 著作権表示またはライセンス表示を削除または変更する。

パッケージの検索と管理

必要なパッケージが見つかりませんか?

サポートとセキュリティ

サポート範囲

Snowflakeは、以下などの標準パッケージのサポートを提供します。

  • インストールガイダンス

  • 環境のトラブルシューティング

  • 統合のサポート

保証と SLA

Anacondaパッケージは、そのまま 提供されるサードパーティのソフトウェアであり、Snowflakeの保証または SLA (サービスレベル契約)の対象外です。

セキュリティ慣行

Snowflakeが提供するAnacondaパッケージは、信頼できるインフラストラクチャ上に構築され、デジタル署名されています。

詳細については、 Anacondaのセキュリティ慣行 をご参照ください。

コンプライアンスとライセンス

各パッケージには独自のオープンソースライセンスが含まれています。お客様は、本ドキュメントで説明されている使用のガイドラインに加え、各パッケージのライセンス規約を遵守する必要があります。

よくある質問

  • 他のAnacondaチャネル(conda-forgeやAnaconda Defaultsなど)のパッケージを使用できますか? できません。他のチャネルは別のサービスであり、Anacondaからの商用ライセンスが必要になることがあります。

  • Snowflakeに関連していないプロジェクトに、これらのパッケージをローカルで使用できますか? できません。ローカルでの使用は、Snowflakeのデプロイを目的としたワークロードの開発またはテストに厳しく制限されています。その他の用途には、別のAnacondaライセンスが必要です。

  • Snowpark Container Servicesに別のライセンスが必要になるのはなぜですか? カスタムのDockerイメージでパッケージを使用することは、Snowflakeの統合環境の範囲を超えているため、別のAnacondaライセンスが必要になります。

パッケージの表示と使用

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

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

プラットフォームの違いにより、ローカルの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 をご参照ください。

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

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