Como usar pacotes de terceiros

Os estágios podem ser usados para importar pacotes de terceiros. Você também pode especificar pacotes do Anaconda a serem instalados quando você criar UDFs de Python.

Neste tópico:

Importação de pacotes pelo estágio Snowflake

Os estágios do Snowflake podem ser usados para importar pacotes. Você pode incluir qualquer código Python que siga as diretrizes definidas em Limitações gerais. Para obter mais informações, consulte Como criar uma UDF Python com código carregado de um estágio.

Só é possível fazer upload de pacotes Python puros ou pacotes com código nativo por meio de um estágio Snowflake. Se seu pacote carregado tiver dependência da arquitetura de CPU x86, será necessário usar Warehouses otimizados para Snowpark e utilizar a propriedade de warehouse RESOURCE_CONSTRAINT, com arquitetura de CPU x86.

Como exemplo, é possível usar o seguinte SQL, que cria um warehouse nomeado so_warehouse com arquitetura de CPU x86:

CREATE WAREHOUSE so_warehouse WITH
   WAREHOUSE_SIZE = 'LARGE'
   WAREHOUSE_TYPE = 'SNOWPARK-OPTIMIZED'
   RESOURCE_CONSTRAINT = 'MEMORY_16X_X86';
Copy

Para instalar um pacote com código nativo por meio da importação do estágio, use o seguinte exemplo:

create or replace function native_module_test_zip()
returns string
language python
runtime_version=3.9
handler='compute'
imports=('@mystage/mycustompackage.zip')
as
$$
import os
import sys
def compute():
   from zipfile import ZipFile
   if os.path.exists('/tmp/mycustompackage'):
      shutil.rmtree('/tmp/mycustompackage')
   os.mkdir('/tmp/mycustompackage')
   zippath = os.path.join(sys._xoptions["snowflake_import_directory"], 'mycustompackage.zip')
   ZipFile(zippath).extractall('/tmp/mycustompackage')
   sys.path.insert(0, '/tmp/mycustompackage')
   #return os.listdir('/tmp/mycustompackage')
   import mycustompackage
   return mycustompackage.mycustompackage()
$$;
Copy

Como usar pacotes de terceiros do Anaconda

Por conveniência, vários pacotes populares de terceiros de código aberto do Python que são criados e fornecidos pelo Anaconda são disponibilizados para uso imediato dentro dos warehouses virtuais do Snowflake. Não há custo adicional para esse uso dos pacotes Anaconda além do preço padrão baseado no consumo da Snowflake. Com exceção dos Snowflake Notebooks, os pacotes Anaconda atualmente não são elegíveis para uso no Snowpark Container Services (SPCS). Para usar pacotes Python em uma imagem de contêiner para SPCS, é possível instalar esses pacotes de PyPi usando pip.

Para ver a lista de pacotes de terceiros do Anaconda, veja o canal Anaconda do Snowflake.

Para solicitar a adição de novos pacotes, vá para a página Snowflake Ideas na comunidade Snowflake. Selecione a categoria Python Packages & Libraries e verifique se alguém já enviou uma solicitação. Em caso afirmativo, vote nisso. Caso contrário, clique em New Idea e envie sua sugestão.

Introdução

Antes de começar a usar os pacotes fornecidos pelo Anaconda dentro do Snowflake, você deve reconhecer os Termos de ofertas externas.

Nota

Você deve ser o administrador da organização (use a função ORGADMIN) para aceitar os termos. Você só precisa aceitar os termos uma vez para sua organização Snowflake. Consulte Ativação da função ORGADMIN em uma conta.

  1. Faça login no Snowsight.

  2. Selecione Admin » Billing & Terms.

  3. Na seção Anaconda, selecione Enable.

  4. Na caixa de diálogo Anaconda Packages, clique no link para rever a página Termos de ofertas externas.

  5. Se você concordar com os termos, selecione Acknowledge & Continue.

Se você vir um erro ao tentar aceitar os termos de serviço, seu perfil de usuário pode estar sem um nome, sobrenome ou endereço de e-mail. Se você tiver uma função de administrador, consulte Adição dos detalhes do usuário ao seu perfil de usuário para atualizar seu perfil usando Snowsight. Caso contrário, entre em contato com um administrador para atualizar sua conta.

Exibição e utilização de pacotes

Exibição dos pacotes disponíveis

Você pode exibir todos os pacotes disponíveis e suas informações de versão consultando a exibição PACKAGES no Information Schema.

select * from information_schema.packages where language = 'python';
Copy

Para exibir informações da versão sobre um pacote específico, por exemplo numpy, use este comando:

select * from information_schema.packages where (package_name = 'numpy' and language = 'python');
Copy

Nota

Alguns pacotes no canal Anaconda Snowflake não são destinados para uso dentro de UDFs do Snowflake porque UDFs são executadas dentro de um mecanismo restrito. Para obter mais informações, consulte Boas práticas de segurança.

Quando consultas que chamam UDFs de Python são executadas dentro de um warehouse do Snowflake, os pacotes do Anaconda são instalados sem problemas e armazenados em cache no warehouse virtual em seu nome.

Exibição de pacotes importados

Você pode exibir uma lista dos pacotes e módulos que uma UDF ou UDTF está usando executando o comando DESCRIBE FUNCTION. A execução do comando DESCRIBE FUNCTION para uma UDF cujo manipulador é implementado em Python retorna os valores de várias propriedades, incluindo uma lista de módulos e pacotes importados, bem como pacotes instalados, a assinatura da função e seu tipo de retorno.

Ao especificar o identificador para a UDF, certifique-se de incluir os tipos de parâmetros de função, se houver.

desc function stock_sale_average(varchar, number, number);
Copy

Como usar os pacotes Anaconda

Para um exemplo de como utilizar um pacote Anaconda importado em um UDF Python, consulte Como importar um pacote em um manipulador em linha.

Configuração de políticas de pacotes

Você pode usar uma política de pacotes para definir listas de permissões e listas de bloqueio para pacotes Python de terceiros do Anaconda no nível da conta. Isso permite atender a requisitos mais rígidos de auditoria e segurança e oferece um controle mais refinado sobre quais pacotes estão disponíveis ou bloqueados em seu ambiente. Para obter mais informações, consulte Políticas de pacotes.

Desempenho em warehouses frios

Para uma gestão mais eficiente dos recursos, warehouse virtuais recém-provisionados não pré-instalam pacotes do Anaconda. Em vez disso, pacotes do Anaconda são instalados sob demanda na primeira vez que uma UDF é usada. Os pacotes ficam estão em cache para futura execução da UDF no mesmo warehouse. O cache é abandonado quando o warehouse é suspenso. Isso pode resultar em um desempenho mais lento na primeira vez que uma UDF é usado ou depois que o warehouse volta a funcionar. A latência adicional pode ser de aproximadamente 30 segundos.

Desenvolvimento local e testes

Para ajudar você a criar um ambiente no conda em sua máquina local para desenvolvimento e testes, o Anaconda criou um canal Snowflake que espelha um subconjunto dos pacotes e versões que são suportados no ambiente de UDF de Python no Snowflake. Você pode usar o canal Snowflake do Conda para testes e desenvolvimento local sem custo sob os Termos Suplementares de Software Incorporado dos Termos de Serviço do Anaconda.

Por exemplo, para criar um novo ambiente conda localmente usando o canal do Snowflake, digite algo como isso na linha de comando:

conda create --name py38_env -c https://repo.anaconda.com/pkgs/snowflake python=3.9 numpy pandas
Copy

Observe que, devido às diferenças de plataforma, seu ambiente local conda pode não ser exatamente o mesmo que o ambiente do servidor.

Práticas recomendadas

Dentro da instrução create function, a especificação do pacote (por exemplo, packages = ('numpy','pandas')) deve especificar apenas os pacotes de nível superior que a UDF está usando diretamente. O Anaconda realiza o gerenciamento de dependência de pacotes e instalará automaticamente as dependências necessárias. Devido a isso, você não deve especificar pacotes de dependência.

O Anaconda instalará a versão mais atualizada do pacote e suas dependências se você não especificar uma versão do pacote. Geralmente, não é necessário especificar uma versão de pacote específica. Observe que a resolução da versão é executada uma vez, quando a UDF é criada usando o comando create function. Depois disso, a resolução da versão resultante é congelada e o mesmo conjunto de pacotes será usado quando essa UDF específica for executada.

Para um exemplo de como usar a especificação do pacote dentro da instrução create function, veja Como importar um pacote em um manipulador em linha.

Problemas conhecidos com pacotes de terceiros

Desempenho com previsão de linha única

Alguns frameworks de ciência de dados, como Scikit-learn e TensorFlow, podem ser lentos ao fazer previsões de linha única com ML. Para melhorar o desempenho, faça uma previsão em lotes em vez da previsão de linha única. Para fazer isso, você pode usar UDFs Python vetorizadas, com as quais poderá definir funções Python que recebem linhas de entrada em lotes, nas quais bibliotecas de aprendizado de máquina ou ciência de dados são otimizadas para operar. Para obter mais informações, consulte UDFs vetorizadas de Python.

Download de dados sob demanda de bibliotecas de ciência de dados

Algumas bibliotecas de ciência de dados, tais como NLTK, Keras e spaCy fornecem funcionalidade para download de corpora, dados ou modelos adicionais sob demanda.

Entretanto, o download sob demanda não funciona com UDFs de Python devido às restrições de segurança do Snowflake, que desativam algumas capacidades, como acesso à rede e escrita em arquivos.

Para contornar esse problema, baixe os dados para seu ambiente local e depois forneça-os para a UDF através de um estágio do Snowflake.

XGBoost

Ao usar XGBoost em UDF ou UDTF para previsão paralela ou treinamento, a concorrência para cada instância XGBoost deve ser definida como 1. Isso assegura que o XGBoost esteja configurado para um ótimo desempenho ao ser executado no ambiente Snowflake.

Exemplos:

import xgboost as xgb
model = xgb.Booster()
model.set_param('nthread', 1)
model.load_model(...)
Copy
import xgboost as xgb
model = xgb.XGBRegressor(n_jobs=1)
Copy

TensorFlow/Keras

Ao usar o Tensorflow/Keras para previsão, use Model.predict_on_batch e não Model.predict.

Exemplo:

import keras
model = keras.models.load_model(...)
model.predict_on_batch(np.array([input]))
Copy