Verwenden von Drittanbieter-Paketen

Stagingbereiche können verwendet werden, um Pakete von Drittanbietern zu importieren. Sie können auch Anaconda-Pakete angeben, die installiert werden sollen, wenn Sie Python-UDFs erstellen.

Unter diesem Thema:

Übersicht Artifact Repository

Mit Artifact Repository können Sie direkt Python-Pakete aus dem Python Package Index (PyPI) innerhalb von benutzerdefinierten Funktionen von Snowpark Python (UDFs) und gespeicherte Prozeduren verwende, sodass das Erstellen und Skalieren von Python-basierten Anwendungen in Snowflake vereinfacht wird.

Erste Schritte

Verwenden Sie die Artifact Repository-Standardoption von Snowflake (snowflake.snowpark.pypi_shared_repository) zum Verbinden und Installieren von PyPI-Paketen innerhalb von Snowpark-UDFs und -Prozeduren.

Bevor Sie dieses Repository verwenden, muss der Kontoadministrator (ein Benutzer, dem die ACCOUNTADMIN-Rolle erteilt wurde) die Datenbankrolle SNOWFLAKE PYPI_REPOSITORY_USER für Ihre Rolle zuweisen:

GRANT DATABASE ROLE SNOWFLAKE.PYPI_REPOSITORY_USER TO ROLE some_user_role;
Copy

Der Kontoadministrator kann diese Datenbankrolle auch allen Benutzern des Kontos zuweisen:

GRANT DATABASE ROLE SNOWFLAKE.PYPI_REPOSITORY_USER TO ROLE PUBLIC;
Copy

Mit dieser Rolle können Sie das Paket aus dem Repository installieren. Wenn Sie die UDF erstellen, legen Sie den ARTIFACT_REPOSITORY-Parameter für den Namen des Artifact Repository fest. Sie legen auch den PACKAGES-Parameter für die Liste der Namen der Pakete fest, die aus dem Artifact Repository stammen werden. Im folgenden Beispiel ist das Artifact Repository mit PyPI konfiguriert. Daher stammt das Paket scikit-learn von 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

Bemerkung

Um eine Paketversion anzugeben, fügen Sie diese wie gezeigt hinzu:

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

Pakete, die nur für x86 erstellt wurden

Wenn ein Paket nur für x86 erstellt wurde, wählen Sie eines der Warehouses aus, das x86 verwendet CPU -Architektur — MEMORY_1X_x86 oder MEMORY_16X_x86 und dann geben Sie RESOURCE_CONSTRAINT=(architecture='x86') an, wie im folgenden Beispiel:

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

Weitere Informationen dazu finden Sie unter Snowpark-optimierte Warehouses.

Sie können Artifact Repository mit UDF und den Stored Procedure Client-APIs verwenden:

Wenn Sie sie verwenden, geben Sie die folgenden Parameter an:

  • ARTIFACT_REPOSITORY

  • PACKAGES

und geben den Paketnamen im Feld PACKAGES an.

Siehe folgendes Beispiel:

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

Problembehandlung

Wenn die Paketinstallation für den Teil mit der Erstellung der Funktion oder Prozedur fehlschlägt, führen Sie den folgenden pip-Befehl lokal aus, um zu sehen, ob die Paketspezifikation gültig ist:

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

Einschränkungen

  • Der Zugriff auf private Repositorys wird nicht unterstützt.

  • Sie können dieses Feature nicht direkt in Notebooks verwenden. Sie können jedoch eine UDF oder eine gespeicherte Prozedur verwenden, die PyPI-Pakete innerhalb eines Notizbuchs nutzt.

  • Sie können Artifact Repository nicht innerhalb von anonymen gespeicherten Prozeduren verwenden.

Bemerkung

  • Snowflake prüft oder kuratiert die Sicherheit von Python-Paketen aus externen Quellen nicht. Es liegt in Ihrer Verantwortung, diese Pakete zu evaluieren und dafür zu sorgen, dass sie sicher und zuverlässig sind.

  • Snowflake behält sich das Recht vor, Pakete, die schädlich oder riskant sein könnten, ohne vorherige Ankündigung zu sperren oder zu entfernen. Dies dient dazu, die Integrität der Plattform zu schützen.

Importieren von Paketen über eine Snowflake-Stagingbereiche

Snowflake-Stagingbereiche können zum Import von Paketen verwendet werden. Sie können beliebigen Python-Code einbringen, der den unter Allgemeine Einschränkungen definierten Richtlinien folgt. Weitere Informationen dazu finden Sie unter Erstellen eines Python-UDF mit aus einem Stagingbereich hochgeladenem Code.

Sie können nur reine Python-Pakete oder Pakete mit nativem Code über einen Snowflake-Stagingbereich hochladen.

Als Beispiel können Sie die folgende SQL verwenden, die ein Warehouse mit dem Namen so_warehouse erstellt, das über die x86-CPU-Architektur verfügt:

CREATE WAREHOUSE so_warehouse WITH
   WAREHOUSE_SIZE = 'LARGE'
   WAREHOUSE_TYPE = 'SNOWPARK-OPTIMIZED'
   RESOURCE_CONSTRAINT = 'MEMORY_16X_X86';
Copy

Um ein Paket mit nativem Code über den Import aus dem Stagingbereich zu installieren, verwenden Sie das folgende Beispiel:

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

Verwenden von Drittanbieterpaketen aus Anaconda

Snowflake bietet Zugriff auf einen kuratierten Satz von Python-Paketen, die von Anaconda erstellt wurden. Diese Pakete sind ohne zusätzliche Kosten direkt in die Python-Features von Snowflake integriert.

Lizenzbedingungen

  • In Snowflake: Geregelt durch Ihre bestehende Snowflake-Kundenvereinbarung, einschließlich der in dieser Dokumentation beschriebenen Anaconda-Nutzungsbeschränkungen. Für die Verwendung in Snowflake gelten keine separaten Anaconda-Bedingungen.

  • Lokale Entwicklung: Über das dedizierte Anaconda-Repository von Snowflake: Vorbehaltlich der Bedingungen für eingebettete Endkunden von Anaconda und der Nutzungsbedingungen von Anaconda, die im Repository veröffentlicht wurden. Die lokale Verwendung ist auf das Entwickeln/Testen von Workloads beschränkt, die für die Bereitstellung in Snowflake vorgesehen sind.

Benutzerrichtlinien

Zulässige Verwendungen

  • In Snowflake: Verwenden Sie Pakete uneingeschränkt für alle unterstützten Python-Features.

    Bemerkung

    Sie können eine UDF nicht innerhalb der DEFAULT-Klausel einer CREATE TABLE-Anweisung aufrufen, mit Ausnahme von Paketen, die in Snowflake Notebooks für Snowpark Container Services frei verfügbar bleiben.

  • Lokale Entwicklung: Verwenden Sie Pakete aus dem speziellen Anaconda-Repository von Snowflake, um Workloads zu entwickeln oder zu testen, die für Snowflake bestimmt sind.

Unzulässige Verwendungen

Die folgenden Verwendungen von Paketen sind nicht zulässig:

  • Verwenden von Paketen für Projekte, die nicht mit Snowflake in Verbindung stehen.

  • Externes Hosting oder Synchronisieren von Paketinhalten.

  • Entfernen oder Ändern von Urheberrechts- oder Lizenzhinweisen.

Suchen und Verwalten von Paketen

Sie können das Paket, das Sie benötigen, nicht finden?

Support und Sicherheit

Supportumfang

Snowflake bietet Standard-Paketunterstützung, einschließlich:

  • Installationsanleitung

  • Problembehandlung in der Umgebung

  • Unterstützung bei der Integration

Garantie und SLA

Anaconda-Pakete sind Softwareprodukte von Drittanbietern, die so wie sie sind bereitgestellt werden, und fallen nicht unter die Garantie oder das SLA (Service-Level Agreement) von Snowflake.

Sicherheitsverfahren

Die von Snowflake bereitgestellten Anaconda-Pakete basieren auf einer vertrauenswürdigen Infrastruktur und sind digital signiert.

Weitere Details dazu finden Sie unter Sicherheitsverfahren von Anaconda.

Compliance und Lizenzen

Jedes Paket enthält seine eigene Open-Source-Lizenz. Kunden müssen zusätzlich zu den in dieser Dokumentation beschriebenen Nutzungsrichtlinien die Lizenzbedingungen der einzelnen Pakete einhalten.

Häufig gestellte Fragen

  • Kann ich Pakete aus anderen Anaconda-Kanälen verwenden (z. B. conda-forge oder Anaconda Defaults?) Nein. Andere Kanäle sind separate Angebote und erfordern möglicherweise eine kommerzielle Lizenz von Anaconda.

  • Kann ich diese Pakete lokal für Projekte verwenden, die nicht mit Snowflake in Verbindung stehen? Nein. Die lokale Nutzung ist streng auf die Entwicklung oder das Testen von Workloads beschränkt, die für die Snowflake-Bereitstellung vorgesehen sind. Andere Verwendungen erfordern eine separate Anaconda-Lizenz.

  • Warum benötigt Snowpark Container Services eine separate Lizenz? Die Verwendung von Paketen in benutzerdefinierten Docker-Images geht über die integrierte Umgebung von Snowflake hinaus und erfordert eine separate Anaconda-Lizenz.

Anzeigen und Verwenden von Paketen

Anzeigen verfügbarer Pakete

Sie können alle verfügbaren Pakete und deren Versionsinformationen anzeigen, indem Sie die Ansicht PACKAGES des Information Schema abfragen.

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

Um Versionsinformationen über ein bestimmtes Paket, z. B. numpy, anzuzeigen, verwenden Sie folgenden Befehl:

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

Bemerkung

Einige Pakete im Anaconda-Snowflake-Kanal sind nicht für die Verwendung in Snowflake-UDFs vorgesehen, da UDFs innerhalb einer eingeschränkten Engine ausgeführt werden. Weitere Informationen dazu finden Sie unter Einsetzen von bewährten Sicherheitsmethoden.

Wenn Sie dann in einem Snowflake-Warehouse Abfragen ausführen, die gespeicherte Python-UDFs aufrufen, werden die Anaconda-Pakete nahtlos installiert und in dem virtuellen Warehouse für Sie zwischengespeichert.

Anzeigen installierter Pakete

Sie können eine Liste der Pakete und Module anzeigen, die eine UDF oder UDTF verwendet, indem Sie den Befehl DESCRIBE FUNCTION ausführen. Die Ausführung des Befehls DESCRIBE FUNCTION für eine UDF, dessen Handler in Python implementiert ist, gibt die Werte mehrerer Eigenschaften zurück, darunter eine Liste der importierten Module und Pakete sowie der installierten Pakete, der Funktionssignatur und des Rückgabetyps.

Wenn Sie den Bezeichner für die UDF angeben, müssen Sie auch die Typen der Funktionsparameter angeben, falls vorhanden.

desc function stock_sale_average(varchar, number, number);
Copy

Verwenden von Anaconda-Paketen

Ein Beispiel für die Verwendung eines importierten Anaconda-Pakets in einer Python-UDF finden Sie unter Importieren eines Pakets in einen Inline-Handler.

Festlegen von Paketrichtlinien

Sie können eine Paketrichtlinie verwenden, um auf Kontoebene Zulassungslisten und Sperrlisten für Python-Pakete von Drittanbietern aus Anaconda zu erstellen. Auf diese Weise können Sie strengere Auditing- und Sicherheitsanforderungen erfüllen und haben eine genauere Kontrolle darüber, welche Pakete in Ihrer Umgebung verfügbar oder gesperrt sind. Weitere Informationen dazu finden Sie unter Paketrichtlinien.

Performance von Warehouses im kalten Zustand

Für eine effizientere Ressourcenverwaltung werden neu eingerichtete virtuelle Warehouses nicht mit Anaconda-Paketen vorinstalliert. Stattdessen werden die Anaconda-Pakete bei Bedarf installiert, wenn eine UDF erstmals verwendet wird. Die Pakete werden für eine spätere UDF-Ausführung im selben Warehouse im Cache zwischengespeichert. Der Cache wird gelöscht, wenn das Warehouse angehalten wird. Dies kann bei der erstmaligen Verwendung einer UDF oder nach dem Fortsetzen des Warehouses zu einer langsameren Performance führen. Die zusätzliche Latenz könnte etwa 30 Sekunden betragen.

Lokale Entwicklung und Testen

Um das Erstellen einer Conda-Umgebung auf Ihrem lokalen Rechner für Entwicklung und Testen zu unterstützen, hat Anaconda einen Snowflake-Kanal eingerichtet, der eine Teilmenge der Pakete und Versionen spiegelt, die in der Snowflake-Python-UDF-Umgebung unterstützt werden. Sie können den Snowflake-Conda-Kanal für lokale Tests und Entwicklung kostenlos auf Grundlage der ergänzenden Bedingungen für eingebettete Software in den Anaconda-Nutzungsbedingungen verwenden.

Um z. B. eine neue Conda-Umgebung lokal über den Snowflake-Kanal zu erstellen, geben Sie in der Befehlszeile in etwa Folgendes ein:

conda create --name py312_env -c https://repo.anaconda.com/pkgs/snowflake python=3.12 numpy pandas
Copy

Beachten Sie, dass aufgrund von Plattformunterschieden Ihre lokale Conda-Umgebung möglicherweise nicht genau mit der Serverumgebung übereinstimmt.

Best Practices

Innerhalb der create function-Anweisung sollte die Paketspezifikation (z. B. packages = ('numpy','pandas')) nur die Top-Level-Pakete angeben, die die UDF direkt verwendet. Anaconda verwaltet die Abhängigkeiten der Pakete und installiert die erforderlichen Abhängigkeiten automatisch. Aus diesem Grund sollten Sie keine Abhängigkeitspakete angeben.

Wenn Sie keine Paketversion angeben, wird Anaconda die aktuelle Version des Pakets und dessen Abhängigkeiten installieren. Im Allgemeinen ist es nicht notwendig, eine bestimmte Paketversion anzugeben. Beachten Sie, dass die Versionsauflösung nur einmal beim Erstellen der UDF mit dem Befehl create function ausgeführt wird. Danach wird die resultierende Versionsauflösung eingefroren, und es wird wieder dasselbe Set von Paketen verwendet, wenn diese UDF ausgeführt wird.

Ein Beispiel für die Verwendung der Paketspezifikation innerhalb der create function-Anweisung finden Sie unter Importieren eines Pakets in einen Inline-Handler.

Bekannte Probleme mit Paketen von Drittanbietern

Performance bei einzeiligen Vorhersagen

Einige Data Science-Frameworks wie Scikit-learn und TensorFlow können bei einzeiligen ML-Vorhersagen langsam sein. Um die Leistung zu verbessern, führen Sie anstelle einer einzeiligen Vorhersage eine Batchvorhersage aus. Dazu können Sie vektorisiertes Python-UDFs verwenden, um Python-Funktionen zu definieren, die Eingabezeilen in Batches empfangen, die für maschinelles Lernen und Data Science optimiert sind. Weitere Informationen dazu finden Sie unter Vektorisierte Python-UDFs.

Herunterladen von Daten auf Abruf aus Data Science-Bibliotheken

Einige Data Science-Bibliotheken wie NLTK, Keras und spaCy bieten Funktionen, mit denen bei Bedarf zusätzlicher Korpora, Daten und Modelle heruntergeladen werden können.

Das Herunterladen auf Abruf funktioniert jedoch bei Python-UDFs nicht, da einige Funktionen wie der Netzwerkzugang und das Schreiben in Dateien aufgrund von Snowflake-Sicherheitseinschränkungen deaktiviert sind.

Um dieses Problem zu umgehen, laden Sie die Daten in Ihre lokale Umgebung herunter, und stellen Sie diese dann der UDF über einen Snowflake-Stagingbereich bereit.

XGBoost

Bei Verwendung von XGBoost in einer UDF oder UDTF für parallele Vorhersagen oder Training muss die Parallelität für jede XGBoost-Instanz auf 1 gesetzt werden. Dadurch wird sichergestellt, dass XGBoost bei der Ausführung in der Snowflake-Umgebung für eine optimale Performance konfiguriert ist.

Beispiele:

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

Wenn Sie Tensorflow/Keras für die Vorhersage verwenden, benutzen Sie Model.predict_on_batch und nicht Model.predict.

Beispiel:

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