revoscalepy와 함께 Python을 사용하여 SQL Server에서 원격으로 실행되는 모델 만들기

적용 대상: SQL Server 2017(14.x) 이상

Microsoft의 revoscalepy Python 라이브러리는 데이터 탐색, 시각화, 변환 및 분석을 위한 데이터 과학 알고리즘을 제공합니다. 이 라이브러리는 SQL Server의 Python 통합 시나리오에서 전략적으로 중요합니다. 다중 코어 서버에서는 revoscalepy 함수를 병렬로 실행할 수 있습니다. 중앙 서버와 클라이언트 워크스테이션(별도의 물리적 컴퓨터, 모두 동일한 revoscalepy 라이브러리를 갖고 있음)을 사용하는 분산 아키텍처에서는 실행을 로컬로 시작한 후 데이터가 상주하는 원격 SQL Server 인스턴스로 이동하는 Python 코드를 작성할 수 있습니다.

revoscalepy는 다음과 같은 Microsoft 제품 및 배포판에서 찾을 수 있습니다.

이 연습에서는 컴퓨팅 컨텍스트를 입력으로 허용하는 revoscalepy의 알고리즘 중 하나인 rx_lin_mod를 기반으로 선형 회귀 모델을 만드는 방법을 보여줍니다. 이 연습에서 실행할 코드는 원격 컴퓨팅 컨텍스트를 지원하는 revoscalepy 함수를 사용하여 코드 실행을 로컬에서 원격 컴퓨팅 환경으로 이동합니다.

이 자습서를 완료하면 다음 작업 방법을 배울 수 있습니다.

  • revoscalepy를 사용하여 선형 모델 만들기
  • 작업을 로컬에서 원격 컴퓨팅 컨텍스트로 이동

필수 조건

이 연습에 사용되는 샘플 데이터는 flightdata 데이터베이스입니다.

이 문서의 샘플 코드를 실행하려면 IDE가 필요하며, IDE는 Python 실행 파일에 연결되어야 합니다.

컴퓨팅 컨텍스트 이동을 연습하려면 로컬 워크스테이션Machine Learning Services 및 Python을 사용하는 SQL Server 데이터베이스 엔진 인스턴스가 필요합니다.

컴퓨터가 하나밖에 없는 경우 관련 애플리케이션을 설치하여 물리적 컴퓨터 한 대로 원격 컴퓨팅 컨텍스트를 시뮬레이션할 수 있습니다. 첫째, SQL Server Machine Learning Services 설치는 "원격" 인스턴스로 작동합니다. 둘째, Python 클라이언트 라이브러리 설치는 클라이언트로 작동합니다. 동일한 머신에 동일한 Python 배포판 및 Microsoft Python 라이브러리의 복사본 두 개가 생성됩니다. 연습을 성공적으로 완료하려면 파일 경로와 사용하는 Python.exe의 복사본을 계속 추적해야 합니다.

원격 컴퓨팅 컨텍스트 및 revoscalepy

이 샘플은 원격 컴퓨팅 컨텍스트에서 Python 모델을 만드는 프로세스를 보여 줍니다. 이렇게 하면 클라이언트에서 작업하지만 작업이 실제로 수행되는 원격 환경(예: SQL Server 또는 Spark)을 선택할 수 있습니다. 원격 컴퓨팅 컨텍스트의 목적은 데이터가 상주하는 위치로 컴퓨팅을 가져오는 것입니다.

SQL Server에서 Python 코드를 실행 하려면 revoscalepy 패키지가 필요합니다. 이 패키지는 Microsoft에서 제공하는 특수 Python 패키지이며, R 언어용 RevoScaleR 패키지와 비슷합니다. revoscalepy 패키지는 컴퓨팅 컨텍스트 만들기를 지원하며, 로컬 워크스테이션과 원격 서버 간에 데이터와 모델을 전달하기 위한 인프라를 제공합니다. 데이터베이스 내 코드 실행을 지원하는 revoscalepy 함수는 RxInSqlServer입니다.

이 단원에서는 매우 큰 데이터 세트에 대한 회귀를 지원하는 revoscalepy의 함수인 rx_lin_mod를 기반으로 SQL Server의 데이터를 사용하여 선형 모델을 학습시킵니다.

또한 이 단원에서는 Python에서 SQL Server 컴퓨팅 컨텍스트를 설정하고 사용하는 방법의 기본 사항도 보여줍니다.

샘플 코드 실행

데이터베이스를 준비하고 학습용 데이터를 테이블에 저장한 후에는 Python 개발 환경을 열고 코드 샘플을 실행합니다.

이 코드는 다음 단계를 수행합니다.

  1. 필요한 라이브러리 및 함수를 가져옵니다.
  2. SQL Server에 대한 연결을 만듭니다. 데이터를 작업하기 위한 데이터 원본 개체를 만듭니다.
  3. 로지스틱 회귀 알고리즘에 사용할 수 있도록 변환을 사용하여 데이터를 수정합니다.
  4. rx_lin_mod를 호출하고 모델 조정에 사용되는 수식을 정의합니다.
  5. 원본 데이터를 기반으로 예측 세트를 생성합니다.
  6. 예상된 값을 기준으로 요약을 만듭니다.

모든 작업은 SQL Server 인스턴스를 컴퓨팅 컨텍스트로 사용하여 수행됩니다.

참고

명령줄에서 실행되는 이 샘플의 데모를 보려면 SQL Server 2017 Advanced Analytics 및 Python 비디오를 시청하세요.

예제 코드

from revoscalepy import RxComputeContext, RxInSqlServer, RxSqlServerData
from revoscalepy import rx_lin_mod, rx_predict, rx_summary
from revoscalepy import RxOptions, rx_import

import os

def test_linmod_sql():
    sql_server = os.getenv('PYTEST_SQL_SERVER', '.')
    
    sql_connection_string = 'Driver=SQL Server;Server=' + sqlServer + ';Database=sqlpy;Trusted_Connection=True;'
    print("connectionString={0!s}".format(sql_connection_string))

    data_source = RxSqlServerData(
        sql_query = "select top 10 * from airlinedemosmall",
        connection_string = sql_connection_string,

        column_info = {
            "ArrDelay" : { "type" : "integer" },
            "DayOfWeek" : {
                "type" : "factor",
                "levels" : [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ]
            }
        })

    sql_compute_context = RxInSqlServer(
        connection_string = sql_connection_string,
        num_tasks = 4,
        auto_cleanup = False
        )

    #
    # Run linmod locally
    #
    linmod_local = rx_lin_mod("ArrDelay ~ DayOfWeek", data = data_source)
    #
    # Run linmod remotely
    #
    linmod = rx_lin_mod("ArrDelay ~ DayOfWeek", data = data_source, compute_context = sql_compute_context)

    # Predict results
    # 
    predict = rx_predict(linmod, data = rx_import(input_data = data_source))
    summary = rx_summary("ArrDelay ~ DayOfWeek", data = data_source, compute_context = sql_compute_context)

데이터 원본 정의와 컴퓨팅 컨텍스트 정의의 비교

데이터 원본은 컴퓨팅 컨텍스트와 다릅니다. 데이터 원본은 코드에 사용되는 데이터를 정의합니다. 컴퓨팅 컨텍스트는 코드가 실행될 위치를 정의합니다. 그러나 다음과 같은 동일한 정보를 둘 다 사용합니다.

  • 데이터 원본을 정의하는 sql_querysql_connection_string 같은 Python 변수.

    이러한 변수를 RxSqlServerData 생성자에 전달하여 data_source라는 데이터 원본 개체을 구현합니다.

  • RxInSqlServer 생성자를 사용하여 컴퓨팅 컨텍스트 개체를 만듭니다. 그 결과로 얻는 컴퓨팅 컨텍스트 개체의 이름은 sql_cc입니다.

    이 예제에서는 데이터가 컴퓨팅 컨텍스트로 사용할 SQL Server 인스턴스와 동일한 인스턴스에 있다는 가정 하에 데이터 원본에서 사용한 것과 동일한 연결 문자열을 다시 사용 합니다.

    그러나 데이터 원본과 컴퓨팅 컨텍스트가 서로 다른 서버에 있을 수 있습니다.

컴퓨팅 컨텍스트 변경

컴퓨팅 컨텍스트를 정의한 후에는 활성 컴퓨팅 컨텍스트를 설정해야 합니다.

기본적으로 대부분의 작업은 로컬로 실행됩니다. 즉, 다른 컴퓨팅 컨텍스트를 지정하지 않으면 데이터 원본에서 데이터가 페치되고, 코드가 현재 Python 환경에서 실행됩니다.

다음과 같이 활성 컴퓨팅 컨텍스트를 설정하는 두 가지 방법이 있습니다.

  • 메서드 또는 함수의 인수로
  • rx_set_computecontext 호출

컴퓨팅 컨텍스트를 메서드 또는 함수의 인수로 설정

이 예제에서는 개별 rx 함수의 인수를 사용하여 컴퓨팅 컨텍스트를 설정합니다.

linmod = rx_lin_mod_ex("ArrDelay ~ DayOfWeek", data = data, compute_context = sql_compute_context)

이 컴퓨팅 컨텍스트는 rxsummary 호출에서 다시 사용됩니다.

summary = rx_summary("ArrDelay ~ DayOfWeek", data = data_source, compute_context = sql_compute_context)

rx_set_compute_context를 사용하여 명시적으로 컴퓨팅 컨텍스트 설정

rx_set_compute_context 함수를 사용하면 이미 정의된 컴퓨팅 컨텍스트 간에 전환할 수 있습니다.

활성 컴퓨팅 컨텍스트를 설정하면 변경할 때까지 활성 상태로 유지됩니다.

병렬 처리 및 스트리밍 사용

컴퓨팅 컨텍스트를 정의할 때 컴퓨팅 컨텍스트에서 데이터를 처리하는 방법을 제어하는 매개 변수를 설정할 수도 있습니다. 이러한 매개 변수는 데이터 원본 형식에 따라 다릅니다.

SQL Server 컴퓨팅 컨텍스트의 경우 일괄 처리 크기를 설정하거나 실행 중인 작업에 사용할 병렬 처리 수준에 대한 힌트를 제공할 수 있습니다.

  • 샘플은 4개의 프로세서가 있는 컴퓨터에서 실행되었으므로, num_tasks 매개 변수는 리소스를 최대로 사용할 수 있도록 4로 설정됩니다.
  • 이 값을 0으로 설정하면 SQL Server는 서버의 현재 MAXDOP 설정 하에서 기본값을 사용하며, 기본값은 최대한 많은 작업을 병렬로 실행합니다. 그러나 할당될 수 있는 작업의 정확한 수는 서버 설정, 실행 중인 다른 작업 등의 여러 요소에 따라 다릅니다.

다음 단계

다음 추가 Python 샘플 및 자습서에서는 원격 컴퓨팅 컨텍스트 사용 외에도 좀 더 복잡한 데이터 원본을 사용하는 엔드투엔드 시나리오를 보여줍니다.