Snowpark ML FileSystem e FileSet — Obsoleto

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 Snowpark ML Data Connector).

Dica

A maioria dos usuários deve usar a mais nova API de conjunto de dados para criar instantâneos de dados imutáveis e governados no Snowflake e usá-los em fluxos de trabalho de aprendizado de máquina de ponta a ponta.

Instalação

O FileSystem e FileSet APIs fazem parte do pacote Snowpark ML Python, snowflake-ml-python. Consulte Como usar o Snowflake ML localmente para obter instruções de instalação.

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 Conexão ao 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 Conexão ao 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 em FileSet para PyTorch ou TensorFlow, consulte Alimentação de um FileSet para PyTorch ou Alimentação de um FileSet para TensorFlow, respectivamente.

Alimentação de um FileSet para PyTorch

A partir de um FileSet do Snowflake, você pode obter um PyTorch DataPipe, que pode ser passado para um PyTorch DataLoader. O DataLoader itera sobre os dados FileSet e produz tensores PyTorch em lote. Crie o DataPipe usando o método to_torch_datapipe de FileSet e depois passe o DataPipe para o DataLoader do PyTorch:

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

Alimentação de um FileSet para TensorFlow

Você pode obter um conjunto de dados TensorFlow de um FileSet do Snowflake usando o método to_tf_dataset do FileSet:

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

A iteração sobre o conjunto de dados produz tensores em lote.

Embaralhamento de dados em FileSets

Muitas vezes vale a pena embaralhar os dados de treinamento para evitar o sobreajuste e outros problemas. Para uma discussão sobre o valor do embaralhamento, consulte Por que os dados deveriam ser embaralhados para tarefas de machine learning?

Se sua consulta ainda não embaralhar seus dados o suficiente, um FileSet poderá embaralhar os dados em dois momentos:

  • Quando o FileSet é criado usando FileSet.make.

    Todas as linhas da sua consulta são embaralhadas antes de serem gravadas no FileSet. Este é um embaralhamento global de alta qualidade e pode ser caro com conjuntos de dados grandes. Portanto, ele é realizado apenas uma vez, ao materializar o FileSet. Passe shuffle=True como argumento de palavra-chave para FileSet.make.

  • Quando você cria um conjunto de dados PyTorch DataPipe ou TensorFlow a partir de um FileSet.

    Neste ponto, a ordem dos arquivos no FileSet é aleatória, assim como a ordem das linhas em cada arquivo. Isto pode ser considerado um embaralhamento global “aproximado”. Ele tem uma qualidade inferior em comparação com um verdadeiro embaralhamento global, mas é muito mais barato. Para embaralhar neste estágio, passe shuffle=True como um argumento de palavra-chave para o método to_torch_datapipe ou to_tf_dataset do FileSet.

Para obter melhores resultados, embaralhe duas vezes: ao criar o FileSet e ao alimentar os dados para PyTorch ou TensorFlow.

Colocação de dados em lote em FileSets

FileSets têm um recurso de lote que funciona da mesma forma que a funcionalidade de lote no PyTorch e TensorFlow, mas é mais eficiente. Snowflake recomenda que você use o parâmetro batch_size nos métodos to_torch_datapipe e to_tf_dataset de FileSet em vez de o PyTorch ou TensorFlow fazer a colocação em lote. Com PyTorch, para desativar sua funcionalidade de lote, você deve passar explicitamente batch_size=None ao instanciar DataLoader.

Você também pode descartar o último lote se ele estiver incompleto, passando drop_last_batch=True para to_torch_datapipe ou para to_tf_dataset.