Blog

SageMakerで自作のHuggingFaceモデルをデプロイして、記事要約をさせてみる

はじめに

N1! Machine Learning Product Engineerの中村です。
普段はニュースサイトやアプリのバックエンド開発を担当し、その他機械学習をプロダクトに実装することを目的としたスペシャリスト(ニフティにはN1!というスペシャリスト制度があります)としても活動しています。
https://recruit.nifty.co.jp/interview/nakamura.htm

本記事では、現在検証中である自然言語処理のためのHuggingFaceモデルをSageMakerにデプロイする手順を説明します。
SageMakerを使用することで、インスタンスタイプ変更やスケーリング、Lambdaなどと組み合わせたWebAPI化も可能なため、機械学習プロダクトの開発が楽に行えます。

注意

この記事ではSageMakerへのデプロイを目的としているため、自然言語処理モデルの具体的な内容や学習手順、JupyterNotebookの詳細な使い方については説明しません。
また、途中で公開している自然言語処理モデルは学習元データ数を極端に落としているため、精度が非常に低いです。
(高精度なモデルを求めている人はぜひ採用サイトまで!)

全体の構成について

今回は上のような構成をTerraformで構築します。
SageMakerでNotebookインスタンスを立ち上げ、S3に自作のHuggingFaceモデルを配置します。
Notebookインスタンス内でデプロイを実行することで、S3からモデルがSageMakerのエンドポイントに配置されます。(SageMaker Serverless Inferenceを使うことで、実行時間だけ課金が発生するようになります)

インフラ環境の構築

Terraformでインフラ環境を構築します

main.tf

AWS Provider Version 4を使用します。
profileの設定などは自分の環境用に変更してください。

s3.tf

モデルを配置するためのS3を作成します。
バケット名は全世界で一意である必要があるため、bucket名を適宜修正してください。

sagemaker.tf

Notebookインスタンスを作成します。
SageMakerの実行権限と、S3からモデルを読み出すためのS3の権限を付与します。

環境を立ち上げる

ファイルを配置して、Terraformで環境を立ち上げます。
SageMaker Notebookのインスタンスが立ち上がるのにやや時間がかかります。

自作モデルをS3に配置する

作成したS3バケットに自作モデルを配置していきます。
以下からモデルをダウンロードするか、または自作のHuggingFaceモデルをtar.gzの形で圧縮したものをアップロードします。
こちらで作成したモデルは以下からダウンロードできます。
(学習データを抑えて学習を行ったサンプル用モデルである点はご了承ください)
https://s3.ap-northeast-1.amazonaws.com/engineering.nifty.co.jp/sagemaker-t5-model-example/model.tar.gz
自作モデルを使用する場合は以下のようにして圧縮します。 モデルが用意できたらS3にアップロードします。

SageMakerでデプロイする

配置したモデルをデプロイしていきます。

Notebookを開く

「JupyterLabを開く」を選択します。
「conda_pytorch_p36」のNotebookを開きます

デプロイのためのコードの記述

まずSageMakerをアップグレードするために、以下のコードをセルに貼り付け、実行します。 次に、inference.pyというファイルを作成するために以下のコードを実行し、ファイルを作成します。

inference.pyの編集

inference.pyではSageMakerが予測時にどのような処理を行うかを記述します。

model_fn

予測のための関数であるpredict_fnに渡すモデル形式を決定します。
今回はモデルのパスを受け取り、HuggingFaceのモデルとトークナイザーを返す処理を実装しています。

predict_fn

input_fnによって解析された入力データと、model_fnでロードしたモデルデータを受け取り、予測のための処理を行います。今回はT5によるプロンプト予測を行い、記事データから要約を生成します。

この他にinput_fn, output_fnという入出力について決める関数もありますが、今回は特にカスタマイズせずに使用します。
前節でダウンロードしたモデルを使う場合はinference.pyは以下のようになり、これをSageMakerのルートディレクトリに配置します。
(オリジナルのモデルを使う場合はモデルに合わせたpredict_fnの処理変更が必要になります)

デプロイの実行

HuggingFaceのデプロイを行うための定義を行います。
(model_dataのbucket名はアップロードしたS3のバケット名を指定します) SageMaker Serverless Inferenceへデプロイするためのコードを記述し、実行します 実行するとデプロイが行われます
!になったら、デプロイ完了です
デプロイされたエンドポイントはSageMakerの推論エンドポイントから確認できます

デプロイされたエンドポイントで要約推論を行う

では、実際にエンドポイントで要約を行ってみます。
以下の形式で記事データを渡すことで、記事要約を行ってくれます。
性能にはまだ改善点が見られますが、記事からタイトル・要約などを生成することが出来ました。

(オプション)環境の削除

一通りの実行が終わったら、不要であれば環境を削除していきます。

エンドポイントとモデルの削除

※Terraformでは管理されていない部分のため、必ず実行してエンドポイントを削除しましょう。

terraform destroyの実行

terraform destroyを実行して環境を削除します。

不要なリソースの削除

SageMakerによってS3バケットとCloudWatch Logsが生成されているため、必要に応じて削除します。 S3バケット
  • sagemaker-ap-northeast-1-XXXXXXXXXXXX
CloudWatch Logs
  • /aws/sagemaker/Endpoints/sagemaker-model-endpoint
  • /aws/sagemaker/NotebookInstances

最後に

今回はSageMakerでHuggingFaceモデルをデプロイする方法を紹介しました。
次回はLambdaを接続し、WebAPIとしてデプロイする手順を公開しますのでお楽しみに。

We are hiring!

ニフティでは、さまざまなプロダクトへ挑戦するエンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトよりお気軽にご連絡ください! Tech TalkやMeetUpも開催しております!
こちらもお気軽にご応募ください!