다음을 통해 공유


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

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

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

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

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

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

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

또한 이 단원에서는 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 샘플 및 자습서에서는 더 복잡한 데이터 원본을 사용하는 엔드투엔드 시나리오와 원격 컴퓨팅 컨텍스트를 사용하는 방법을 보여 줍니다.