Snowpark ML FileSystem e FileSet

A biblioteca Snowpark ML inclui FileSystem, uma abstração semelhante a um sistema de arquivos para um estágio interno do Snowflake criptografado no lado do servidor. Especificamente, é uma implementação fsspec AbstractFileSystem. A biblioteca também inclui FileSet, uma classe relacionada que permite mover dados de machine learning de uma tabela Snowflake para o estágio e, a partir daí, alimentar os dados para PyTorch ou TensorFlow (consulte Conectores do Snowpark ML Framework).

Dica

Consulte a Referência de API do Snowpark ML para obter detalhes completos sobre estas APIs.

Nota

Este tópico pressupõe que o módulo Snowpark ML já esteja instalado. Caso contrário, consulte Instalação do Snowpark ML.

Criação e utilização de um sistema de arquivos

A criação de um sistema de arquivos Snowpark ML exige um objeto do conector Snowflake para Python Connection ou um Snowpark Python Session. Consulte Autenticação no Snowflake para obter instruções.

Depois de ter uma conexão ou uma sessão, você poderá criar uma instância do Snowpark ML SFFileSystem por meio da qual poderá acessar dados em seu estágio interno.

Se você tiver uma conexão do conector Snowflake para Python, passe-a como o argumento sf_connection:

import fsspec
from snowflake.ml.fileset import sfcfs

sf_fs1 = sfcfs.SFFileSystem(sf_connection=sf_connection)
Copy

Se você tiver uma sessão Snowpark Python, passe-a como o argumento snowpark_session:

import fsspec
from snowflake.ml.fileset import sfcfs

sf_fs2 = sfcfs.SFFileSystem(snowpark_session=sp_session)
Copy

SFFileSystem herda muitos recursos de fsspec.FileSystem, como armazenamento em cache local de arquivos. Você pode ativar esse e outros recursos instanciando um sistema de arquivos Snowflake por meio da função de fábrica fsspec.filesystem, passando target_protocol="sfc" para usar a implementação do FileSystem do Snowflake:

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

O sistema de arquivos do Snowflake oferece suporte à maioria dos métodos somente leitura definidos para um fsspec FileSystem, incluindo find, info, isdir, isfile e exists.

Especificação de arquivos

Para especificar arquivos em um estágio, use um caminho no formato @database.schema.stage/file_path.

Listagem de arquivos

O método ls do sistema de arquivos é usado para obter uma lista dos arquivos no estágio:

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

Abertura e leitura de arquivos

Você pode abrir arquivos no estágio usando o método open do sistema de arquivos. Você pode então ler os arquivos usando os mesmos métodos usados com arquivos Python comuns. O objeto de arquivo também é um gerenciador de contexto que pode ser usado com a instrução with do Python, portanto é fechado automaticamente quando não é mais necessário.

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

Você também pode usar a instância SFFileSystem com outros componentes que aceitam sistemas de arquivos fsspec. Aqui, o arquivo de dados Parquet mencionado no bloco de código anterior é passado para o método read_table de PyArrow:

import pyarrow.parquet as pq

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

Componentes Python que aceitam arquivos (ou objetos semelhantes a arquivos) podem passar para um objeto de arquivo aberto do sistema de arquivos do Snowflake. Por exemplo, se você tiver um arquivo compactado com gzip em seu estágio, poderá usá-lo com o módulo gzip do Python, passando-o para gzip.GzipFile como o parâmetro fileobj:

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

Criação e utilização de um FileSet

Um FileSet do Snowflake representa um instantâneo imutável do resultado de uma consulta SQL na forma de arquivos em um estágio criptografado interno do lado do servidor. Esses arquivos podem ser acessados por meio de um FileSystem para alimentar dados em ferramentas como PyTorch e TensorFlow para que você possa treinar modelos em escala e dentro do seu modelo de governança de dados existente. Para criar um FileSet, use o método FileSet.make.

Você precisa de uma conexão Snowflake Python ou de uma sessão Snowpark para criar um FileSet. Consulte Autenticação no Snowflake para obter instruções. Você também deve fornecer o caminho para um estágio criptografado interno do servidor existente ou um subdiretório nesse estágio, onde o FileSet será armazenado.

Para criar um FileSet a partir de um DataFrame do Snowpark, construa um DataFrame e passe-o para FileSet.make como snowpark_dataframe; não chame o método collect do DataFrame:

# 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

Para criar um FileSet usando uma conexão do conector Snowflake para Python, transmita a conexão para Fileset.make como sf_connection e transmita a consulta SQL como 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

Nota

Consulte Embaralhamento de dados em FileSets para obter informações sobre como embaralhar seus dados usando o parâmetro shuffle.

Use o método files para obter uma lista dos arquivos no FileSet:

print(*fileset_df.files())
Copy

Para obter informações sobre como alimentar os dados no FileSet para PyTorch ou TensorFlow, consulte Conectores do Snowpark ML Framework.