Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Pythonによるデータ処理のための分散フレームワーク選び

 Pythonによるデータ処理のための分散フレームワーク選び

Pythonでデータ処理を行うとき、pandasやpolarsのようなライブラリ群を使う人は多いと思います。また、これらのライブラリにこだわらずPythonスクリプト「効率よくスケールさせたい」、「定期的に動かしたい」と考えたことはありませんか?
データ量が増えてくると様々なケースで「もっと自動化して効率よく処理したい」という壁にぶつかることがよくあります。
そんなときに役立つのが、Dask、Ray、Prefectなどの「分散処理」や「ワークフロー管理」に関わる様々な分散フレームワークたちです。
しかしながら、これらのフレームワークは数がありすぎて「どれがどんなときに向いているのか」が分かりづらいのも事実です。
このトークでは、複数のPythonで利用可能な分散処理フレームワークの特徴を比較します。Pythonのコードをスケーラブルに・効率的に動かすための方法について紹介します。Ray、Prefect、Dask、Restateなどの他、用途別にどのような選択肢があり、何を基準に選べば良いのかを整理し、「とりあえずDask?」「Rayって何?」といった疑問を持つPythonユーザーのために、「選び方」を共有します。

Avatar for Satoru Kadowaki

Satoru Kadowaki

September 27, 2025
Tweet

More Decks by Satoru Kadowaki

Other Decks in Programming

Transcript

  1. Who am I ? / ࣗݾ঺հ • ໳࿬ ་ (@satoru_kadowaki

    ) • όΫϑʔגࣜձࣾ ʢBakFoo, Incʣ • PyConJP2015ɺ2017ʹొஃ • ॻ੶ • Python࣮ફϨγϐʢٕज़ධ࿦ࣾʣ • ࿈ࡌɿPython Monthly Topics • https://gihyo.jp/list/group/Python-Monthly-Topics
  2. Goal / ΰʔϧ • ԿΛ஌Δʁ • Pythonͷ෼ࢄॲཧϑϨʔϜϫʔΫͱ͸ʁ • ෳ਺͋Δ෼ࢄॲཧϑϨʔϜϫʔΫͷҧ͍ •

    Ͳ͏બͿ͔Λཧղ • ࣗ෼ͷϢʔεέʔεͷࢀߟʹͳΔ • ಋೖͯ͠Έͨ͘ͳΔ
  3. ෼ࢄॲཧϑϨʔϜϫʔΫͱ͸ʁ • λεΫΛఆٛͯ͠ґଘ؀ڥʹै࣮ͬͯߦ͢Δ࢓૊Έ • ༷ʑͳݺͼํ • ΦʔέετϨʔγϣϯ - ج൫ /

    πʔϧ / ΦʔέετϨʔλʔ • ෼ࢄॲཧ - (࣮ߦ)ج൫ / ϑϨʔϜϫʔΫ • ϫʔΫϑϩʔ - (࣮ߦ)ج൫ / Τϯδϯ / ϑϨʔϜϫʔΫ / ࣗಈԽπʔϧ • λεΫ - (࣮ߦ)ج൫ / ϥϯφʔ • σʔλύΠϓϥΠϯ - (࣮ߦ)ج൫ • ૯শʢ޿ٛʣͱͯ͠ຊτʔΫͰ͸ʮ෼ࢄॲཧϑϨʔϜϫʔΫʯͱݴ͏
  4. • Apache Air fl ow: https://air fl ow.apache.org/ • Ray:

    https://www.ray.io/ • Prefect: https://www.prefect.io/ • Luigi: https://luigi.readthedocs.io/en/stable/ • ͦͷଞ: • restate: https://restate.dev/ɺTemporal: https://learn.temporal.io/ɺ Modal: https://modal.com/ ɺDagster: https://dagster.io/ɺkedro: https://kedro.org/ɺ mars: https://mars-project.readthedocs.io/ PythonͰར༻Ͱ͖Δ ୅දతͳ෼ࢄॲཧϑϨʔϜϫʔΫ
  5. ʢpandasར༻ऀ޲͚ʣ • pandasΛར༻͢Δ৔߹ɺdask ͷ࢖༻Λݕ౼ɹ ɹɹɹdask: https://www.dask.org/ • dask͸pandasޓ׵ͷฒྻॲཧΤϯδϯ • Ray/Prefect/Air

    fl owͳͲͷ෼ࢄॲཧϑϨʔϜϫʔΫͱഉଞతͰ͸ͳ͍ • daskΛ࣮ࡍͷܭࢉ෦෼ͷฒྻॲཧΤϯδϯͱͯ͠࢖༻͠ɺ෼ࢄॲཧϑϨʔϜ ϫʔΫͰεέʔϧͤ͞Δ ෼ࢄॲཧϑϨʔϜϫʔΫʢʹೖΔલʹʣ
  6. ෼ࢄॲཧϑϨʔϜϫʔΫ Ray • γϯϓϧͳAPIʮ@ray.remoteʯ Ͱؔ਺΍ΫϥεΛͦͷ··෼ࢄԽ • ฒྻ౓ΛϦιʔεཁٻ (num_cpus, num_gpusͳͲ) ͱͯ͠ࢦఆՄೳ

    → ॊೈͳઃఆ → ࣮ࡍʹ͍ͭ͘ಉ࣌ʹ૸Δ͔͸ΫϥελͷϦιʔεঢ়گʹԠͯ͡Ray͕ௐ੔ • Ray Train(෼ࢄֶश) / Tune(ϋΠύʔύϥϝʔλ୳ࡧ) / Serve(ਪ࿦αʔϏε) / Data(σʔλॲཧ) Ͱֶशɾ୳ࡧɾਪ࿦ΛҰ؏αϙʔτʢMLʹڧ͍ʣ • Ray͸PythonΦϒδΣΫτΛγϦΞϥΠζͯ͠෼ࢄڞ༗͢ΔͨΊɺ • Φʔόʔϔου͕େ͖͘ͳΔ͜ͱ΋
  7. Ray Ϋϥελʔͷىಈ • ϔουϊʔυΛىಈ $ ray start --head • ϫʔΧʔϊʔυΛࢀՃͤ͞Δ

    $ ray start --address='192.168.1.1' ෼ࢄॲཧϑϨʔϜϫʔΫ
  8. Prefect • @ fl ow / @task σίϨʔλͰPython ؔ਺ΛϫʔΫϑϩʔԽͰ͖Δ •

    ։ൃऀମݧ͕ྑ͍ • fl owΛdeploymentͱͯ͠ొ࿥͢ΔͱɺεέδϡʔϧɾΠϕϯτɾύϥϝʔλΛαʔόଆͰ ؅ཧ͠ɺUI ͔Β࣮ߦɾ؂ࢹ (Slack௨஌ͳͲ) ͕Ͱ͖Δ • V1ʙV3·Ͱͷߋ৽ͰܰྔԽ΋ਐΈϩʔΧϧ࣮ߦ΋ָʹ • ϩʔΧϧ͔ΒΫϥ΢υ΁ͷҠߦ͕༰қ (Prefect Cloud) • େن໛෼ࢄܭࢉ΍ߦྻԋࢉ͸໾ׂ֎ • Ray/Dask ͱซ༻͕جຊʢPrefect ͸ͦΕΒΛ“ݺͼग़͢ଆ”ʣ ෼ࢄॲཧϑϨʔϜϫʔΫ
  9. Temporal / restate • go (Temporal) ΍Rust (restate) Ͱ࡞੒͞ΕͨϑϨʔϜϫʔΫ •

    PythonͷSDK͕༻ҙ͞Ε͍ͯΔʢͦͷଞͷݴޠ΋ʣ • εςʔτϑϧͳॲཧΛ؅ཧ • ॲཧͷࣦഊΛϑϨʔϜϫʔΫ͕֎෦ʹӬଓԽʢه࿥ʣ • εςʔτϑϧͱ͸ɺҰఆ͕࣌ؒܦաͨ͠σʔλͳͲϓϩηεͷण໋ʹґଘ͠ͳ͍“ঢ়ଶ”Λ࣋ͭ • ܾࡁAPI͕Ұ࣌తʹ 502 Λฦͯ͠΋ࣗಈ࠶ࢼߦ • ࡏݿॲཧʹ߹ΘܾͤͯࡁΛΩϟϯηϧ͢Δ • Ϣʔβʔొ࿥͔Βn࣌ؒҎ಺ʹຊొ࿥͕͞Εͳ͔ͬͨΒΩϟϯηϧ͢Δ • 1ճͰऴΘΔॲཧɺࣦഊͨ͠Β࠶౓࣮ߦ͢Ε͹Α͍χʔζʹ͸ੵۃతʹ࢖Θͳͯ͘΋Α͍ ෼ࢄॲཧϑϨʔϜϫʔΫ
  10. Modal • αʔόʔϨε෼ࢄॲཧϑϨʔϜϫʔΫ • γϯϓϧͳAPIʮ@app.function()ɺ@app.local_entrypoint()ʯ Ͱؔ਺΍ ΫϥεΛͦͷ··Ϋϥ΢υʹσϓϩΠͰ͖ɺϩʔΧϧͰͷ Docker ΍Π ϯϑϥ؅ཧ͸ͳ͍

    • GPUʹ΋ରԠ͓ͯ͠ΓɺMLͷਪ࿦΍ֶश༻్ʹ޲͍͍ͯΔ • ৗ࣌Քಇ͢ΔαʔϏε΍௿ϨΠςϯγʔཁٻͷ͋ΔϦΞϧλΠϜॲཧʹ ͸޲͔ͳ͍ʢ༻్ͱͯ͠ϑΥʔΧε֎ʣ ෼ࢄॲཧϑϨʔϜϫʔΫ
  11. ػೳൺֱද ෼ࢄॲཧϑϨʔϜϫʔΫ ϑϨʔϜϫʔΫ ಘҙྖҬ ֶशίετ 1ZUIPOͱͷ਌࿨ੑ ಋೖ͠΍͢͞ ओͳϢʔεέʔε "JS fl

    PX ϫʔΫϑϩʔ؅ཧ ʢେن໛ʣ ˒˒˒ʢߴʣ ˒˒ˑʢதʣ ʢ:".-%4-΋ଟ͍ʣ ˒ˑˑʢ௿ʣ େن໛&5-ج൫ ෳࡶͳδϣϒ؅ཧ 3BZ ฒྻλεΫ .-෼ࢄֶश ˒˒ˑʢதʣ ˒˒˒ʢߴʣ ʢؔ਺Λͦͷ··ฒྻԽ ˒˒ˑʢதʣ Ϟσϧֶशͷ෼ࢄॲཧ 1SFGFDU ϫʔΫϑϩʔ؅ཧ &5-εέδϡʔϦϯά ˒ˑˑʢ௿ʣ ˒˒˒ʢߴʣ ʢσίϨʔλϕʔεʣ ˒˒˒ʢߴʣ ఆظόον ґଘؔ܎ͷ͋Δॲཧϑϩʔ -VJHJ ϫʔΫϑϩʔ؅ཧ ʢܰྔʣ ˒˒ˑʢதʣ ˒˒˒ʢߴʣ ˒˒˒ʢߴʣ தখن໛&5- δϣϒґଘؔ܎؅ཧ .PEBM 4FSWFSMFTT ˒ˑˑʢ௿ʣ ˒˒˒ʢߴʣ ʢؔ਺୯Ґʣ ˒˒˒ʢߴʣ ࢼݧతͳδϣϒ ΠϯϑϥϨε1P$ 5FNQPSBM 3F4UBUF εςʔτϑϧॲཧ ˒˒˒ʢߴʣ ˒˒ˑʢதʣ ˒ˑˑʢ௿ʣ ঢ়ଶ؅ཧʹΑΔ࠶ࢼߦ͕ඞਢͳॲཧ
  12. ·ͣ͸ػೳλΠϓผͰΈΔ • λεΫฒྻܥɿؔ਺΍λεΫΛ෼ࢄʢRayʣ • ϫʔΫϑϩʔܥɿδϣϒґଘؔ܎΍εέδϡʔϧ؅ཧʢPrefect, Air fl ow, Luigiʣ •

    εςʔτϑϧܥɿ௕ظͷঢ়ଶ؅ཧ΍࠶ࢼߦʹڧ͍ʢTemporal, restateʣ • αʔόϨε࣮ߦܥɿΫϥ΢υͰؔ਺୯Ґͷ࣮ߦʢModal, AWS Lambdaʣ બͼํͷ؍఺ͱൺֱ
  13. ػೳൺֱද બͼํͷ؍఺ͱൺֱ ϑϨʔϜϫʔΫ ಘҙྖҬ ֶशίετ 1ZUIPOͱͷ਌࿨ੑ ಋೖ͠΍͢͞ ओͳϢʔεέʔε "JS fl

    PX ϫʔΫϑϩʔ؅ཧ ʢେن໛ʣ ˒˒˒ʢߴʣ ˒˒ˑʢதʣ ʢ:".-%4-΋ଟ͍ʣ ˒ˑˑʢ௿ʣ େن໛&5-ج൫ ෳࡶͳδϣϒ؅ཧ 3BZ ฒྻλεΫ .-෼ࢄֶश ˒˒ˑʢதʣ ˒˒˒ʢߴʣ ʢؔ਺Λͦͷ··ฒྻԽ ˒˒ˑʢதʣ Ϟσϧֶशͷ෼ࢄॲཧ 1SFGFDU ϫʔΫϑϩʔ؅ཧ &5-εέδϡʔϦϯά ˒˒ˑʢதʣ ˒˒˒ʢߴʣ ʢσίϨʔλϕʔεʣ ˒˒˒ʢߴʣ ఆظόον ґଘؔ܎ͷ͋Δॲཧϑϩʔ -VJHJ ϫʔΫϑϩʔ؅ཧ ʢܰྔʣ ˒˒ˑʢதʣ ˒˒˒ʢߴʣ ˒˒˒ʢߴʣ தখن໛&5- δϣϒґଘؔ܎؅ཧ .PEBM 4FSWFSMFTT ˒ˑˑʢ௿ʣ ˒˒˒ʢߴʣ ʢؔ਺୯Ґʣ ˒˒˒ʢߴʣ ࢼݧతͳδϣϒ ΠϯϑϥϨε1P$ 5FNQPSBM 3F4UBUF εςʔτϑϧॲཧ ˒˒˒ʢߴʣ ˒˒ˑʢதʣ ˒ˑˑʢ௿ʣ ঢ়ଶ؅ཧʹΑΔ࠶ࢼߦ͕ඞਢͳॲཧ
  14. • ͱΓ͋͑ͣશ෦ࢼ͢ඞཁ͸ͳ͍ɻ • ԿΛݟΔ͔͸෼ࢄॲཧϑϨʔϜϫʔΫͷػೳλΠϓผͰݟ෼͚͍ͯ͘ • DataframeͷॲཧͰ͸Dask͸ϑϨʔϜϫʔΫͱ߹Θͤͯ࢖༻Ͱ͖Δ͔Ͳ͏͔΋େࣄ • Schedulerͱ͍͏ݴ༿ʹͩ·͞Εͳ͍Ͱ • Ϣʔεέʔεɺطଘίʔυ͔ΒͷҠߦɺ࢖͍΍͢͞ʹԠͯ͡બͿ

    • ։ൃͷ͠΍͢͞ͱӡ༻͠΍͢͞ͷ྆໘ • ϚωʔδυαʔϏεʹΑΔϕϯμʔϩοΫΠϯΛͰ͖Δ͚ͩগͳ͘͢Δͱ͍͏఺ʹ͓͍ͯ΋෼ࢄॲ ཧϑϨʔϜϫʔΫ্Ͱ։ൃ͍ͯ͘͠ϝϦοτ • εϞʔϧελʔτͰ͖ΔPrefect͕͓͢͢Ί ·ͱΊ