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)
Snowpark Python 세션이 있는 경우 이를 snowpark_session
인자로 전달합니다.
import fsspec
from snowflake.ml.fileset import sfcfs
sf_fs2 = sfcfs.SFFileSystem(snowpark_session=sp_session)
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)
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')
파일 열기 및 읽기¶
파일 시스템의 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))
fsspec 파일 시스템을 허용하는 다른 구성 요소와 함께 SFFileSystem
인스턴스를 사용할 수도 있습니다. 여기에서는 이전 코드 블록에서 언급된 Parquet 데이터 파일이 PyArrow의 read_table
메서드에 전달됩니다.
import pyarrow.parquet as pq
table = pq.read_table(path, filesystem=sf_fs1)
table.take([1, 3])
파일(또는 파일과 유사한 오브젝트)을 허용하는 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())
FileSet 생성 및 사용하기¶
Snowflake FileSet는 내부 서버 측 암호화 스테이지에서 파일 형식으로 SQL 쿼리 결과를 보여주는 변경 불가능한 스냅샷을 나타냅니다. 이러한 파일은 FileSystem을 통해 액세스하여 PyTorch 및 TensorFlow와 같은 도구에 데이터를 공급함으로써 기존 데이터 거버넌스 모델 내에서 모델을 대규모로 학습시키도록 할 수 있습니다. FileSet를 생성하려면 FileSet.make
메서드를 사용하십시오.
FileSet를 생성하려면 Snowflake Python 연결 또는 Snowpark 세션이 필요합니다. 지침을 Snowflake에 연결하기 섹션을 참조하십시오. 또한 기존 내부 서버 측 암호화 스테이지 또는 FileSet가 저장될 해당 스테이지 아래의 하위 디렉터리에 대한 경로를 제공해야 합니다.
Snowpark DataFrame에서 FileSet를 생성하려면 DataFrame을 생성하고 이를 FileSet.make
에 snowpark_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,
)
Python용 Snowflake 커넥터 연결을 사용하여 FileSet를 생성하려면 연결을 Fileset.make
에 sf_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
)
참고
shuffle
매개 변수를 사용하여 데이터를 셔플링하는 방법에 대한 자세한 내용은 FileSets의 데이터 셔플링 섹션을 참조하십시오.
files
메서드를 사용하여 FileSet의 파일 목록을 가져옵니다.
print(*fileset_df.files())
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
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
데이터 세트를 반복하면 일괄 처리된 텐서가 생성됩니다.
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_datapipe
및 to_tf_dataset
메서드에서 batch_size
매개 변수를 사용하는 것이 좋습니다. PyTorch를 사용하여 일괄 처리 기능을 비활성화하려면 DataLoader
를 인스턴스화할 때 batch_size=None
을 명시적으로 전달해야 합니다.
마지막 일괄 처리가 불완전할 경우 drop_last_batch=True
를 to_torch_datapipe
또는 to_tf_dataset
에 전달하여 삭제할 수도 있습니다.