Az ETL adatfeldolgozás egyszerűsítése a Talent.com oldalon az Amazon SageMaker | Amazon webszolgáltatások

Az ETL adatfeldolgozás egyszerűsítése a Talent.com oldalon az Amazon SageMaker | Amazon webszolgáltatások

Ennek a bejegyzésnek a társszerzői Anatolij Khomenko, a gépi tanulási mérnök és Abdenour Bezzouh, a Talent.com technológiai igazgatója.

Alapítva 2011, Talent.com összesíti ügyfeleik fizetett álláshirdetéseit és nyilvános álláshirdetéseit, és egységes, könnyen kereshető platformot hozott létre. A több mint 30 országban több mint 75 millió álláshirdetést lefedő, különböző nyelveken, iparágakon és terjesztési csatornákon átívelő Talent.com az álláskeresők sokrétű igényeit elégíti ki, és több millió álláskeresőt köt össze munkalehetőségekkel.

A Talent.com küldetése a globális munkaerő-kapcsolatok elősegítése. Ennek elérése érdekében a Talent.com összesíti az álláshirdetéseket az interneten különböző forrásokból, és hozzáférést kínál az álláskeresőknek több mint 30 millió álláslehetőséghez, készségeikre és tapasztalataikra szabva. E küldetésnek megfelelően a Talent.com együttműködött az AWS-szel egy olyan élvonalbeli állásajánló motor kifejlesztésében, amelyet mély tanulás vezérel, és célja, hogy segítse a felhasználókat karrierjük előmozdításában.

Ennek az állásajánló motornak a hatékony működése érdekében kulcsfontosságú egy nagyszabású adatfeldolgozási folyamat bevezetése, amely a Talent.com összesített állásajánlatainak kinyeréséért és finomításáért felelős. Ez a folyamat 5 millió napi rekordot képes feldolgozni kevesebb mint 1 óra alatt, és lehetővé teszi több napos rekord párhuzamos feldolgozását. Ezenkívül ez a megoldás lehetővé teszi a gyors üzembe helyezést a termelésben. Ennek a folyamatnak az elsődleges adatforrása a JSON Lines formátum, amelyen tárolva van Amazon egyszerű tárolási szolgáltatás (Amazon S3) és dátum szerint particionálva. Ez minden nap több tízezer JSON Lines-fájl generálását eredményezi, naponta növekményes frissítésekkel.

Ennek az adatfeldolgozási folyamatnak az elsődleges célja, hogy megkönnyítse a képzéshez szükséges funkciók létrehozását és a Talent.com állásajánló motorjának telepítését. Érdemes megjegyezni, hogy ennek a folyamatnak támogatnia kell a növekményes frissítéseket, és meg kell felelnie az állásajánló rendszerhez elengedhetetlen képzési és telepítési modulokhoz szükséges bonyolult szolgáltatáskivonási követelményeknek. Csővezetékünk az általános ETL (extract, transform, and load) folyamatcsaládhoz tartozik, amely több forrásból származó adatokat egyesít egy nagy, központi adattárba.

Ha további betekintést szeretne kapni abba, hogy a Talent.com és az AWS hogyan épített ki közösen a legmodernebb természetes nyelvi feldolgozási és mély tanulási modell képzési technikákat Amazon SageMaker állásajánló rendszer kidolgozásához lásd A szövegtől az álommunkáig: NLP-alapú állásajánló készítése a Talent.com oldalon az Amazon SageMaker segítségével. A rendszer magában foglalja a funkciók tervezését, a mély tanulási modell architektúra tervezését, a hiperparaméter-optimalizálást és a modellértékelést, ahol az összes modul Python használatával fut.

Ez a bejegyzés bemutatja, hogy a SageMaker segítségével hogyan építettünk fel egy nagyszabású adatfeldolgozási folyamatot a Talent.com állásajánló motorjának funkcióinak előkészítésére. Az eredményül kapott megoldás lehetővé teszi a Data Scientist számára, hogy Python-könyvtárak (pl. scikit-learn or PyTorch, majd gyorsan telepítheti ugyanazt a kódot az adatfeldolgozó folyamatba, amely nagyarányú szolgáltatáskivonást hajt végre. A megoldás nem igényli a szolgáltatás kibontási kódjának portolását a PySpark használatához, ahogyan a használat során szükséges AWS ragasztó mint az ETL megoldás. Megoldásunkat kizárólag egy Data Scientist fejlesztheti és telepítheti végpontok között, csak egy SageMaker segítségével, és nem igényel más ETL-megoldások ismeretét, mint pl. AWS köteg. Ez jelentősen lerövidítheti a Machine Learning (ML) folyamat éles üzembe helyezéséhez szükséges időt. A folyamat a Pythonon keresztül működik, és zökkenőmentesen integrálódik a szolgáltatás-kinyerési munkafolyamatokhoz, így az adatelemzési alkalmazások széles skálájához adaptálhatóvá válik.

Megoldás áttekintése

A SageMaker feldolgozást használó ETL-folyamat áttekintése

A csővezeték három fő szakaszból áll:

  1. Használjon egy Amazon SageMaker feldolgozás feladat egy adott naphoz társított nyers JSONL-fájlok kezelésére. Több napos adat feldolgozható külön feldolgozási munkákkal egyidejűleg.
  2. Foglalkoztat AWS ragasztó adatfeltérképezéshez több napos adatfeldolgozás után.
  3. Feldolgozott szolgáltatások betöltése egy megadott dátumtartományhoz SQL használatával egy Amazon Athéné táblázatot, majd betanítsa és telepítse az állásajánló modellt.

Nyers JSONL-fájlok feldolgozása

A nyers JSONL-fájlokat egy adott napon egy SageMaker feldolgozási feladat segítségével dolgozzuk fel. A feladat funkciók kivonatolását és adattömörítését valósítja meg, és a feldolgozott jellemzőket parkettafájlokba menti, fájlonként 1 millió rekorddal. Kihasználjuk a CPU-párhuzamosítás előnyeit, hogy minden nyers JSONL-fájlhoz párhuzamosan bontsa ki a funkciókat. Az egyes JSONL-fájlok feldolgozási eredményei egy külön parquet fájlba kerülnek mentésre egy ideiglenes könyvtárban. Az összes JSONL-fájl feldolgozása után több ezer kis parkettafájlt tömörítünk több fájlba, fájlonként 1 millió rekorddal. A tömörített Parquet fájlok ezután feltöltődnek az Amazon S3-ba a feldolgozási feladat kimeneteként. Az adattömörítés hatékony feltérképezést és SQL-lekérdezéseket tesz lehetővé a folyamat következő szakaszaiban.

A következő mintakód egy SageMaker feldolgozási feladat ütemezéséhez adott napra, például 2020-01-01, a SageMaker SDK használatával. A feladat nyers JSONL-fájlokat olvas be az Amazon S3-ból (például a s3://bucket/raw-data/2020/01/01), és elmenti a tömörített Parquet fájlokat az Amazon S3-ba (például a 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
)

A következő kódvázlat a fő szkripthez (processing_script.py), amely a SageMaker Processing feladatot futtatja, a következő:

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)

A skálázhatóság a folyamat legfontosabb jellemzője. Először is, több SageMaker Processing job használható az adatok egyidejű feldolgozására több napon keresztül. Másodszor, elkerüljük, hogy a teljes feldolgozott vagy nyers adatot egyszerre töltsük be a memóriába, miközben minden meghatározott napon feldolgozzuk az adatokat. Ez lehetővé teszi az adatok feldolgozását olyan példánytípusok használatával, amelyek nem férnek el az elsődleges memóriában egy teljes napnyi adattal. Az egyetlen követelmény az, hogy a példánytípus képes legyen N nyers JSONL vagy feldolgozott Parquet fájl egyidejű betöltésére a memóriába, ahol N a használt folyamatmunkások száma.

A feldolgozott adatok feltérképezése az AWS Glue segítségével

Miután több napig feldolgoztuk az összes nyers adatot, egy AWS Glue bejáró segítségével létrehozhatunk egy Athena táblát a teljes adatkészletből. Használjuk a AWS SDK pandákhoz (awswrangler) könyvtárat a táblázat létrehozásához a következő kódrészlet segítségével:

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

Feldolgozott funkciók betöltése edzéshez

A megadott dátumtartomány feldolgozott jellemzői mostantól betölthetők az Athena táblából SQL használatával, majd ezek a szolgáltatások felhasználhatók az állásajánló modell betanításához. Például a következő kódrészlet egy hónap feldolgozott szolgáltatásokat tölt be egy DataFrame-be a következő használatával awswrangler könyvtár:

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

Ezen túlmenően, az SQL használata a feldolgozott szolgáltatások betanítás céljából történő betöltésére kibővíthető, hogy megfeleljen számos egyéb használati esetnek. Például alkalmazhatunk egy hasonló folyamatot két külön Athena tábla karbantartására: az egyik a felhasználói megjelenítések, a másik pedig az ezekre a megjelenítésekre leadott kattintások tárolására szolgál. Az SQL csatlakozási utasítások segítségével lekérhetjük azokat a megjelenítéseket, amelyekre a felhasználók kattintottak, vagy nem, majd átadhatjuk ezeket a megjelenítéseket egy modell betanítási feladatnak.

A megoldás előnyei

A javasolt megoldás megvalósítása számos előnnyel jár meglévő munkafolyamatunkhoz, többek között:

  • Egyszerűsített megvalósítás – A megoldás lehetővé teszi a szolgáltatások kibontását Pythonban a népszerű ML-könyvtárak használatával. És ehhez nem kell a kódot a PySparkba portolni. Ez leegyszerűsíti a funkciók kinyerését, mivel ugyanazt a kódot, amelyet egy Data Scientist fejlesztett ki egy notebookban, ez a folyamat hajtja végre.
  • Gyors út a gyártáshoz – A megoldást egy Data Scientist fejlesztheti és telepítheti, hogy nagyarányú tulajdonságkinyerést hajtson végre, lehetővé téve számukra egy ML ajánló modell kidolgozását ezen adatok alapján. Ugyanakkor ugyanazt a megoldást az ML mérnök kis módosításokkal telepítheti a termelésbe.
  • Reus képesség – A megoldás újrafelhasználható mintát biztosít a méretarányos jellemzők kinyeréséhez, és könnyen adaptálható más felhasználási esetekre is, az ajánlómodelleken kívül.
  • Hatékonyság – A megoldás jó teljesítményt kínál: egyetlen nap feldolgozása a Talent.comaz adatok kevesebb mint 1 órát vett igénybe.
  • Növekményes frissítések – A megoldás a fokozatos frissítéseket is támogatja. Az új napi adatok egy SageMaker Processing job segítségével dolgozhatók fel, és a feldolgozott adatokat tartalmazó S3 hely újra bejárható az Athena tábla frissítéséhez. Használhatunk cron feladatot a mai adatok frissítésére is naponta többször (például 3 óránként).

Ezt az ETL-folyamatot arra használtuk, hogy a Talent.com napi 50,000 5 fájlt dolgozzon fel, amelyek 90 millió rekordot tartalmaznak, és képzési adatokat hoztunk létre a Talent.com 450 napos nyers adataiból kinyert funkciók segítségével – összesen 900,000 millió rekordot 2 8.6 fájlban. A mi folyamatunk segített a Talent.com-nak mindössze XNUMX héten belül felépíteni és üzembe helyezni az ajánlási rendszert. A megoldás az összes ML-folyamatot, beleértve az ETL-t is, végrehajtotta az Amazon SageMakeren anélkül, hogy más AWS-szolgáltatást igénybe vett volna. Az állásajánló rendszer XNUMX%-kal növelte az átkattintási arányt az online A/B tesztelés során egy korábbi XGBoost-alapú megoldáshoz képest, amivel a Talent.com felhasználóinak millióit sikerült jobb állásokhoz kötni.

Következtetés

Ez a bejegyzés felvázolja azt az ETL-folyamatot, amelyet a Talent.com-on a képzéshez és egy állásajánló modell bevezetéséhez fejlesztettünk ki. Csővezetékünk SageMaker Processing munkákat használ a hatékony adatfeldolgozás és a funkciók nagy léptékű kinyerése érdekében. A szolgáltatáskivonó kód a Pythonban van megvalósítva, lehetővé téve a népszerű ML-könyvtárak használatát a szolgáltatások nagyarányú kibontásához anélkül, hogy a PySpark használatához portolni kellene a kódot.

Arra biztatjuk az olvasókat, hogy vizsgálják meg annak lehetőségét, hogy az ebben a blogban bemutatott folyamatot sablonként használhassák olyan használati eseteikben, amikor a funkciók nagyarányú kinyerésére van szükség. A folyamatot a Data Scientist felhasználhatja egy ML-modell felépítéséhez, majd ugyanezt a folyamatot egy ML-mérnök felhasználhatja a termelésben való futtatáshoz. Ez jelentősen csökkentheti az ML-megoldás végpontok közötti termékesítéséhez szükséges időt, ahogy az a Talent.com esetében is történt. Az olvasók hivatkozhatnak a oktatóanyag a SageMaker Processing feladatok beállításához és futtatásához. A bejegyzés megtekintésére is ajánljuk az olvasókat A szövegtől az álommunkáig: NLP-alapú állásajánló készítése a Talent.com oldalon az Amazon SageMaker segítségével, ahol a mély tanulási modell képzési technikáit tárgyaljuk Amazon SageMaker a Talent.com állásajánló rendszerének felépítéséhez.


A szerzőkről

Dmitrij BeszpalovDmitrij Beszpalov vezető alkalmazott tudós az Amazon Machine Learning Solutions Labnál, ahol különböző iparágakban segíti az AWS-ügyfeleket a mesterséges intelligencia és a felhő alkalmazásának felgyorsításában.

Yi XiangYi Xiang Applied Scientist II az Amazon Machine Learning Solutions Labnál, ahol különböző iparágakban segíti az AWS-ügyfeleket a mesterséges intelligencia és a felhő alkalmazásának felgyorsításában.

Tong WangTong Wang vezető alkalmazott tudós az Amazon Machine Learning Solutions Labnál, ahol különböző iparágakban segíti az AWS-ügyfeleket a mesterséges intelligencia és a felhő alkalmazásának felgyorsításában.

Anatolij KhomenkoAnatolij Khomenko vezető gépi tanulási mérnök Talent.com a természetes nyelvi feldolgozás iránti szenvedéllyel, hogy jó embereket és jó munkát találjanak.

Abdenour BezzouhAbdenour Bezzouh ügyvezető több mint 25 éves tapasztalattal olyan technológiai megoldások építésében és szállításában, amelyek több millió ügyfélre terjednek ki. Abdenour technológiai igazgatói (CTO) pozíciót töltött be Talent.com amikor az AWS csapata megtervezte és végrehajtotta ezt a konkrét megoldást Talent.com.

Yanjun QiYanjun Qi Senior Applied Science Manager az Amazon Machine Learning Solution Labnál. Megújítja és alkalmazza a gépi tanulást, hogy segítse az AWS-ügyfeleket az AI és a felhő alkalmazásának felgyorsításában.

Időbélyeg:

Még több AWS gépi tanulás