Menyederhanakan pemrosesan data ETL di Talent.com dengan Amazon SageMaker | Layanan Web Amazon

Menyederhanakan pemrosesan data ETL di Talent.com dengan Amazon SageMaker | Layanan Web Amazon

Postingan ini ditulis bersama oleh Anatoly Khomenko, Machine Learning Engineer, dan Abdenour Bezzouh, Chief Technology Officer di Talent.com.

Didirikan pada 2011, Bakat.com mengumpulkan daftar pekerjaan berbayar dari klien mereka dan daftar pekerjaan publik, dan telah menciptakan platform terpadu yang mudah dicari. Mencakup lebih dari 30 juta lowongan pekerjaan di lebih dari 75 negara dan mencakup berbagai bahasa, industri, dan saluran distribusi, Talent.com melayani beragam kebutuhan pencari kerja, secara efektif menghubungkan jutaan pencari kerja dengan peluang kerja.

Misi Talent.com adalah memfasilitasi koneksi tenaga kerja global. Untuk mencapai hal ini, Talent.com mengumpulkan daftar pekerjaan dari berbagai sumber di web, menawarkan akses kepada pencari kerja ke lebih dari 30 juta peluang kerja yang disesuaikan dengan keterampilan dan pengalaman mereka. Sejalan dengan misi ini, Talent.com berkolaborasi dengan AWS untuk mengembangkan mesin rekomendasi pekerjaan mutakhir yang didorong oleh pembelajaran mendalam, yang bertujuan membantu pengguna dalam memajukan karier mereka.

Untuk memastikan pengoperasian mesin rekomendasi pekerjaan ini secara efektif, sangat penting untuk menerapkan jalur pemrosesan data berskala besar yang bertanggung jawab untuk mengekstraksi dan menyempurnakan fitur dari kumpulan daftar pekerjaan Talent.com. Pipeline ini mampu memproses 5 juta catatan harian dalam waktu kurang dari 1 jam, dan memungkinkan pemrosesan catatan beberapa hari secara paralel. Selain itu, solusi ini memungkinkan penerapan cepat ke produksi. Sumber data utama untuk alur ini adalah format JSON Lines, yang disimpan di Layanan Penyimpanan Sederhana Amazon (Amazon S3) dan dipartisi berdasarkan tanggal. Setiap hari, hal ini menghasilkan puluhan ribu file JSON Lines, dengan pembaruan bertahap yang terjadi setiap hari.

Tujuan utama dari jalur pemrosesan data ini adalah untuk memfasilitasi pembuatan fitur yang diperlukan untuk pelatihan dan penerapan mesin rekomendasi pekerjaan di Talent.com. Perlu diperhatikan bahwa pipeline ini harus mendukung pembaruan bertahap dan memenuhi persyaratan ekstraksi fitur rumit yang diperlukan untuk modul pelatihan dan penerapan yang penting untuk sistem rekomendasi pekerjaan. Pipeline kami termasuk dalam rangkaian proses ETL (ekstrak, transformasi, dan muat) umum yang menggabungkan data dari berbagai sumber ke dalam repositori terpusat yang besar.

Untuk wawasan lebih lanjut tentang bagaimana Talent.com dan AWS secara kolaboratif membangun pemrosesan bahasa alami yang mutakhir dan teknik pelatihan model pembelajaran mendalam, dengan memanfaatkannya Amazon SageMaker untuk menyusun sistem rekomendasi pekerjaan, lihat Dari pekerjaan teks ke pekerjaan impian: Membangun pemberi rekomendasi pekerjaan berbasis NLP di Talent.com dengan Amazon SageMaker. Sistem ini mencakup rekayasa fitur, desain arsitektur model pembelajaran mendalam, pengoptimalan hyperparameter, dan evaluasi model, di mana semua modul dijalankan menggunakan Python.

Postingan ini menunjukkan bagaimana kami menggunakan SageMaker untuk membangun jalur pemrosesan data berskala besar guna menyiapkan fitur untuk mesin rekomendasi pekerjaan di Talent.com. Solusi yang dihasilkan memungkinkan Ilmuwan Data untuk membuat ide ekstraksi fitur di notebook SageMaker menggunakan pustaka Python, seperti Scikit-Belajar or PyTorch, lalu dengan cepat menerapkan kode yang sama ke dalam alur pemrosesan data dengan melakukan ekstraksi fitur dalam skala besar. Solusinya tidak memerlukan porting kode ekstraksi fitur untuk menggunakan PySpark, seperti yang diperlukan saat menggunakan Lem AWS sebagai solusi ETL. Solusi kami dapat dikembangkan dan diterapkan hanya oleh Ilmuwan Data secara end-to-end hanya dengan menggunakan SageMaker, dan tidak memerlukan pengetahuan tentang solusi ETL lainnya, seperti Batch AWS. Hal ini dapat secara signifikan mempersingkat waktu yang dibutuhkan untuk menerapkan pipeline Machine Learning (ML) ke produksi. Pipeline ini dioperasikan melalui Python dan terintegrasi secara mulus dengan alur kerja ekstraksi fitur, menjadikannya dapat beradaptasi dengan berbagai aplikasi analisis data.

Ikhtisar solusi

Ikhtisar alur ETL menggunakan SageMaker Processing

Pipa ini terdiri dari tiga fase utama:

  1. Gunakan sebuah Pemrosesan SageMaker Amazon tugas untuk menangani file JSONL mentah yang terkait dengan hari tertentu. Data berhari-hari dapat diproses dengan tugas Pemrosesan terpisah secara bersamaan.
  2. Mempekerjakan Lem AWS untuk perayapan data setelah memproses data beberapa hari.
  3. Memuat fitur yang diproses untuk rentang tanggal tertentu menggunakan SQL dari Amazon Athena tabel, lalu latih dan terapkan model pemberi rekomendasi pekerjaan.

Memproses file JSONL mentah

Kami memproses file JSONL mentah untuk hari tertentu menggunakan tugas Pemrosesan SageMaker. Pekerjaan ini mengimplementasikan ekstraksi fitur dan pemadatan data, serta menyimpan fitur yang diproses ke dalam file Parket dengan 1 juta catatan per file. Kami memanfaatkan paralelisasi CPU untuk melakukan ekstraksi fitur untuk setiap file JSONL mentah secara paralel. Hasil pemrosesan setiap file JSONL disimpan ke dalam file Parket terpisah di dalam direktori sementara. Setelah semua file JSONL diproses, kami melakukan pemadatan ribuan file Parket kecil menjadi beberapa file dengan 1 juta record per file. File Parket yang dipadatkan kemudian diunggah ke Amazon S3 sebagai output dari tugas pemrosesan. Pemadatan data memastikan perayapan dan kueri SQL yang efisien pada tahap alur berikutnya.

Berikut ini adalah contoh kode untuk menjadwalkan tugas Pemrosesan SageMaker pada hari tertentu, misalnya 2020-01-01, menggunakan SageMaker SDK. Tugas tersebut membaca file JSONL mentah dari Amazon S3 (misalnya dari s3://bucket/raw-data/2020/01/01) dan menyimpan file Parket yang dipadatkan ke Amazon S3 (misalnya ke 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
)

Berikut garis besar kode untuk skrip utama (processing_script.py) yang menjalankan tugas Pemrosesan SageMaker adalah sebagai berikut:

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)

Skalabilitas adalah fitur utama dari saluran kami. Pertama, beberapa pekerjaan Pemrosesan SageMaker dapat digunakan untuk memproses data selama beberapa hari secara bersamaan. Kedua, kami menghindari memuat seluruh data yang diproses atau mentah ke dalam memori sekaligus, saat memproses data setiap hari tertentu. Hal ini memungkinkan pemrosesan data menggunakan tipe instans yang tidak dapat menampung data sepanjang hari di memori utama. Satu-satunya persyaratan adalah jenis instans harus mampu memuat N JSONL mentah atau file Parket yang diproses ke dalam memori secara bersamaan, dengan N adalah jumlah pekerja proses yang digunakan.

Merayapi data yang diproses menggunakan AWS Glue

Setelah semua data mentah selama beberapa hari diproses, kita dapat membuat tabel Athena dari seluruh dataset dengan menggunakan crawler AWS Glue. Kami menggunakan AWS SDK untuk panda (awswrangler) perpustakaan untuk membuat tabel menggunakan cuplikan berikut:

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

Muat fitur yang diproses untuk pelatihan

Fitur yang diproses untuk rentang tanggal tertentu kini dapat dimuat dari tabel Athena menggunakan SQL, dan fitur ini kemudian dapat digunakan untuk melatih model pemberi rekomendasi pekerjaan. Misalnya, cuplikan berikut memuat fitur yang diproses selama satu bulan ke dalam DataFrame menggunakan awswrangler Perpustakaan:

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

Selain itu, penggunaan SQL untuk memuat fitur yang diproses untuk pelatihan dapat diperluas untuk mengakomodasi berbagai kasus penggunaan lainnya. Misalnya, kita dapat menerapkan alur serupa untuk mengelola dua tabel Athena terpisah: satu untuk menyimpan tayangan pengguna dan satu lagi untuk menyimpan klik pengguna pada tayangan tersebut. Dengan menggunakan pernyataan gabungan SQL, kita dapat mengambil tayangan yang diklik atau tidak diklik pengguna, lalu meneruskan tayangan tersebut ke tugas pelatihan model.

Manfaat solusi

Menerapkan solusi yang diusulkan memberikan beberapa keuntungan pada alur kerja kami yang ada, termasuk:

  • Implementasi yang disederhanakan – Solusi ini memungkinkan ekstraksi fitur diimplementasikan dengan Python menggunakan perpustakaan ML yang populer. Dan, kode tersebut tidak perlu di-porting ke PySpark. Ini menyederhanakan ekstraksi fitur karena kode yang sama yang dikembangkan oleh Ilmuwan Data di buku catatan akan dieksekusi oleh saluran ini.
  • Jalur cepat menuju produksi – Solusi ini dapat dikembangkan dan diterapkan oleh Ilmuwan Data untuk melakukan ekstraksi fitur dalam skala besar, sehingga memungkinkan mereka mengembangkan model rekomendasi ML terhadap data ini. Pada saat yang sama, solusi yang sama dapat diterapkan ke produksi oleh Insinyur ML dengan sedikit modifikasi yang diperlukan.
  • Dapat digunakan kembali – Solusi ini memberikan pola yang dapat digunakan kembali untuk ekstraksi fitur dalam skala besar, dan dapat dengan mudah diadaptasi untuk kasus penggunaan lain selain membuat model rekomendasi.
  • Efisiensi – Solusinya menawarkan kinerja yang baik: memproses satu hari saja Bakat.comDatanya memakan waktu kurang dari 1 jam.
  • Pembaruan tambahan – Solusi ini juga mendukung pembaruan tambahan. Data harian baru dapat diproses dengan tugas Pemrosesan SageMaker, dan lokasi S3 yang berisi data yang diproses dapat dirayapi ulang untuk memperbarui tabel Athena. Kita juga dapat menggunakan tugas cron untuk memperbarui data hari ini beberapa kali sehari (misalnya setiap 3 jam).

Kami menggunakan saluran ETL ini untuk membantu Talent.com memproses 50,000 file per hari yang berisi 5 juta catatan, dan membuat data pelatihan menggunakan fitur yang diambil dari data mentah selama 90 hari dari Talent.com—total 450 juta catatan di 900,000 file. Saluran kami membantu Talent.com membangun dan menerapkan sistem rekomendasi ke dalam produksi hanya dalam waktu 2 minggu. Solusi ini melakukan semua proses ML termasuk ETL di Amazon SageMaker tanpa memanfaatkan layanan AWS lainnya. Sistem rekomendasi pekerjaan mendorong peningkatan rasio klik-tayang sebesar 8.6% dalam pengujian A/B online dibandingkan solusi berbasis XGBoost sebelumnya, membantu menghubungkan jutaan pengguna Talent.com ke pekerjaan yang lebih baik.

Kesimpulan

Postingan ini menguraikan alur ETL yang kami kembangkan untuk pemrosesan fitur guna pelatihan dan penerapan model pemberi rekomendasi pekerjaan di Talent.com. Saluran pipa kami menggunakan tugas Pemrosesan SageMaker untuk pemrosesan data yang efisien dan ekstraksi fitur dalam skala besar. Kode ekstraksi fitur diimplementasikan dengan Python yang memungkinkan penggunaan pustaka ML populer untuk melakukan ekstraksi fitur dalam skala besar, tanpa perlu mem-porting kode untuk menggunakan PySpark.

Kami mendorong pembaca untuk mengeksplorasi kemungkinan menggunakan pipeline yang disajikan di blog ini sebagai template untuk kasus penggunaan mereka yang memerlukan ekstraksi fitur dalam skala besar. Pipeline tersebut dapat dimanfaatkan oleh Data Scientist untuk membangun model ML, dan pipeline yang sama kemudian dapat diadopsi oleh ML Engineer untuk dijalankan dalam produksi. Hal ini dapat secara signifikan mengurangi waktu yang diperlukan untuk memproduksi solusi ML secara end-to-end, seperti yang terjadi pada Talent.com. Para pembaca dapat merujuk pada tutorial untuk menyiapkan dan menjalankan pekerjaan SageMaker Processing. Kami juga merujuk pembaca untuk melihat postingan tersebut Dari pekerjaan teks ke pekerjaan impian: Membangun pemberi rekomendasi pekerjaan berbasis NLP di Talent.com dengan Amazon SageMaker, dimana kita membahas teknik pelatihan model pembelajaran mendalam yang memanfaatkan Amazon SageMaker untuk membangun sistem rekomendasi pekerjaan Talent.com.


Tentang penulis

Dmitriy BespalovDmitriy Bespalov adalah Ilmuwan Terapan Senior di Lab Solusi Pembelajaran Mesin Amazon, di mana dia membantu pelanggan AWS di berbagai industri mempercepat adopsi AI dan cloud mereka.

Yi XiangYi Xiang adalah Ilmuwan Terapan II di Amazon Machine Learning Solutions Lab, tempat dia membantu pelanggan AWS di berbagai industri mempercepat adopsi AI dan cloud mereka.

Tong WangTong Wang adalah Ilmuwan Terapan Senior di Lab Solusi Pembelajaran Mesin Amazon, di mana dia membantu pelanggan AWS di berbagai industri mempercepat adopsi AI dan cloud mereka.

Anatoly KhomenkoAnatoly Khomenko adalah Insinyur Pembelajaran Mesin Senior di Bakat.com dengan hasrat untuk pemrosesan bahasa alami yang mencocokkan orang-orang baik dengan pekerjaan yang baik.

Abdenour BezzouhAbdenour Bezzouh adalah seorang eksekutif dengan pengalaman lebih dari 25 tahun dalam membangun dan memberikan solusi teknologi yang menjangkau jutaan pelanggan. Abdenour menjabat sebagai Chief Technology Officer (CTO) di Bakat.com ketika tim AWS merancang dan mengeksekusi solusi khusus ini Bakat.com.

YanjunqiYanjunqi adalah Manajer Sains Terapan Senior di Lab Solusi Pembelajaran Mesin Amazon. Dia berinovasi dan menerapkan pembelajaran mesin untuk membantu pelanggan AWS mempercepat penerapan AI dan cloud mereka.

Stempel Waktu:

Lebih dari Pembelajaran Mesin AWS