ייעול עיבוד הנתונים של ETL ב-Talent.com עם Amazon SageMaker | שירותי האינטרנט של אמזון

ייעול עיבוד הנתונים של ETL ב-Talent.com עם Amazon SageMaker | שירותי האינטרנט של אמזון

פוסט זה נכתב בשיתוף אנטולי חומנקו, מהנדס למידת מכונה, ו- Abdenour Bezzouh, קצין טכנולוגיה ראשי ב- Talent.com.

הוקם בשנת 2011, Talent.com אוסף רשימות משרות בתשלום מהלקוחות שלהם ורשימות משרות ציבוריות, ויצר פלטפורמה אחידה וניתנת לחיפוש בקלות. Talent.com מכסה למעלה מ-30 מיליון רישומי משרות בלמעלה מ-75 מדינות ומשתרעת על פני שפות, תעשיות וערוצי הפצה שונים, ומספקת מענה לצרכים המגוונים של מחפשי עבודה, ומחברת למעשה מיליוני מחפשי עבודה עם הזדמנויות עבודה.

המשימה של Talent.com היא להקל על קשרי כוח עבודה גלובליים. כדי להשיג זאת, Talent.com אוסף רשימות משרות ממקורות שונים באינטרנט, ומציע למחפשי עבודה גישה למאגר נרחב של למעלה מ-30 מיליון הזדמנויות עבודה המותאמות לכישוריהם ולניסיונם. בהתאם למשימה זו, Talent.com שיתף פעולה עם AWS כדי לפתח מנוע המלצות עבודה חדשני המונע על ידי למידה עמוקה, שמטרתו לסייע למשתמשים בקידום הקריירה שלהם.

כדי להבטיח את פעולתו האפקטיבית של מנוע המלצות עבודה זה, חיוני ליישם צינור עיבוד נתונים בקנה מידה גדול האחראי על חילוץ וחידוד תכונות מרשימות המשרות המצטברות של Talent.com. צינור זה מסוגל לעבד 5 מיליון רשומות יומיות בפחות משעה, ומאפשר עיבוד של מספר ימים של רשומות במקביל. בנוסף, פתרון זה מאפשר פריסה מהירה לייצור. המקור העיקרי לנתונים עבור צינור זה הוא פורמט JSON Lines, המאוחסן ב שירות אחסון פשוט של אמזון (Amazon S3) ומחולק לפי תאריך. כל יום, זה מביא ליצירת עשרות אלפי קבצי JSON Lines, עם עדכונים מצטברים מדי יום.

המטרה העיקרית של צינור עיבוד נתונים זה היא להקל על יצירת התכונות הנחוצות להדרכה ופריסה של מנוע המלצות העבודה ב-Talent.com. ראוי לציין שצנרת זו חייבת לתמוך בעדכונים מצטברים ולעמוד בדרישות החילוץ המורכבות של תכונות הדרושות עבור מודולי ההדרכה והפריסה החיוניים למערכת המלצות העבודה. הצינור שלנו שייך למשפחת תהליכי ה-ETL הכללית (חילוץ, טרנספורמציה וטעינה) המשלבת נתונים ממקורות מרובים למאגר גדול ומרכזי.

לתובנות נוספות לגבי האופן שבו Talent.com ו-AWS בנו בשיתוף פעולה עיבוד שפה טבעית מתקדמת ומודלים של למידה עמוקה, תוך שימוש בטכניקות אימון אמזון SageMaker ליצירת מערכת המלצות לעבודה, עיין ב מטקסט לעבודת חלומות: בניית ממליץ עבודה מבוסס NLP ב-Talent.com עם Amazon SageMaker. המערכת כוללת הנדסת תכונות, עיצוב ארכיטקטורת מודל למידה עמוקה, אופטימיזציה של היפרפרמטרים והערכת מודלים, כאשר כל המודולים מופעלים באמצעות Python.

פוסט זה מראה כיצד השתמשנו ב-SageMaker כדי לבנות צינור עיבוד נתונים בקנה מידה גדול להכנת תכונות עבור מנוע המלצות העבודה ב-Talent.com. הפתרון המתקבל מאפשר למדען נתונים לחשוב על מיצוי תכונות במחברת SageMaker באמצעות ספריות Python, כגון סקיקיט-למד or PyTorch, ולאחר מכן לפרוס במהירות את אותו קוד לתוך צינור עיבוד הנתונים ביצוע חילוץ תכונות בקנה מידה. הפתרון אינו דורש העברה של קוד חילוץ התכונה כדי להשתמש ב-PySpark, כנדרש בעת השימוש דבק AWS כפתרון ETL. ניתן לפתח ולפרוס את הפתרון שלנו אך ורק על ידי Data Scientist מקצה לקצה באמצעות SageMaker בלבד, ואינו דורש ידע בפתרונות ETL אחרים, כגון אצווה AWS. זה יכול לקצר באופן משמעותי את הזמן הדרוש לפריסת הצינור של למידת מכונה (ML) לייצור. הצינור מופעל באמצעות Python ומשתלב בצורה חלקה עם זרימות עבודה של מיצוי תכונות, מה שהופך אותו להתאמה למגוון רחב של יישומי ניתוח נתונים.

סקירת פתרונות

סקירה כללית עבור צינור ETL ​​באמצעות SageMaker Processing

הצינור מורכב משלושה שלבים עיקריים:

  1. השתמש ב- עיבוד אמזון SageMaker עבודה לטיפול בקובצי JSONL גולמיים המשויכים ליום מסוים. ניתן לעבד מספר ימים של נתונים על ידי עבודות עיבוד נפרדות בו-זמנית.
  2. להעסיק דבק AWS לסריקת נתונים לאחר עיבוד מספר ימים של נתונים.
  3. טען תכונות מעובדות עבור טווח תאריכים מוגדר באמצעות SQL מ-an אמזונה אתנה טבלה, ולאחר מכן אימון ופריסה של מודל ממליצים לעבודה.

עבד קבצי JSONL גולמיים

אנו מעבדים קבצי JSONL גולמיים ליום מוגדר באמצעות עבודת SageMaker Processing. העבודה מיישמת מיצוי תכונות ודחיסה של נתונים, ושומרת תכונות מעובדות לקבצי Parquet עם מיליון רשומות לכל קובץ. אנו מנצלים את ההקבלה של CPU כדי לבצע חילוץ תכונות עבור כל קובץ JSONL גולמי במקביל. תוצאות העיבוד של כל קובץ JSONL נשמרות בקובץ Parquet נפרד בתוך ספרייה זמנית. לאחר שכל קבצי ה-JSONL עברו עיבוד, אנו מבצעים דחיסה של אלפי קבצי פרקט קטנים למספר קבצים עם מיליון רשומות לקובץ. קבצי הפרקט הדחוסים מועלים לאחר מכן לאמזון S1 כפלט של עבודת העיבוד. דחיסת הנתונים מבטיחה סריקה יעילה ושאילתות SQL בשלבים הבאים של הצינור.

להלן הקוד לדוגמה לתזמון עבודת SageMaker Processing ליום מסוים, למשל 2020-01-01, באמצעות ה-SDK של SageMaker. העבודה קוראת קבצי JSONL גולמיים מאמזון S3 (לדוגמה מ s3://bucket/raw-data/2020/01/01) ושומר את קבצי הפרקט הדחוסים באמזון 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 Processing היא כדלקמן:

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 Processing לעיבוד נתונים במשך מספר ימים בו זמנית. שנית, אנו נמנעים מלטעון את כל הנתונים המעובדים או הגולמיים לזיכרון בבת אחת, תוך עיבוד כל יום נתון שצוין. זה מאפשר עיבוד נתונים באמצעות סוגי מופעים שאינם יכולים להכיל נתונים של יום שלם בזיכרון הראשי. הדרישה היחידה היא שסוג המופע צריך להיות מסוגל לטעון N קובצי JSONL גולמיים או קבצי Parquet מעובדים לזיכרון בו זמנית, כאשר N הוא מספר עובדי התהליך שנמצאים בשימוש.

סרוק נתונים מעובדים באמצעות דבק AWS

לאחר שעובדו כל הנתונים הגולמיים של מספר ימים, נוכל ליצור טבלת Athena מכל מערך הנתונים באמצעות סורק AWS Glue. אנו משתמשים ב- 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])

טען תכונות מעובדות לאימון

כעת ניתן לטעון תכונות מעובדות עבור טווח תאריכים מוגדר מטבלת Athena באמצעות SQL, ולאחר מכן ניתן להשתמש בתכונות אלו להכשרת מודל ממליצים לעבודה. לדוגמה, הקטע הבא טוען חודש אחד של תכונות מעובדות לתוך 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 join, אנו יכולים לאחזר הופעות שמשתמשים לחצו עליהן או לא לחצו עליהן ולאחר מכן להעביר הופעות אלו לעבודת הדרכה למודל.

יתרונות פתרון

יישום הפתרון המוצע מביא מספר יתרונות לזרימת העבודה הקיימת שלנו, כולל:

  • יישום פשוט – הפתרון מאפשר יישום מיצוי תכונות ב-Python באמצעות ספריות ML פופולריות. וזה לא מצריך העברה של הקוד לתוך PySpark. זה מייעל את חילוץ התכונות שכן אותו קוד שפותח על ידי מדען נתונים במחברת יבוצע על ידי צינור זה.
  • דרך מהירה לייצור - ניתן לפתח ולפרוס את הפתרון על ידי מדען נתונים כדי לבצע מיצוי תכונות בקנה מידה, מה שמאפשר להם לפתח מודל ממליצים ML כנגד נתונים אלה. במקביל, אותו פתרון יכול להיפרס לייצור על ידי מהנדס ML עם שינויים קטנים הדרושים.
  • שימוש חוזר - הפתרון מספק דפוס לשימוש חוזר לחילוץ תכונות בקנה מידה, וניתן להתאים אותו בקלות למקרי שימוש אחרים מעבר למודלים של ממליצים.
  • יְעִילוּת – הפתרון מציע ביצועים טובים: עיבוד יום בודד של ה Talent.comהנתונים של ארכו פחות משעה.
  • עדכונים מצטברים – הפתרון תומך גם בעדכונים מצטברים. ניתן לעבד נתונים יומיים חדשים עם עבודת SageMaker Processing, וניתן לסרוק מחדש את מיקום S3 המכיל את הנתונים המעובדים כדי לעדכן את טבלת Athena. אנו יכולים גם להשתמש ב-cron job כדי לעדכן את הנתונים של היום מספר פעמים ביום (לדוגמה, כל 3 שעות).

השתמשנו בצינור ה-ETL הזה כדי לעזור ל-Talent.com לעבד 50,000 קבצים ביום המכילים 5 מיליון רשומות, ויצרנו נתוני אימון באמצעות תכונות שחולצו מ-90 ימים של נתונים גולמיים מ-Talent.com - סה"כ 450 מיליון רשומות על פני 900,000 קבצים. הצינור שלנו עזר ל-Talent.com לבנות ולפרוס את מערכת ההמלצות לייצור תוך שבועיים בלבד. הפתרון ביצע את כל תהליכי ה-ML כולל ETL באמזון SageMaker מבלי להשתמש בשירות AWS אחר. מערכת ההמלצות לעבודה הביאה לעלייה של 2% בשיעור הקליקים בבדיקות A/B מקוונות מול פתרון קודם מבוסס XGBoost, ועזרה לחבר מיליוני משתמשים של Talent.com לעבודות טובות יותר.

סיכום

פוסט זה מתאר את צינור ה-ETL שפיתחנו לעיבוד תכונות להדרכה ופריסה של מודל ממליצים לעבודה ב-Talent.com. הצינור שלנו משתמש בעבודות SageMaker Processing לעיבוד נתונים יעיל וחילוץ תכונות בקנה מידה גדול. קוד חילוץ תכונות מיושם ב-Python המאפשר שימוש בספריות ML פופולריות לביצוע חילוץ תכונות בקנה מידה, ללא צורך בהעברת הקוד כדי להשתמש ב-PySpark.

אנו מעודדים את הקוראים לבחון את האפשרות להשתמש בצינור המוצג בבלוג זה כתבנית עבור מקרי השימוש שלהם שבהם נדרשת מיצוי תכונות בקנה מידה. ניתן למנף את הצינור על ידי מדען נתונים לבניית מודל ML, ואז אותו צינור יכול להיות מאומץ על ידי מהנדס ML כדי להפעיל אותו בייצור. זה יכול להפחית משמעותית את הזמן הדרוש לייצור פתרון ML מקצה לקצה, כפי שהיה במקרה של Talent.com. הקוראים יכולים להתייחס ל מדריך להגדרה והרצה של עבודות SageMaker Processing. אנו מפנים גם את הקוראים לצפות בפוסט מטקסט לעבודת חלומות: בניית ממליץ עבודה מבוסס NLP ב-Talent.com עם Amazon SageMaker, שבו אנו דנים בטכניקות אימון מודל למידה עמוקה תוך שימוש אמזון SageMaker לבנות את מערכת המלצות העבודה של Talent.com.


על המחברים

דמיטרי בספלובדמיטרי בספלוב הוא מדען יישומי בכיר במעבדת פתרונות למידת מכונה של אמזון, שם הוא עוזר ללקוחות AWS בתעשיות שונות להאיץ את אימוץ הבינה המלאכותית והענן שלהם.

יי שיאנגיי שיאנג היא מדענית יישומית II במעבדת פתרונות למידת מכונה של אמזון, שם היא עוזרת ללקוחות AWS בתעשיות שונות להאיץ את אימוץ הבינה המלאכותית והענן שלהם.

טונג וואנגטונג וואנג הוא מדען יישומי בכיר במעבדת פתרונות למידת מכונה של אמזון, שם הוא עוזר ללקוחות AWS בתעשיות שונות להאיץ את אימוץ הבינה המלאכותית והענן שלהם.

אנטולי חומנקואנטולי חומנקו הוא מהנדס למידת מכונה בכיר ב Talent.com עם תשוקה לעיבוד שפה טבעית בהתאמת אנשים טובים לעבודות טובות.

עבדנור בז'והעבדנור בז'וה הוא מנהל עם יותר מ-25 שנות ניסיון בבנייה ואספקה ​​של פתרונות טכנולוגיים המותאמים למיליוני לקוחות. עבדנור כיהן בתפקיד מנהל הטכנולוגיה הראשי (CTO) ב Talent.com כאשר צוות AWS תכנן והוציא לפועל את הפתרון הספציפי הזה עבור Talent.com.

יאנג'ון צ'ייאנג'ון צ'י הוא מנהל בכיר למדע יישומי במעבדת פתרונות למידת מכונה של אמזון. היא מחדשת ומיישמת למידת מכונה כדי לעזור ללקוחות AWS להאיץ את אימוץ הבינה המלאכותית והענן שלהם.

בול זמן:

עוד מ למידת מכונות AWS