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:

Visão geral do repositório de artefatos

Com o Artifact Repository, você pode usar diretamente os pacotes Python do Python Package Index (PyPI) dentro das funções definidas pelo usuário do Snowpark Python (UDFs) e procedimentos armazenados para que seja mais fácil criar e dimensionar aplicativos baseados em Python no Snowflake.

Introdução

Usar o repositório de artefatos padrão do Snowflake (snowflake.snowpark.pypi_shared_repository) para conectar e instalar o PyPI Pacotes dentro do Snowpark UDFs e procedimentos.

Antes de usar este repositório, o administrador da conta (um usuário que recebeu a função ACCOUNTADMIN) deve conceder a função de banco de dados SNOWFLAKE.PYPI_REPOSITORY_USER para sua função:

GRANT DATABASE ROLE SNOWFLAKE.PYPI_REPOSITORY_USER TO ROLE some_user_role;
Copy

O administrador da conta também pode conceder essa função de banco de dados a todos os usuários da conta:

GRANT DATABASE ROLE SNOWFLAKE.PYPI_REPOSITORY_USER TO ROLE PUBLIC;
Copy

Com essa função, você pode instalar o pacote do repositório. Quando você cria a UDF, você define o parâmetro ARTIFACT_REPOSITORY para o nome do repositório de artefatos. Você também define o parâmetro PACKAGES para a lista dos nomes dos pacotes que virão do repositório de artefatos. No exemplo a seguir, como o repositório de artefatos está configurado com PyPI, o pacote scikit-learn é originado de PyPI:

CREATE OR REPLACE FUNCTION sklearn_udf()
  RETURNS FLOAT
  LANGUAGE PYTHON
  RUNTIME_VERSION = 3.12
  ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
  PACKAGES = ('scikit-learn')
  HANDLER = 'udf'
  AS
$$
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier

def udf():
  X, y = load_iris(return_X_y=True)
  X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)

  model = RandomForestClassifier()
  model.fit(X_train, y_train)
  return model.score(X_test, y_test)
$$;

SELECT sklearn_udf();
Copy

Nota

Para especificar uma versão de pacote, adicione-a como mostrado:

PACKAGES = ('scikit-learn==1.5')
Copy

Pacotes criados somente para x86

Se um pacote for criado apenas para x86, escolha um dos warehouses que use a arquitetura de CPU x86 — MEMORY_1X_x86 ou MEMORY_16X_x86 — e depois especifique RESOURCE_CONSTRAINT=(architecture='x86'), como no exemplo a seguir:

CREATE OR REPLACE FUNCTION pymeos_example()
RETURNS STRING
LANGUAGE PYTHON
HANDLER='main'
RUNTIME_VERSION='3.11'
ARTIFACT_REPOSITORY=snowflake.snowpark.pypi_shared_repository
PACKAGES=('pymeos') -- dependency pymeos-cffi is x86 only
RESOURCE_CONSTRAINT=(architecture='x86')
AS $$
def main() -> str:
   from pymeos import pymeos_initialize, pymeos_finalize, TGeogPointInst, TGeogPointSeq

   # Always initialize MEOS library
   pymeos_initialize()

   sequence_from_string = TGeogPointSeq(
      string='[Point(10.0 10.0)@2019-09-01 00:00:00+01, Point(20.0 20.0)@2019-09-02 00:00:00+01, Point(10.0 10.0)@2019-09-03 00:00:00+01]')

   sequence_from_points = TGeogPointSeq(instant_list=[TGeogPointInst(string='Point(10.0 10.0)@2019-09-01 00:00:00+01'),
        TGeogPointInst(string='Point(20.0 20.0)@2019-09-02 00:00:00+01'),
        TGeogPointInst(string='Point(10.0 10.0)@2019-09-03 00:00:00+01')],
          lower_inc=True, upper_inc=True)
   speed = sequence_from_points.speed()

   # Call finish at the end of your code
   pymeos_finalize()

   return speed
$$;

SELECT pymeos_example();
Copy

Para obter mais informações, consulte Warehouses otimizados para Snowpark.

Você pode usar o repositório de artefatos com APIs de cliente de procedimento armazenado e UDF, como as seguintes:

Ao usá-las, especifique os seguintes parâmetros:

  • ARTIFACT_REPOSITORY

  • PACKAGES

e fornecem o nome do pacote no campo PACKAGES.

Veja o exemplo a seguir:

...
ARTIFACT_REPOSITORY="snowflake.snowpark.pypi_shared_repository",
PACKAGES=["urllib3", "requests"],
...
Copy

Solução de problemas

Se a instalação do pacote falhar para a parte de criação da função ou procedimento, execute o seguinte comando pip localmente para verificar se a especificação do pacote é válida:

pip install <package name> --only-binary=:all: --python-version 3.12 –platform <platform_tag>
Copy

Limitações

  • Não há suporte para o acesso a repositórios privados.

  • Você não pode usar esse recurso diretamente no Notebooks. No entanto, você pode usar um UDF ou procedimento armazenado que usa pacotes PyPI dentro de um notebook.

  • Você não pode usar o repositório de artefatos em procedimentos armazenados anônimos.

Nota

  • O Snowflake não verifica ou corrige a segurança dos pacotes Python de fontes externas. Você é responsável por avaliar esses pacotes e garantir que sejam seguros e confiáveis.

  • O Snowflake se reserva o direito de bloquear ou remover qualquer pacote que possa ser prejudicial ou arriscado, sem aviso prévio. Isso é para proteger a integridade da plataforma.

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.

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.12
  RESOURCE_CONSTRAINT=(architecture='x86')
  IMPORTS=('@mystage/mycustompackage.zip')
  HANDLER='compute'
  as
  $$
  def compute():
      import mycustompackage
      return mycustompackage.mycustompackage()
  $$;
Copy

Como usar pacotes de terceiros do Anaconda

O Snowflake fornece acesso a um conjunto curado de pacotes Python criados pelo Anaconda. Esses pacotes se integram diretamente aos recursos Python do Snowflake, sem custo adicional.

Termos de licenciamento

  • No Snowflake: regido por seu contrato de cliente existente do Snowflake, incluindo as restrições de uso do Anaconda descritas nesta documentação. Nenhum termo separado do Anaconda se aplica para uso no Snowflake.

  • Desenvolvimento local: da de Snowflake Repositório dedicado do Anaconda : Sujeito aos Termos de cliente final incorporado do Anaconda e aos Termos de serviço do Anaconda publicados no repositório. O uso local é limitado ao desenvolvimento/teste de cargas de trabalho destinadas à implantação no Snowflake.

Diretrizes do usuário

Usos permitidos

  • Dentro do Snowflake: Use pacotes livremente em todos os recursos Python com suporte.

    Nota

    Você não pode chamar uma UDF dentro da cláusula DEFAULT de uma instrução CREATE TABLE, com exceção dos pacotes que permanecem disponíveis gratuitamente na instrução Snowflake Notebooks em Snowpark Container Services.

  • Desenvolvimento local: use pacotes do repositório Anaconda dedicado do Snowflake para desenvolver ou testar cargas de trabalho destinadas ao Snowflake.

Usos proibidos

Os seguintes usos de pacotes são proibidos:

  • Usando pacotes para projetos não relacionados ao Snowflake.

  • Hospedar ou espelhar o conteúdo do pacote externamente.

  • Remoção ou modificação de avisos de direitos autorais ou licença.

Como encontrar e gerenciar pacotes

Não consegue encontrar um pacote de que precisa?

Suporte e segurança

Cobertura de suporte

O Snowflake oferece suporte ao pacote padrão, incluindo:

  • Orientação de instalação

  • Solução de problemas de ambiente

  • assistência para integração

Garantia e SLA

Os pacotes Anaconda são software de terceiros fornecidos como estão e não são cobertos pela garantia da Snowflake ou SLA (Contrato de nível de serviço).

Práticas de segurança

Os pacotes Anaconda fornecidos pelo Snowflake são criados em uma infraestrutura confiável e assinados digitalmente.

Para obter mais detalhes, consulte Práticas de segurança do Anaconda .

Conformidade e licenciamento

Cada pacote inclui sua própria licença de código aberto. Os clientes devem cumprir os termos de licença do pacote individual, além das diretrizes de uso descritas nesta documentação.

Perguntas frequentes

  • Pposso usar pacotes de outros canais do Anaconda (por exemplo, conda-forge ou Padrões do Anaconda)? Não. Outros canais são ofertas separadas e podem exigir uma licença comercial do Anaconda.

  • Poliano para usar estes pacotes localmente para projetos não relacionados ao Snowflake? Não. O uso local é estritamente limitado ao desenvolvimento ou teste de cargas de trabalho destinadas à implantação no Snowflake. Outros usos exigem uma licença Anaconda separada.

  • Por que o Snowpark Container Services requer licenciamento separado? O uso de pacotes em imagens Docker personalizadas vai além do ambiente integrado do Snowflake, precisando de um licenciamento separado do Anaconda.

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 py312_env -c https://repo.anaconda.com/pkgs/snowflake python=3.12 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