Snowpark ML FileSystem 및 FileSet — 사용 중단

Snowpark ML 라이브러리에는 서버 측의 암호화된 내부 Snowflake 스테이지 의 파일 시스템과 유사한 추상화인 FileSystem이 포함되어 있습니다. 구체적으로는 fsspec AbstractFileSystem 구현입니다. 이 라이브러리에는 머신 러닝 데이터를 Snowflake 테이블에서 스테이지로 이동하고, 스테이지에서 데이터를 PyTorch 또는 TensorFlow에 공급할 수 있게 해주는 관련 클래스 FileSet도 포함되어 있습니다(Snowpark ML Data Connector 참조).

대부분의 사용자는 최신 데이터 세트 API 를 사용하여 Snowflake에서 변경 불가능하고 관리되는 데이터 스냅샷을 생성하고 이를 엔드투엔드 머신 러닝 워크플로에 사용해야 합니다.

설치

FileSystem 및 FileSet APIs는 Snowpark ML Python 패키지, snowflake-ml-python 의 일부입니다. 설치 지침은 로컬에서 Snowflake ML 사용하기 섹션을 참조하십시오.

파일 시스템 생성 및 사용하기

Snowpark ML 파일 시스템을 만들려면 Python용 Snowflake 커넥터 Connection 오브젝트 또는 Snowpark Python Session 이 필요합니다. 지침을 Snowflake에 연결하기 섹션을 참조하십시오.

연결 또는 세션 확보 후 내부 스테이지의 데이터에 액세스할 수 있는 Snowpark ML SFFileSystem 인스턴스를 생성할 수 있습니다.

Python용 Snowflake 커넥터 연결이 있는 경우 이를 sf_connection 인자로 전달합니다.

import fsspec
from snowflake.ml.fileset import sfcfs

sf_fs1 = sfcfs.SFFileSystem(sf_connection=sf_connection)
Copy

Snowpark Python 세션이 있는 경우 이를 snowpark_session 인자로 전달합니다.

import fsspec
from snowflake.ml.fileset import sfcfs

sf_fs2 = sfcfs.SFFileSystem(snowpark_session=sp_session)
Copy

SFFileSystem 은 파일의 로컬 캐싱과 같은 많은 기능을 fsspec.FileSystem 에서 상속합니다. fsspec.filesystem 팩터리 함수를 통해 Snowflake 파일 시스템을 인스턴스화하여 Snowflake FileSystem 구현을 사용하도록 target_protocol="sfc" 를 전달함으로써 이 기능과 기타 기능을 활성화할 수 있습니다.

local_cache_path = "/tmp/sf_files/"
cached_fs = fsspec.filesystem("cached", target_protocol="sfc",
                    target_options={"sf_connection": sf_connection,
                                    "cache_types": "bytes",
                                    "block_size": 32 * 2**20},
                    cache_storage=local_cache_path)
Copy

Snowflake 파일 시스템은 find, info, isdir, isfile, exists 를 포함하여 fsspec FileSystem 에 대해 정의된 읽기 전용 메서드를 대부분 지원합니다.

파일 지정하기

스테이지의 파일을 지정하려면 @database.schema.stage/file_path 형식의 경로를 사용하십시오.

파일 나열하기

파일 시스템의 ls 메서드는 스테이지에 있는 파일의 목록을 가져오는 데 사용됩니다.

print(*cached_fs.ls("@ML_DATASETS.public.my_models/sales_predict/"), end='\n')
Copy

파일 열기 및 읽기

파일 시스템의 open 메서드를 사용하여 스테이지에서 파일을 열 수 있습니다. 그런 다음 일반 Python 파일과 함께 사용하는 것과 동일한 방법을 사용하여 파일을 읽을 수 있습니다. 파일 오브젝트는 Python의 with 문과 함께 사용할 수 있는 컨텍스트 관리자이기도 하므로 더 이상 필요하지 않으면 자동으로 닫힙니다.

path = '@ML_DATASETS.public.my_models/test/data_7_7_3.snappy.parquet'

with sf_fs1.open(path, mode='rb') as f:
    print(f.read(16))
Copy

fsspec 파일 시스템을 허용하는 다른 구성 요소와 함께 SFFileSystem 인스턴스를 사용할 수도 있습니다. 여기에서는 이전 코드 블록에서 언급된 Parquet 데이터 파일이 PyArrow의 read_table 메서드에 전달됩니다.

import pyarrow.parquet as pq

table = pq.read_table(path, filesystem=sf_fs1)
table.take([1, 3])
Copy

파일(또는 파일과 유사한 오브젝트)을 허용하는 Python 구성 요소는 Snowflake 파일 시스템에서 열린 파일 오브젝트로 전달할 수 있습니다. 예를 들어, 스테이지에 gzip으로 압축된 파일이 있는 경우 이를 fileobj 매개 변수로 gzip.GzipFile 에 전달하여 Python의 gzip 모듈과 함께 사용할 수 있습니다.

path = "sfc://@ML_DATASETS.public.my_models/dataset.csv.gz"

with cached_fs.open(path, mode='rb', sf_connection=sf_connection) as f:
    g = gzip.GzipFile(fileobj=f)
    for i in range(3):
        print(g.readline())
Copy

FileSet 생성 및 사용하기

Snowflake FileSet는 내부 서버 측 암호화 스테이지에서 파일 형식으로 SQL 쿼리 결과를 보여주는 변경 불가능한 스냅샷을 나타냅니다. 이러한 파일은 FileSystem을 통해 액세스하여 PyTorch 및 TensorFlow와 같은 도구에 데이터를 공급함으로써 기존 데이터 거버넌스 모델 내에서 모델을 대규모로 학습시키도록 할 수 있습니다. FileSet를 생성하려면 FileSet.make 메서드를 사용하십시오.

FileSet를 생성하려면 Snowflake Python 연결 또는 Snowpark 세션이 필요합니다. 지침을 Snowflake에 연결하기 섹션을 참조하십시오. 또한 기존 내부 서버 측 암호화 스테이지 또는 FileSet가 저장될 해당 스테이지 아래의 하위 디렉터리에 대한 경로를 제공해야 합니다.

Snowpark DataFrame에서 FileSet를 생성하려면 DataFrame을 생성하고 이를 FileSet.makesnowpark_dataframe 으로 전달하십시오. 이때 DataFrame의 collect 메서드를 호출하지 마십시오.

# Snowpark Python equivalent of "SELECT * FROM MYDATA LIMIT 5000000"
df = snowpark_session.table('mydata').limit(5000000)
fileset_df = fileset.FileSet.make(
    target_stage_loc="@ML_DATASETS.public.my_models/",
    name="from_dataframe",
    snowpark_dataframe=df,
    shuffle=True,
)
Copy

Python용 Snowflake 커넥터 연결을 사용하여 FileSet를 생성하려면 연결을 Fileset.makesf_connection 으로 전달하고 SQL 쿼리를 query 로 전달하십시오.

fileset_sf = fileset.FileSet.make(
    target_stage_loc="@ML_DATASETS.public.my_models/",
    name="from_connector",
    sf_connection=sf_connection,
    query="SELECT * FROM MYDATA LIMIT 5000000",
    shuffle=True,           # see later section about shuffling
)
Copy

참고

shuffle 매개 변수를 사용하여 데이터를 셔플링하는 방법에 대한 자세한 내용은 FileSets의 데이터 셔플링 섹션을 참조하십시오.

files 메서드를 사용하여 FileSet의 파일 목록을 가져옵니다.

print(*fileset_df.files())
Copy

FileSet 의 데이터를 PyTorch 또는 TensorFlow 에 공급하는 방법에 대한 자세한 내용은 각각 PyTorch에 FileSet 공급하기 또는 TensorFlow에 FileSet 공급하기 섹션을 참조하십시오.

PyTorch에 FileSet 공급하기

Snowflake FileSet에서 PyTorch DataLoader에 전달할 수 있는 PyTorch DataPipe를 얻을 수 있습니다. DataLoader는 FileSet 데이터를 반복하여 일괄 처리된 PyTorch 텐서를 산출합니다. FileSet의 to_torch_datapipe 메서드를 사용하여 DataPipe를 생성한 다음 DataPipe를 PyTorch의 DataLoader 에 전달합니다.

from torch.utils.data import DataLoader

# See later sections about shuffling and batching
pipe = fileset_df.to_torch_datapipe(
    batch_size=4,
    shuffle=True,
    drop_last_batch=True)

for batch in DataLoader(pipe, batch_size=None, num_workers=0):
    print(batch)
    break
Copy

TensorFlow에 FileSet 공급하기

FileSet의 to_tf_dataset 메서드를 사용하여 Snowflake FileSet에서 TensorFlow 데이터 세트를 가져올 수 있습니다.

import tensorflow as tf

# See following sections about shuffling and batching
ds = fileset_df.to_tf_dataset(
    batch_size=4,
    shuffle=True,
    drop_last_batch=True)

for batch in ds:
    print(batch)
    break
Copy

데이터 세트를 반복하면 일괄 처리된 텐서가 생성됩니다.

FileSets의 데이터 셔플링

과적합 및 기타 문제를 방지하기 위해 학습 데이터를 셔플링하면 큰 가치를 발휘하는 경우가 많습니다. 데이터 섞기의 가치에 대한 논의는 머신 러닝 작업을 위해 데이터를 셔플링해야 하는 이유 를 참조하십시오.

쿼리에서 데이터를 아직 충분히 셔플링하지 않은 경우 FileSet는 다음 두 시점에 데이터를 셔플링할 수 있습니다.

  • FileSet.make 를 사용하여 FileSet를 만들 때.

    쿼리의 모든 행은 FileSet에 기록되기 전에 셔플링됩니다. 이는 고품질 전역 셔플이며 대규모 데이터세트 사용 시 비용이 많이 들 수 있습니다. 따라서 FileSet를 구체화할 때 한 번만 셔플링이 수행됩니다. shuffle=True 를 키워드 인자로 FileSet.make 에 전달합니다.

  • FileSet에서 PyTorch DataPipe 또는 TensorFlow 데이터 세트를 만들 때.

    이때는 FileSet의 파일 순서가 각 파일의 행 순서와 마찬가지로 무작위로 지정됩니다. 이는 “근사적인” 전역 셔플로 간주될 수 있습니다. 실제 전역 셔플보다 품질은 낮지만 비용은 훨씬 덜 듭니다. 이 스테이지에서 셔플링하려면 shuffle=True 을 FileSet의 to_torch_datapipe 또는 to_tf_dataset 메서드에 키워드 인자로 전달하십시오.

최상의 결과를 얻으려면 FileSet를 만들 때와 PyTorch 또는 TensorFlow에 데이터를 공급할 때 두 번 셔플링하십시오.

FileSets에서 데이터 일괄 처리하기

FileSets는 PyTorch 및 TensorFlow의 일괄 처리 기능과 똑같이 작동하지만 더 효율적인 일괄 처리 기능이 있습니다. PyTorch 또는 TensorFlow가 일괄 처리를 수행하도록 하는 대신 FileSet의 to_torch_datapipeto_tf_dataset 메서드에서 batch_size 매개 변수를 사용하는 것이 좋습니다. PyTorch를 사용하여 일괄 처리 기능을 비활성화하려면 DataLoader 를 인스턴스화할 때 batch_size=None 을 명시적으로 전달해야 합니다.

마지막 일괄 처리가 불완전할 경우 drop_last_batch=Trueto_torch_datapipe 또는 to_tf_dataset 에 전달하여 삭제할 수도 있습니다.