RAKSUL TechBlog

ラクスルグループのエンジニアが技術トピックを発信するブログです

機械学習の推論用REST APIサーバーをAmazon SageMakerで構築するまでに考えたこと

はじめに

ラクスルグループのノバセルで新卒2年目のエンジニアをしています田村(tamtam)です💪

現在は、データサイエンティストが作成した学習済みモデルをもとに、推論を行うロジックを実装し、Web APIとして提供するための開発をしています。

この記事を読んで得られること

この記事では、推論用REST APIサーバーを構築する際に考えたことを2つのセクションに分けて紹介します。

  1. 推論用サーバーを構成するAWSリソースの検討
  2. 推論コードを実装する上での検討

SageMakerを利用し推論用REST APIサーバーを構築する方の参考になれればと思います!

それでは詳細について見ていきましょう!

参考となるレポジトリ

今回の記事に際して、参考となるプロジェクトテンプレートを共有します。

github.com

上記のテンプレートは、サンプルとしてWord2Vecを利用した予測を行います。試したい方はTesting Production Image Locallyを参照ください。

1.推論用サーバーを構成するAWSリソースの検討

定期的に学習済みモデルを更新し、デプロイするフローの構築を想定したサービスの検討

今回は、1〜2週間ごとに学習済みモデルを更新し、デプロイするサービスを想定します。

初期段階では、手動でモデルの学習を行い、推論サーバーのみ提供を考えています。しかし、将来の効率化を見据えて、モデルの定期更新とデプロイの自動化を検討しています。

上記のことを踏まえ、機械学習モデルを構築からデプロイまで行うサービスであるSageMakerを選択しました。

※ AWS外のサービスだとDatabricksも学習や推論を効率的に行う上で良い選択になると考えます。

REST APIで提供することを想定したSageMakerのタイプの選定

今回は社内の多様なサービスから容易に接続するため、推論サーバーはREST APIとして提供する方針にしました。

SageMakerの選択肢の中では、リアルタイム推論やサーバーレス推論が同期処理を可能にするため、これらを優先的に検討しています。

SageMakerのタイプの大まかな選定に関しては、Amazon SageMaker 推論 Part1 推論の頻出課題とSageMakerによる 解決方法がわかりやすいです。

引用:Amazon SageMaker 推論 Part1 推論の頻出課題とSageMakerによる 解決方法(12ページ目)

加えてREST APIとして提供する際には、API Gatewayのマッピングテンプレートを使うことでLambdaを間に挟まずSageMakerと連携することができます。

引用: Creating a machine learning-powered REST API with Amazon API Gateway mapping templates and Amazon SageMaker

今回の要件では上記の実装で問題なかったため採用する方針になりました。

推論の粒度を考慮

上記のようにAPI Gatewayを利用する場合、API Gatewayのタイムアウト制限を考慮する必要があります。 (API GatewayのREST APIタイプに関するクォータによると、統合のタイムアウトの最大時間は29秒です。

例えば、バッチ変換による推論のように、大量のデータで一度に行おうとします。その際、処理時間が長くAPI Gatewayのタイムアウト制限に達した場合、HTTP 408 Request Timeoutを返してしまうことがあると考えます。

この問題を回避するために、1度の推論を1つのデータに限定する、あるいは推論のリミットを設定するなどの対応が必要と思われます。

特に2023年8月16日の情報では、サーバーレス推論を利用する場合、GPUインスタンスが使用できないためCPUでの推論となります。そのため処理時間を意識した設計がより一層必要になることを考えます。

こういった制限を考慮して、上記のような推論粒度の調整やそもそものSageMakerのタイプの吟味が必要となるでしょう。

2.推論コードを実装する上での検討

データサイエンティストが既に用意したコードを移植するためのコンテナ環境の検討

今回は、データサイエンティストがGoogleColab上で検証した推論コードを、SageMaker上に移植することを想定しました。

その中で、使用するライブラリやコードに関しては、移植時にそのまま移すことを想定し、以下のカスタムコンテナ実装パターンの4パターン目を採用しました。こちらはスクラッチで独自の推論コードを実行するパターンです。

aws.amazon.com

また、具体的な実装にあたっては以下のレポジトリを参考にしました。

github.com

独自の推論コードで気にするところ

docs.aws.amazon.com

上記の記事に書いてある内容が全てですが、ここでは最低限押さえるべき箇所をピックアップして紹介します。

前述したプロジェクトテンプレートではこうした要件を満たすように実装しています。

推論イメージの実行

コンテナ起動時に、コマンドにserveを指定します。

docker run image serve

もしserveコマンド以外で実行した場合はENTRYPOINTをDockerfileに指定する必要があります。

モデルアーティファクトのロード

コンテナ起動時に、予めSageMakerのモデル作成時に指定したS3 - tar.gz アーカイブを、 /opt/ml/model に展開します。

コンテナがリクエストを提供する方法

コンテナにはポート 8080/invocations/pingに応答するウェブサーバーを実装します。

FastAPIの利用

AWSのSampleではFlaskを利用していますが、今回はFastAPIを採用しました。

FastAPIはASGI (Asynchronous Server Gateway Interface) 標準のStarletteをベースに実装されており、非同期I/Oをサポートします。

また、Pydanticと連携しリクエスト/レスポンスをはじめとする型ヒント(型のバリデーション)をサポートしています。

そのほか、ドキュメントの自動生成なども対応していることから、実行パフォーマンスだけでなく開発生産性の向上にも寄与するモノとなっています。

FastAPIを用いた開発に関しては、手前味噌ですが以前投稿した記事も読むと良いかもしれません。 techblog.raksul.com

マルチステージビルドの利用

前述したプロジェクトテンプレートでは、Poetryを依存関係の管理に利用しています。

このことから、FastAPIの公式のドキュメントを参考に、マルチステージビルドを採用することにしました。

fastapi.tiangolo.com

以下サンプルのコードです

FROM python:3.10 as requirements-stage

WORKDIR /tmp

RUN pip install poetry==1.5.1

COPY ./pyproject.toml ./poetry.lock* /tmp/

RUN poetry export -f requirements.txt --output requirements.txt --without-hashes

FROM python:3.10

RUN apt-get -y update && apt-get install -y --no-install-recommends \
        g++ \
        make \
        cmake \
        wget \
        nginx \
        ca-certificates \
    && rm -rf /var/lib/apt/lists/*

RUN ln -s /usr/bin/python3 /usr/bin/python & \
    ln -s /usr/bin/pip3 /usr/bin/pip

ENV PATH="/opt/program:${PATH}"
ENV BASE_DIR="/opt/"
ENV PYTHONPATH="/opt/"

COPY --from=requirements-stage /tmp/requirements.txt /requirements.txt

RUN pip install -r requirements.txt

COPY ./opt/ /opt/

RUN chmod 755 /opt/program/serve

EXPOSE 8080

本番運用する上でのスタック

Workerの利用

FastAPIはASGI標準であるため、Uvicornのようなサーバーを用いて単一のプロセスで処理します。

しかし、アプリケーションをデプロイする際には、多くのリクエストを処理を捌くために、複数のコアを利用しプロセスのレプリケーションを行うことを考えます。

FastAPIを利用する場合、FastAPIはWSGI標準ではないため、サンプルで示されるようなGunicornを直接使うことができません。

そのため、Gunicornをプロセスマネージャーとし、複数のUvicornのワーカーを管理して複数のプロセスを起動させるような対応を行います。(参考: Server Workers - Gunicorn と Uvicorn

なお、UvicornとGunicornの連携によるWorkerの利用は必ずしも最適ではないので、ユースケースに応じて選択しましょう。(参考: レプリケーション - プロセス数)

Nginxの利用

今回は同一コンテナ上にNginxを設けるようにしています。

Nginxはロードバランシング、キャッシング、SSL Termination、やリクエスト処理機能を提供します。

餅は餅屋の精神で、本番環境ではUvicornやGunicornよりも上位の処理をNginxといった専用のミドルウェアに任せ、組み合わせて利用することが推奨されています。

以下の2つの内容が参考になると思われます。 docs.gunicorn.org

medium.com

まとめの今後の展望

この記事では、推論用REST APIサーバーを構築する際に考えたことを2つのセクションに分けて紹介していきました。

  1. 推論用サーバーを構成するAWSリソースの検討
  2. 推論コードを実装する上での検討

今回は推論コードや学習済みモデルをデプロイしエンドポイントを更新するまでのフローについては触れていません。次回機会があれば書きたいと考えています!

社内ハッカソンイベント”HackWeek”待望の5日間がもうすぐ到来!

こんにちは、ラクスル広報の和田です。
2023年8月21日~25日に、いよいよ今年度6回目となる、社内ハッカソンイベント「HackWeek」を開催します!

今年のテーマは ”Upgrade Ourselves”
通常向き合っている開発とは異なり、私たち自身の生産性向上・進化に焦点を当て、アイディアだけで終わらず、実際に活用されることまでを想定したプロダクト開発を目指します。

エンジニアの視点から生まれるであろう独創的なアイディアを再考し、具体的なプロダクトとして活用されることにフォーカスしたテーマになりました。

本記事ではHackWeekがどのようなものか、イベント開催前の様子と共にご紹介していきます。

※昨年度の様子はコチラ

「HackWeek」とは

HackWeekは、その年のテーマに沿って一定期間にわたり集中開発を行う社内ハッカソンイベントです。このイベントには、ラクスル事業の拡張を支えるエンジニア、デザイナー、PdMが参加します。

今年は、「ラクスル」をはじめ、ラクスルグループの「ノバセル」「ハコベル」「ペライチ」のエンジニアも参加することが決定しました。

ポイント! チーム編成は自由であり、異なる事業部門や通常の開発チームとは異なるメンバーが多様なチームを組むことが可能です。シナジーを最大限に活かし、さらなる成長を目指すスタイルは、ラクスルグループが実施するHackWeekならではの特長となります。

なぜやるのか

理由は大きく分けて3つあります。

1.  技術的チャレンジ・学び

普段の業務から一旦離れ、自由に開発を行いプロダクトの進化や自身の成長に繋げる。

2. イノベーションの創出

新しいイノベーションが生まれる機会づくり。

3. テックカルチャーの醸成

エンジニア目線でプロダクトをデザインする社内風土の醸成。

開発テーマ案が70を超えた

事前にテーマを募集し、集まったテーマ案は70以上に達しました。その後、二度にわたる検討会を実施し、その中から今年は20のテーマを厳選。 厳選されたテーマの開発に取り組むメンバーは、ベトナムを含むメンバーも加わり、なんと95名に上ります。

注目の使用予定の技術

20チームの使用予定の技術に「GraphQL」「CDN」をはじめ、「AI系API」「ChatGPT」などの未来を切り開くような技術を使用するチームも見受けられ新たな時代の到来を感じます。

ChatGPTを通じて得られる高度な言語生成能力やAIのデータ駆動の分析力など、これらの技術がどのような目的で活用されるのでしょうか。特にAIの予測や分析を通じて、ニーズやトレンドを的確に把握し、既存の課題に対する新しいアプローチを見つける可能性も大いにありそうです。

こうした最新技術の応用によって、アイディアの進化が促進され、革命的な変化がもたらす未来のプロダクト開発に社内の期待感も高まっています。

プロダクトを讃える6つのアングル

プロダクトを多面的に評価し、各視点からプロダクトを讃えるため今年は6つの賞を用意。 プレゼンテーションを見た全社員が、最も「素晴らしい」 と感じたチームに一人1票を投票してもらう形式で投票を集計し、表彰を行います。果たして、栄冠を勝ち取るのはどのチームなのか!

オフィスもHackWeekの装いに

HackWeek開催まであと僅かとなりました。
今年もHackWeekを盛り上げるため、様々なデジタルクリエイティブを制作し、社内装飾も無事に完了!あとはいよいよ開催を待つのみです!

さいごに

この記事では、HackWeekがどのようなものか、イベント開催前の様子についてまとめました。 今年はオフラインでの開催となり、肌で熱気を感じる熱いイベントになりそうです。 今回のHackWeekではどのような成果が生まれ、栄冠を勝ち取るのはどのチームなのか!
開催が待ち遠しい・・・HackWeekイベントレポートは9月ごろに配信予定です。そちらもぜひお楽しみに!

Snowflake Summit 2023 で感じた新たな時代の盛り上がり

こんにちは。ラクスルグループのノバセル株式会社にてデータエンジニアをやっている、@yamnakuです。 今回は、6月末にラスベガスにて開催された Snowflake Summit 2023 に参加してきたので、その参加報告をしたいと思います。

Snowflake については、以下の記事にて紹介しています。

参加に至るまでの経緯

弊社では、ビジョンである「マーケティングの民主化」を実現するため、お客様のマーケティング施策の定量評価を通じ、より効果的なマーケティング活動の実現を支援しています。 その中で、定量評価に用いるさまざまなデータの集計や分析を行うにあたり、"データクラウド"である Snowflake を中心としたシステムの構築を行なっています。

私自身も、データエンジニアとして2年ほど Snowflake を利用したデータパイプラインの構築や運用を行なってきました。 また、日本において Snowflake をより多くの人に触れていただくべく、コミュニティ活動にも力を注いできました。 そうした活動を通じて、Snowflake 社からコミュニティへの貢献者に送られる「 Data Superheroes 」に今年選出いただきました(今年は世界で70名ほどが選出)。

Data Superheroes について、および選出に至るまでの詳しい経緯については以下の記事にて紹介させていただきました。

このように、弊社では Snowflake がビジネスにおける中心的なテクノロジーであり、その最新技術についてキャッチアップすることで、よりビジネスに貢献できると考えています。 また、コミュニティ活動の一環として、海外の最新情報を日本に伝えることも重要であると考え、今回、 Snowflake Summit への参加をしてきました。

なお、ラクスルグループには、「海外カンファレンス支援制度」というものがあり、海外カンファレンスへの参加費用(渡航費・宿泊費)を会社が負担してくれる制度があります。 いくつかの条件を満たす必要がありますが、今回はこの制度を利用して参加してきました。

Snowflake Summit とは

Snowflake Summit とは、Snowflake が主催する年1回のカンファレンスで、Snowflake の新規リリースや事例などの発表が行われています。毎年6月ごろに開催されており、今年はアメリカ・ラスベガスにて開催されました。会期は4日間で、来場者は12000人ほどだったそうです。日本からも150人程度が参加されていたそうです。

手前味噌になりますが、Snowflake Summit の概要や詳細な発表内容については、以下の記事をご覧いただければと思います。

zenn.dev

何をしてきたか

日本コミュニティでのYoutube配信

会期は4日間ありましたが、初日はトレーニングセッションなど、比較的時間が空いています。 Snowflake 日本コミュニティである「SnowVillage」での動画配信用の収録をサミット会場内の配信エリアで行いました。

コミュニティメンバーのみなさんと収録(菱沼さん、鈴木さん、向井さん、自分、KTさん)

実際に配信された動画はこちらです。かなり大掛かりの機材を利用して収録していただいたため、これまでで一番緊張していたかもしれません。

www.youtube.com

基調講演やセッションを聞く

2日目からは基調講演や、さまざまなセッションが実施され、400以上のセッションが設定されていました。 私は最近興味の持っている技術や、マーケティングに関わる最新の事例などを主に聞いて回りました。 英語を全て理解し切ることは出来ませんでしたが、この業界の盛り上がりを直に触れることが出来て非常によかったです。

2日目の基調講演の様子

ブースセッションの様子

Data Superheroes Global Community にて交流

Data Superheroes に選出されると、いくつかの優遇を受けることができます。そのうちの一部として、Snowflake Summmit 内でグローバルの Data Superheroes と交流する機会を作ってもらえたり、基調講演で最前列に座ることなどが出来ます。また、Snowflake の VP メンバーと直接話す機会もあったりします。

距離の問題なのか、アメリカやヨーロッパのメンバーが比較的多い印象でした。イタリアでコミュニティリーダーをやっている方と仲良くなりました。

Global Community での交流会

Data Superheroes Global Community

各ブースを見て回る

Summit には、スポンサーブースなども多数出展しており、正確には数えていませんが100以上のスポンサーブースが出ていました。 まだ日本で知名度が低かったり、上陸していないサービスも実際にデモを見たり、質問したりすることが出来ました。 hightouch というリバースETLツールのブースに行ったら、CEO がカジュアルに話しかけてきてちょっとびっくりしました。

Sigma というサービスをここで初めて知りました。良さそうでした。

日本向けセッションにてパネルディスカッション

Summit の最終日には、日本から来ている皆さんに向けたラップアップセッションがありました。 そちらで、今回の Snowlfake Summit で発表された機能についてのディスカッションをさせていただきました。 何を話したか覚えていませんが、非常に熱い話をした記憶があります。(笑)

3人で Summit での発表内容についてディスカッション(KTさん、自分、渋谷さん)

このセッションの後、立食パーティーとなり、日本から来られた様々な方とお話しすることが出来ました。 パネルディスカッションでした話などの感想などを頂くことができ、非常に楽しい時間を過ごせました。

ラスベガスを楽しむ

もちろん、Summit の夜にはラスベガスの街を楽しみました。 シルクドソレイユや、カジノ、アメリカ料理など、ラスベガスを存分に味わうことが出来ました。

ホテル「ベラージオ」の噴水ショー

アメリカぽいステーキ。

データを中心としたアプリケーションの時代がやってくる

Summit では、「データアプリケーション」向けの注目機能が多く発表されました。 前述したブログに詳しく記載していますが、これまでの SaaS サービスとは考え方の異なる、新しい「データアプリケーション」の概念がいよいよ具現化してきたように感じました。

Snowflake だけでなく、競合製品も似たようなアプローチを進めています。 この流れが強まっていくことで、これまでの Web 開発の常識が塗り替えられていくのではないかと興奮しました。 そして、そこにキャッチアップしていくことで、新たなビジネス機会につながるということも感じられました。

なぜ、現地に行くべきなのか?

Snowflake Summit はアーカイブ配信もやっているため、日本にいても情報をキャッチアップすることは可能です。 しかし、今回初めて行ってみて感じたことは、現地に行くことの重要性です。

さまざまなセッションやブースを周り、グローバルにビジネス展開しているサービスを見て回りました。 私個人としては、日本市場が縮小していくなかで、グローバルに展開するビジネスを作っていくことは非常に重要だと思っています。 アメリカというソフトウェア・テクノロジーで盛り上がっている市場を見ることで、自分のモチベーションが上がりましたし、グローバル市場を意識して開発したいなと感じるようになりました。

また、現地に来ている日本人の皆さんとの交流も刺激になりました。 わざわざラスベガスまでやってきて情報を得ようとしている皆さんとの交流の中で、新しい考え方を知ったり、関係性を作ることもできました。 こういったことも、実際に現地に向かうことでしか得られないことだと思っています。

また来年も Snowflake Summit に参加したいですね。そして、他の海外カンファレンスも行ってみたいですね。 ここまで読んでいただきありがとうございました。

【全2回】AWS Lambda x FastAPIによるPythonモダンAPI開発のすゝめ 2

  • はじめに
    • 対象読者
    • あまり説明しないこと
    • 前提とするバージョン
    • 参考となるレポジトリ
  • 3. アーキテキチャ及びディレクトリ構造
    • オニオンアーキテクチャを採用
      • オニオンアーキテクチャとは
        • 誕生の背景
        • 依存関係逆転の原則の活用
      • 採用理由
      • 参考になった記事
    • ディレクトリ構造
      • 全体の構成
      • api
      • schema
        • apiとusecaseの間のデータ構造を提供する役割
        • schemaはパスオペレーション関数のリクエストとレスポンスの構造を提供する役割
      • usecase
      • domain
      • infrastructure
      • core
      • container_config
      • exception
      • 参考にしたもの
  • まとめ

はじめに

ラクスルグループのノバセルで新卒2年目のエンジニアをしています田村(tamtam)です。

第1回では、AWS Lambda x FastAPIによるPythonモダンAPI開発を実現する上で役立つであろう1. 開発環境の構築で使用したツール2. 開発に活用したPythonライブラリについて紹介していきました。

そして本記事ではある第2回では3. アーキテキチャ及びディレクトリ構造について紹介していきます!💪

この記事を通じて、同じような課題を抱える他の開発者の皆さんに役立つ情報を提供できればと思います。

それでは詳細について見ていきましょう!

続きを読む

【全2回】AWS Lambda x FastAPIによるPythonモダンAPI開発のすゝめ 1

  • はじめに
    • この記事を読んで得られること
    • 対象読者
    • あまり説明しないこと
    • 前提とするバージョン
    • 参考となるレポジトリ
  • 1. 開発環境の構築で使用したツール
    • AWS Lambdaのコンテナサポートを採用
    • Poetry利用時に開発と本番環境の適切な管理でLambdaデプロイ問題を解決
      • Poetry利用時に起きた問題
      • Dockerfileを分けてデプロイできない問題を回避
    • Mutagen Composeを採用
      • Dockerの同期遅い問題
      • Mutagen Composeを利用
  • 2. 開発で活用したPythonライブラリ
    • パッケージ管理
      • Poetry
        • Ryeも検討したものの採用せず
    • ベースのライブラリ
      • FastAPI
      • Mangum
      • Powertools for AWS Lambda
    • リンター・フォーマッター
      • Ruff
      • Mypy
        • 型アノテーション自動生成ツールの活用
      • Black
    • テスト
      • Pytest
      • pytest-cov
      • pytest-env
    • その他
      • Pydantic
      • Pandera
      • PyYAML
      • Injector
    • 検討したが使用しなかったモノ
      • pre-commit
  • まとめ

はじめに

ラクスルグループのノバセルで新卒2年目のエンジニアをしています田村(tamtam)です。

この度、私たちのチームではAWS LambdaとFastAPIを使用したAPI開発プロジェクトを進めております。

この記事を読んで得られること

この記事では、プロジェクトの中から特に効果的だった要素を、以下の3つのカテゴリーに分けて詳しく紹介します。

  1. 開発環境の構築で使用したツール
  2. 開発で活用したPythonライブラリ
  3. アーキテキチャ及びディレクトリ構造

これらはプロジェクトの初期段階で慎重に選定され、今後の開発の進行に大きな影響を及ぼします。

全2回を通じて、同じような課題を抱える他の開発者の皆さんに役立つ情報を提供できればと思います。

第1回では、1. 開発環境の構築で使用したツール2. 開発に活用したPythonライブラリについて紹介します。

それでは詳細について見ていきましょう!

続きを読む