서버리스 머신러닝 모델 빌드

이 문서에서는 Google Cloud Platform(GCP)에서 서버리스 방식으로 커스텀 머신러닝(ML) 작업을 빌드하는 방법을 알아봅니다. 또한 Perception API와 달리 AI Platform이 제공하는 이점도 설명합니다. 여기서 다루는 주제는 다음과 같습니다.

  • ML 모델 빌드 단계 이해
  • 모델 품질 개선
  • 장난감 문제에서 확장 가능한 환경으로 전환

이 문서에서는 서버리스 머신러닝 모델의 아키텍처를 살펴보고 Firebase, Cloud Functions, Natural Language API, AI Platform을 사용하여 서버리스 방식으로 헬프 데스크 티켓을 강화하는 방법을 알아봅니다.

빌드 단계 이해

GCP에서 머신러닝 작업을 수행하는 방법은 크게 두 가지입니다.

  • Cloud Vision API 또는 Cloud Speech API와 같이 사전 빌드되고 학습된 RESTful Perception API를 사용합니다. 이 솔루션의 첫 번째 부분에 언급되는 감정 분석 및 자동 태그 추가에 이러한 선행 학습된 모델을 사용합니다.
  • 모델을 빌드하고 다시 사용합니다. TensorFlow 및 AI Platform을 사용하여 커스텀 데이터로 이러한 모델을 학습시킬 수 있습니다. 이 방식은 솔루션의 첫 번째 부분에 설명되어 있듯이 해결 시간 및 우선순위 예측에 더 적합합니다.

다음 다이어그램은 데이터 세트를 저장하고 데이터를 정리하고 모델을 설계, 학습, 배포하는 두 번째 방식을 보여줍니다.

머신러닝 작업

데이터 수집 및 저장

데이터는 우수한 모델을 생성하는 데 있어 핵심 요소입니다. 데이터가 관련되고 정리되었다는 가정 하에 사용 가능한 데이터가 많을수록 더욱 정확하게 예측하도록 모델을 학습시킬 수 있는 기회가 더 많아집니다. 자세한 내용은 모델 품질 개선 섹션을 참조하세요.

데이터 수집은 쉬운 경우도 있지만 데이터 세트가 몇 백 개 수준의 예로 제한되는 경우에는 어려울 수 있습니다. 지원 티켓의 경우 보통 수십 만 개의 기록 예가 있으므로 우수한 모델을 학습시키기에 충분합니다.

고객 관계 관리(CRM) 시스템을 비롯해서 티켓을 처리하는 기타 시스템을 사용 중인 경우 대부분 내보내기 또는 쿼리를 실행하여 제품이 출시된 이후 생성된 모든 티켓에 액세스할 수 있습니다. 목표는 티켓 필드에 대한 액세스를 확보하는 것입니다. 이러한 필드에는 일반적으로 티켓 ID, 고객 ID, 카테고리, 우선순위, 해결 시간, 에이전트 ID, 고객 제품 경험 등의 정보가 포함됩니다. 이러한 내보내기는 일반적으로 CSV 파일로 출력됩니다.

t0,Patrick Blevins,12,3-Advanced,Performance,Request,4-Critical,P1,5
t1,Kaitlyn Ruiz,3,2-Experienced,Technical,Issue,1-Minor,P4,6
t2,Chelsea Martin,11,2-Experienced,Technical,Request,4-Critical,P1,2
t3,Richard Arnold,8,2-Experienced,Performance,Request,1-Minor,P3,5
...

데이터를 수집할 때 다음과 같은 몇 가지 사항을 유의해야 합니다.

  • 이진 분류를 수행하는 경우 긍정적 예만 수집하지 말고 부정적 예도 수집합니다.
  • 일반적으로, 가능한 경우 각 클래스에서 예의 수가 적절한 균형을 이루도록 합니다. 그렇지 않은 경우 코드에서 불균형을 보상해야 합니다.
  • 이상점 예를 더 많이 찾습니다. 이상점은 실제 환경의 사례이므로 시스템은 이를 예측할 수 있어야 합니다.

가이드에서는 이전 데이터가 이미 수집되었으며 Cloud Storage에서 단일 CSV 파일로 제공됩니다.

데이터 사전 처리

데이터 사전 처리는 모델 학습 전의 중요한 단계입니다. 작업의 양과 사용할 기술은 주로 다음 두 가지 매개변수에 의해 좌우됩니다.

  • 품질: 데이터에 관련성 없는 필드가 포함되거나 정리 또는 특성 교차가 필요한 경우 학습을 위해 데이터를 보내기 전에 이러한 문제를 해결하는 것이 중요합니다.
  • 크기: 데이터가 너무 크거나 one-of-k 인코딩으로 인해 지나치게 커질 수 있는 경우 단일 인스턴스로 이를 처리하지 못할 수 있습니다.

사전 처리 권장사항에 대한 자세한 내용은 장난감 문제에서 확장 가능한 솔루션으로 전환 섹션을 참조하세요.

Cloud Datalab은 UI에서 직접 gcloud 명령어를 실행하고 관리형 환경에서 Jupyter 메모장을 실행할 수 있으므로 데이터를 준비하는 데 있어 중요한 도구입니다. Cloud Datalab에는 TensorFlow와의 상호작용을 간소화하는 ML Workbench가 함께 제공됩니다.

Cloud Datalab은 양방향 조정자 역할도 수행할 수 있습니다.

  • 데이터가 충분히 작으면 Pandas와 같은 라이브러리를 양방향으로 활용할 수 있습니다.
  • 데이터가 메모리에 없으면 Apache Beam과 같은 도구를 사용하여 Cloud Datalab 외부에서 데이터를 처리할 수 있습니다. 하지만 여전히 결과를 대화형으로 사용할 수 있습니다.

다음은 일반적으로 수행하는 몇 가지 작업입니다.

  • 예측 시 입력으로 사용할 수 없는 열을 필터링으로 걸러냅니다. 예를 들면 다음과 같습니다. 에이전트 ID
  • 라벨이 올바르게 변환되었고 사용 가능한지 확인합니다. 예를 들면 다음과 같습니다. 빈 값 삭제
  • 예외를 제거하거나 예외가 아닌 반복 이벤트인 경우 더 많은 예를 찾습니다. 예를 들면 다음과 같습니다. 존재하지 않는 카테고리 텍스트
  • 학습, 평가, 테스트를 위해 데이터를 분할합니다. 예를 들면 다음과 같습니다. 80%, 10%, 10%
  • 입력 및 라벨을 사용 가능한 특성으로 변환합니다. 예를 들면 다음과 같습니다. 해결 시간 = (마감 시간 – 생성 시간)
  • 중복 행 제거

다음 표에서 제공되는 값 일부를 볼 수 있습니다.

필드 이름 Keep 이유 유형
Ticket ID 아니요 티켓별로 고유한 값이며 예측 알고리즘 학습에 도움이 되지 않습니다. 해당 없음
Customer ID 확실하지 않음 반복 고객으로부터 학습합니다. 독립형
Category 티켓 복잡성에 영향을 미칠 수 있습니다. 카테고리
Agent ID 아니요 사용자가 티켓을 제출할 때 알려진 값이 아닙니다.

참고: 분류 체계를 통해 이 값을 예측하는 것은 흥미로운 사례가 될 수 있습니다.
해당 없음
Years of product experience 티켓 복잡성에 영향을 미칠 수 있습니다. 지속적

입력 열을 선택한 다음 겹치지 않고 모두 데이터를 나타내는 두 개 이상의 다른 데이터 세트를 만들어야 하며, 가급적 세 개가 좋습니다.

학습 세트
총 데이터 세트의 약 80%를 나타냅니다. 모델은 이를 사용하여 모델 가중치라고 하는 다양한 매개변수를 조정해서 최대한 진실(라벨)에 근접합니다. 모델은 이를 위해 모델의 예측이 진실로부터 떨어진 정도(현재 오류 레벨)를 계산하는 손실 함수를 최소화합니다. 최종 예측 모델을 위해 최선의 가중치 집합이 사용됩니다.
평가 집합
일반적으로 데이터 세트의 10%에서 20% 사이입니다. 이 집합은 모델의 과적합을 방지합니다. 과적합은 모델이 학습 세트에서는 잘 작동하면서 소수의 오류만 생성하지만 새롭거나 알 수 없는 데이터를 대상으로는 고전하는 경우 발생합니다. 즉, 모델이 데이터에 스스로를 과적합시킵니다. 과학습된 모델은 주어진 데이터 유형에서 일반적인 특성을 가려내도록 모델을 학습시키는 대신 학습 세트에서 발견되는 특정 특성을 가려내는 방법만 학습합니다.
테스트 세트
일반적으로 데이터의 10~15% 사이입니다. 테스트 세트는 모델의 일반화 능력을 검증합니다. 평가 집합은 학습 중에 사용되므로 모델에서 내재적 편향이 발생할 수 있습니다. 모델 효과를 평가하려면 별개의 테스트 세트로 모델 성능을 측정해야 합니다.

다음 기법 중 하나를 사용하여 데이터를 나눕니다.

  • 데이터를 무작위로 섞기
  • 생성기 시드를 사용하여 섞기
  • 열 해시를 사용하여 예가 학습, 평가 또는 테스트 세트에 들어가는지 여부 결정

해시는 업데이트된 데이터 세트 버전을 가져올 때 영향을 받지 않으므로 이를 사용하는 것이 좋습니다. 또한 이 방법은 시간이 경과해도 일관된 테스트 세트를 제공합니다.

모델 설계

해결 시간 및 우선순위 예측은 지도 머신러닝 작업입니다. 이는 입력 데이터에 라벨이 지정됨을 의미합니다. 관련 데이터 필드는 두 가지 카테고리로 분류됩니다.

입력
티켓 ID, 서열, 경험, 카테고리, 유형, 영향
라벨
해결 시간 및 우선순위

라벨과 연결된 입력은 지도 러닝 컨텍스트에서 유용한 학습 예시입니다. 이러한 유형의 라벨은 모델에 의해 발견될 진실을 나타냅니다. 예측 모델의 목표는 입력을 사용하여 알려지지 않은 라벨을 예측하는 것입니다. 이 목표를 달성하기 위해 모델은 유효한 예제를 바탕으로 학습합니다. 이 사용 사례에서 예측에는 다음이 포함됩니다.

해결 시간
헬프데스크 상담사에게 높은 값이 보인다면 알려지지 않은 문제에 대처하기 위해 더 많은 리소스가 필요할 가능성이 높습니다.
우선순위
상담사가 정립된 프로세스에 따라 티켓과 리소스에 우선순위를 지정하는 데 도움이 됩니다.

모델 설계를 위해서는 문제를 프레이밍하여 어느 모델이 예측을 해야 하는지를 결정해야 합니다. 이 사용 사례에는 두 가지 지도 머신러닝 문제가 있습니다.

회귀
해결 시간은 연속적인 숫자 값입니다. 모델이 연속된 값을 예측하는 회귀 문제로 정의할 수 있습니다.
분류
우선순위는 P1, P2, P3, P4와 같은 여러 값을 가질 수 있습니다. 다중 분류는 이 문제에 접근하는 좋은 방법입니다. 모델은 각 우선순위 클래스의 가능성을 출력하며 여기서 모든 가능성의 합은 1이 됩니다. 가능성이 할당되면 어느 우선순위를 어느 티켓에 할당할지를 결정할 수 있습니다. 예를 들어 P1 = 10%, P2 = 20%, P3 = 60%, P4 = 10%인 경우 지원 티켓에 P3 우선순위를 할당합니다.

TensorFlow와 AI Platform을 활용하는 경우 두 문제의 모델 개발 프로세스는 유사합니다. 동일한 특성이 Estimator API 중 하나를 공급합니다. 간단하게 코드 두 줄만 변경하면 분류에서 회귀로 전환됩니다.

이제 입력을 알고 작업 데이터 세트가 있으니 데이터를 숫자 이외의 값을 포함한 TensorFlow 그래프에서 사용 가능한 항목으로 변환해야 합니다.

필드 이름 유형 설명
Category 카테고리 모든 어휘(가능한 모든 값)를 압니다.
Product experience 지속적 보관할 숫자 값. 각 Product experience 연도가 중요합니다.

ML Workbench에서는 이러한 입력을 TensorFlow가 사용할 수 있는 항목으로 간단히 변환할 수 있습니다. ML Workbench는 각 필드 유형으로 TensorFlow 특성 열 함수를 사용합니다.

features:
  ticketid:
    transform: key
  seniority:
    transform: identity
  category:
    transform: one_hot
  [...]
  priority:
    transform: target

또한 ML Workbench는 모델을 위해 데이터를 분석하고 준비하기 위한 단일 함수를 제공합니다.

%%ml analyze [--cloud]
output: [OUTPUT_ANALYSIS]
data: $[CREATED_DATASET]
features:
...

모델 생성

이 문서의 사용 사례에서 티켓 수는 우수하게 예측하기에는 충분하지만 데이터 크기에 대해 걱정할 만큼은 아니므로 로컬 트레이너를 사용할 수 있습니다. 간단한 --cloud 매개변수를 사용하여 로컬 학습에서 클라우드 학습으로 전환할 수 있습니다.

%%ml train [--cloud]
output: [OUTPUT_TRAIN]
analysis: [OUTPUT_ANALYSIS]
data: $[CREATED_DATASET]
  model_args:
    model: dnn_regression
    max-steps: 2000
    hidden-layer-size1: 32
    hidden-layer-size2: 8
    train-batch-size: 100
    eval-batch-size: 100
    learning-rate: 0.001

hidden-layer-sizeXmax-steps 매개변수에 대한 자세한 내용은 초매개변수 조정 섹션을 참조하세요.

모델 배포

TensorFlow에서 그래프를 만들어 이를 학습시킬 AI Platform으로 포팅하는 작업은 애플리케이션 개발에서 핵심적인 요소입니다. 그러나 강력한 예측 모델이라도 데이터과학자만 사용할 수 있다면 무슨 의미가 있을까요? 현재 사용 사례의 목표는 지원 데스크에 실시간 예측을 제공하는 것입니다. 이를 위해서는 Node.js로 작성된 Cloud Functions에서 모델에 액세스할 수 있어야 합니다. 이 모델은 Python으로 빌드 및 작성되었습니다.

AI Platform은 사용자 수에 관계없이 모델을 RESTful API로 배포하여 대규모 예측을 수행할 수 있는 옵션을 제공합니다. [MODEL_NAME][BUCKET]의 모델 이름과 버킷을 바꿔 간단한 명령줄로 모델을 배포할 수 있습니다.

gcloud ml-engine models create [MODEL_NAME]
DEPLOYMENT_SOURCE=[BUCKET]
gcloud ml-engine versions create "version_name" --model [MODEL_NAME] --origin $DEPLOYMENT_SOURCE

모델은 온라인과 오프라인 예측에 모두 사용할 수 있습니다. 다음 섹션에서는 서버리스 방식으로 Cloud Functions를 사용하여 이를 호출하는 방법을 알아봅니다.

서버리스 보강

모델을 배포한 후에는 RESTful API를 통해 모델을 사용할 수 있으며, 이는 AI Platform을 사용하는 장점 중 하나입니다. 이 API는 Cloud Functions를 포함한 모든 종류의 클라이언트에서 모델을 사용할 수 있게 해줍니다. 솔루션 사용 사례에서 Firebase 데이터베이스는 티켓을 기록한 후 Natural Language API와 커스텀 모델을 모두 사용하여 데이터를 보강하도록 Cloud 함수를 트리거합니다. 다음 다이어그램은 이 모델을 보여줍니다.

서버리스 보강

다음 두 예는 Cloud Functions에서 Natural Language API와 커스텀 모델을 호출합니다.

  • Natural Language API:

    const text = ticket.description;
    const document = language.document({content: text});
    
    document.detectSentiment()
     .then((results) => {
        const sentiment = results[1].documentSentiment;
        admin.database().ref(`/tickets/${key}/pred_sentiment`).set(sentiment.score);
     })
     .catch((err) => {
        console.error('ERROR detectSentiment:', err);
     });
  • 해결 시간 회귀 모델:

    ml.projects.predict({
      name: `projects/${MDL_PROJECT_NAME}/models/${RESOLUTION_TIME_MODEL_NAME}`,
      resource: {
        name: `projects/${MDL_PROJECT_NAME}/models/${RESOLUTION_TIME_MODEL_NAME}`,
        instances: [
          `${key},${ticket.seniority},${ticket.experience},${ticket.category},
          ${ticket.type},${ticket.impact}`
        ]
      }
    },

모델 품질 개선

이 섹션에서는 모델을 개선하기 위해 취할 수 있는 몇 가지 부가적인 단계를 다룹니다.

데이터 준비

모델 학습을 시작하기 전에 데이터를 준비해야 합니다.

예 수집
데이터에 이상점이 있든 예측할 클래스가 여러 개 있든 모든 사례의 예를 수집해야 합니다.
데이터 정리
정리란 중복을 삭제해서 두 학습 세트 및 평가 세트에 동일한 예시가 없도록 하는 간단한 작업일 수도 있고 모든 값이 의미를 갖도록 하는 것을 의미할 수도 있습니다(예를 들어 0보다 작은 연공서열이 없음).
인간의 통찰력 활용
머신러닝 모델은 적절한 특성을 사용할 때 더 잘 작동합니다. 권장사항은 TensorFlow에서 제공하는 cross_function을 사용하여 특성을 교차하는 것입니다. 예를 들어 택시 요금을 예측하는 경우 이 함수는 경도와 위도를 교차하여 모델 품질을 개선할 수 있습니다. 또는 헬프데스크의 경우 연공서열과 제품 경험을 교차할 수 있습니다.
데이터 버킷 생성
TensorFlow bucketized_column과 같은 함수는 특히 예가 많지 않은 극단적 경우 입력을 구분하고 성능을 개선하는 데 도움이 됩니다.

초매개변수 조정

일부 학습 매개변수 값은 찾기 어려우면서 성공적인 모델을 구축하기 위한 핵심 요소인 경우가 있습니다. 적절한 조합은 모델의 성능을 비약적으로 높일 수 있습니다. 일반적으로 조정할 값은 다음과 같습니다.

  • 히든 레이어 크기(신경망)
  • 뉴런 수(신경망)
  • 학습 단계
  • 전체 사전이 없는 경우 카테고리 입력의 버킷 크기(예: 출발 도시)

선택한 모든 값이 초매개변수가 될 수 있습니다. 여러가지 방법으로 적절한 조합을 찾을 수 있습니다.

  • 'For' 루프를 사용하여 그리드 검색을 수행합니다.

    다양한 값을 설정하고 모든 조합을 순환하면서 최선의 결과에 초점을 맞출 수 있습니다. 초매개변수의 수와 범위 크기에 따라 많은 시간과 컴퓨팅 리소스가 소비될 수 있습니다.

  • AI Platform을 사용하여 초매개변수를 조정하는 방법을 사용하는 것이 좋습니다. AI Platform은 선언적 YAML 설정을 기반으로 초매개변수를 자동 조정합니다. 시스템은 최상의 매개변수 조합으로 신속하게 이동하여 모든 학습 단계를 수행하기 전에 중지하므로 시간과 컴퓨팅 능력 비용이 절감됩니다.

예의 수 늘리기

모델 학습에 사용되는 데이터가 많고 모델이 보는 사용 사례가 많을수록 결과 예측의 품질도 높아집니다. 모델에 수백 만 개의 예를 제공하는 것은 로컬 학습을 어렵게 만드는 요인이 될 수 있습니다. 한 가지 해결 방법은 ML Workbench를 사용하는 것입니다. ML Workbench에서 활용할 수 있는 요소는 다음과 같습니다.

  • TensorFlow를 활용하여 학습 작업을 분산시키고 일괄로 단계를 실행합니다.
  • BigQuery를 활용하여 학습 데이터를 분석합니다.
  • AI Platform을 활용하여 확장 가능한 주문형 인프라에서 학습 및 예측을 실행합니다.

다음 다이어그램은 사용 사례와 학습 데이터가 많을수록 예측 품질이 향상되는 원리를 보여줍니다.

데이터 및 사용 사례

ML 학습은 맵리듀스와 같은 절대적 병렬 문제가 아닙니다. 이는 예를 들어 경사하강법 최적화에는 매개변수 서버의 공유 메모리가 필요함을 의미합니다. ML 플랫폼은 이러한 유형의 방식을 지원해야 합니다.

장난감 문제에서 확장 가능한 환경으로 전환

이전 섹션에서 모델 품질을 개선하기 위한 몇 가지 권장사항을 언급했습니다. 이러한 작업 중 일부는 샘플링된 또는 제한된 데이터 세트를 사용하여 손쉽게 달성할 수 있는 것처럼 보입니다. 그러나 뛰어난 모델을 학습시키는 데 필요한 많은 양의 데이터를 사용하는 경우 이 작업은 어려울 수 있습니다.

다음 다이어그램은 확장 가능한 접근 방법을 보여줍니다.

서버리스 보강

BigQuery 및 Cloud Datalab을 사용한 데이터 탐색

BigQuery를 사용하여 데이터를 저장하고 쿼리하는 것은 권장되는 접근 방법입니다. BigQuery는 빅데이터를 위해 만들어진 열 기반 데이터베이스로, 사용자가 테라바이트 용량의 데이터를 대상으로 몇 초 만에 임시 쿼리를 실행할 수 있게 해줍니다.

Cloud Datalab 및 BigQuery를 통해 할 수 있는 작업은 다음과 같습니다.

  • Cloud Datalab에서 BigQuery를 활용하여 TB 단위의 데이터를 탐색 및 시각화합니다.
  • 예측에 큰 영향을 미치지 않을 입력을 필터링합니다.
  • 모델 생성을 시작하기 위한 대표 데이터의 샘플 세트를 만듭니다.
  • 학습, 평가, 테스트를 위해 데이터를 분할할 수 있습니다.

Cloud Dataprep 및 Cloud Dataflow를 사용하여 데이터 전처리

입력을 바로 사용할 수 있는 경우는 거의 없습니다. 사용 가능한 특성이 되기 위해서는 처리가 필요합니다. 예를 들면 다음과 같습니다.

  • None 및 Null과 같이 Unknown이 되는 값을 정리합니다.
  • 학습, 평가, 테스트를 위해 데이터 세트를 분할합니다.
  • tfRecord 파일로 데이터를 변환합니다. 이 파일 형식을 TensorFlow와 함께 사용하는 것이 좋습니다.

Cloud Dataprep은 제한적인 프로그래밍 오버헤드로 데이터를 대규모로 준비 및 정리할 수 있는 시각적 도구입니다. Cloud Dataprep은 내부적으로 Apache Beam을 사용하지만 사용하기 쉬운 UI 덕분에 많은 상용구 코드 작성의 부담을 덜어줍니다.

Apache Beam은 Cloud Dataflow에서 실행할 수 있습니다. Cloud Dataflow를 사용하면 다양한 데이터 처리 패턴을 개발 및 실행할 수 있습니다. 이러한 패턴에는 추출, 변환, 로드(ETL), 일괄 계산, 연속 계산 등이 포함됩니다.

tf.Transform 및 Dataflow로 규모에 맞춘 편향 최소화

개발자는 종종 학습에 사용할 사전 처리 코드를 작성합니다. 개발자는 간혹 분산 환경에서 실행되도록 이 코드를 조정하지만 비슷하면서도 다른 코드도 작성하여 예측용 수신 데이터에 사용합니다. 이 방식에는 다음과 같은 두 가지 큰 문제가 있습니다.

  • 코드베이스 두 개를 경우에 따라 서로 다른 팀이 유지 관리해야 합니다.
  • 더 중요한 점은 이로 인해 학습과 추론 사이에서 편향이 발생할 수 있다는 점입니다.

Transform은 학습과 예측 모두에 공통 코드를 작성하도록 하여 두 가지 문제를 모두 해결합니다. 또한 Apache Beam을 사용하여 분산 환경에서 코드를 실행할 수 있습니다.

Google Cloud Platform에서 tf.Transform로 TensorFlow 활용

이전에 언급된 일부 특징은 TensorFlow의 특징이고 따라서 오픈소스이지만 AI Platform은 TensorFlow를 실행할 때 다음과 같은 주요 이점을 제공합니다.

  • 서버리스 환경에서 머신러닝 태스크 실행
  • 초매개변수 조정 촉진
  • Python뿐만 아니라 이종 클라이언트에서 액세스할 수 있는 RESTful API로 모델 호스팅

다음 다이어그램은 TensorFlow를 활용하기 위한 접근 방법을 보여줍니다.

TensorFlow 활용

TensorFlow 라이브러리인 tf.Transform을 활용하면 같은 코드베이스를 사용할 수 있는 학습 및 예측 간의 잠재적 편향을 제한할 수 있습니다.

다음 단계