Amazon SageMaker를 사용하여 Talent.com에서 ETL 데이터 처리 간소화 | 아마존 웹 서비스

Amazon SageMaker를 사용하여 Talent.com에서 ETL 데이터 처리 간소화 | 아마존 웹 서비스

이 게시물은 기계 학습 엔지니어인 Anatoly Khomenko와 Talent.com의 최고 기술 책임자인 Abdenour Bezzouh가 공동으로 작성했습니다.

2011 년에 설립 된, 탤런트닷컴 고객과 공개 구인 목록의 유료 구인 목록을 집계하고 쉽게 검색할 수 있는 통합 플랫폼을 만들었습니다. 30개국 이상에서 75천만 개 이상의 채용 정보를 다루고 다양한 언어, 산업 및 유통 채널을 포괄하는 Talent.com은 구직자의 다양한 요구 사항을 충족하여 수백만 명의 구직자를 취업 기회와 효과적으로 연결합니다.

Talent.com의 사명은 글로벌 인력 연결을 촉진하는 것입니다. 이를 달성하기 위해 Talent.com은 웹의 다양한 소스에서 구인 목록을 집계하여 구직자에게 자신의 기술과 경험에 맞춰진 30천만 개가 넘는 광범위한 취업 기회 풀에 대한 액세스를 제공합니다. 이 사명에 맞춰 Talent.com은 AWS와 협력하여 사용자의 경력 발전을 지원하는 것을 목표로 딥 러닝을 기반으로 하는 최첨단 직업 추천 엔진을 개발했습니다.

이 직업 추천 엔진의 효과적인 작동을 보장하려면 Talent.com의 집계된 직업 목록에서 기능을 추출하고 개선하는 대규모 데이터 처리 파이프라인을 구현하는 것이 중요합니다. 이 파이프라인은 5시간 이내에 일일 레코드 1만 개를 처리할 수 있으며 여러 날의 레코드를 병렬로 처리할 수 있습니다. 또한 이 솔루션을 사용하면 프로덕션에 빠르게 배포할 수 있습니다. 이 파이프라인의 기본 데이터 소스는 다음 위치에 저장된 JSON Lines 형식입니다. 아마존 단순 스토리지 서비스 (Amazon S3) 날짜별로 분할됩니다. 이로 인해 매일 수만 개의 JSON Lines 파일이 생성되고 매일 증분 업데이트가 발생합니다.

이 데이터 처리 파이프라인의 주요 목적은 Talent.com에서 직업 추천 엔진을 교육하고 배포하는 데 필요한 기능 생성을 촉진하는 것입니다. 이 파이프라인은 증분 업데이트를 지원하고 작업 추천 시스템에 필수적인 교육 및 배포 모듈에 필요한 복잡한 기능 추출 요구 사항을 충족해야 한다는 점은 주목할 가치가 있습니다. 우리 파이프라인은 여러 소스의 데이터를 대규모 중앙 저장소로 결합하는 일반 ETL(추출, 변환 및 로드) 프로세스 제품군에 속합니다.

Talent.com과 AWS가 어떻게 협력하여 최첨단 자연어 처리 및 딥 러닝 모델 교육 기술을 구축했는지에 대한 추가 통찰력을 얻으려면 아마존 세이지 메이커 직업 추천 시스템을 구축하려면 다음을 참조하십시오. 텍스트에서 꿈의 직업으로: Amazon SageMaker를 사용하여 Talent.com에서 NLP 기반 직업 추천 구축. 시스템에는 기능 엔지니어링, 딥 러닝 모델 아키텍처 설계, 하이퍼파라미터 최적화 및 모델 평가가 포함되어 있으며, 모든 모듈은 Python을 사용하여 실행됩니다.

이 게시물에서는 SageMaker를 사용하여 Talent.com의 직업 추천 엔진 기능을 준비하기 위한 대규모 데이터 처리 파이프라인을 구축한 방법을 보여줍니다. 결과 솔루션을 통해 데이터 과학자는 다음과 같은 Python 라이브러리를 사용하여 SageMaker 노트북에서 기능 추출을 아이디어화할 수 있습니다. 사이킷런 or 파이 토치, 그리고 대규모로 특징 추출을 수행하는 데이터 처리 파이프라인에 동일한 코드를 신속하게 배포합니다. 솔루션에서는 PySpark를 사용하기 위해 기능 추출 코드를 포팅할 필요가 없습니다. AWS 접착제 ETL 솔루션으로. 우리의 솔루션은 SageMaker만을 사용하여 데이터 과학자에 의해서만 개발 및 배포될 수 있으며 다음과 같은 다른 ETL 솔루션에 대한 지식이 필요하지 않습니다. AWS 배치. 이를 통해 기계 학습(ML) 파이프라인을 프로덕션에 배포하는 데 필요한 시간을 크게 단축할 수 있습니다. 파이프라인은 Python을 통해 작동되며 특징 추출 워크플로와 원활하게 통합되어 광범위한 데이터 분석 애플리케이션에 적응할 수 있습니다.

솔루션 개요

SageMaker 처리를 사용하는 ETL 파이프라인 개요

파이프라인은 세 가지 기본 단계로 구성됩니다.

  1. 활용 Amazon SageMaker 처리 지정된 날짜와 관련된 원시 JSONL 파일을 처리하는 작업입니다. 여러 날의 데이터를 별도의 처리 작업으로 동시에 처리할 수 있습니다.
  2. 고용 AWS 접착제 며칠 동안의 데이터를 처리한 후 데이터 크롤링을 위해.
  3. SQL을 사용하여 지정된 날짜 범위에 대해 처리된 기능을 로드합니다. 아마존 아테나 테이블을 만든 다음 직업 추천 모델을 훈련하고 배포합니다.

원시 JSONL 파일 처리

SageMaker 처리 작업을 사용하여 지정된 날짜에 대한 원시 JSONL 파일을 처리합니다. 이 작업은 기능 추출 및 데이터 압축을 구현하고 처리된 기능을 파일당 1만 개의 레코드가 포함된 Parquet 파일에 저장합니다. 우리는 CPU 병렬화를 활용하여 각 원시 JSONL 파일에 대한 기능 추출을 병렬로 수행합니다. 각 JSONL 파일의 처리 결과는 임시 디렉터리 내의 별도 Parquet 파일에 저장됩니다. 모든 JSONL 파일이 처리된 후 수천 개의 작은 Parquet 파일을 파일당 1만 개의 레코드가 포함된 여러 파일로 압축합니다. 압축된 Parquet 파일은 처리 작업의 출력으로 Amazon S3에 업로드됩니다. 데이터 압축은 파이프라인의 다음 단계에서 효율적인 크롤링 및 SQL 쿼리를 보장합니다.

다음은 SageMaker SDK를 사용하여 지정된 날짜(예: 2020-01-01)에 SageMaker 처리 작업을 예약하는 샘플 코드입니다. 작업은 Amazon S3에서 원시 JSONL 파일을 읽습니다(예: s3://bucket/raw-data/2020/01/01) 압축된 Parquet 파일을 Amazon S3에 저장합니다(예: s3://bucket/processed/table-name/day_partition=2020-01-01/).

### install dependencies %pip install sagemaker pyarrow s3fs awswrangler import sagemaker
import boto3 from sagemaker.processing import FrameworkProcessor
from sagemaker.sklearn.estimator import SKLearn
from sagemaker import get_execution_role
from sagemaker.processing import ProcessingInput, ProcessingOutput region = boto3.session.Session().region_name
role = get_execution_role()
bucket = sagemaker.Session().default_bucket() ### we use instance with 16 CPUs and 128 GiB memory
### note that the script will NOT load the entire data into memory during compaction
### depending on the size of individual jsonl files, larger instance may be needed
instance = "ml.r5.4xlarge"
n_jobs = 8 ### we use 8 process workers
date = "2020-01-01" ### process data for one day est_cls = SKLearn
framework_version_str = "0.20.0" ### schedule processing job
script_processor = FrameworkProcessor( role=role, instance_count=1, instance_type=instance, estimator_cls=est_cls, framework_version=framework_version_str, volume_size_in_gb=500,
) script_processor.run( code="processing_script.py", ### name of the main processing script source_dir="../src/etl/", ### location of source code directory ### our processing script loads raw jsonl files directly from S3 ### this avoids long start-up times of the processing jobs, ### since raw data does not need to be copied into instance inputs=[], ### processing job input is empty outputs=[ ProcessingOutput(destination="s3://bucket/processed/table-name/", source="/opt/ml/processing/output"), ], arguments=[ ### directory with job's output "--output", "/opt/ml/processing/output", ### temporary directory inside instance "--tmp_output", "/opt/ml/tmp_output", "--n_jobs", str(n_jobs), ### number of process workers "--date", date, ### date to process ### location with raw jsonl files in S3 "--path", "s3://bucket/raw-data/", ], wait=False
)

기본 스크립트에 대한 다음 코드 개요(processing_script.py)는 SageMaker 처리 작업을 실행하는 방법은 다음과 같습니다.

import concurrent
import pyarrow.dataset as ds
import os
import s3fs
from pathlib import Path ### function to process raw jsonl file and save extracted features into parquet file from process_data import process_jsonl ### parse command line arguments
args = parse_args() ### we use s3fs to crawl S3 input path for raw jsonl files
fs = s3fs.S3FileSystem()
### we assume raw jsonl files are stored in S3 directories partitioned by date
### for example: s3://bucket/raw-data/2020/01/01/
jsons = fs.find(os.path.join(args.path, *args.date.split('-'))) ### temporary directory location inside the Processing job instance
tmp_out = os.path.join(args.tmp_output, f"day_partition={args.date}") ### directory location with job's output
out_dir = os.path.join(args.output, f"day_partition={args.date}") ### process individual jsonl files in parallel using n_jobs process workers
futures=[]
with concurrent.futures.ProcessPoolExecutor(max_workers=args.n_jobs) as executor: for file in jsons: inp_file = Path(file) out_file = os.path.join(tmp_out, inp_file.stem + ".snappy.parquet") ### process_jsonl function reads raw jsonl file from S3 location (inp_file) ### and saves result into parquet file (out_file) inside temporary directory futures.append(executor.submit(process_jsonl, file, out_file)) ### wait until all jsonl files are processed for future in concurrent.futures.as_completed(futures): result = future.result() ### compact parquet files
dataset = ds.dataset(tmp_out) if len(dataset.schema) > 0: ### save compacted parquet files with 1MM records per file ds.write_dataset(dataset, out_dir, format="parquet", max_rows_per_file=1024 * 1024)

확장성은 우리 파이프라인의 핵심 기능입니다. 첫째, 여러 SageMaker 처리 작업을 사용하여 며칠 동안 동시에 데이터를 처리할 수 있습니다. 둘째, 지정된 각 날짜의 데이터를 처리하는 동안 처리된 전체 데이터 또는 원시 데이터를 한 번에 메모리에 로드하는 것을 방지합니다. 이를 통해 기본 메모리에 하루 종일 데이터를 수용할 수 없는 인스턴스 유형을 사용하여 데이터를 처리할 수 있습니다. 유일한 요구 사항은 인스턴스 유형이 N개의 원시 JSONL 또는 처리된 Parquet 파일을 메모리에 동시에 로드할 수 있어야 한다는 것입니다. 여기서 N은 사용 중인 프로세스 작업자의 수입니다.

AWS Glue를 사용하여 처리된 데이터 크롤링

며칠 동안의 모든 원시 데이터가 처리된 후 AWS Glue 크롤러를 사용하여 전체 데이터 세트에서 Athena 테이블을 생성할 수 있습니다. 우리는 판다용 AWS SDK(awswrangler) 다음 코드 조각을 사용하여 테이블을 생성하는 라이브러리:

import awswrangler as wr ### crawl processed data in S3
res = wr.s3.store_parquet_metadata( path='s3://bucket/processed/table-name/', database="database_name", table="table_name", dataset=True, mode="overwrite", sampling=1.0, path_suffix='.parquet',
) ### print table schema
print(res[0])

훈련을 위해 처리된 특성 로드

이제 지정된 날짜 범위에 대해 처리된 기능을 SQL을 사용하여 Athena 테이블에서 로드할 수 있으며, 이러한 기능을 작업 추천 모델 교육에 사용할 수 있습니다. 예를 들어 다음 스니펫은 다음을 사용하여 한 달 동안 처리된 기능을 DataFrame에 로드합니다. awswrangler 도서관:

import awswrangler as wr query = """ SELECT * FROM table_name WHERE day_partition BETWEN '2020-01-01' AND '2020-02-01' """ ### load 1 month of data from database_name.table_name into a DataFrame
df = wr.athena.read_sql_query(query, database='database_name')

또한 학습을 ​​위해 처리된 기능을 로드하는 데 SQL을 사용하여 다양한 다른 사용 사례를 수용하도록 확장할 수 있습니다. 예를 들어 유사한 파이프라인을 적용하여 두 개의 별도 Athena 테이블을 유지 관리할 수 있습니다. 하나는 사용자 노출을 저장하기 위한 것이고 다른 하나는 이러한 노출에 대한 사용자 클릭을 저장하기 위한 것입니다. SQL 조인 문을 사용하면 사용자가 클릭했거나 클릭하지 않은 노출을 검색한 다음 이러한 노출을 모델 학습 작업에 전달할 수 있습니다.

솔루션 이점

제안된 솔루션을 구현하면 다음을 포함하여 기존 워크플로에 여러 가지 이점이 제공됩니다.

  • 단순화된 구현 – 이 솔루션을 사용하면 널리 사용되는 ML 라이브러리를 사용하여 Python에서 기능 추출을 구현할 수 있습니다. 또한 코드를 PySpark로 이식할 필요가 없습니다. 데이터 과학자가 노트북에서 개발한 동일한 코드가 이 파이프라인에서 실행되므로 기능 추출이 간소화됩니다.
  • 빠른 생산 경로 – 데이터 과학자가 솔루션을 개발 및 배포하여 대규모로 기능 추출을 수행함으로써 이 데이터에 대한 ML 추천 모델을 개발할 수 있습니다. 동시에 ML 엔지니어는 거의 수정하지 않고도 동일한 솔루션을 프로덕션에 배포할 수 있습니다.
  • 재사용 성 – 이 솔루션은 대규모 기능 추출을 위한 재사용 가능한 패턴을 제공하며 추천 모델 구축 이외의 다른 사용 사례에도 쉽게 적용할 수 있습니다.
  • 효율성 – 솔루션은 우수한 성능을 제공합니다. 탤런트닷컴의 데이터는 1시간도 채 걸리지 않았습니다.
  • 증분 업데이트 – 솔루션은 증분 업데이트도 지원합니다. SageMaker 처리 작업을 통해 새로운 일일 데이터를 처리할 수 있으며, 처리된 데이터가 포함된 S3 위치를 다시 크롤링하여 Athena 테이블을 업데이트할 수 있습니다. 또한 크론 작업을 사용하여 오늘의 데이터를 하루에 여러 번(예: 3시간마다) 업데이트할 수도 있습니다.

우리는 이 ETL 파이프라인을 사용하여 Talent.com이 매일 50,000만 개의 레코드가 포함된 5개의 파일을 처리하도록 돕고 Talent.com에서 90일간의 원시 데이터(450개 파일에 걸쳐 총 900,000억 2천만 개의 레코드)에서 추출한 기능을 사용하여 교육 데이터를 생성했습니다. 우리의 파이프라인은 Talent.com이 단 8.6주 만에 추천 시스템을 구축하고 프로덕션에 배포하는 데 도움이 되었습니다. 이 솔루션은 다른 AWS 서비스를 활용하지 않고 Amazon SageMaker에서 ETL을 포함한 모든 ML 프로세스를 수행했습니다. 직업 추천 시스템은 이전 XGBoost 기반 솔루션에 비해 온라인 A/B 테스트에서 클릭률을 XNUMX% 증가시켜 수백만 명의 Talent.com 사용자를 더 나은 직업에 연결하는 데 도움이 되었습니다.

결론

이 게시물에서는 Talent.com에서 직업 추천 모델을 교육하고 배포하기 위한 기능 처리를 위해 개발한 ETL 파이프라인을 간략하게 설명합니다. 우리 파이프라인은 효율적인 데이터 처리 및 대규모 기능 추출을 위해 SageMaker 처리 작업을 사용합니다. 기능 추출 코드는 Python으로 구현되어 PySpark를 사용하기 위해 코드를 이식할 필요 없이 널리 사용되는 ML 라이브러리를 사용하여 대규모로 기능 추출을 수행할 수 있습니다.

독자들이 대규모 기능 추출이 필요한 사용 사례에 대한 템플릿으로 이 블로그에 제시된 파이프라인을 사용할 수 있는 가능성을 탐색해 보시기 바랍니다. 데이터 과학자는 파이프라인을 활용하여 ML 모델을 구축할 수 있으며, 그런 다음 ML 엔지니어가 동일한 파이프라인을 채택하여 프로덕션에서 실행할 수 있습니다. 이를 통해 Talent.com의 경우처럼 ML 솔루션을 처음부터 끝까지 제품화하는 데 필요한 시간을 크게 줄일 수 있습니다. 독자들은 다음을 참조할 수 있다. SageMaker 처리 작업 설정 및 실행을 위한 자습서. 우리는 또한 독자들에게 게시물을 보도록 권유합니다 텍스트에서 꿈의 직업으로: Amazon SageMaker를 사용하여 Talent.com에서 NLP 기반 직업 추천 구축, 여기서는 다음을 활용한 딥 러닝 모델 훈련 기술에 대해 논의합니다. 아마존 세이지 메이커 Talent.com의 직업 추천 시스템을 구축합니다.


저자 소개

드미트리 베스팔로프드미트리 베스팔로프 Amazon Machine Learning Solutions Lab의 선임 응용 과학자로서 다양한 산업 분야의 AWS 고객이 AI 및 클라우드 채택을 가속화하도록 돕습니다.

이샹이샹 Amazon Machine Learning Solutions Lab의 응용 과학자 II로서 다양한 산업 분야의 AWS 고객이 AI 및 클라우드 채택을 가속화하도록 돕습니다.

왕통왕통 Amazon Machine Learning Solutions Lab의 선임 응용 과학자로서 다양한 산업 분야의 AWS 고객이 AI 및 클라우드 채택을 가속화하도록 돕습니다.

아나톨리 코멘코아나톨리 코멘코 의 수석 기계 학습 엔지니어입니다. 탤런트닷컴 좋은 사람과 좋은 직업을 연결하는 자연어 처리에 대한 열정을 가지고 있습니다.

압데누르 베주압데누르 베주 수백만 고객에게 확장 가능한 기술 솔루션을 구축하고 제공하는 데 25년 이상의 경험을 보유한 임원입니다. Abdenour는 최고 기술 책임자(CTO) 직책을 맡았습니다. 탤런트닷컴 AWS 팀이 이 특정 솔루션을 설계하고 실행했을 때 탤런트닷컴.

치 얀준치 얀준 Amazon Machine Learning Solution Lab의 수석 응용 과학 관리자입니다. 그녀는 AWS 고객이 AI 및 클라우드 채택 속도를 높일 수 있도록 기계 학습을 혁신하고 적용합니다.

타임 스탬프 :

더보기 AWS 기계 학습