Hợp lý hóa quá trình xử lý dữ liệu ETL tại Talent.com với Amazon SageMaker | Dịch vụ web của Amazon

Hợp lý hóa quá trình xử lý dữ liệu ETL tại Talent.com với Amazon SageMaker | Dịch vụ web của Amazon

Bài đăng này được đồng tác giả bởi Anatoly Khomenko, Kỹ sư máy học và Abdenour Bezzouh, Giám đốc công nghệ tại Talent.com.

Được thành lập vào 2011, Tài năng.com tổng hợp danh sách công việc được trả tiền từ khách hàng của họ và danh sách công việc công khai, đồng thời đã tạo ra một nền tảng thống nhất, dễ tìm kiếm. Bao gồm hơn 30 triệu danh sách việc làm trên hơn 75 quốc gia và trải rộng trên nhiều ngôn ngữ, ngành nghề và kênh phân phối khác nhau, Talent.com đáp ứng nhu cầu đa dạng của người tìm việc, kết nối hiệu quả hàng triệu người tìm việc với cơ hội việc làm.

Sứ mệnh của Talent.com là tạo điều kiện kết nối lực lượng lao động toàn cầu. Để đạt được điều này, Talent.com tổng hợp danh sách việc làm từ nhiều nguồn khác nhau trên web, cung cấp cho người tìm việc quyền truy cập vào hơn 30 triệu cơ hội việc làm phù hợp với kỹ năng và kinh nghiệm của họ. Để thực hiện sứ mệnh này, Talent.com đã hợp tác với AWS để phát triển một công cụ giới thiệu việc làm tiên tiến được thúc đẩy bởi học sâu, nhằm hỗ trợ người dùng thăng tiến trong sự nghiệp.

Để đảm bảo công cụ giới thiệu việc làm này hoạt động hiệu quả, điều quan trọng là phải triển khai quy trình xử lý dữ liệu quy mô lớn chịu trách nhiệm trích xuất và tinh chỉnh các tính năng từ danh sách việc làm tổng hợp của Talent.com. Quy trình này có thể xử lý 5 triệu bản ghi hàng ngày trong vòng chưa đầy 1 giờ và cho phép xử lý song song nhiều bản ghi trong nhiều ngày. Ngoài ra, giải pháp này cho phép triển khai nhanh chóng vào sản xuất. Nguồn dữ liệu chính cho quy trình này là định dạng Dòng JSON, được lưu trữ trong Dịch vụ lưu trữ đơn giản của Amazon (Amazon S3) và được phân vùng theo ngày. Mỗi ngày, điều này dẫn đến việc tạo ra hàng chục nghìn tệp Dòng JSON, với các bản cập nhật gia tăng diễn ra hàng ngày.

Mục tiêu chính của quy trình xử lý dữ liệu này là tạo điều kiện thuận lợi cho việc tạo ra các tính năng cần thiết cho việc đào tạo và triển khai công cụ giới thiệu việc làm trên Talent.com. Điều đáng lưu ý là quy trình này phải hỗ trợ các bản cập nhật gia tăng và đáp ứng các yêu cầu trích xuất tính năng phức tạp cần thiết cho các mô-đun đào tạo và triển khai cần thiết cho hệ thống đề xuất công việc. Quy trình của chúng tôi thuộc họ quy trình ETL (trích xuất, chuyển đổi và tải) chung kết hợp dữ liệu từ nhiều nguồn vào một kho lưu trữ trung tâm lớn.

Để hiểu rõ hơn về cách Talent.com và AWS cộng tác xây dựng các kỹ thuật đào tạo mô hình học sâu và xử lý ngôn ngữ tự nhiên tiên tiến, bằng cách sử dụng Amazon SageMaker để xây dựng hệ thống giới thiệu công việc, hãy tham khảo Từ tin nhắn đến công việc mơ ước: Xây dựng công cụ giới thiệu việc làm dựa trên NLP tại Talent.com với Amazon SageMaker. Hệ thống này bao gồm kỹ thuật tính năng, thiết kế kiến ​​trúc mô hình học sâu, tối ưu hóa siêu tham số và đánh giá mô hình, trong đó tất cả các mô-đun được chạy bằng Python.

Bài đăng này trình bày cách chúng tôi sử dụng SageMaker để xây dựng quy trình xử lý dữ liệu quy mô lớn nhằm chuẩn bị các tính năng cho công cụ giới thiệu việc làm tại Talent.com. Giải pháp thu được cho phép Nhà khoa học dữ liệu lý tưởng hóa việc trích xuất tính năng trong sổ ghi chép SageMaker bằng cách sử dụng các thư viện Python, chẳng hạn như scikit-học or Kim tự tháp, sau đó nhanh chóng triển khai mã tương tự vào quy trình xử lý dữ liệu để thực hiện trích xuất tính năng trên quy mô lớn. Giải pháp không yêu cầu chuyển mã trích xuất tính năng để sử dụng PySpark, theo yêu cầu khi sử dụng Keo AWS như giải pháp ETL. Giải pháp của chúng tôi có thể được phát triển và triển khai hoàn toàn bởi Nhà khoa học dữ liệu từ đầu đến cuối chỉ bằng SageMaker và không yêu cầu kiến ​​thức về các giải pháp ETL khác, chẳng hạn như Hàng loạt AWS. Điều này có thể rút ngắn đáng kể thời gian cần thiết để triển khai quy trình Machine Learning (ML) vào sản xuất. Quy trình này được vận hành thông qua Python và tích hợp liền mạch với quy trình trích xuất tính năng, khiến nó có khả năng thích ứng với nhiều ứng dụng phân tích dữ liệu.

Tổng quan về giải pháp

Tổng quan về quy trình ETL sử dụng SageMaker Treatment

Đường ống bao gồm ba giai đoạn chính:

  1. Sử dụng một Chế biến Amazon SageMaker công việc để xử lý các tệp JSONL thô được liên kết với một ngày được chỉ định. Dữ liệu nhiều ngày có thể được xử lý đồng thời bằng các công việc Xử lý riêng biệt.
  2. Thuê Keo AWS để thu thập dữ liệu sau khi xử lý dữ liệu trong nhiều ngày.
  3. Tải các tính năng được xử lý cho một phạm vi ngày được chỉ định bằng cách sử dụng SQL từ một amazon Athena table, sau đó huấn luyện và triển khai mô hình tư vấn công việc.

Xử lý các tệp JSONL thô

Chúng tôi xử lý các tệp JSONL thô trong một ngày được chỉ định bằng cách sử dụng công việc Xử lý SageMaker. Công việc thực hiện trích xuất tính năng và nén dữ liệu, đồng thời lưu các tính năng đã xử lý vào tệp Parquet với 1 triệu bản ghi trên mỗi tệp. Chúng tôi tận dụng tính năng song song hóa CPU để thực hiện trích xuất tính năng song song cho từng tệp JSONL thô. Kết quả xử lý của mỗi tệp JSONL được lưu vào một tệp Parquet riêng bên trong một thư mục tạm thời. Sau khi tất cả các tệp JSONL đã được xử lý, chúng tôi thực hiện nén hàng nghìn tệp Parquet nhỏ thành nhiều tệp với 1 triệu bản ghi trên mỗi tệp. Sau đó, các tệp Parquet được nén sẽ được tải lên Amazon S3 dưới dạng đầu ra của công việc xử lý. Việc nén dữ liệu đảm bảo thu thập thông tin và truy vấn SQL hiệu quả trong các giai đoạn tiếp theo của quy trình.

Sau đây là mã mẫu để lên lịch công việc Xử lý SageMaker cho một ngày được chỉ định, ví dụ: 2020-01-01, bằng cách sử dụng SageMaker SDK. Công việc đọc các tệp JSONL thô từ Amazon S3 (ví dụ từ s3://bucket/raw-data/2020/01/01) và lưu các tệp Parquet đã nén vào Amazon S3 (ví dụ: 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
)

Phác thảo mã sau đây cho tập lệnh chính (processing_script.py) chạy công việc Xử lý SageMaker như sau:

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)

Khả năng mở rộng là một tính năng chính của quy trình của chúng tôi. Đầu tiên, có thể sử dụng nhiều công việc Xử lý SageMaker để xử lý dữ liệu trong vài ngày cùng một lúc. Thứ hai, chúng tôi tránh tải toàn bộ dữ liệu thô hoặc đã xử lý vào bộ nhớ cùng một lúc trong khi xử lý từng ngày dữ liệu được chỉ định. Điều này cho phép xử lý dữ liệu bằng cách sử dụng các loại phiên bản không thể chứa đủ dữ liệu cho cả ngày trong bộ nhớ chính. Yêu cầu duy nhất là loại phiên bản phải có khả năng tải N tệp JSONL thô hoặc tệp Parquet đã xử lý vào bộ nhớ cùng lúc, với N là số lượng nhân viên xử lý đang sử dụng.

Thu thập dữ liệu đã xử lý bằng AWS Glue

Sau khi tất cả dữ liệu thô trong nhiều ngày đã được xử lý, chúng tôi có thể tạo bảng Athena từ toàn bộ tập dữ liệu bằng cách sử dụng trình thu thập thông tin AWS Glue. Chúng tôi sử dụng AWS SDK cho gấu trúc (awswrangler) thư viện để tạo bảng bằng đoạn mã sau:

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])

Tải các tính năng đã xử lý để đào tạo

Giờ đây, các tính năng đã xử lý trong phạm vi ngày được chỉ định có thể được tải từ bảng Athena bằng SQL và sau đó có thể sử dụng các tính năng này để đào tạo mô hình đề xuất công việc. Ví dụ: đoạn mã sau tải các tính năng đã xử lý trong một tháng vào DataFrame bằng cách sử dụng awswrangler thư viện:

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')

Ngoài ra, việc sử dụng SQL để tải các tính năng đã xử lý cho hoạt động đào tạo có thể được mở rộng để phù hợp với nhiều trường hợp sử dụng khác. Ví dụ: chúng ta có thể áp dụng quy trình tương tự để duy trì hai bảng Athena riêng biệt: một bảng để lưu trữ số lần hiển thị của người dùng và một bảng khác để lưu trữ số lần nhấp chuột của người dùng vào các lần hiển thị này. Bằng cách sử dụng các câu lệnh nối SQL, chúng tôi có thể truy xuất các lần hiển thị mà người dùng đã nhấp vào hoặc không nhấp vào, sau đó chuyển các lần hiển thị này sang công việc đào tạo mô hình.

Lợi ích giải pháp

Việc triển khai giải pháp được đề xuất mang lại một số lợi thế cho quy trình làm việc hiện tại của chúng tôi, bao gồm:

  • Đơn giản hóa triển khai – Giải pháp cho phép triển khai trích xuất tính năng trong Python bằng các thư viện ML phổ biến. Và nó không yêu cầu phải chuyển mã vào PySpark. Điều này hợp lý hóa việc trích xuất tính năng vì cùng một mã do Nhà khoa học dữ liệu phát triển trong sổ ghi chép sẽ được thực thi bởi quy trình này.
  • Con đường sản xuất nhanh chóng – Giải pháp có thể được Nhà khoa học dữ liệu phát triển và triển khai để thực hiện trích xuất tính năng trên quy mô lớn, cho phép họ phát triển mô hình đề xuất ML dựa trên dữ liệu này. Đồng thời, giải pháp tương tự có thể được Kỹ sư ML triển khai vào sản xuất mà không cần sửa đổi nhiều.
  • Tái sử dụng – Giải pháp cung cấp một mẫu có thể tái sử dụng để trích xuất tính năng trên quy mô lớn và có thể dễ dàng điều chỉnh cho các trường hợp sử dụng khác ngoài việc xây dựng các mô hình đề xuất.
  • Hiệu quả – Giải pháp mang lại hiệu quả tốt: xử lý một ngày duy nhất của Tài năng.comdữ liệu của nó mất chưa đầy 1 giờ.
  • Cập nhật tăng dần – Giải pháp cũng hỗ trợ cập nhật gia tăng. Dữ liệu mới hàng ngày có thể được xử lý bằng công việc Xử lý SageMaker và vị trí S3 chứa dữ liệu đã xử lý có thể được thu thập lại thông tin để cập nhật bảng Athena. Chúng tôi cũng có thể sử dụng công việc định kỳ để cập nhật dữ liệu ngày hôm nay vài lần mỗi ngày (ví dụ: 3 giờ một lần).

Chúng tôi đã sử dụng quy trình ETL này để giúp Talent.com xử lý 50,000 tệp mỗi ngày chứa 5 triệu bản ghi và tạo dữ liệu đào tạo bằng cách sử dụng các tính năng được trích xuất từ ​​dữ liệu thô trong 90 ngày từ Talent.com—tổng cộng 450 triệu bản ghi trên 900,000 tệp. Quy trình của chúng tôi đã giúp Talent.com xây dựng và triển khai hệ thống đề xuất vào sản xuất chỉ trong vòng 2 tuần. Giải pháp đã thực hiện tất cả các quy trình ML bao gồm ETL trên Amazon SageMaker mà không cần sử dụng dịch vụ AWS khác. Hệ thống đề xuất công việc đã giúp tỷ lệ nhấp trong thử nghiệm A/B trực tuyến tăng 8.6% so với giải pháp dựa trên XGBoost trước đó, giúp kết nối hàng triệu người dùng Talent.com với công việc tốt hơn.

Kết luận

Bài đăng này phác thảo quy trình ETL mà chúng tôi đã phát triển để xử lý tính năng nhằm đào tạo và triển khai mô hình giới thiệu việc làm tại Talent.com. Quy trình của chúng tôi sử dụng các công việc Xử lý SageMaker để xử lý dữ liệu hiệu quả và trích xuất tính năng ở quy mô lớn. Mã trích xuất tính năng được triển khai bằng Python cho phép sử dụng các thư viện ML phổ biến để thực hiện trích xuất tính năng trên quy mô lớn mà không cần chuyển mã sang sử dụng PySpark.

Chúng tôi khuyến khích người đọc khám phá khả năng sử dụng quy trình được trình bày trong blog này làm mẫu cho các trường hợp sử dụng của họ, trong đó cần phải trích xuất tính năng trên quy mô lớn. Nhà khoa học dữ liệu có thể tận dụng quy trình này để xây dựng mô hình ML và sau đó Kỹ sư ML có thể áp dụng quy trình tương tự đó để chạy trong sản xuất. Điều này có thể giảm đáng kể thời gian cần thiết để sản xuất giải pháp ML từ đầu đến cuối, như trường hợp của Talent.com. Bạn đọc có thể tham khảo các hướng dẫn thiết lập và chạy các công việc Xử lý SageMaker. Chúng tôi cũng giới thiệu quý độc giả xem bài viết Từ tin nhắn đến công việc mơ ước: Xây dựng công cụ giới thiệu việc làm dựa trên NLP tại Talent.com với Amazon SageMaker, nơi chúng tôi thảo luận về các kỹ thuật đào tạo mô hình học sâu bằng cách sử dụng Amazon SageMaker xây dựng hệ thống giới thiệu việc làm của Talent.com.


Giới thiệu về tác giả

Dmitry BespalovDmitry Bespalov là Nhà khoa học ứng dụng cấp cao tại Phòng thí nghiệm giải pháp máy học của Amazon, nơi ông giúp khách hàng AWS trong các ngành khác nhau đẩy nhanh việc áp dụng AI và đám mây của họ.

Yi TươngYi Tương là Nhà khoa học ứng dụng II tại Phòng thí nghiệm giải pháp học máy của Amazon, nơi cô giúp khách hàng AWS ở các ngành khác nhau tăng tốc việc áp dụng AI và đám mây.

Tống VươngTống Vương là Nhà khoa học ứng dụng cấp cao tại Phòng thí nghiệm giải pháp máy học của Amazon, nơi ông giúp khách hàng AWS trong các ngành khác nhau đẩy nhanh việc áp dụng AI và đám mây của họ.

Anatoly KhomenkoAnatoly Khomenko là Kỹ sư máy học cao cấp tại Tài năng.com với niềm đam mê xử lý ngôn ngữ tự nhiên, kết nối người giỏi với công việc tốt.

Abdenour BezzouhAbdenour Bezzouh là giám đốc điều hành với hơn 25 năm kinh nghiệm xây dựng và cung cấp các giải pháp công nghệ có quy mô cho hàng triệu khách hàng. Abdenour giữ chức vụ Giám đốc Công nghệ (CTO) tại Tài năng.com khi nhóm AWS thiết kế và triển khai giải pháp cụ thể này cho Tài năng.com.

Yên Quân TềYên Quân Tề là Giám đốc khoa học ứng dụng cấp cao tại Phòng thí nghiệm giải pháp máy học của Amazon. Cô đổi mới và áp dụng công nghệ máy học để giúp các khách hàng của AWS tăng tốc độ tiếp nhận AI và đám mây của họ.

Dấu thời gian:

Thêm từ Học máy AWS