Criação de perfil dos manipuladores de funções definidas pelo usuário no Snowpark Python

Você pode descobrir quanto tempo ou memória foi gasto na execução do código do manipulador usando o criador de perfil do código integrado. O criador de perfil gera informações que descrevem quanto tempo ou memória foi gasto na execução de cada linha do manipulador.

Usando o criador de perfil, você pode gerar relatórios que se concentram em um dos seguintes itens de cada vez:

  • Quanto tempo por linha, que mostra quantas vezes uma linha foi executada, duração da execução etc.

  • Quantidade de uso de memória por linha, que mostra a quantidade de memória consumida por linha.

O criador de perfil salva o relatório gerado em uma tabela de eventos interna. Você pode recuperar os resultados usando uma função designada para acessar a tabela.

Nota

A criação de perfil gera uma sobrecarga de desempenho para execução do Python e pode afetar o desempenho da consulta. Ele se destina a desenvolvimento e testes e não deve ser ativado em cargas de trabalho de produção contínua.

Privilégios obrigatórios

Para gerenciar e usar os dados dos resultados do criador de perfil, que são armazenados na tabela de eventos SNOWFLAKE.LOCAL.PROFILER_EVENTS_RAW, você deve usar as seguintes funções:

Função do aplicativo

Notas

PROFILER_EVENTS_ADMIN

Necessária para gerenciar dados na tabela de eventos em que os dados do criador de perfil são armazenados, inclusive para selecionar, truncar ou descartar registros.

PROFILER_USER

Necessária para ler os resultados do criador de perfil da tabela de eventos.

Para obter mais informações sobre como conceder uma função de aplicativo, consulte GRANT APPLICATION ROLE. O exemplo a seguir usa a função ACCOUNTADMIN para conceder a função de aplicativo PROFILER_USER a um usuário.

USE ROLE ACCOUNTADMIN;
CREATE ROLE PROFILER_ROLE;
GRANT APPLICATION ROLE SNOWFLAKE.PROFILER_USER TO ROLE PROFILER_ROLE;
GRANT ROLE PROFILER_ROLE TO USER some_user;

Limitações

  • Pode levar de 15 a 20 segundos para que os resultados do criador de perfil fiquem prontos após a execução da consulta.

  • A saída do criador de perfil não será salva se houver falha na execução da UDF.

  • Não há suporte para criação de perfil recursiva. Somente as funções de nível superior dos módulos especificados são analisadas. As funções definidas dentro de funções não têm o perfil criado.

  • Não há suporte para criação de perfil de módulos de terceiros.

  • O suporte para criação de perfil de UDFs criadas no lado do cliente usando a API snowflake.snowpark não está disponível.

  • As funções Python executadas em paralelo por meio do joblib não são analisadas.

  • UDTFs não são suportados.

  • O tempo é medido no horário local, não no horário da CPU.

Uso

Depois de configurar o criador de perfil, você poderá usá-lo simplesmente executando a UDF para gerar a saída do criador de perfil. Depois que a UDF é executada, a saída do criador de perfil é gravada em uma tabela de eventos interna. Você pode buscar a saída do criador de perfil usando uma função do sistema.

Siga estas etapas em seu código para configurar e usar o criador de perfil:

  1. Ative o criador de perfil e defina em que o relatório de perfil deve se concentrar.

  2. Execute a UDF.

  3. Visualize a saída de criação de perfil.

Como habilitar o criador de perfil especificando seu foco

Para habilitar o criador de perfil, defina um dos seguintes parâmetros de sessão:

-- To enable profiling that focuses on activity per line
ALTER SESSION SET ACTIVE_PYTHON_PROFILER = 'LINE';

-- To enable profiling that focuses on memory usage
ALTER SESSION SET ACTIVE_PYTHON_PROFILER = 'MEMORY';

Nota

A criação de perfil gera uma sobrecarga de desempenho para a execução do Python. Você deve criar o perfil do seu código durante o desenvolvimento e o teste. Não habilite a criação de perfil em cargas de trabalho de produção contínua.

Especificando o código para criação de perfil

Por padrão, os métodos de perfis do criador de perfil definidos em linha com a declaração da UDF. Em outras palavras, o criador de perfil cria o perfil de todos os métodos definidos no manipulador.

Para o seguinte exemplo de UDF, o criador de perfil criará o perfil dos métodos handler e helper.

CREATE OR REPLACE function my_udf()
  RETURNS VARIANT
  LANGUAGE PYTHON
  RUNTIME_VERSION = 3.11
  PACKAGES = ('other_package')
  HANDLER = 'handler'
  AS $$
from other_package import some_method

def helper():
...

def handler():
...
$$;

Especificar o código externo para o perfil

Você pode especificar que o criador de perfil deve criar o perfil do código do manipulador definido fora da declaração da UDF, como um código importado de uma área de preparação.

Para especificar o código externo para criação de perfil, defina o valor do parâmetro de sessão PYTHON_UDF_PROFILER_MODULES como uma lista separada por vírgulas dos módulos que contêm o código.

ALTER SESSION SET PYTHON_UDF_PROFILER_MODULES = 'test_python_import_main, test_python_import_module';

O criador de perfil inclui os módulos especificados na saída de criação de perfil quando você executa uma UDF que os importa.

O código no exemplo a seguir mostra uma UDF que importa um código dos módulos especificados:

CREATE OR REPLACE function test_udf_1()
  RETURNS STRING
  LANGUAGE PYTHON
  RUNTIME_VERSION = 3.11
  HANDLER = 'test_python_import_main.my_udf'
  IMPORTS = ('@stage1/test_python_import_main.py', '@stage2/test_python_import_module.py');

Executar a função definida pelo usuário

Depois que você habilitar o criador de perfil, execute sua função definida pelo usuário (User-Defined Function, UDF) para iniciar a criação de perfil.

Por padrão, o criador de perfil cria o perfil dos métodos definidos no seu módulo. Para obter mais informações sobre como registrar outros módulos de arquivos importados no perfil, consulte Especificando o código para criação de perfil.

SELECT return_mean(my_col) FROM MY_TABLE;

Como exibir a saída de criação de perfil

  • Para visualizar a saída da criação de perfil, consulte a :doc:` tabela de eventos </developer-guide/logging-tracing/event-table-columns>` interna.

Os resultados da criação de perfil normalmente estarão disponíveis na tabela de eventos entre 15 e 20 segundos após o término da execução da UDF. Você pode acessar a saída usando a função do sistema de tabela GET_PYTHON_UDF_PROFILER_OUTPUT.

O código no exemplo a seguir mostra uma consulta aos resultados do criador de perfil na tabela de eventos. O query_id especificado como argumento é o ID da consulta da UDF para a qual a criação de perfil foi habilitada.

SELECT * FROM TABLE(SNOWFLAKE.LOCAL.GET_PYTHON_UDF_PROFILER_OUTPUT(<query_id>));

Resultados do perfil

Ao visualizar os resultados do criador de perfil, você verá um relatório diferente dependendo se especificou a criação de perfil para um relatório de linha ou de memória.

A saída do criador de perfil de memória terá a seguinte aparência:

Handler Name: return_mean
Python Runtime Version: 3.12
Modules Profiled: ['return_mean_module']
Extension Function ID: 1

File: _udf_code.py
Function: return_mean at line 2

Line #    Mem usage    Increment  Occurrences    Line Contents
==============================================================
     2    107.0 MiB    107.0 MiB           1    def return_mean():
     3    144.6 MiB     37.6 MiB           1        import numpy as np
     4
     5                                              # Generate a numpy array with 10 random integers between 1 and 100
     6                                              # np.random.randint(low, high, size)
     7    147.3 MiB      2.7 MiB           1        random_array = np.random.randint(1, 101, 10)
     8
     9                                              # Use a numpy function to calculate the mean
    10    147.3 MiB      0.0 MiB           1        mean_value = np.mean(random_array)
    11
    12    147.3 MiB      0.0 MiB           1        count = 0
    13    147.3 MiB      0.0 MiB         101        for i in range(100):
    14    147.3 MiB      0.0 MiB         100            count = count + 1
    15
    16    147.3 MiB      0.0 MiB           1        return mean_value

A saída do criador de perfil de linha terá a seguinte aparência:

Handler Name: return_mean
Python Runtime Version: 3.12
Extension Function ID: 1
Modules Profiled: ['return_mean_module']
Timer Unit: 0.001 s

Total Time: 0.229063 s
File: _udf_code.py
Function: return_mean at line 2

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     2                                           def return_mean():
     3         1        206.1    206.1     90.0      import numpy as np
     4
     5                                               # Generate a numpy array with 10 random integers between 1 and 100
     6                                               # np.random.randint(low, high, size)
     7         1         22.8     22.8     10.0      random_array = np.random.randint(1, 101, 10)
     8
     9                                               # Use a numpy function to calculate the mean
    10         1          0.1      0.1      0.0      mean_value = np.mean(random_array)
    11
    12         1          0.0      0.0      0.0      count = 0
    13       101          0.0      0.0      0.0      for i in range(100):
    14       100          0.0      0.0      0.0          count = count + 1
    15
    16         1          0.0      0.0      0.0      return mean_value