서드 파티 패키지 사용하기

스테이지를 사용하여 서드 파티 패키지를 가져올 수 있습니다. 또한 Python UDF를 만들 때 설치할 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;
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)를 사용하는 웨어하우스 중 하나를 선택한 후 다음 예제와 같이 :code:`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 및 저장 프로시저 클라이언트 API와 함께 다음과 같이 사용할 수 있습니다.

사용할 때는 다음 매개 변수를 지정하고

  • 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

제한 사항

  • 비공개 리포지토리에 대한 액세스는 지원되지 않습니다.

  • Notebooks에서 이 기능을 직접 사용할 수는 없습니다. 그러나 노트북 내에서 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 기능에서 패키지를 자유롭게 사용할 수 있습니다.

    참고

    |spcs|의 |sf-notebooks|에서 무료로 사용할 수 있는 패키지를 제외하고 CREATE TABLE 문의 DEFAULT 절 내에서 UDF를 호출할 수 없습니다.

  • 로컬 개발: Snowflake 전용 Anaconda 리포지토리의 패키지를 사용하여 Snowflake용 워크로드를 개발하거나 테스트합니다.

금지된 사용

다음과 같은 패키지 사용은 금지됩니다.

  • Snowflake와 관련이 없는 프로젝트에 패키지 사용

  • 패키지 콘텐츠를 외부에서 호스팅 또는 미러링

  • 저작권 또는 라이선스 고지 제거 또는 수정

패키지 찾기 및 관리

필요한 패키지를 찾을 수 없습니까?

  • `Snowflake Ideas 포럼<https://community.snowflake.com/s/ideas>`_을 통해 요청을 제출하세요.

  • (컴파일된 확장이 없는) 순수 Python 패키지는 :doc:`Snowflake 스테이지에 직접 업로드</developer-guide/snowflake-cli/snowpark/upload>`될 수 있습니다.

지원 및 보안

지원 범위

Snowflake는 다음을 포함한 표준 패키지 지원을 제공합니다.

  • 설치 지침

  • 환경 문제 해결

  • 통합 지원

보증 및 SLA

Anaconda 패키지는 있는 그대로 제공되는 서드 파티 소프트웨어이며 Snowflake의 보증 또는 서비스 수준 계약(SLA)이 적용되지 않습니다.

보안 규정

Snowflake에서 제공하는 Anaconda 패키지는 신뢰할 수 있는 인프라를 기준으로 하며 디지털로 서명됩니다.

자세한 내용은 `Anaconda의 보안 관행<https://www.anaconda.com/docs/reference/security>`_을 참조하세요.

규정 준수 및 라이선스

각 패키지에는 자체 오픈 소스 라이선스가 포함되어 있습니다. 고객은 이 설명서에 설명된 사용 지침 외에도 개별 패키지 라이선스 조건을 준수해야 합니다.

자주 묻는 질문

  • 다른 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 채널의 일부 패키지는 UDF가 제한된 엔진 내에서 실행되므로 Snowflake UDF 내에서 사용하기 위한 것이 아닙니다. 자세한 내용은 우수한 보안 관행 따르기 섹션을 참조하십시오.

Python UDF를 호출하는 쿼리가 Snowflake 웨어하우스 내에서 실행되면 Anaconda 패키지가 원활하게 설치되고 사용자를 대신하여 가상 웨어하우스에 캐시됩니다.

가져온 패키지 표시하기

DESCRIBE FUNCTION 명령을 실행하여 UDF 또는 UDTF가 사용 중인 패키지와 모듈의 목록을 표시할 수 있습니다. 핸들러가 Python으로 구현된 UDF에 대해 DESCRIBE FUNCTION 명령을 실행하면 가져온 모듈과 패키지의 목록뿐 아니라 설치된 패키지, 함수 서명 그리고 그 반환 형식을 비롯한 여러 속성의 값이 반환됩니다.

UDF의 식별자를 지정할 때 함수 매개 변수 형식(있는 경우)을 포함해야 합니다.

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

Anaconda 패키지 사용하기

Python UDF에서 가져온 Anaconda 패키지를 사용하는 방법에 대한 예는 인라인 처리기에서 패키지 가져오기 섹션을 참조하십시오.

패키지 정책 설정하기

패키지 정책을 사용하여 계정 수준에서 Anaconda의 서드 파티 Python 패키지에 대한 허용 목록과 차단 목록을 설정할 수 있습니다. 이를 통해 보다 엄격한 감사 및 보안 요구 사항을 충족할 수 있으며 환경에서 사용 가능하거나 차단되는 패키지를 더욱 세밀하게 제어할 수 있습니다. 자세한 내용은 패키지 정책 섹션을 참조하십시오.

콜드 웨어하우스에서의 성능

더욱 효율적인 리소스 관리를 위해 새로 프로비저닝된 가상 웨어하우스는 Anaconda 패키지를 사전 설치하지 않습니다. 그 대신, Anaconda 패키지는 UDF를 처음 사용할 때 온디맨드 방식으로 설치됩니다. 향후 UDF 실행을 위해 패키지는 같은 웨어하우스에 캐시됩니다. 웨어하우스가 일시 중단되면 캐시가 삭제됩니다. 이로 인해 UDF를 처음 사용할 때나 웨어하우스가 재개된 후에 성능이 저하될 수 있습니다. 약 30초 정도의 대기 시간이 추가로 발생할 수 있습니다.

로컬 개발 및 테스트

개발과 테스트를 위해 로컬 컴퓨터에 conda 환경을 만드는 데 도움이 되도록, Anaconda는 Snowflake Python UDF 환경에서 지원되는 패키지와 버전 중 일부를 미러링하는 Snowflake 채널을 만들었습니다. Anaconda의 서비스 약관에 대한 추가 포함 소프트웨어 약관에 따라 현지 테스트 및 개발을 위한 Snowflake conda 채널을 무료로 사용할 수 있습니다.

예를 들어, 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를 생성할 때 한 번 수행됩니다. 그 후, 결과 버전 확인이 고정되고 이 특정 UDF가 실행될 때 동일한 패키지 세트가 사용됩니다.

create function 문 내에서 패키지 사양을 사용하는 방법의 예는 인라인 처리기에서 패키지 가져오기 섹션을 참조하십시오.

서드 파티 패키지의 알려진 문제

단일 행 예측 사용 시의 성능

Scikit-learn 및 TensorFlow와 같은 어떤 데이터 과학 프레임워크는 단일 행 ML 예측을 수행할 때 느릴 수 있습니다. 성능을 향상하려면 단일 행 예측 대신 일괄 예측을 수행하십시오. 이를 위해 입력 행을 일괄적으로 받아 머신 러닝 또는 데이터 과학 라이브러리가 작업하도록 최적화된 Python 함수를 정의할 수 있는 벡터화된 Python UDFs를 사용할 수 있습니다. 자세한 내용은 벡터화된 Python UDF 섹션을 참조하십시오.

데이터 과학 라이브러리에서 온디맨드 방식으로 데이터 다운로드하기

NLTK, Keras, spaCy 와 같은 데이터 과학 라이브러리에서는 온디맨드 방식으로 말뭉치, 데이터 또는 모델을 추가로 다운로드하는 기능을 제공합니다.

하지만 네트워크 액세스 및 파일에 쓰기와 같은 일부 기능을 사용하지 못하게 되는 Snowflake 보안 제약 조건으로 인해 Python UDF에서는 온디맨드 방식으로 다운로드할 수 없습니다.

이 문제를 해결하려면 데이터를 로컬 환경으로 다운로드한 다음, 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