💰

SageMakerのエンドポイントをサーバレスにしたらコストが劇的に下がった話

2022/07/12に公開

はじめまして

こんにちは。私はNCDC株式会社という会社でコンサルタントをしております島田と言います。
エンジニアではないのですが、データサイエンスの領域が得意で、データ分析の案件では自分でクレンジングやモデリング・検証等を行っています。

この記事で書くこと

とあるプロジェクトにおいて、Amazon SageMakerでデータ分析を実施し、エンドポイントを作ったのですが・・・
エンドポイントたっけぇ!!!お金が飛んでく!!!
ということで、最近SageMakerに登場した機能を使ってエンドポイントをサーバレス化しましたよ、という話を書きます。

前提条件

  • 使用しているアルゴリズムはXGBoost。まぁ話の中ではあまり関係しません。
  • 予測モデルを4つ作り、それぞれ別々のエンドポイントを作成しました。つまりエンドポイントも4つ。
  • プロトタイプ開発の一環でのエンドポイント作成だったので、エンドポイントの呼出回数はそんなに多くない、というか稀です。

やったこと

実際、どれくらいのお金を飛ばしたか

エンドポイントの維持にかかっている分は、AWS請求書でいうとこの部分。

これは5月の請求書なので、5月31日時点のレート(NY為替市場の終値$1=¥128.89)で円換算してみると・・・

業務繁忙で6月も策を打てず、これくらいかかっています・・・
大して呼ばれもしないエンドポイントのために、2か月で25万以上溶かしました。土下座もんです。ほんとすみません。。。

天の声

「4月にsagemakerのserverlessエンドポイントがリリースされているようです!」
https://aws.amazon.com/jp/blogs/news/amazon-sagemaker-serverless-inference-machine-learning-inference-without-worrying-about-servers/
これは・・・使わない手はない・・・!!!
ということで、早速やってみました。

どこをどう直したか

SageMakerの一般的な使い方やトレーニングジョブ実行・エンドポイント生成についてはいろいろな記事が出ているのでここでは省略し、エンドポイントのサーバレス化だけに集中して書きます。
まず、サーバレス化する前のエンドポイント生成のコード

xgb_predictor = xgb.deploy(
    initial_instance_count=1,
    instance_type='ml.m4.xlarge', 
    endpoint_name='endpoint1', 
)

こんな感じで、至ってシンプルなコードです。
このコードで生成されたエンドポイントの情報を見てみます。タイプのところが「リアルタイム」になっています。

このコードに、serverless_inference_config=serverless_configの1行を追加するだけサーバレス化できちゃいます(ついでに、処理もそんなに重たくないのでインスタンスのスペックも落としました)。

xgb_predictor = xgb.deploy(
    initial_instance_count=1,
    instance_type='ml.m5.large', 
    endpoint_name='endpoint1', 
    serverless_inference_config=serverless_config
)

これで作成したエンドポイントの情報を見てみましょう。

タイプが「サーバーレス」になりました!バンザイ!

結果

コストは?

サーバレス化の対応をしたのが2022年7月5日でした。そこで、7月1日から7月5日までの日別コストを見てみると・・・

毎日30ドル近く($29.93)かかっていたSageMakerの費用が、1ドル少々($1.32)まで下がりました。これが30日積み重なると、$858.3の節約となります。7/11時点の為替市場の終値が$1=¥136.92なので(5末に比べて8円も安くなってる・・・)

12万円近い節約になっています!5末時点のレートで考えても11万強。これは素晴らしいですね。

実行時間は?

一般的に、サーバレスは初回起動に時間がかかると言われていますが、実際どうでしょう?
invoke_endpointメソッドで、エンドポイントを呼び出してから結果が返ってくるまでどれくらいの時間がかかるのか、試してみました。

client = boto3.client('sagemaker-runtime')
response = client.invoke_endpoint(
    EndpointName=EndPointName,
    Body=concat_data,
    ContentType='text/csv',
    Accept='application/json'
)

CloudWatchで見てみたのですが、1回の呼び出しで結構大量にログを吐いていたのでここに貼り付けるのはやめておきますが、結果としては

  • サーバレス化前:1秒
  • サーバレス化後:7秒

でした。これが許容できるかできないかは用途や各種運用条件によりますが、私のプロジェクトではあくまでプロトタイプなので問題なしでした。

まとめ

エンドポイントは、内部的にはEC2インスタンスを常時起動させて維持しているため、どうしてもランニングコストが上昇してしまいます。コストでお悩みの方は積極的にサーバレス化を検討してみてはいかがでしょうか。
ただ、呼出回数が多いとか、常に早いレスポンスが求められるとか、変数が多くて予測に時間がかかり過ぎる、という場合にはどうしてもサーバレス化は向かなくなってしまうので、プロジェクトでどのレベルの性能が求められるかを加味しながら検討いただければと思います。

最後に

  • SageMakerのコストに気づき、教えてくれた@hisamitsuさん
  • 天の声の主@nkmrkzさん
  • 上記2名と一緒に、エンドポイント化を支援してくれた@ibarakiさん

弊社エンジニアチーム3名、救いの手を差し伸べてくださり本当にありがとうございました!!!

Discussion