Metaflow adalah kerangka kerja Python yang dibuat di Netflix dan berfokus pada bidang Ilmu Data. Yaitu, ia dirancang untuk membuat proyek yang bertujuan untuk bekerja dengan data, dan untuk mengelola proyek tersebut. Baru-baru ini, perusahaan memindahkannya ke kategori open-source. Kerangka kerja Metaflow telah banyak digunakan di dalam Netflix dalam 2 tahun terakhir. Secara khusus, ia memungkinkan untuk secara signifikan mengurangi waktu yang dibutuhkan untuk menyelesaikan proyek dalam produksi.

Bahan yang kami terjemahkan hari ini adalah panduan cepat untuk Metaflow.
Apa itu Metaflow?
Di bawah ini adalah grafik yang menggambarkan implementasi kerangka kerja Metaflow di Netflix.
Implementasi Metaflow di NetflixPada November 2018, kerangka kerja ini digunakan di 134 proyek perusahaan.
Metaflow adalah kerangka kerja untuk membuat dan mengeksekusi alur kerja ilmu data. Ini fitur fitur berikut:
- Komputasi manajemen sumber daya.
- Peluncuran tugas kemas.
- Mengelola dependensi eksternal.
- Versi, melaksanakan kembali tugas, melanjutkan eksekusi tugas yang ditangguhkan.
- API Klien untuk memeriksa hasil tugas yang dapat digunakan di lingkungan Notebook Jupyter.
- Dukungan untuk pelaksanaan tugas lokal (misalnya pada laptop) dan jarak jauh (di cloud). Kemampuan untuk beralih di antara mode-mode ini.
Pengguna vtuulos
menulis di Ycombinator bahwa Metaflow dapat secara otomatis membuat snapshot (snapshot) kode, data, dan dependensi. Semua ini ditempatkan di repositori dengan pengalamatan berdasarkan konten, yang biasanya didasarkan pada S3, meskipun sistem file lokal juga didukung. Ini memungkinkan Anda untuk terus melakukan tugas yang dihentikan, mereproduksi hasil yang diperoleh sebelumnya, dan mengeksplorasi segala sesuatu yang berkaitan dengan tugas, misalnya, di Jupyter Notebook.
Secara umum, kita dapat mengatakan bahwa Metaflow bertujuan untuk meningkatkan produktivitas para ilmuwan data. Hal ini dilakukan karena fakta bahwa kerangka kerja memungkinkan mereka untuk terlibat secara eksklusif dalam bekerja dengan data, tanpa terganggu oleh penyelesaian tugas terkait. Selain itu, Metaflow mempercepat penarikan proyek berdasarkan itu dalam produksi.
Kebutuhan seorang ilmuwan data terkait dengan tanggung jawab langsungnya dan solusi dari tugas-tugas tambahan terkait dengan infrastruktur di mana perhitungan dilakukanSkenario Alur Kerja dengan Metaflow
Berikut ini beberapa skenario alur kerja yang bisa Anda atur menggunakan Metaflow:
- Kolaborasi Satu ilmuwan data ingin membantu orang lain menemukan sumber kesalahan. Pada saat yang sama, asisten ingin mengunduh ke komputernya seluruh lingkungan di mana tugas yang macet bekerja.
- Kelanjutan dari tugas yang dihentikan dari tempat mereka berhenti. Beberapa tugas berhenti karena kesalahan (atau dihentikan dengan sengaja). Kesalahan diperbaiki (atau kode diedit). Penting untuk memulai kembali tugas sehingga pekerjaannya berlanjut dari tempat gagal (atau dihentikan).
- Eksekusi tugas hibrid. Diperlukan untuk melakukan langkah tertentu dari alur kerja secara lokal (mungkin ini adalah langkah mengunduh data dari file yang disimpan dalam folder di komputer), dan langkah lain yang membutuhkan sumber daya komputasi yang besar (mungkin ini adalah pelatihan model) harus dilakukan di cloud.
- Pemeriksaan metadata diperoleh setelah menyelesaikan tugas. Tiga data Para ilmuwan terlibat dalam pemilihan hiperparameter dari model yang sama, berusaha meningkatkan akurasi model ini. Setelah itu, Anda perlu menganalisis hasil tugas untuk melatih model dan memilih set hiperparameter yang telah menunjukkan diri sebagai yang terbaik.
- Menggunakan beberapa versi dari paket yang sama. Dalam proyek ini Anda perlu menggunakan versi yang berbeda, misalnya, pustaka sklearn. Selama preprocessing, versi 0.20 diperlukan, dan selama pemodelan, versi 0.22 diperlukan.
Alur Kerja Metaflow Khas
Pertimbangkan alur kerja Metaflow khas dari perspektif konseptual dan pemrograman.
▍Konseptual melihat alur kerja Metaflow
Dari sudut pandang konseptual, alur kerja Metaflow (rantai tugas) diwakili oleh
grafik asiklik terarah (DAG). Ilustrasi di bawah ini akan membantu Anda lebih memahami ide ini.
Grafik asiklik linierGrafik asiklik dengan jalur "paralel"Setiap node grafik mewakili langkah pemrosesan data dalam alur kerja.
Di setiap langkah rantai tugas, Metaflow mengeksekusi kode Python biasa tanpa perubahan khusus. Kode dieksekusi dalam wadah terpisah di mana kode dikemas bersama dengan dependensinya.
Aspek kunci dari arsitektur Metaflow diwakili oleh fakta bahwa itu memungkinkan Anda untuk mengimplementasikan hampir semua perpustakaan eksternal dari ekosistem conda ke dalam proyek yang didasarkan padanya tanpa menggunakan plugin. Ini membedakan Metaflow dari solusi tujuan umum serupa lainnya. Misalnya - dari Airflow.
▍ Alur kerja Metaflow dalam hal pemrograman
Setiap rantai tugas (aliran) dapat direpresentasikan sebagai kelas Python standar (nama-nama kelas tersebut biasanya memiliki kata
Flow
) jika memenuhi persyaratan minimum berikut:
- Kelas ini adalah turunan dari kelas Metaflow
FlowSpec
. - Setiap fungsi yang mewakili langkah dalam rantai tugas telah
@step
dekorator @step
. - Di akhir setiap fungsi
@step
, harus ada indikasi fungsi serupa yang mengikutinya. Ini dapat dilakukan dengan menggunakan konstruk seperti ini: self.next(self.function_name_here)
. - Kelas mengimplementasikan fungsi
start
dan end
.
Pertimbangkan contoh rantai tugas minimal yang terdiri dari tiga node.
Skemanya terlihat seperti ini:
start → process_message → end
Ini kodenya:
from metaflow import FlowSpec, step class LinearFlow(FlowSpec): """ , Metaflow. """
Instruksi Instalasi Metaflow
▍ Instalasi dan uji coba
Berikut adalah urutan langkah-langkah yang perlu Anda lakukan untuk menginstal dan meluncurkan Metaflow pertama kali:
- Instal Metaflow (disarankan Python 3):
pip3 install metaflow
. - Masukkan fragmen kode di atas (ini dia di GitHub) dalam file
linear_flow.py
. - Untuk melihat arsitektur rantai tugas yang diterapkan oleh kode ini, gunakan perintah
python3 linear_flow.py show
. - Untuk memulai streaming,
python3 linear_flow.py run
.
Anda harus mendapatkan sesuatu yang mirip dengan yang ditunjukkan di bawah ini.
Pemeriksaan Kesehatan Metaflow yang BerhasilIni ada baiknya memperhatikan beberapa hal. Kerangka kerja Metaflow membuat
.metaflow
data
.metaflow
lokal. Di sana, ia menyimpan semua metadata yang terkait dengan eksekusi tugas dan snapshot yang terkait dengan sesi eksekusi tugas. Jika Anda telah mengonfigurasi pengaturan Metaflow terkait dengan penyimpanan cloud, snapshots akan disimpan dalam AWS S3 Bucket, dan metadata yang terkait dengan peluncuran tugas akan menuju ke layanan Metadata, berdasarkan RDS (Relational Data Store, relational data store). Nanti kita akan berbicara tentang cara menjelajahi metadata ini menggunakan API klien. Hal sepele lainnya, meskipun penting, yang perlu diperhatikan, adalah pengidentifikasi proses (pid, ID proses) yang dilampirkan pada langkah-langkah berbeda berbeda. Ingat - kami katakan di atas bahwa Metaflow secara mandiri mengemas setiap langkah dari rantai tugas dan melakukan setiap langkah di lingkungannya sendiri (hanya mengirimkan data di antara langkah-langkah tersebut).
▍Penginstalan dan konfigurasi conda (jika Anda berencana untuk menerapkan dependensi)
Ikuti langkah-langkah ini untuk menginstal conda:
Anda sekarang siap untuk menanamkan dependensi conda di rantai tugas Anda. Detail dari proses ini akan dibahas di bawah ini.
Contoh Aliran Kerja Realistis
Di atas, kami berbicara tentang cara menginstal Metaflow, dan bagaimana memastikan bahwa sistemnya operasional. Selain itu, kami membahas dasar-dasar arsitektur alur kerja dan melihat contoh sederhana. Di sini kita melihat contoh yang lebih kompleks, sambil mengungkapkan beberapa konsep Metaflow.
▍ pekerjaan
Buat alur kerja menggunakan Metaflow yang mengimplementasikan fungsi-fungsi berikut:
- Memuat data film CSV ke dalam kerangka data Pandas.
- Perhitungan paralel kuartil untuk genre.
- Menyimpan kamus dengan hasil perhitungan.
▍ Rantai tugas
Kerangka kelas
GenreStatsFlow
ditunjukkan di
GenreStatsFlow
. Setelah menganalisanya, Anda akan memahami inti dari pendekatan yang diterapkan di sini untuk menyelesaikan masalah kami.
from metaflow import FlowSpec, step, catch, retry, IncludeFile, Parameter class GenreStatsFlow(FlowSpec): """ , , . : 1) CSV- Pandas. 2) . 3) . """ @step def start(self): """ : 1) Pandas. 2) . 3) . """
Pertimbangkan beberapa bagian penting dari contoh ini. Kode tersebut berisi komentar dari bentuk
# n
, yang akan kita rujuk di bawah ini.
- Dalam
1
, pada langkah start
, perhatikan parameter foreach
. Berkat itu, salinan langkah-langkah compute_statistics
secara compute_statistics
dalam for each
loop for each
entri dalam daftar genres
. - Dalam
2
dekorator @catch(var='compute_failed')
menangkap setiap pengecualian yang terjadi pada langkah compute_statistics
dan menulisnya ke variabel compute_failed
(dapat dibaca pada langkah berikutnya). - Dalam
3
dekorator @retry(times=1)
melakukan persis seperti yang diisyaratkan namanya. Yakni, ketika kesalahan terjadi, ia mengulangi langkahnya. - Di mana dalam
4
, dalam compute_statistics
, self.input
? Masalahnya, input
adalah variabel kelas yang disediakan oleh Metaflow. Ini berisi data yang berlaku untuk instance tertentu dari compute_statistics
(ketika ada banyak salinan fungsi yang dieksekusi secara paralel). Variabel ini ditambahkan oleh Metaflow hanya ketika node diwakili oleh beberapa proses paralel, atau ketika beberapa node digabungkan. - Berikut ini adalah contoh menjalankan fungsi yang sama secara paralel -
compute_statistics
. Tetapi, jika perlu, Anda dapat secara bersamaan menjalankan fungsi yang sama sekali berbeda yang tidak saling terkait. Untuk melakukan ini, ubah apa yang ditunjukkan pada 1
menjadi sesuatu seperti self.next(self.func1, self.function2, self.function3)
. Tentu saja, dengan pendekatan ini, akan perlu untuk menulis ulang langkah join
juga, sehingga memungkinkan untuk memproses hasil dari berbagai fungsi di dalamnya.
Inilah cara membayangkan kelas kerangka di atas.
Representasi visual dari kelas GenreStatsFlowEadBaca file data dan parameter transfer
- Unduh file CSV film ini .
- Sekarang Anda perlu melengkapi program dengan dukungan untuk kemungkinan mentransfer path secara dinamis ke file
movie_data
dan nilai max_genres
ke max_genres
. Mekanisme argumen eksternal akan membantu kita dalam hal ini. Metaflow memungkinkan Anda untuk menyampaikan argumen ke program dengan menggunakan flag tambahan di perintah mulai alur kerja. Sebagai contoh, ini mungkin terlihat seperti ini: python3 tutorial_flow.py run --movie_data=path/to/movies.csv --max_genres=5
. - Metaflow memberi pengembang objek
IncludeFile
dan Parameter
yang memungkinkan Anda membaca input dalam kode alur kerja. Kami merujuk ke argumen yang diteruskan dengan menetapkan objek IncludeFile
dan Parameter
ke variabel kelas. Tergantung pada apa yang ingin kita baca - file, atau nilai yang biasanya.
Begini cara kode terlihat seperti membaca parameter yang diteruskan ke program saat diluncurkan dari baris perintah:
movie_data = IncludeFile("movie_data", help="The path to a movie metadata file.", default = 'movies.csv') max_genres = Parameter('max_genres', help="The max number of genres to return statistics for", default=5)
▍Masukkan conda dalam rantai tugas
- Jika Anda belum menginstal konda, lihat bagian tentang menginstal dan mengkonfigurasi conda di artikel ini.
- Tambahkan dekorator
GenreStatsFlow
disediakan oleh Metaflow ke kelas GenreStatsFlow. Penghias ini mengharapkan untuk diberikan versi python. Itu dapat diatur dalam kode, atau diperoleh dengan menggunakan fungsi bantu. Di bawah ini adalah kode yang menunjukkan penggunaan dekorator dan menunjukkan fungsi pembantu.
def get_python_version(): """ , python, . conda python. """ import platform versions = {'2' : '2.7.15', '3' : '3.7.4'} return versions[platform.python_version_tuple()[0]] # python. @conda_base(python=get_python_version()) class GenreStatsFlow(FlowSpec):
- Sekarang Anda dapat menambahkan dekorator
@conda
ke setiap langkah dalam rantai tugas. Itu mengharapkan objek dengan dependensi, yang diteruskan ke sana melalui parameter libraries
. Metaflow, sebelum memulai langkah, akan mengambil tugas mempersiapkan wadah dengan dependensi yang ditentukan. Jika perlu, Anda dapat dengan aman menggunakan versi paket yang berbeda pada langkah yang berbeda, karena Metaflow meluncurkan setiap langkah dalam wadah yang terpisah.
@conda(libraries={'pandas' : '0.24.2'}) @step def start(self):
- Sekarang jalankan perintah berikut:
python3 tutorial_flow.py --environment=conda run
.
▍Langkah mulai implementasi
@conda(libraries={'pandas' : '0.24.2'}) @step def start(self): """ : 1) Pandas. 2) . 3) . """ import pandas from io import StringIO # Pandas. self.dataframe = pandas.read_csv(StringIO(self.movie_data)) # 'genres' . # . self.genres = {genre for genres \ in self.dataframe['genres'] \ for genre in genres.split('|')} self.genres = list(self.genres) # . # 'foreach' # self.next(self.compute_statistics, foreach='genres')
Pertimbangkan beberapa fitur kode ini:
- Perhatikan bahwa ekspresi impor panda ada di dalam fungsi yang menjelaskan langkah tersebut. Faktanya adalah bahwa ketergantungan ini diperkenalkan oleh conda hanya dalam lingkup langkah ini.
- Tetapi variabel yang dideklarasikan di sini (
dataframe
dan genres
) tersedia bahkan dalam kode langkah-langkah yang dilakukan setelah langkah ini. Intinya adalah bahwa Metaflow bekerja berdasarkan prinsip-prinsip pemisahan lingkungan eksekusi kode, tetapi memungkinkan data untuk bergerak secara alami di antara langkah-langkah rantai tugas.
▍ Implementasi langkah compute_statistics
@catch(var='compute_failed') @retry @conda(libraries={'pandas' : '0.25.3'}) @step def compute_statistics(self): """ . """ # # 'input'. self.genre = self.input print("Computing statistics for %s" % self.genre) # , # . selector = self.dataframe['genres'].\ apply(lambda row: self.genre in row) self.dataframe = self.dataframe[selector] self.dataframe = self.dataframe[['movie_title', 'genres', 'gross']] # gross . points = [.25, .5, .75] self.quartiles = self.dataframe['gross'].quantile(points).values # , . self.next(self.join)
Harap perhatikan bahwa pada langkah ini kami merujuk ke variabel
dataframe
yang dideklarasikan pada langkah
start
sebelumnya. Kami memodifikasi variabel ini. Saat beralih ke langkah berikutnya, pendekatan ini, yang menyiratkan penggunaan objek
dataframe
baru yang dimodifikasi, memungkinkan Anda untuk mengatur kerja yang efisien dengan data.
▍ Terapkan langkah bergabung
@conda(libraries={'pandas' : '0.25.3'}) @step def join(self, inputs): """ . """ inputs = inputs[0:self.max_genres] # , . self.genre_stats = {inp.genre.lower(): \ {'quartiles': inp.quartiles, 'dataframe': inp.dataframe} \ for inp in inputs} self.next(self.end)
Di sini perlu menyoroti beberapa poin:
- Pada langkah ini, kami menggunakan versi panda perpustakaan yang sama sekali berbeda.
- Setiap elemen dalam array
inputs
adalah salinan dari compute_statistics
dieksekusi sebelumnya. Ini berisi keadaan menjalankan fungsi yang sesuai, yaitu, nilai-nilai berbagai variabel. Jadi, input[0].quartiles
dapat berisi kuartil untuk genre comedy
, dan input[1].quartiles
input[0].quartiles
dapat berisi kuartil untuk genre sci-fi
.
DraftSiap draft
Kode proyek lengkap yang baru saja kami ulas dapat ditemukan di
sini .
Untuk melihat bagaimana alur kerja yang dijelaskan dalam file
tutorial_flow.py
, Anda perlu menjalankan perintah berikut:
python3 tutorial_flow.py --environment=conda show
Gunakan perintah berikut untuk memulai alur kerja:
python3 tutorial_flow.py --environment=conda run --movie_data=path/to/movies.csv --max_genres=7
Meneliti hasil dari menjalankan alur kerja menggunakan API klien
Untuk memeriksa snapshot data dan status peluncuran alur kerja sebelumnya, Anda dapat menggunakan
API klien yang disediakan oleh Metaflow. API ini sangat ideal untuk mengeksplorasi rincian percobaan yang dilakukan di lingkungan Notebook Jupyter.
Berikut adalah contoh sederhana dari output dari
genre_stats
, yang diambil dari data peluncuran
GenreStatsFlow
sukses terakhir.
from metaflow import Flow, get_metadata
Menjalankan alur kerja di cloud
Setelah Anda membuat dan menguji alur kerja di komputer biasa, sangat mungkin bahwa Anda ingin menjalankan kode di cloud untuk mempercepat pekerjaan.
Saat ini, Metaflow hanya mendukung integrasi dengan AWS. Pada gambar berikut, Anda dapat melihat pemetaan sumber daya lokal dan cloud yang digunakan oleh Metaflow.
Metaflow dan Integrasi AWSUntuk menghubungkan Metaflow ke AWS, Anda harus menyelesaikan langkah-langkah berikut:
- Pertama, Anda perlu melakukan pengaturan AWS satu kali dengan membuat sumber daya yang dapat bekerja dengan Metaflow. Sumber daya yang sama dapat digunakan, misalnya, oleh anggota tim kerja yang saling menunjukkan hasil alur kerja. Anda dapat menemukan instruksi yang relevan di sini. Pengaturan cukup cepat, karena Metaflow memiliki templat pengaturan CloudFormation.
- Selanjutnya, di komputer lokal, Anda perlu menjalankan perintah
metaflow configure aws
dan memasukkan jawaban untuk pertanyaan sistem. Dengan data ini, Metaflow akan dapat menggunakan gudang data berbasis cloud. - Sekarang, untuk memulai alur kerja lokal di cloud, cukup tambahkan
--with batch
kunci --with batch
ke --with batch
mulai alur kerja. Misalnya, ini mungkin terlihat seperti ini: python3 sample_flow.py run --with batch
. - Untuk melakukan peluncuran alur kerja hibrid, yaitu, untuk melakukan beberapa langkah secara lokal, dan beberapa di cloud, Anda perlu menambahkan dekorator
@batch
ke langkah-langkah yang perlu dilakukan di cloud. Misalnya, seperti ini: @batch(cpu=1, memory=500)
.
Ringkasan
Di sini, saya ingin mencatat beberapa fitur Metaflow yang dapat dianggap sebagai kelebihan dan kekurangan dari kerangka kerja ini:
- Metaflow terintegrasi erat dengan AWS. Tetapi dalam rencana pengembangan kerangka kerja ada dukungan untuk sejumlah besar penyedia cloud.
- Metaflow adalah alat yang hanya mendukung antarmuka baris perintah. Itu tidak memiliki antarmuka grafis (tidak seperti kerangka kerja universal lainnya untuk mengatur proses kerja, seperti Airflow).
Pembaca yang budiman! Apakah Anda berencana menggunakan Metaflow?
