Pelajari Metaflow dalam 10 Menit

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 Netflix

Pada 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 dilakukan

Skenario 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 linier


Grafik 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.    """       #         @step    def start(self):        self.message = 'Thanks for reading.'        self.next(self.process_message)    @step    def process_message(self):        print('the message is: %s' % self.message)        self.next(self.end)    @step    def end(self):        print('the message is still: %s' % self.message) if __name__ == '__main__':    LinearFlow() 

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 Berhasil

Ini 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)        .    """       # TODO:  CSV         self.genres = []    self.next(self.compute_statistics, foreach='genres') #  1     @catch(var='compute_failed') #  2  @retry(times=1) #  3  @step  def compute_statistics(self):    """    .   ."""    self.genre = self.input #  4    # TODO:        self.next(self.join)     @step  def join(self, inputs):    """       ."""    # TODO:      self.next(self.end)     @step  def end(self):      """End the flow."""      pass   if __name__ == '__main__':  GenreStatsFlow() 

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 GenreStatsFlow

EadBaca 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 #      print("Using metadata provider: %s" % get_metadata()) #     MovieStatsFlow. run = Flow('GenreStatsFlow').latest_successful_run print("Using analysis from '%s'" % str(run)) genre_stats = run.data.genre_stats print(genre_stats) 

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 AWS

Untuk 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?

Source: https://habr.com/ru/post/id482462/


All Articles