ETL-i andmetöötluse tõhustamine saidil Talent.com Amazon SageMakeri abil Amazoni veebiteenused

ETL-i andmetöötluse tõhustamine saidil Talent.com Amazon SageMakeri abil Amazoni veebiteenused

Selle postituse kaasautoriteks on masinõppeinsener Anatoli Khomenko ja Talent.com-i tehnoloogiajuht Abdenour Bezzouh.

Asutatud 2011 Talent.com koondab oma klientide tasustatud tööpakkumisi ja avalikke tööpakkumisi ning on loonud ühtse hõlpsasti otsitava platvormi. Talent.com, mis hõlmab enam kui 30 miljonit tööpakkumist enam kui 75 riigis ja hõlmab erinevaid keeli, tööstusi ja turustuskanaleid, rahuldab tööotsijate erinevaid vajadusi, ühendades miljoneid tööotsijaid tõhusalt töövõimalustega.

Talent.com missioon on hõlbustada ülemaailmseid tööjõuühendusi. Selle saavutamiseks koondab Talent.com tööpakkumisi erinevatest veebiallikatest, pakkudes tööotsijatele juurdepääsu enam kui 30 miljonile töövõimalusele, mis on kohandatud nende oskustele ja kogemustele. Kooskõlas selle missiooniga tegi Talent.com koostööd AWS-iga, et töötada välja tipptasemel töösoovitusmootor, mille juhiks on sügav õppimine ja mille eesmärk on aidata kasutajatel oma karjääri edendada.

Selle töösoovitusmootori tõhusa toimimise tagamiseks on ülioluline rakendada suuremahulist andmetöötlust, mis vastutab Talent.com-i koondatud tööloenditest funktsioonide hankimise ja täiustamise eest. See konveier suudab töödelda 5 miljonit igapäevast kirjet vähem kui 1 tunniga ja võimaldab töödelda mitme päeva kirjeid paralleelselt. Lisaks võimaldab see lahendus kiiresti tootmisse juurutada. Selle torujuhtme esmane andmeallikas on JSON Line'i vorming, mis on salvestatud Amazoni lihtne salvestusteenus (Amazon S3) ja jaotatud kuupäeva järgi. Selle tulemusel genereeritakse iga päev kümneid tuhandeid JSON Line'i faile, mida värskendatakse iga päev.

Selle andmetöötluse põhieesmärk on hõlbustada koolituseks vajalike funktsioonide loomist ja töösoovitusmootori juurutamist saidil Talent.com. Väärib märkimist, et see torujuhe peab toetama järkjärgulisi värskendusi ja vastama keerukatele funktsioonide eraldamise nõuetele, mis on vajalikud töösoovitussüsteemi jaoks vajalike koolitus- ja juurutamismoodulite jaoks. Meie torujuhe kuulub üldisesse ETL-i (ekstrakti, teisendus- ja laadimisprotsesside perekonda), mis ühendab mitmest allikast pärinevad andmed suurde kesksesse hoidlasse.

Lisateabe saamiseks selle kohta, kuidas Talent.com ja AWS lõid koostöös tipptasemel loomuliku keele töötlemise ja süvaõppe mudeli koolitustehnikaid, kasutades Amazon SageMaker töösoovitussüsteemi koostamiseks vt Tekstist unistuste töökohani: NLP-põhise töösoovitaja loomine saidil Talent.com koos Amazon SageMakeriga. Süsteem sisaldab funktsioonide projekteerimist, süvaõppemudeli arhitektuuri disaini, hüperparameetrite optimeerimist ja mudeli hindamist, kus kõiki mooduleid käitatakse Pythoni abil.

See postitus näitab, kuidas kasutasime SageMakerit suuremahulise andmetöötluse torustiku ehitamiseks, et valmistada ette funktsioonid Talent.com-i töösoovitusmootori jaoks. Saadud lahendus võimaldab andmeteadlasel mõelda SageMakeri sülearvutist funktsioonide ekstraheerimisele, kasutades Pythoni teeke, näiteks scikit-õppida or PyTorchja seejärel sama koodi kiiresti juurutamiseks andmetöötluskonveierisse, teostades funktsioonide ulatuslikku ekstraheerimist. Lahendus ei nõua funktsiooni ekstraktimise koodi teisaldamist PySparki kasutamiseks, nagu selle kasutamisel nõutakse AWS liim ETL lahendusena. Meie lahendust saab arendada ja juurutada ainult Data Scientist, kasutades ainult SageMakerit, ja see ei nõua teadmisi muudest ETL-i lahendustest, näiteks AWS partii. See võib oluliselt lühendada aega, mis kulub masinõppe (ML) konveieri juurutamiseks tootmisse. Konveierit juhitakse Pythoni kaudu ja see integreerub sujuvalt funktsioonide ekstraheerimise töövoogudega, muutes selle kohandatavaks paljude andmeanalüütika rakendustega.

Lahenduse ülevaade

Ülevaade ETL-konveieri kohta, kasutades SageMakeri töötlemist

Torujuhe koosneb kolmest põhifaasist:

  1. Kasutage an Amazon SageMakeri töötlemine töö konkreetse päevaga seotud JSONL-i töötlemata failide käsitlemiseks. Erinevate töötlemistöödega saab korraga töödelda mitu päeva andmeid.
  2. Töötama AWS liim andmete roomamiseks pärast mitmepäevaste andmete töötlemist.
  3. Laadige töödeldud funktsioonid määratud kuupäevavahemiku jaoks, kasutades SQL-i alates an Amazonase Athena tabel, seejärel koolitage ja rakendage töösoovitajate mudel.

Töötle töötlemata JSONL-faile

Töötleme töötlemata JSONL-faile määratud päeva jooksul, kasutades SageMakeri töötlemistööd. Töö teostab funktsioonide ekstraheerimist ja andmete tihendamist ning salvestab töödeldud funktsioonid Parketi failidesse 1 miljoni kirjega faili kohta. Kasutame protsessori paralleelsust, et teostada paralleelselt iga JSONL-i töötlemata faili funktsioonide ekstraheerimist. Iga JSONL-faili töötlemistulemused salvestatakse ajutisse kataloogi eraldi Parquet-faili. Kui kõik JSONL-failid on töödeldud, tihendame tuhanded väikesed Parquet-failid mitmeks failiks, kusjuures faili kohta on 1 miljon kirjet. Tihendatud Parketi failid laaditakse seejärel töötlemistöö väljundina Amazon S3-sse. Andmete tihendamine tagab tõhusa roomamise ja SQL-päringute tegemise konveieri järgmistes etappides.

Järgmine on näidiskood SageMakeri töötlemistöö ajastamiseks määratud päevaks, näiteks 2020-01-01, kasutades SageMakeri SDK-d. Töö loeb JSONL-i töötlemata faile Amazon S3-st (näiteks saidilt s3://bucket/raw-data/2020/01/01) ja salvestab tihendatud Parketi failid Amazon S3-sse (näiteks 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
)

Järgmine põhiskripti koodi ülevaade (processing_script.py), mis käitab SageMakeri töötlemistööd, on järgmine:

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)

Skaleeritavus on meie torujuhtme põhifunktsioon. Esiteks saab andmete töötlemiseks mitu päeva korraga kasutada mitut SageMakeri töötlemistööd. Teiseks väldime kogu töödeldud või töötlemata andmete korraga mällu laadimist, töödeldes samal ajal iga määratud päeva andmeid. See võimaldab töödelda andmeid, kasutades eksemplaritüüpe, mis ei mahuta põhimällu terve päeva andmeid. Ainus nõue on, et eksemplari tüüp peaks suutma korraga mällu laadida N töötlemata JSONL- või töödeldud Parquet-faili, kusjuures N on kasutatavate protsessitöötajate arv.

Töödeldud andmete indekseerimine AWS-liimi abil

Kui kõik mitme päeva algandmed on töödeldud, saame AWS-i liimiroomiku abil luua kogu andmestikku Athena tabeli. Me kasutame AWS SDK pandadele (awswrangler) teek tabeli loomiseks järgmise väljalõike abil:

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

Laadige treenimiseks töödeldud funktsioonid

Määratud kuupäevavahemiku töödeldud funktsioone saab nüüd SQL-i abil laadida Athena tabelist ja neid funktsioone saab seejärel kasutada töösoovitajate mudeli koolitamiseks. Näiteks laadib järgmine väljavõte ühe kuu töödeldud funktsioonid DataFrame'i, kasutades awswrangler raamatukogu:

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

Lisaks saab SQL-i kasutamist treeningu jaoks töödeldud funktsioonide laadimiseks laiendada, et see sobiks erinevate muude kasutusjuhtumitega. Näiteks saame rakendada sarnast konveieri kahe eraldiseisva Athena tabeli haldamiseks: üks kasutaja näitamiste salvestamiseks ja teine ​​nendel näitamistel tehtud klikkide salvestamiseks. SQL-i liitumislausete abil saame hankida kuvamised, millel kasutajad kas klõpsasid või ei klõpsanud, ja seejärel edastada need näitamised mudelkoolitustööle.

Lahenduse eelised

Pakutud lahenduse rakendamine toob meie olemasolevale töövoole mitmeid eeliseid, sealhulgas:

  • Lihtsustatud rakendamine – Lahendus võimaldab Pythonis populaarsete ML-teekide abil funktsioonide ekstraktimist rakendada. Ja see ei nõua koodi teisaldamist PySparki. See muudab funktsioonide ekstraheerimise sujuvamaks, kuna see konveier käivitab sama koodi, mille andmeteadlane on sülearvutis välja töötanud.
  • Kiire tee tootmiseni – Andmeteadlane saab lahenduse välja töötada ja kasutusele võtta, et teostada mastaabis funktsioonide ekstraheerimist, võimaldades neil nende andmete põhjal välja töötada ML-i soovitusmudeli. Samal ajal saab ML-i insener sama lahendust tootmises kasutusele võtta, vajades vähe muudatusi.
  • Korduvkasutatavus – Lahendus pakub korduvkasutatavat mustrit mastaabis funktsioonide eraldamiseks ja seda saab hõlpsasti kohandada muudeks kasutusjuhtudeks peale soovituslike mudelite ehitamise.
  • Efektiivsus – Lahendus pakub head jõudlust: ühe päeva töötlemine Talent.comandmete saamiseks kulus vähem kui 1 tund.
  • Järkjärgulised värskendused – Lahendus toetab ka järkjärgulisi värskendusi. Uusi igapäevaseid andmeid saab töödelda SageMakeri töötlemistööga ja töödeldud andmeid sisaldavat S3 asukohta saab Athena tabeli värskendamiseks uuesti indekseerida. Tänaste andmete värskendamiseks saame kasutada ka cron-tööd mitu korda päevas (näiteks iga 3 tunni järel).

Kasutasime seda ETL-i konveieri, et aidata Talent.com-il töödelda 50,000 5 faili päevas, mis sisaldasid 90 miljonit kirjet, ja lõime koolitusandmeid, kasutades funktsioone, mis eraldati saidilt Talent.com 450 päeva toorandmetest – kokku 900,000 miljonit kirjet 2 8.6 failis. Meie konveier aitas Talent.com-il soovitussüsteemi luua ja tootmisse juurutada vaid XNUMX nädalaga. Lahendus teostas Amazon SageMakeris kõiki ML-protsesse, sealhulgas ETL-i, ilma muud AWS-teenust kasutamata. Töösoovituste süsteem suurendas veebipõhises A/B-testimises XNUMX% klikkimise määra võrreldes varasema XGBoostil põhineva lahendusega, aidates miljonitel Talent.com-i kasutajatel paremaid töökohti leida.

Järeldus

See postitus kirjeldab ETL-i konveieri, mille oleme välja töötanud funktsioonide töötlemiseks koolitamiseks ja töösoovitusmudeli juurutamiseks saidil Talent.com. Meie konveier kasutab tõhusaks andmetöötluseks ja laiaulatuslikuks funktsioonide eraldamiseks SageMakeri töötlemistöid. Funktsioonide ekstraktimise kood on Pythonis rakendatud, võimaldades populaarsete ML-teekide kasutamist funktsioonide ulatuslikuks ekstraktimiseks, ilma et oleks vaja PySparki kasutamiseks koodi portida.

Soovitame lugejatel uurida võimalust kasutada selles ajaveebis esitatud konveieri mallina nende kasutusjuhtudel, kus on vaja funktsioonide ulatuslikku eraldamist. Andmeteadlane saab torujuhet kasutada ML-mudeli loomiseks ja ML-i insener saab seejärel sama torujuhtme kasutusele võtta tootmiseks. See võib märkimisväärselt lühendada aega, mis kulub ML-lahenduse täielikuks tootmiseks, nagu Talent.com puhul. Lugejad saavad viidata õpetus SageMakeri töötlemistööde seadistamiseks ja käitamiseks. Soovitame ka lugejaid postitust vaatama Tekstist unistuste töökohani: NLP-põhise töösoovitaja loomine saidil Talent.com koos Amazon SageMakeriga, kus arutleme süvaõppe mudeli koolitustehnikate kasutamise üle Amazon SageMaker Talent.com töösoovitussüsteemi loomiseks.


Autoritest

Dmitri BespalovDmitri Bespalov on vanemrakendusteadlane Amazoni masinõppelahenduste laboris, kus ta aitab AWS-i klientidel erinevates tööstusharudes kiirendada nende tehisintellekti ja pilve kasutuselevõttu.

Yi XiangYi Xiang on rakendusteadlane II Amazoni masinõppelahenduste laboris, kus ta aitab AWS-i klientidel erinevates tööstusharudes kiirendada nende tehisintellekti ja pilve kasutuselevõttu.

Tong WangTong Wang on vanemrakendusteadlane Amazoni masinõppelahenduste laboris, kus ta aitab AWS-i klientidel erinevates tööstusharudes kiirendada nende tehisintellekti ja pilve kasutuselevõttu.

Anatoli KhomenkoAnatoli Khomenko on masinõppe vaneminsener Talent.com kirg loomuliku keele töötlemise vastu, sobitades head inimesed headele töökohtadele.

Abdenour BezzouhAbdenour Bezzouh on tegevjuht, kellel on enam kui 25-aastane kogemus miljonite klientideni ulatuvate tehnoloogiliste lahenduste ehitamisel ja tarnimisel. Abdenour töötas tehnoloogiajuhina (CTO) kell Talent.com kui AWS-i meeskond selle konkreetse lahenduse kavandas ja teostas Talent.com.

Yanjun QiYanjun Qi on rakendusteaduste vanemjuht Amazoni masinõppelahenduste laboris. Ta teeb uuendusi ja rakendab masinõpet, et aidata AWS-i klientidel kiirendada nende tehisintellekti ja pilve kasutuselevõttu.

Ajatempel:

Veel alates AWS-i masinõpe