Snowpark Python 저장 프로시저 처리기 프로파일링하기

기본 제공 코드 프로파일러를 사용하여 처리기 코드를 실행하는 데 얼마나 많은 시간이나 메모리가 사용되었는지 확인할 수 있습니다. 프로파일러는 프로시저 처리기의 각 줄을 실행하는 데 소요된 시간 또는 메모리를 설명하는 정보를 생성합니다.

프로파일러를 사용하면 다음 중 하나에 초점을 맞춘 보고서를 한 번에 생성할 수 있습니다.

  • 라인당 시간: 보고서에 라인이 실행된 횟수, 실행에 걸린 시간 등이 표시됩니다.

  • 라인당 메모리 사용량: 보고서에 라인당 소비된 메모리의 양이 표시됩니다.

프로파일러는 생성된 보고서를 사용자가 지정한 Snowflake 내부 사용자 스테이지 에 저장합니다. StoredProcedureProfiler.get_output 함수를 사용하여 프로파일러 출력을 읽을 수 있습니다.

참고

프로파일링은 Python 실행에 성능 오버헤드를 유발하며 쿼리 성능에 영향을 미칠 수 있습니다. 이 기능은 개발 및 테스트를 위한 것으로 지속적인 프로덕션 워크로드에서는 활성화해서는 안 됩니다.

필수 권한

StoredProcedureProfiler.set_active_profiler 함수가 호출된 후 저장 프로시저가 실행되면 Snowflake는 프로시저를 실행하는 사용자의 다음 권한을 확인합니다.

  • 프로파일링 출력 스테이지에 대한 읽기 쓰기 권한이 있어야 합니다.

  • 프로필 저장 프로시저가 호출자 권한 저장 프로시저 인 경우 저장 프로시저에 USAGE 권한이 있는 역할을 사용해야 합니다.

  • 프로필 저장 프로시저가 소유자 권한 저장 프로시저 인 경우 저장 프로시저에 OWNERSHIP 권한이 있는 역할을 사용해야 합니다.

제한 사항

  • 저장 프로시저만 지원됩니다. UDF 지원은 아직 제공되지 않습니다.

  • 재귀 프로파일링은 지원되지 않습니다. 지정된 모듈의 최상위 함수만 프로파일링되고 함수 내부에 정의된 함수는 프로파일링되지 않습니다.

  • snowflake.snowpark API 를 통해 클라이언트 측에서 생성된 저장 프로시저를 프로파일링하는 것은 지원되지 않습니다.

  • joblib 를 통해 병렬로 실행되는 Python 함수는 프로파일링되지 않습니다.

  • 시스템 정의 저장 프로시저는 프로파일링할 수 없습니다. 출력을 생성하지 않습니다.

  • 프로필 API 는 프로시저가 호출된 것과 동일한 스레드에서 사용해야 합니다.

사용법

프로파일러를 사용할 수 있도록 설정한 후에는 저장 프로시저를 호출하여 프로파일러 출력을 생성하는 것만으로 프로파일러를 사용할 수 있습니다. 프로시저 실행이 완료되면 프로파일러의 출력은 사용자가 지정한 스테이지의 파일에 기록됩니다. 아래 설명된 대로 시스템 함수를 사용하여 프로파일러 출력을 가져올 수 있습니다.

프로파일러를 설정하고 사용하려면 코드에서 다음 단계를 따르십시오.

  1. Session 오브젝트에서 프로파일러 오브젝트를 가져옵니다.

  2. 프로필 출력을 작성할 Snowflake 스테이지를 지정합니다.

  3. 프로파일러를 활성화하고 프로필 보고서의 초점을 설정할 항목을 설정합니다.

  4. 저장 프로시저를 호출합니다.

  5. 프로파일링 출력을 봅니다.

프로파일러 오브젝트 획득하기

Python에서 프로파일러를 구성하고 실행할 StoredProcedureProfiler 유형의 변수를 생성합니다.

# Create your sesssion
session = Session.builder.configs(CONNECTION_PARAMETERS).create()

# Acquire profiler object
profiler = session.stored_procedure_profiler()
Copy

프로필 출력을 작성할 Snowflake 스테이지 지정하기

프로파일러를 실행하기 전에 출력을 저장할 스테이지를 지정해야 합니다. 스테이지를 지정하려면 StoredProcedureProfiler.set_target_stage 를 호출하고 보고서를 작성해야 하는 내부 Snowflake 스테이지 의 정규화된 이름을 지정합니다.

다음 사항에 유의하십시오.

  • 스테이지 이름은 정규화된 이름이어야 합니다.

  • 이 함수에 입력한 스테이지가 존재하지 않는 경우 Snowflake는 해당 이름으로 임시 스테이지를 생성합니다.

  • 세션 범위 밖에서 프로파일러 출력을 보존하려면 set_target_stage 를 실행하기 전에 영구 스테이지를 만들고 함수 호출에 해당 영구 스테이지의 이름을 지정하십시오.

  • set_target_stage 로 대상 스테이지를 설정하지 않으면 Snowflake는 현재 세션의 임시 스테이지를 대상 스테이지로 설정합니다. 임시 스테이지를 확인하려면 Session.get_session_stage 를 호출하십시오.

다음 예의 코드는 프로파일러 출력을 수신하기 위해 임시 profiler_output 스테이지를 생성합니다.

profiler.set_target_stage("mydb.myschema.profiler_output")
Copy

포커스를 지정하여 프로파일러 활성화하기

StoredProcedureProfiler.set_active_profiler 함수를 사용하여 생성할 프로필 보고서의 종류를 나타내는 값을 지정합니다.

  • 프로파일러가 라인 사용 활동을 보고하도록 하려면 아래와 같이 매개 변수를 LINE 값(대/소문자 구분 없음)으로 설정하십시오.

    profiler.set_active_profiler("LINE")
    
    Copy
  • 프로파일러가 메모리 사용 활동을 보고하도록 하려면 아래와 같이 매개 변수를 MEMORY 값(대/소문자 구분 없음)으로 설정하십시오.

    profiler.set_active_profiler("MEMORY")
    
    Copy

프로파일러를 비활성화하려면 StoredProcedureProfiler.disable 함수를 사용하십시오.

저장 프로시저 호출

프로파일러가 활성화된 후 저장 프로시저를 호출합니다.

session.call("my_stored_procedure")
Copy

프로파일링 출력 보기

실행이 끝나면 StoredProcedureProfiler.get_output 함수를 사용하여 출력에 액세스할 수 있습니다.

profiler.get_output()
Copy

프로파일링을 위한 추가 모듈 포함하기

프로필을 만들 때 기본적으로 포함되지 않는 모듈을 포함할 수 있습니다.

기본적으로 모듈에 정의된 메서드는 프로파일링됩니다. 이러한 방법에는 다음이 포함됩니다.

  • 처리기 메서드

  • 모듈에 정의된 메서드

  • 패키지 또는 다른 모듈에서 가져온 메서드

프로필을 위한 추가 모듈을 포함하려면 StoredProcedureProfiler.register_modules 함수를 사용하여 포함할 모듈을 지정하십시오.

다음 예의 코드는 프로파일링을 위해 모듈 module_A와 module_B를 등록합니다.

profiler.register_modules(["module_A", "module_B"])
Copy

등록된 모듈의 등록을 취소하려면 다음 예시와 같이 인자 없이 register_modules 를 사용합니다.

profiler.register_modules()
Copy

다음 예는 프로파일러를 사용하여 라인 사용량 보고서를 생성하고 검색하는 방법을 설명합니다.

이 예의 코드는 profiler_test_proc 프로시저를 생성합니다.

CREATE OR REPLACE PROCEDURE profiler_test_proc()
RETURNS NUMBER
LANGUAGE PYTHON
RUNTIME_VERSION = 3.8
PACKAGES = ('snowflake-snowpark-python')
HANDLER = 'main'
AS
$$
from snowflake.snowpark.functions import col, udf

def main(session):
  df = session.sql("select 1")
  return df.collect()[0][0]
$$;
Copy

다음 예의 코드는 프로파일러를 설정한 다음 profiler_test_proc 프로시저를 프로파일링합니다.

profiler = profiler_session.stored_procedure_profiler
profiler.register_modules(["profiler_test_proc"])
profiler.set_target_stage(
  f"{db_parameters['database']}.{db_parameters['schema']}.{tmp_stage_name}"
)

profiler.set_active_profiler("LINE")

profiler_session.call("profiler_test_proc")
res = profiler.get_output()
print(res)

profiler.disable()
profiler.register_modules([])
Copy

생성된 라인 프로파일러 출력은 다음과 같습니다.

Handler Name: main
Python Runtime Version: 3.8
Modules Profiled: ['main_module']
Timer Unit: 0.001 s

Total Time: 0.0619571 s
File: _udf_code.py
Function: main at line 4

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     4                                           def main(session):
     5         1          0.4      0.4      0.6      df = session.sql("select 1")
     6         1         61.6     61.6     99.4      return df.collect()[0][0]