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

Snowpark for Python を効率的に使いこなすスタートライン(UDF)

Avatar for Toru Hiyama Toru Hiyama
September 19, 2024

Snowpark for Python を効率的に使いこなすスタートライン(UDF)

Avatar for Toru Hiyama

Toru Hiyama

September 19, 2024
Tweet

More Decks by Toru Hiyama

Other Decks in Technology

Transcript

  1. © 2023 NTT DATA Corporation 2 2 自己紹介 Snowpark for

    Pythonって何? そもそもUDFって?どうやって使うの? UDFの効率的な使い方1(Vectorized UDF) UDFの効率的な使い方2(CacheTools)
  2. © 2023 NTT DATA Corporation 3 Snowpark for Pythonって何? ➢

    Snowpark for Python は、主に以下の3つの機能で構成されます。 • 本日は、主に「UDF」にスポットを当ててみます。 UDFはとっつきづらい所はありますが、非常に便利なツールです。
  3. © 2023 NTT DATA Corporation 4 そもそもUDFって?どうやって使うの? ➢ UDF(User Defined

    Function)とは、POWやSQRT、HASHなどのシステム定義関数と同じように使用できる 関数を自作できる機能です。 • 各入力行を複数のノードで並列処理するため、効率的に計算できます。 [Python: UDF定義] @udf(name=multiply) def multiply( a:float, b:float ): return a*b 1 2 3 a b a b a*b ノード1:1×2 ノード2:2×3 ノード3:3×4 2 3 4 2 6 12 4 5 ノード4:4×5 ノード5:5×6 5 6 20 30 [SQL: UDF呼び出し] select a, b, multiply(a,b) from table; UDFの処理イメージ インプットデータ アウトプットデータ UDFの定義・呼び出しイメージ
  4. © 2023 NTT DATA Corporation 5 そもそもUDFって?どうやって使うの? ➢ UDF(User Defined

    Function)とは、POWやSQRT、HASHなどのシステム定義関数と同じように使用できる 関数を自作できる機能です。 • 各入力行を複数のノードで並列処理するため、効率的に計算できます。 [Python: UDF定義] @udf(name=multiply) def multiply( a:float, b:float ): return a*b 1 2 3 a b a b a*b ノード1:1×2 ノード2:2×3 ノード3:3×4 2 3 4 2 6 12 4 5 ノード4:4×5 ノード5:5×6 5 6 20 30 [SQL: UDF呼び出し] select a, b, multiply(a,b) from table; UDFの処理イメージ インプットデータ アウトプットデータ UDFの定義・呼び出しイメージ つまり、「各行に対する処理」が独立している場合、(=スカラー) UDFを使用することで効率的な処理が可能! 機械学習の推論ユースケースにも非常に適している。 例:画像認識、音声・言語処理、などなど・・・
  5. © 2023 NTT DATA Corporation 6 UDFの効率的な使い方1(Vectorized UDF) ➢ 処理したいデータは、数億レコード以上にのぼります。このとき、UDFをレコード

    一行ずつに対して呼び出していたのでは、オーバーヘッドが大きくなってしまいます。 • そこで役立つのが、この「Vectorized UDF」です! • これにより、バッチでデータを入力・処理でき、呼び出し回数を大きく削減できます。 • 使い方は、Pandas Dataframeを処理する関数を定義するだけ、です。 • 呼び出しも通常のUDFと全く同じ・・・! @udf(name=“infer_model”) def vectorized_infer_model( df: pd.DataFrame ) -> pd.Series: model_name = 'model.sav' model = load(import_dir+model_name) scored_data = pd.Series(model.predict(df)) return scored_data ※上記コードは簡略化のため一部省略しています。 通常のUDFの結果 Vectorized UDFの結果 > 7倍高速! (42.9s -> 5.87s)
  6. © 2023 NTT DATA Corporation 7 UDFの効率的な使い方2(CacheTools) ➢ 機械学習モデルはしばしば大容量になります。そのため、UDFのノード起動のたびにモデルを読み込むと、それだ けでも結構な時間になってしまいます。

    • そこで役立つのが、この「キャッシュ」です! • 使い方は、モデル読み込み関数を定義し、キャッシュデコレータを付与することで、モデルの読み込みをキャッ シュできます。 @cachetools.cached(cache={}) def load_model(model_path): return load(model_path) @udf(name=“infer_model”) def vectorized_infer_model( df: pd.DataFrame ) -> pd.Series: model_name = 'model.sav' model = load_model(import_dir+model_name) scored_data = pd.Series(model.predict(df)) return scored_data Vectorized UDF(キャッシュ)の結果 通常のUDFの結果 > 12倍高速! (42.9s -> 3.54s) ※上記コードは簡略化のため一部省略しています。
  7. © 2023 NTT DATA Corporation 8 おわりに ➢ このようにSnowpark for

    PythonにおけるUDFは、機械学習の推論などの処理と、非常に相性のよいツールとなっています。 • 今回は機械学習タスクにフォーカスして紹介しましたが、その他のデータ処理においても効果的にはたらく機能です。 • ぜひUDFとストアドプロシージャの違いを知っていただいて、今後の開発に役立てていただければと思います! • 今回は紹介できていませんが、UDTFというグループに対する集計(Window関数)用のUDFも用意されています。ぜ ひそちらもチェックしてみてください。 ➢ SnowparkやPythonに関するアップデートも続々とリリースされてきているので、今後のアップデートも要チェックです! ★ ご興味ある方は、ぜひのちほどのフリートークの場などでお声がけください!