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 @stepdekorator@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 startdanend.
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 langkahstart, perhatikan parameterforeach. Berkat itu, salinan langkah-langkahcompute_statisticssecaracompute_statisticsdalamfor eachloopfor eachentri dalam daftargenres.
- Dalam 2dekorator@catch(var='compute_failed')menangkap setiap pengecualian yang terjadi pada langkahcompute_statisticsdan menulisnya ke variabelcompute_failed(dapat dibaca pada langkah berikutnya).
- Dalam 3dekorator@retry(times=1)melakukan persis seperti yang diisyaratkan namanya. Yakni, ketika kesalahan terjadi, ia mengulangi langkahnya.
- Di mana dalam 4, dalamcompute_statistics,self.input? Masalahnya,inputadalah variabel kelas yang disediakan oleh Metaflow. Ini berisi data yang berlaku untuk instance tertentu daricompute_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 pada1menjadi sesuatu sepertiself.next(self.func1, self.function2, self.function3). Tentu saja, dengan pendekatan ini, akan perlu untuk menulis ulang langkahjoinjuga, 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_datadan nilaimax_genreskemax_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 IncludeFiledanParameteryang memungkinkan Anda membaca input dalam kode alur kerja. Kami merujuk ke argumen yang diteruskan dengan menetapkan objekIncludeFiledanParameterke 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 GenreStatsFlowdisediakan 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 @condake setiap langkah dalam rantai tugas. Itu mengharapkan objek dengan dependensi, yang diteruskan ke sana melalui parameterlibraries. 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 ( dataframedangenres) 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 inputsadalah salinan daricompute_statisticsdieksekusi sebelumnya. Ini berisi keadaan menjalankan fungsi yang sesuai, yaitu, nilai-nilai berbagai variabel. Jadi,input[0].quartilesdapat berisi kuartil untuk genrecomedy, daninput[1].quartilesinput[0].quartilesdapat berisi kuartil untuk genresci-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 awsdan 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 batchkunci--with batchke--with batchmulai 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 @batchke 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?
