Usprawnienie przetwarzania danych ETL w Talent.com za pomocą Amazon SageMaker | Usługi internetowe Amazona

Usprawnienie przetwarzania danych ETL w Talent.com za pomocą Amazon SageMaker | Usługi internetowe Amazona

Współautorami tego postu są Anatolij Chomenko, inżynier uczenia maszynowego, i Abdenour Bezzouh, dyrektor ds. technologii w Talent.com.

Założona w 2011, talent.com gromadzi płatne oferty pracy od swoich klientów i publiczne oferty pracy i stworzył ujednoliconą, łatwą do przeszukiwania platformę. Obejmując ponad 30 milionów ofert pracy w ponad 75 krajach i obejmujących różne języki, branże i kanały dystrybucji, Talent.com zaspokaja różnorodne potrzeby osób poszukujących pracy, skutecznie łącząc miliony osób poszukujących pracy z możliwościami pracy.

Misją Talent.com jest ułatwianie globalnych połączeń pracowników. Aby to osiągnąć, Talent.com agreguje oferty pracy z różnych źródeł w Internecie, oferując osobom poszukującym pracy dostęp do obszernej puli ponad 30 milionów ofert pracy dostosowanych do ich umiejętności i doświadczenia. Zgodnie z tą misją firma Talent.com współpracowała z AWS w celu opracowania najnowocześniejszego silnika rekomendacji stanowisk pracy opartego na głębokim uczeniu się, którego celem jest pomaganie użytkownikom w rozwoju ich kariery.

Aby zapewnić skuteczne działanie tego silnika rekomendacji stanowisk pracy, kluczowe jest wdrożenie potoku przetwarzania danych na dużą skalę, odpowiedzialnego za wyodrębnianie i udoskonalanie funkcji ze zbiorczych ofert pracy Talent.com. Potok ten jest w stanie przetworzyć 5 milionów rekordów dziennie w czasie krótszym niż 1 godzina i umożliwia równoległe przetwarzanie rekordów z wielu dni. Dodatkowo rozwiązanie to pozwala na szybkie wdrożenie do produkcji. Podstawowym źródłem danych dla tego potoku jest format JSON Lines przechowywany w Usługa Amazon Simple Storage (Amazon S3) i podzielone według daty. Każdego dnia skutkuje to generowaniem dziesiątek tysięcy plików JSON Lines, a codziennie pojawiają się aktualizacje przyrostowe.

Głównym celem tego potoku przetwarzania danych jest ułatwienie tworzenia funkcji niezbędnych do szkolenia i wdrażania silnika rekomendacji pracy na Talent.com. Warto zauważyć, że ten potok musi obsługiwać aktualizacje przyrostowe i spełniać skomplikowane wymagania dotyczące ekstrakcji funkcji niezbędne dla modułów szkoleniowych i wdrożeniowych niezbędnych dla systemu rekomendacji stanowisk. Nasz potok należy do ogólnej rodziny procesów ETL (wyodrębnianie, przekształcanie i ładowanie), która łączy dane z wielu źródeł w duże, centralne repozytorium.

Aby uzyskać więcej informacji na temat współpracy Talent.com i AWS, najnowocześniejsze techniki szkoleniowe w zakresie modeli przetwarzania języka naturalnego i głębokiego uczenia się, wykorzystując Amazon Sage Maker Aby stworzyć system rekomendacji stanowisk pracy, zob Od SMS-a do wymarzonej pracy: budowanie narzędzia rekomendującego oferty pracy w oparciu o NLP w Talent.com za pomocą Amazon SageMaker. System obejmuje inżynierię funkcji, projektowanie architektury modelu głębokiego uczenia się, optymalizację hiperparametrów i ocenę modelu, gdzie wszystkie moduły są uruchamiane przy użyciu języka Python.

W tym poście pokazano, jak wykorzystaliśmy SageMaker do zbudowania potoku przetwarzania danych na dużą skalę w celu przygotowania funkcji dla silnika rekomendacji stanowisk pracy w Talent.com. Powstałe rozwiązanie umożliwia analitykowi danych zaprojektowanie ekstrakcji funkcji w notatniku SageMaker przy użyciu bibliotek Pythona, takich jak Nauka Scikit or PyTorch, a następnie szybko wdrożyć ten sam kod w potoku przetwarzania danych, wykonując ekstrakcję funkcji na dużą skalę. Rozwiązanie nie wymaga przenoszenia kodu ekstrakcji funkcji do korzystania z PySpark, zgodnie z wymaganiami podczas używania Klej AWS jako rozwiązanie ETL. Nasze rozwiązanie może zostać opracowane i wdrożone wyłącznie przez analityka danych, kompleksowo przy użyciu wyłącznie SageMakera i nie wymaga znajomości innych rozwiązań ETL, takich jak Partia AWS. Może to znacznie skrócić czas potrzebny na wdrożenie potoku uczenia maszynowego (ML) w środowisku produkcyjnym. Potok jest obsługiwany za pośrednictwem języka Python i bezproblemowo integruje się z procesami wyodrębniania funkcji, dzięki czemu można go dostosować do szerokiej gamy aplikacji do analizy danych.

Omówienie rozwiązania

Omówienie potoku ETL wykorzystującego przetwarzanie SageMaker

Rurociąg składa się z trzech głównych etapów:

  1. Wykorzystaj Przetwarzanie Amazon SageMaker zadanie do obsługi surowych plików JSONL powiązanych z określonym dniem. Dane z wielu dni mogą być przetwarzane jednocześnie przez oddzielne zadania przetwarzania.
  2. Zatrudniać Klej AWS do indeksowania danych po wielodniowym przetwarzaniu danych.
  3. Załaduj przetworzone funkcje dla określonego zakresu dat przy użyciu języka SQL z pliku Amazonka Atena table, a następnie wytrenuj i wdróż model rekomendujący oferty pracy.

Przetwarzaj surowe pliki JSONL

Przetwarzamy surowe pliki JSONL na określony dzień, korzystając z zadania SageMaker Processing. Zadanie obejmuje wyodrębnianie cech i zagęszczanie danych oraz zapisywanie przetworzonych funkcji w plikach Parquet z 1 milionem rekordów w pliku. Korzystamy z równoległości procesora, aby równolegle wyodrębniać funkcje dla każdego surowego pliku JSONL. Wyniki przetwarzania każdego pliku JSONL są zapisywane w oddzielnym pliku Parquet w katalogu tymczasowym. Po przetworzeniu wszystkich plików JSONL kompresujemy tysiące małych plików Parquet do kilku plików po 1 milion rekordów w pliku. Skompaktowane pliki Parquet są następnie przesyłane do Amazon S3 jako wynik zadania przetwarzania. Zagęszczenie danych zapewnia wydajne indeksowanie i zapytania SQL w kolejnych etapach potoku.

Poniżej znajduje się przykładowy kod umożliwiający zaplanowanie zadania przetwarzania SageMaker na określony dzień, na przykład 2020-01-01, przy użyciu pakietu SageMaker SDK. Zadanie odczytuje surowe pliki JSONL z Amazon S3 (na przykład z s3://bucket/raw-data/2020/01/01) i zapisuje skompaktowane pliki Parquet w Amazon S3 (na przykład do 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
)

Poniższy zarys kodu głównego skryptu (processing_script.py), który uruchamia zadanie SageMaker Processing, wygląda następująco:

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)

Skalowalność jest kluczową cechą naszego rurociągu. Po pierwsze, można używać wielu zadań SageMaker Processing do jednoczesnego przetwarzania danych przez kilka dni. Po drugie, unikamy jednoczesnego ładowania do pamięci całych przetworzonych lub surowych danych, przetwarzając dane każdego określonego dnia. Umożliwia to przetwarzanie danych przy użyciu typów instancji, które nie są w stanie pomieścić danych z całego dnia w pamięci podstawowej. Jedynym wymaganiem jest to, że typ instancji powinien umożliwiać jednoczesne załadowanie do pamięci N surowych plików JSONL lub przetworzonych plików Parquet, gdzie N oznacza liczbę używanych procesów roboczych.

Indeksuj przetworzone dane za pomocą kleju AWS

Po przetworzeniu wszystkich surowych danych z wielu dni możemy utworzyć tabelę Athena z całego zbioru danych, korzystając z robota AWS Glue. Używamy AWS SDK dla pand (awswrangler) biblioteka, aby utworzyć tabelę, korzystając z następującego fragmentu:

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

Załaduj przetworzone funkcje do szkolenia

Przetworzone funkcje dla określonego zakresu dat można teraz załadować z tabeli Athena przy użyciu języka SQL, a następnie wykorzystać te funkcje do uczenia modelu osoby rekomendującej oferty pracy. Na przykład poniższy fragment ładuje przetworzone funkcje z jednego miesiąca do ramki DataFrame przy użyciu metody awswrangler biblioteka:

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

Ponadto użycie języka SQL do ładowania przetworzonych funkcji na potrzeby szkolenia można rozszerzyć, aby uwzględnić różne inne przypadki użycia. Możemy na przykład zastosować podobny potok do obsługi dwóch oddzielnych tabel Athena: jednej do przechowywania wyświetleń użytkowników, a drugiej do przechowywania kliknięć tych wyświetleń przez użytkowników. Korzystając z instrukcji łączenia SQL, możemy pobrać wyświetlenia, które użytkownicy kliknęli lub nie, a następnie przekazać te wyświetlenia do zadania uczenia modelu.

Korzyści z rozwiązania

Wdrożenie proponowanego rozwiązania wnosi kilka korzyści do naszego istniejącego przepływu pracy, w tym:

  • Uproszczona implementacja – Rozwiązanie umożliwia implementację ekstrakcji cech w języku Python przy użyciu popularnych bibliotek ML. I nie wymaga przeniesienia kodu do PySpark. Usprawnia to ekstrakcję funkcji, ponieważ ten sam kod opracowany przez analityka danych w notatniku będzie wykonywany w tym potoku.
  • Szybka droga do produkcji – Rozwiązanie może zostać opracowane i wdrożone przez analityka danych w celu przeprowadzenia ekstrakcji funkcji na dużą skalę, co umożliwi mu opracowanie modelu rekomendującego ML na podstawie tych danych. Jednocześnie to samo rozwiązanie może zostać wdrożone do produkcji przez inżyniera ML z niewielkimi modyfikacjami.
  • Wielokrotny użytek – Rozwiązanie zapewnia wzorzec wielokrotnego użytku do ekstrakcji cech na dużą skalę i można je łatwo dostosować do innych zastosowań, wykraczających poza modele rekomendacji budowania.
  • Wydajność – Rozwiązanie zapewnia dobrą wydajność: przetwarzanie jednego dnia talent.comprzesyłanie danych zajęło mniej niż godzinę.
  • Aktualizacje przyrostowe – Rozwiązanie obsługuje także aktualizacje przyrostowe. Nowe dzienne dane można przetworzyć za pomocą zadania SageMaker Processing, a lokalizację S3 zawierającą przetworzone dane można ponownie przeszukać w celu zaktualizowania tabeli Athena. Możemy również użyć zadania cron, aby aktualizować dzisiejsze dane kilka razy dziennie (na przykład co 3 godziny).

Wykorzystaliśmy ten potok ETL, aby pomóc Talent.com przetwarzać 50,000 5 plików dziennie zawierających 90 milionów rekordów i utworzyliśmy dane szkoleniowe, korzystając z funkcji wyodrębnionych z surowych danych z 450 dni z Talent.com — łącznie 900,000 milionów rekordów w 2 8.6 plików. Nasz rurociąg pomógł Talent.com zbudować i wdrożyć system rekomendacji w środowisku produkcyjnym w ciągu zaledwie XNUMX tygodni. Rozwiązanie wykonywało wszystkie procesy ML, w tym ETL na Amazon SageMaker, bez korzystania z innej usługi AWS. System rekomendacji ofert pracy zapewnił wzrost współczynnika klikalności w internetowych testach A/B o XNUMX% w porównaniu z poprzednim rozwiązaniem opartym na XGBoost, pomagając milionom użytkowników Talent.com znaleźć lepszą pracę.

Wnioski

W tym poście opisano potok ETL, który opracowaliśmy do przetwarzania funkcji na potrzeby szkolenia i wdrażania modelu rekomendującego pracę w Talent.com. Nasz potok wykorzystuje zadania SageMaker Processing do wydajnego przetwarzania danych i ekstrakcji funkcji na dużą skalę. Kod ekstrakcji funkcji jest zaimplementowany w języku Python, co umożliwia wykorzystanie popularnych bibliotek ML do ekstrakcji funkcji na dużą skalę, bez konieczności przenoszenia kodu w celu korzystania z PySpark.

Zachęcamy czytelników do zbadania możliwości wykorzystania potoku przedstawionego na tym blogu jako szablonu dla ich przypadków użycia, w których wymagana jest ekstrakcja funkcji na dużą skalę. Analityk danych może wykorzystać potok do zbudowania modelu ML, a następnie ten sam potok może zaadaptować inżynier ML do uruchomienia w środowisku produkcyjnym. Może to znacznie skrócić czas potrzebny na kompleksowe wyprodukowanie rozwiązania ML, tak jak miało to miejsce w przypadku Talent.com. Czytelnicy mogą zapoznać się z samouczek dotyczący konfigurowania i uruchamiania zadań SageMaker Processing. Czytelników odsyłamy także do wpisu Od SMS-a do wymarzonej pracy: budowanie narzędzia rekomendującego oferty pracy w oparciu o NLP w Talent.com za pomocą Amazon SageMaker, gdzie omawiamy techniki uczenia się metodą głębokiego uczenia się Amazon Sage Maker zbudowanie systemu rekomendacji pracy Talent.com.


O autorach

Dmitrij BespałowDmitrij Bespałow jest Senior Applied Scientist w Amazon Machine Learning Solutions Lab, gdzie pomaga klientom AWS z różnych branż przyspieszyć wdrażanie sztucznej inteligencji i chmury.

Yi XiangYi Xiang jest naukowcem stosowanym II w laboratorium Amazon Machine Learning Solutions Lab, gdzie pomaga klientom AWS z różnych branż przyspieszyć wdrażanie sztucznej inteligencji i chmury.

Tong WangTong Wang jest Senior Applied Scientist w Amazon Machine Learning Solutions Lab, gdzie pomaga klientom AWS z różnych branż przyspieszyć wdrażanie sztucznej inteligencji i chmury.

Anatolij ChomenkoAnatolij Chomenko jest starszym inżynierem uczenia maszynowego w firmie talent.com z pasją do przetwarzania języka naturalnego, dopasowując dobrych ludzi do dobrej pracy.

Abdenoura BezzouhaAbdenoura Bezzouha jest dyrektorem z ponad 25-letnim doświadczeniem w tworzeniu i dostarczaniu rozwiązań technologicznych, które można skalować do milionów klientów. Abdenour zajmował stanowisko dyrektora ds. technologii (CTO) w firmie talent.com kiedy zespół AWS zaprojektował i wykonał to konkretne rozwiązanie talent.com.

Yanjun QiYanjun Qi jest starszym kierownikiem ds. nauk stosowanych w Amazon Machine Learning Solution Lab. Wprowadza innowacje i stosuje uczenie maszynowe, aby pomóc klientom AWS przyspieszyć wdrażanie sztucznej inteligencji i chmury.

Znak czasu:

Więcej z Uczenie maszynowe AWS