Snowflake 데이터 세트

Datasets는 머신 러닝 워크플로를 위해 특별히 설계된 새로운 Snowflake 스키마 수준 오브젝트입니다. Snowflake Datasets는 버전으로 구성된 데이터 모음을 보관하며, 각 버전은 불변성, 효율적인 데이터 액세스, 널리 사용되는 딥러닝 프레임워크와의 상호 운용성을 보장하는 데이터의 구체화된 스냅샷을 제공합니다.

참고

Datasets는 SQL 오브젝트이지만, Snowpark ML에서만 사용할 수 있도록 설계되었습니다. Snowsight 데이터베이스 오브젝트 탐색기에 표시되지 않으며 SQL 명령을 사용하여 작업하지 않습니다.

다음과 같은 상황에서는 Snowflake 데이터 세트를 사용해야 합니다.

  • 재현 가능한 머신 러닝 모델 훈련 및 테스트를 위해서는 대규모 데이터 세트를 관리하고 버전을 관리해야 합니다.

  • Snowflake의 확장 가능하고 보안 데이터 저장소 및 처리 기능을 활용할 수 있습니다.

  • 분산형 훈련이나 데이터 스트리밍을 위해서는 세분화된 파일 수준 액세스 및/또는 데이터 셔플링이 필요합니다.

  • 외부 머신 러닝 프레임워크 및 도구와 통합해야 합니다.

참고

구체화된 데이터 세트에는 저장 비용이 발생합니다. 이러한 비용을 최소화하려면 사용하지 않는 데이터 세트를 삭제합니다.

설치

Dataset Python SDK는 버전 1.5.0부터 Snowpark ML(Python 패키지 snowflake-ml-python)에 포함되어 있습니다. 설치 지침은 로컬에서 Snowflake ML 사용하기 섹션을 참조하십시오.

필수 권한

데이터 세트를 생성하려면 CREATE DATASET 스키마 수준 권한이 필요합니다. 데이터 세트 버전을 추가하거나 삭제하는 등 데이터 세트를 수정하려면 데이터 세트에 대한 OWNERSHIP이 필요합니다. 데이터 세트에서 읽으려면 데이터 세트에 대한 USAGE 권한(또는 OWNERSHIP)만 있으면 됩니다. Snowflake에서 권한을 부여하는 방법에 대한 자세한 내용은 GRANT <권한> 섹션을 참조하십시오.

setup_feature_store 메서드 또는 권한 설정 SQL 스크립트 를 사용하여 Snowflake Feature Store에 대한 권한을 설정하면 데이터 세트 권한도 설정됩니다. 이러한 방법 중 하나를 사용하여 이미 기능 스토어 권한을 설정한 경우 추가적인 작업이 필요하지 않습니다.

데이터 세트 만들기 및 사용하기

데이터 세트는 snowflake.ml.dataset.create_from_dataframe 함수에 Snowpark DataFrame을 전달하여 생성됩니다.

from snowflake import snowpark
from snowflake.ml import dataset

# Create Snowpark Session
# See https://docs.snowflake.com/en/developer-guide/snowpark/python/creating-session
session = snowpark.Session.builder.configs(connection_parameters).create()

# Create a Snowpark DataFrame to serve as a data source
# In this example, we generate a random table with 100 rows and 1 column
df = session.sql(
    "select uniform(0, 10, random(1)) as x, uniform(0, 10, random(2)) as y from table(generator(rowcount => 100))"
)

# Materialize DataFrame contents into a Dataset
ds1 = dataset.create_from_dataframe(
    session,
    "my_dataset",
    "version1",
    input_dataframe=df)
Copy

데이터 세트에는 버전이 지정됩니다. 각 버전은 데이터 세트에서 관리하는 데이터의 변경 불가능한 특정 시점 스냅샷입니다. Python API에는 주어진 데이터 세트가 사용하도록 선택되었는지 여부를 나타내는 Dataset.selected_version 속성이 포함되어 있습니다. 이 속성은 dataset.create_from_dataframedataset.load_dataset 팩토리 메서드에 의해 자동으로 설정되므로 데이터 세트를 생성하면 생성된 버전이 자동으로 선택됩니다. Dataset.select_versionDataset.create_version 메서드를 사용하여 버전 간에 명시적으로 전환할 수도 있습니다. Dataset에서 읽기는 활성화된 선택 버전에서 읽기를 실행합니다.

# Inspect currently selected version
print(ds1.selected_version) # DatasetVersion(dataset='my_dataset', version='version1')
print(ds1.selected_version.created_on) # Prints creation timestamp

# List all versions in the Dataset
print(ds1.list_versions()) # ["version1"]

# Create a new version
ds2 = ds1.create_version("version2", df)
print(ds1.selected_version.name)  # "version1"
print(ds2.selected_version.name)  # "version2"
print(ds1.list_versions())        # ["version1", "version2"]

# selected_version is immutable, meaning switching versions with
# ds1.select_version() returns a new Dataset object without
# affecting ds1.selected_version
ds3 = ds1.select_version("version2")
print(ds1.selected_version.name)  # "version1"
print(ds3.selected_version.name)  # "version2"
Copy

Dataset에서 데이터 읽기

Dataset 버전 데이터는 Apache Parquet 형식의 균일한 크기의 파일로 저장됩니다. Dataset 클래스는 TensorFlow 및 PyTorch용 내장 커넥터 등 Snowflake 데이터세트로부터 데이터를 읽기 위해 FileSet 와 유사한 API를 제공합니다. API는 사용자 지정 프레임워크 커넥터를 지원하도록 확장할 수 있습니다.

Dataset에서 읽으려면 선택한 버전이 활성화되어 있어야 합니다.

TensorFlow에 연결

효율적인 훈련과 평가를 위해 데이터 세트를 TensorFlow의 tf.data.Dataset 으로 변환하고 일괄 스트리밍할 수 있습니다.

import tensorflow as tf

# Convert Snowflake Dataset to TensorFlow Dataset
tf_dataset = ds1.read.to_tf_dataset(batch_size=32)

# Train a TensorFlow model
for batch in tf_dataset:
    # Extract and build tensors as needed
    input_tensor = tf.stack(list(batch.values()), axis=-1)

    # Forward pass (details not included for brevity)
    outputs = model(input_tensor)
Copy

PyTorch에 연결

또한 데이터 세트는 PyTorch DataPipes로의 변환을 지원하며 효율적인 훈련과 평가를 위해 일괄 스트리밍할 수 있습니다.

import torch

# Convert Snowflake Dataset to PyTorch DataPipe
pt_datapipe = ds1.read.to_torch_datapipe(batch_size=32)

# Train a PyTorch model
for batch in pt_datapipe:
    # Extract and build tensors as needed
    input_tensor = torch.stack([torch.from_numpy(v) for v in batch.values()], dim=-1)

    # Forward pass (details not included for brevity)
    outputs = model(input_tensor)
Copy

Snowpark ML에 연결

데이터 세트는 Snowpark ML 모델링과의 통합을 위해 다시 Snowpark DataFrames로 변환할 수도 있습니다. 변환된 Snowpark DataFrame은 Dataset 생성 시 제공된 DataFrame과 동일하지 않으며, Dataset 버전에서 구체화된 데이터를 가리킵니다.

from snowflake.ml.modeling.ensemble import random_forest_regressor

# Get a Snowpark DataFrame
ds_df = ds1.read.to_snowpark_dataframe()

# Note ds_df != df
ds_df.explain()
df.explain()

# Train a model in Snowpark ML
xgboost_model = random_forest_regressor.RandomForestRegressor(
    n_estimators=100,
    random_state=42,
    input_cols=["X"],
    label_cols=["Y"],
)
xgboost_model.fit(ds_df)
Copy

직접 파일 액세스

또한 데이터 세트 API에는 fsspec 인터페이스가 노출되어 있어 PyArrow, Dask 또는 fsspec 를 지원하고 분산 및/또는 스트림 기반 모델 훈련이 가능한 기타 패키지 등 외부 라이브러리와의 사용자 지정 통합을 구축하는 데 사용할 수 있습니다.

print(ds1.read.files()) # ['snow://dataset/my_dataset/versions/version1/data_0_0_0.snappy.parquet']

import pyarrow.parquet as pq
pd_ds = pq.ParquetDataset(ds1.read.files(), filesystem=ds1.read.filesystem())

import dask.dataframe as dd
dd_df = dd.read_parquet(ds1.read.files(), filesystem=ds1.read.filesystem())
Copy

현재 제한 사항 및 알려진 문제

  • 데이터 세트 이름은 SQL 식별자이며 Snowflake 식별자 요구 사항 을 따릅니다.

  • 데이터 세트 버전은 문자열이며 최대 128자까지 가능합니다. 일부 문자는 허용되지 않으며 오류 메시지가 표시됩니다.

  • 스키마가 광범위한 데이터 세트(약 4,000개 이상의 열)에 대한 특정 쿼리 작업은 완전히 최적화되지 않았습니다. 이 문제는 향후 릴리스에서 개선될 예정입니다.