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 do 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 de Python com código carregado de um estágio.

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 do Snowflake. Não há custo adicional para o uso dos pacotes Anaconda além do preço baseado no consumo padrão do Snowflake.

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 Terceiros do Snowflake.

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 única vez para sua conta Snowflake. Consulte Habilitação da função ORGADMIN para uma conta.

  1. Entre em 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 Terceiros do Snowflake.

  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 Definição de detalhes e preferências do 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

Usando 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 inline.

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.8 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 inline.

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 isso, converta o conjunto de dados de entrada em arrays do Snowflake e alimente as arrays no código de previsão. A operação em lote pode ser feita com o UDTFs tabulares de Python, a função ARRAY_AGG, UDFs tabulares (UDTFs) de Java ou UDFs tabulares de JavaScript (UDTFs).

Você também pode usar UDFs vetorizadas Python, com a qual você pode definir funções de Python que recebem linhas de entrada em lotes, nas quais bibliotecas de machine learning ou de 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