Immersion In Data

Snowflake

[Snowflake] Container 기반 Notebook에 패키지 임포트시 오류 해결

sungjunminn 2025. 11. 4. 10:30

Snowflake의 컨테이너 런타임(SPCS) 기반 노트북은 AI/ML 워크로드를 위해 강력한 CPU/GPU 리소스에 접근할 수 있게 해주는 훌륭한 기능입니다. 하지만 표준 노트북 환경과 달리, 이 컨테이너 환경에서 Python 패키지를 설치하는 것은 몇 가지 독특한 제약 사항과 절차를 따릅니다. 컨테이너 노트북에서 패키지를 설치할 때 겪을 수 있는 오류와 그 해결 과정을 공유합니다. 

 

ML 모델링을 위해 numpy와 snowflake-ml-python을 설치중 오류 발생

ML 모델을 만들기 위해 컨테이너 런타임 노트북을 생성 후 ML에 필요한 numpy, pandas, scikit_learn, snowflake-ml-python 등의 .whl 파일을 Snowflake Stage에 업로드한 뒤, 'Stage Packages' UI를 통해 설치를 시도했습니다.

하지만 이 과정에서 4가지의 각기 다른 오류를 순차적으로 마주하게 되었습니다.

 

1단계 오류: "File does not exist or not authorized." (경로 문제)

가장 먼저 마주한 오류입니다. Stage에 파일이 있는 것을 LIST @... 명령으로 확인했음에도 파일이 없다는 오류가 발생했습니다.

  • 시도한 경로:
    • @MY_PACKAGE_STAGE/numpy...whl
    • @TEST_DB.TEST_SCHEMA.MY_PACKAGE_STAGE/numpy...whl

해결책 1: 모든 경로는 '소문자'로 작성

Snowflake Notebook의 'Stage Packages' UI는 경로의 대소문자를 구분하며, 전체 경로(데이터베이스, 스키마, 스테이지, 파일명)를 모두 소문자로 작성해야 합니다.

  • 올바른 경로: @tcmsdb.datalake.my_package_stage/numpy...whl

 

2단계 오류: "File does not exist..." (파일명 문제)

경로를 소문자로 수정하자 numpy, pandas 등은 설치되었지만, 특정 패키지 2개가 여전히 동일한 오류를 발생시켰습니다.

  • 오류 발생 파일:
    • .../snowflake_ml_python-1.18.0-py3-none-any.whl
    • .../snowflake_snowpark_python-1.41.0-py3-none-any.whl

해결책 2: 파일명에 특수 문자(-none-any) 제거

컨테이너 노트북 환경은 패키지 파일명에 -none-any와 같은 특정 문자열이 포함된 경우, 이를 제대로 인식하지 못하는 문제가 있었습니다.

파일명을 더 간결하게(예: snowflake_ml_python-1.18.0-py3.whl) 변경하여 스테이지에 다시 업로드한 뒤, 변경된 파일명으로 'Stage Packages'에 등록하여 문제를 해결했습니다.

 

3단계 오류: "At least one ZIP or PY file must be provided." (컨테이너 제약)

모든 .whl 파일 설치에 성공한 후, import 코드를 실행하자 이번에는 SQL 컴파일 오류가 발생했습니다.

해결책 3: 'Stage Packages'에는 .zip 또는 .py 파일이 최소 1개 포함되어야 함

컨테이너 런타임 노트북의 독특한 제약 사항입니다. 'Stage Packages' 기능을 사용할 때는 최소 한 개 이상의 .zip 또는 .py 파일이 목록에 포함되어야 합니다. .whl 파일만으로는 세션이 시작되지 않습니다.

가장 간단한 해결책은 설치하려던 모든 .whl 파일들을 하나의 .zip 파일로 압축한 뒤, 그 .zip 파일을 'Stage Packages'에 등록하는 것입니다.

 

4단계 오류: "ModuleNotFoundError: ... snowflake.snowpark.ml." (설치 방식의 오해)

Stage 패키지 설정을 마쳤지만, import 시 snowflake.snowpark.ml 모듈을 찾을 수 없다는 근본적인 오류가 발생했습니다.

해결책 4: 공개(Public) 패키지는 EAI + !pip로 설치

문제의 핵심은 설치 방식의 오해였습니다.

  1. Stage Packages (스테이지 설치):
    • 용도: PyPI에 없거나, 인터넷 접근이 불가능한 환경에서 사용하는 비공개(Private) / 사용자 정의 패키지를 설치할 때 사용합니다. (예: numpy, pandas 등)
    • 방법: .whl 파일들을 .zip으로 묶어 스테이지에 등록합니다.
  2. External Access (외부 설치):
    • 용도: snowflake-ml-python처럼 PyPI에 공개된(Public) 패키지를 설치하는 표준적인 방법입니다.
    • 방법:
      1. [관리자] ACCOUNTADMIN 역할로 PyPI(pypi.org, files.pythonhosted.org)로의 Egress를 허용하는 External Access Integration(EAI)을 생성합니다.
      2. [사용자] 노트북 설정(Notebook settings) > 'External access' 탭에서 생성된 EAI를 활성화(Toggle on)합니다.
      3. [사용자] 노트북 셀에서 !pip install snowflake-ml-python 명령을 직접 실행합니다.

 

5단계 오류: "ModuleNotFoundError: ... anomaly_detection" (Import 경로 오류)

EAI와 !pip 설치까지 마쳤음에도 from snowflake.snowpark.ml.anomaly_detection import IsolationForest 코드에서 모듈을 찾을 수 없다는 최종 오류가 발생했습니다.

해결책 5: 올바른 Import 경로 사용

snowflake.snowpark.ml.anomaly_detection는 존재하지 않는 모듈이었습니다. IsolationForest를 사용하기 위한 올바른 경로는 사용 목적에 따라 두 가지로 나뉩니다.

  1. Scikit-learn (로컬 메모리 처리):
    • Import: from sklearn.ensemble import IsolationForest
    • 특징: 표준 Scikit-learn 라이브러리입니다. 컨테이너의 로컬 메모리에서 단일 노드로 실행되며, 중소규모 데이터(1GB 이하)의 빠른 프로토타이핑에 적합합니다.
  2. Snowflake ML Modeling (분산 처리):
    • Import: from snowflake.ml.modeling.ensemble import IsolationForest
    • 특징: Snowflake 웨어하우스의 분산 컴퓨팅을 활용합니다. Snowpark DataFrame을 입력받아 대용량 데이터를 로컬로 가져오지 않고 웨어하우스에서 직접 병렬 처리합니다. 프로덕션 환경에 최적화되어 있습니다.

이 두 가지 옵션 중 사용 사례에 맞는 패키지를 선택하여 import 경로를 수정한 후, 마침내 모든 문제를 해결하고 정상 동작을 확인할 수 있었습니다.

 

결론

Snowflake 컨테이너 노트북에서의 패키지 설치는 표준 환경보다 복잡하지만, 명확한 규칙이 존재합니다.

  1. 비공개/오프라인 패키지: 'Stage Packages'를 사용하되, ①소문자 경로, ②간결한 파일명, ③최소 1개의 .zip 파일 포함 규칙을 지켜야 합니다.
  2. 공개(PyPI) 패키지: EAI + !pip install을 사용하는 것이 표준입니다.
  3. Import: sklearn과 snowflake.ml.modeling의 차이를 명확히 인지하고 올바른 경로를 사용해야 합니다.