Snowflake ML 작업¶
Snowflake ML Jobs를 사용하여 Snowflake ML Container Runtime 내에서 머신 러닝(ML) 워크플로를 실행합니다. 모든 개발 환경에서 실행할 수 있습니다. Snowflake 워크시트나 노트북에서 코드를 실행할 필요는 없습니다. 작업을 사용하여 개발 워크플로 내에서 리소스 집약적인 작업을 실행하기 위해 Snowflake의 인프라를 활용하십시오. 로컬에서 Snowflake ML 을 설정하는 방법에 대한 자세한 내용은 로컬에서 Snowflake ML 사용하기 섹션을 참조하십시오.
중요
Snowflake ML Jobs는 Snowpark ML Python 패키지(snowflake-ml-python
) 버전 1.8.2 이상에서 공개 미리 보기로 사용할 수 있습니다.
Snowflake ML Jobs를 통해 다음을 수행할 수 있습니다.
GPU 및 고용량 메모리 CPU 인스턴스를 포함하여 Snowflake Compute Pool에서 ML 워크로드를 실행할 수 있습니다.
VS Code 또는 Jupyter 노트북 등 선호하는 개발 환경을 사용할 수 있습니다.
런타임 환경 내에서 사용자 정의 Python 패키지를 설치하여 사용할 수 있습니다.
Snowflake의 분산형 API를 사용하여 데이터 로딩, 학습 및 하이퍼 매개 변수 튜닝을 최적화할 수 있습니다.
Apache Airflow와 같은 오케스트레이션 도구와 통합할 수 있습니다.
Snowflake의 API를 통해 작업을 모니터링하고 관리할 수 있습니다.
이러한 기능을 사용하여 다음을 수행할 수 있습니다.
GPU 가속 또는 상당한 컴퓨팅 리소스가 필요한 대규모 데이터 세트에 대해 리소스 집약적인 학습을 실행할 수 있습니다.
파이프라인을 통한 프로그래밍 실행으로 개발에서 프로덕션으로 ML 코드를 이동하여 ML 워크플로를 프로덕션화할 수 있습니다.
기존 개발 환경을 유지하면서 Snowflake의 컴퓨팅 리소스를 활용할 수 있습니다.
최소한의 코드 변경으로 OSS ML 워크플로를 해제하고 전환할 수 있습니다.
Large Snowflake 데이터 세트로 직접 작업하여 데이터 이동을 줄이고 값비싼 데이터 전송을 피할 수 있습니다.
전제 조건¶
중요
Snowflake ML Jobs는 현재 Python 3.10 클라이언트만 지원합니다. 다른 Python 버전에 대한 지원이 필요한 경우 Snowflake 계정 팀에 문의하십시오.
Python 3.10 환경에 Snowflake ML Python 패키지를 설치합니다.
pip install snowflake-ml-python>=1.8.2
기본 컴퓨팅 풀 크기는 CPU_X 64_S 인스턴스 패밀리를 사용합니다. 최소 노드 수는 1개, 최대 노드 수는 25개입니다. 다음 SQL 명령을 사용하여 사용자 지정 컴퓨팅 풀을 만들 수 있습니다.
CREATE COMPUTE POOL IF NOT EXISTS MY_COMPUTE_POOL MIN_NODES = <MIN_NODES> MAX_NODES = <MAX_NODES> INSTANCE_FAMILY = <INSTANCE_FAMILY>;
Snowflake ML Jobs에는 Snowpark 세션이 필요합니다. 다음 코드를 사용하여 생성합니다.
from snowflake.snowpark import Session from snowflake.ml.jobs import list_jobs ls = list_jobs() # This will fail! You must create a session first. # Requires valid ~/.snowflake/config.toml file session = Session.builder.getOrCreate() ls = list_jobs(session=session) ls = list_jobs() # Infers created session from context
세션 생성에 대한 자세한 내용은 세션 만들기 섹션을 참조하십시오.
Snowflake ML 작업 실행하기¶
다음 방법 중 하나로 Snowflake ML Job을 실행할 수 있습니다.
코드 내에서 원격 데코레이터 사용.
Python API 를 사용하여 전체 파일 또는 디렉터리 제출.
Python 함수를 Snowflake ML Job으로 실행하기¶
Function Dispatch를 사용하여 @remote
데코레이터를 통해 Snowflake의 컴퓨팅 리소스에서 개별 Python 함수를 원격으로 실행할 수 있습니다.
@remote
데코레이터를 사용하여 다음을 수행할 수 있습니다.
함수와 그 종속성을 직렬화할 수 있습니다.
지정된 Snowflake 스테이지에 업로드할 수 있습니다.
ML 에 대한 Container Runtime 내에서 실행할 수 있습니다.
다음 예제 Python 코드는 @remote
데코레이터를 사용하여 Snowflake ML Job을 제출합니다. Snowpark Session
이 필요하며, 전제 조건 섹션을 참조하십시오.
from snowflake.ml.jobs import remote
@remote("MY_COMPUTE_POOL", stage_name="payload_stage", session=session)
def train_model(data_table: str):
# Provide your ML code here, including imports and function calls
...
job = train_model("my_training_data")
@remote
데코레이터 함수를 호출하면 작업 실행을 관리하고 모니터링하는 데 사용할 수 있는 Snowflake MLJob
오브젝트가 반환됩니다. 자세한 내용은 Snowflake ML Job 관리 섹션을 참조하십시오.
Python 파일을 Snowflake로 ML Job으로 실행하기¶
Python 파일 또는 프로젝트 디렉터리를 Snowflake 컴퓨팅 리소스에서 실행합니다. 이 기능은 다음과 같은 경우에 유용합니다.
여러 모듈과 종속성이 있는 복잡한 ML 프로젝트가 있는 경우.
로컬 개발 코드와 제품 코드의 분리를 유지하려고 하는 경우.
명령줄 인자를 사용하는 스크립트를 실행해야 하는 경우.
기존 ML 프로젝트로 작업하고 있는데, 이 프로젝트는 특별히 Snowflake 컴퓨팅에서 실행하도록 설계되지 않았습니다.
Snowflake Job API 에서는 두 가지 주요 방법을 제공합니다.
submit_file()
: 단일 Python 파일 실행용submit_directory()
: 여러 파일과 리소스가 있는 전체 프로젝트 디렉터리 실행용
두 가지 방법 모두 다음을 지원합니다.
명령줄 인자 전달
환경 변수 구성
사용자 지정 종속성 사양
Snowflake 스테이지를 통한 프로젝트 자산 관리
File Dispatch는 기존 ML 워크플로를 프로덕션화하고 개발 환경과 실행 환경을 명확하게 분리하는 데 특히 유용합니다.
다음 Python 코드는 파일을 Snowflake ML Job에 제출합니다.
from snowflake.ml.jobs import submit_file
# Run a single file
job1 = submit_file(
"train.py",
"MY_COMPUTE_POOL",
stage_name="payload_stage",
args=["--data-table", "my_training_data"],
session=session,
)
다음 Python 코드는 디렉터리를 Snowflake ML Job에 제출합니다.
from snowflake.ml.jobs import submit_directory
# Run from a directory
job2 = submit_directory(
"./ml_project/",
"MY_COMPUTE_POOL",
entrypoint="train.py",
stage_name="payload_stage",
session=session,
)
파일 또는 디렉터리를 제출하면 작업 실행을 관리하고 모니터링하는 데 사용할 수 있는 Snowflake MLJob
오브젝트가 반환됩니다. 자세한 내용은 Snowflake ML Job 관리 섹션을 참조하십시오.
Snowflake ML Job 관리¶
Snowflake ML Job을 제출하면 API 에서 MLJob
오브젝트를 생성합니다. 이를 사용하여 다음을 수행할 수 있습니다.
상태 업데이트를 통한 작업 진행 상황 추적
자세한 실행 로그를 사용하여 문제 디버그
실행 결과 검색(있는 경우)
get_job()
API 를 사용하여 MLJob
오브젝트를 ID 로 검색할 수 있습니다. 다음 Python 코드는 MLJob
오브젝트를 검색하는 방법을 보여줍니다.
from snowflake.ml.jobs import MLJob, get_job, list_jobs
# List all jobs
jobs = list_jobs()
# Retrieve an existing job based on ID
job = get_job("<job_id>") # job is an MLJob instance
# Retrieve status and logs for the retrieved job
print(job.status) # PENDING, RUNNING, FAILED, DONE
print(job.get_logs())
작업의 result
메서드를 호출하여 실행이 완료될 때까지 기다린 후 실행 결과를 검색합니다. 실행에 실패하면 result
에서 예외를 발생시킵니다.
result = job.result()
종속성 관리하기¶
Snowflake ML Job API 는 Container Runtime for ML 환경 내에서 페이로드를 실행합니다. 이 환경에는 머신 러닝과 데이터 과학에 가장 일반적으로 사용되는 Python 패키지가 있습니다. 대부분의 사용 사례는 추가 구성 없이 ‘즉시’ 작동합니다. 사용자 지정 종속성이 필요한 경우 pip_requirements
를 사용하여 설치할 수 있습니다.
사용자 지정 종속성을 설치하려면 외부 액세스 통합을 사용하여 외부 네트워크 액세스를 활성화해야 합니다. 다음 SQL 예제 명령을 사용하여 액세스를 제공할 수 있습니다.
CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION PYPI_EAI
ALLOWED_NETWORK_RULES = (snowflake.external_access.pypi_rule)
ENABLED = true;
외부 액세스 통합에 대한 자세한 내용은 외부 액세스 통합 생성 및 사용하기 섹션을 참조하십시오.
외부 네트워크 액세스를 제공한 후 pip_requirements
및 external_access_integrations
매개 변수를 사용하여 사용자 지정 종속성을 구성할 수 있습니다. Container Runtime 환경에서 사용할 수 없거나 특정 버전의 패키지를 사용하는 경우 패키지를 사용할 수 있습니다.
다음 Python 코드는 remote
데코레이터에 사용자 지정 종속성을 지정하는 방법을 보여줍니다.
@remote(
"MY_COMPUTE_POOL",
stage_name="payload_stage",
pip_requirements=["custom-package"],
external_access_integrations=["PYPI_EAI"],
session=session,
)
def my_function():
# Your code here
다음 Python 코드는 submit_file()
메서드에 대한 사용자 지정 종속성을 지정하는 방법을 보여줍니다.
from snowflake.ml.jobs import submit_file
# Can include version specifier to specify version(s)
job = submit_file(
"/path/to/repo/my_script.py",
compute_pool,
stage_name="payload_stage",
pip_requirements=["custom-package==1.0.*"],
external_access_integrations=["pypi_eai"],
session=session,
)
비공개 패키지 피드¶
Snowflake ML Jobs는 JFrog Artifactory 및 Sonatype Nexus 리포지토리와 같은 비공개 피드에서 패키지를 로딩하는 것도 지원합니다. 이러한 피드는 일반적으로 내부 및 독점 패키지를 배포하고, 종속성 버전을 제어하며, 보안/규정 준수를 보장하는 데 사용됩니다.
비공개 피드에서 패키지를 설치하려면 다음을 수행해야 합니다.
비공개 피드의 URL 에 대한 액세스를 허용하는 네트워크 규칙을 만듭니다.
기본 인증을 사용하는 원본의 경우 간단히 네트워크 규칙을 만들면 됩니다.
CREATE OR REPLACE NETWORK RULE private_feed_nr MODE = EGRESS TYPE = HOST_PORT VALUE_LIST = ('<your-repo>.jfrog.io');
비공개 연결(즉, Private Link)을 사용하여 원본에 대한 액세스를 구성하려면 비공개 연결을 사용한 네트워크 송신 의 단계를 따르십시오.
네트워크 규칙을 사용하여 외부 액세스 통합을 만듭니다. 작업을 제출할 역할에 EAI 사용 권한을 부여합니다.
CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION private_feed_eai ALLOWED_NETWORK_RULES = (PRIVATE_FEED_NR) ENABLED = true; GRANT USAGE ON INTEGRATION private_feed_eai TO ROLE <role_name>;
작업을 제출할 때 비공개 피드 URL, External Access Integration 및 패키지를 지정합니다.
# Option 1: Specify private feed URL in pip_requirements job = submit_file( "/path/to/script.py", compute_pool="MY_COMPUTE_POOL", stage_name="payload_stage", pip_requirements=[ "--index-url=https://your.private.feed.url", "internal-package==1.2.3" ], external_access_integrations=["PRIVATE_FEED_EAI"] )
# Option 2: Specify private feed URL by environment variable job = submit_directory( "/path/to/code/", compute_pool="MY_COMPUTE_POOL", entrypoint="script.py", stage_name="payload_stage", pip_requirements=["internal-package==1.2.3"], external_access_integrations=["PRIVATE_FEED_EAI"], env_vars={'PIP_INDEX_URL': 'https://your.private.feed.url'}, )
비공개 피드 URL 에 인증 토큰과 같은 민감한 정보가 포함된 경우, URL 에 Snowflake 시크릿을 생성하여 관리하십시오. CREATE SECRET 을 사용하여 시크릿을 생성하십시오. spec_overrides
인자를 사용하여 작업 제출 중에 시크릿을 구성합니다.
# Create secret for private feed URL with embedded auth token
feed_url = "<your-repo>.jfrog.io/artifactory/api/pypi/test-pypi/simple"
user = "<auth_user>"
token = "<auth_token>"
session.sql(f"""
CREATE SECRET IF NOT EXISTS PRIVATE_FEED_URL_SECRET
TYPE = GENERIC_STRING
SECRET_STRING = 'https://{auth_user}:{auth_token}@{feed_url}'
""").collect()
# Prepare service spec override for mounting secret into job execution
spec_overrides = {
"spec": {
"containers": [
{
"name": "main", # Primary container name is always "main"
"secrets": [
{
"snowflakeSecret": "PRIVATE_FEED_URL_SECRET",
"envVarName": "PIP_INDEX_URL",
"secretKeyRef": "secret_string"
},
],
}
]
}
}
# Load private feed URL from secret (e.g. if URL includes auth token)
job = submit_file(
"/path/to/script.py",
compute_pool="MY_COMPUTE_POOL",
stage_name="payload_stage",
pip_requirements=[
"internal-package==1.2.3"
],
external_access_integrations=["PRIVATE_FEED_EAI"],
spec_overrides=spec_overrides,
)
container.secrets
에 대한 자세한 내용은 containers.secrets 필드 섹션을 참조하십시오.
비용 고려 사항¶
Snowflake ML Jobs는 Snowpark Container Services에서 실행되며 사용량에 따라 요금이 청구됩니다. 컴퓨팅 비용에 대한 자세한 내용은 Snowpark Container Services 비용 섹션을 참조하십시오.
작업 페이로드는 stage_name
인자로 지정된 스테이지에 업로드됩니다. 추가 요금이 부과되지 않도록 하려면 반드시 정리해야 합니다. 스테이지 저장소와 관련된 비용에 대한 자세한 내용은 저장소 비용 이해하기 및 저장소 비용 살펴보기 섹션을 참조하십시오.