青いセーターを着た人がコンピュータで作業している
Microsoft Base ロゴ

技術ブログ

Azureに関する技術情報

ML モデルをマイクロサービスとしてデプロイするためのスケーラブルなプロセスを、簡単な手順で作成する

Open Source

Share

本ポストは以下の記事の翻訳です。
Simple steps to create scalable processes to deploy ML models as microservices – Microsoft Open Source Blog
2021 年 7 月 9 日

Elena Neroslavskaya
AI + 機械学習, チュートリアルとデモ, マイクロソフト

この投稿は、Seldon Technologies の機械学習エンジニアリング ディレクター Alejandro Saucedo 氏との共同執筆記事です。

共同執筆者について: Alejandro 氏が率いる機械学習エンジニア チームでは、500 万台以上設置されている機械学習デプロイメントおよびモニタリング製品のスケーラビリティと機能拡張性の向上に取り組んでいます。また同氏は、チーフ サイエンティストを務める Institute for Ethical AI and Machine Learning にて、機械学習の説明可能性、敵対的堅牢性、差分プライバシーに関する業界標準の策定に中心的な役割を果たしています。10 年を超えるソフトウェア開発経験を活かし、急拡大するスケールアップ企業各社の技術リーダーを歴任。数多くの部門横断型ソフトウェア エンジニア チームを成功に導いてきました。

機械学習を本番運用に移行する場合は、本番環境の機械学習モデルの数が増えることで課題も増えていくことを認識しておく必要があります。この記事では、本番環境に対応したワークフローを活用し、AI 作成者が独自の機械学習を大規模にデプロイする方法を、実践的チュートリアルで説明します。具体的には、ONNX Runtime、Seldon Core、Hugging Face などオープン ソース ツールのメリットを説明し、さらにこれらと Azure Kubernetes Service を連携させ、堅牢性と拡張性を備えた機械学習の運用機能を実現する方法を説明します。

このブログ記事を読み終わるまでには、複雑な機械学習モデルをデプロイするための簡単でスケーラブル、かつ再現可能なプロセスの作成方法を理解しているはずです。今回紹介する例を通して、自然言語処理 (NLP) モデル OpenAI GPT-2 を、リアルタイムの指標測定と堅牢なモニタリング機能を持つ、完成されたマイクロサービスとしてデプロイする方法を学習できます。プロセス全体を試す場合は、Seldon が公開している GPT-2 の Azure AKS デプロイメントに関するノートブックのデモを参照してください。

このブログでは、図に示した手順に従って以下の項目を実施します。

  1. 事前トレーニング済みの GPT2 Model モデルを Hugging Face を使って取得し、ONNX にインポートする
  2. Kubernetes 環境を設定し、モデル アーティファクトをアップロードする
  3. Seldon Core を使用して、ONNX モデルを Azure Kubernetes Service にデプロイする
  4. Kubernetes にデプロイされた GPT2 モデルに推論リクエストを送信する
  5. リアルタイム モニタリングの指標を Azure のダッシュボードで可視化する

さらに、このフレームワークで使用するツールについて説明します。

  • Seldon Core: Kubernetes に対応した、機械学習モデルのデプロイメントおよびモニタリング フレームワーク。モデル アーティファクトを、リアルタイムの指標を提供するスケーラブルなマイクロサービスに変換することができます。
  • ONNX Runtime: モデル推論のパフォーマンスを向上する、最適化されたランタイム エンジン。モデルの最適化と実行に使用します。
  • Azure Kubernetes Service (AKS): Azure のマネージド Kubernetes サービス。デプロイした機械学習モデルの実行環境となります。
  • Azure Monitor: Azure のマネージド モニタリング サービス。すべてのパフォーマンス指標をここで可視化できます。
  • Hugging Face: トランスフォーマーベースの NLP モデルのトレーニングおよび事前トレーニングのためのエコシステム。OpenAI GPT-2 モデルへのアクセスに使用します。

それでは始めましょう。

1. トレーニング済みの GPT-2 モデルを Hugging Face を使って取得し、ONNX にインポートする

GPT-2 は人気の NLP 言語で、膨大なデータセットによるトレーニングに基づいて人間が記述したようなテキストを生成します。この GPT-2 のトークナイザーとモデルが事前トレーニングされたものを、Hugging Face のユーティリティを使用してインポートします。最初に、以下のようにトークナイザーをダウンロードします。

  1. import GPT2Tokenizer
  2. = GPT2Tokenizer.from_pretrained(“gpt2”)

GPT2 TensorFlow モデルをダウンロードし、エクスポートしてデプロイします。

  1. from transformers import GPT2Tokenizer,
  2. TFGPT2LMHeadModel tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
  3. model = TFGPT2LMHeadModel.from_pretrained("gpt2", from_pt=True, pad_token_id=tokenizer.eos_token_id)
  4. model.save_pretrained("./tfgpt2model", saved_model=True)

最後に、ONNX Runtime 用の変換と最適化を、以下のコマンドで実行します。

  1. python -m tf2onnx.convert –saved-model ./tfgpt2model/saved_model/1 –opset 11  –output model.onnx

ONNX Runtime を使用する主なメリットは、高パフォーマンスな推論機能を利用でき、幅広い互換性が提供される点です。ONNX Runtime を使えば、あらゆる機械学習フレームワークを担当者が自由に使用して、Open Neural Network Exchange (ONNX) 形式に変換し最適化できます。モデルが変換されると、ONNX Runtime を使用してデスクトップ、IoT、モバイルなどさまざまなターゲットにデプロイできます。今回の場合は、Seldon Core を使用して Azure Kubernetes にデプロイします。

このフレームワークで得られる高スループットや低遅延などのメリットは、「Hugging Face トランスフォーマーと ONNX Runtime による NLP パイプラインの高速化」、「Hugging Face と ONNX Runtime による NLP の高速化と極小量子化」といった数々の高度なベンチマークによって証明されています。

2. Kubernetes 環境を設定し、モデル アーティファクトをアップロードする

Seldon Core は、Kubernetes での機械学習モデルの大規模な展開とモニタリングを支援する、代表的なオープン ソース フレームワークの 1 つです。機械学習担当者は Seldon Core を使用して、トレーニング済みのモデル アーティファクトや機械学習モデルのコードを、完成されたマイクロサービスに変換できます。Seldon を使用してデプロイされたすべてのモデルで、高度なモニタリング、強力なプロモーション戦略、スケーラブルなアーキテクチャ パターンが利用可能です。今回の GPT-2 モデルのデプロイにも、この Seldon Core を使用します。

Seldon では、標準提供されるさまざまなパッケージ済み推論サーバーを使用して、モデル アーティファクトを TFServing、Triton、ONNX Runtime にデプロイできます。また、カスタムの Python、Java、C++ などへのデプロイを可能にする、カスタムの言語ラッパーが提供されます。このブログ記事では Triton パッケージ済みサーバーを使用し、バックエンドに ONNX Runtime を使用します。Seldon Core の設定については、Seldon Core の設定手順を参照してください。

Azure Kubernetes 環境を設定する

以下の図は、Azure Kubernetes Service (AKS) が活用されたターゲット アーキテクチャを示しています。Azure Kubernetes Service は Azure で提供されるフルマネージドの Kubernetes サービスです。複雑なインフラストラクチャ管理を Azure Kubernetes Service が担うことで、開発者とデータ サイエンティストは機械学習モデルの構築に集中できます。

作成する AKS クラスターには、以下のノードプールを設定し、CSI ドライバーのインストールを推奨します。ご自身で実行できるスクリプトは、Azure の設定に関するこちらのノートブックに記載されています。

  • CPU システム ノードプール: Kubernetes システム コンポーネントを実行
  • CPU ユーザー ノードプール: Seldon Operator および Istio コンポーネントを実行
  • GPU ユーザー ノードプール: 最適化された GPU ハードウェアで、機械学習モデルの推論を実行
  • Azure Blob CSI ドライバー: モデルをホスティングするための Azure Storage アカウントをマウント

モデル アーティファクトをアップロードする

Seldon は、オブジェクト ストアのモデル アーティファクトを自動でダウンロードできます。このため、最初に Azure Blob Storage にモデルをアップロードすることにします。ストレージ接続の詳細を SeldonDeployment から抽象化して分離する場合は、モデル マニフェスト内の PersistentVolume 参照を使用できます (その後、モデル コンテナーを使用してマウントされます)。Blob CSI を使用して Azure Blob 用に PersistentVolume を設定する方法の詳細については、Seldon によるこちらの例を参照してください。次に、以下の Triton モデル リポジトリ形式が定める既定のディレクトリ構造に従って、ONNX モデル ファイルを Azure Blob にアップロードします。

3. Seldon Core を使用して、Kubernetes (AKS) にデプロイする

この段階で、Seldon Core の Triton パッケージ済みサーバーを使用してモデルをデプロイする準備が整いました。デプロイするには、パッケージ済み Triton サーバー用 SeldonDeployment の Kubernetes マニフェスト ファイルを以下のように定義し、適用する必要があります。

いくつかの属性について、以下の点にご注意ください。

  • implementation フィールドを `TRITON_SERVER` に設定する。
  • モデルをダウンロードするため、‘model_url’ は PVC を参照する (<pvc>://<名前>)。
  • ダウンロードするモデルを指示するため、‘name’ フィールドを GPT-2 にする。
  • ‘componentSpecs’ はポッドの spec のフィールド (limits/requests など) をオーバーライドし、Kubernetes スケジューラが GPU ノード上でポッドを実行するよう tolerations で指示する。
  • ‘protocol’ フィールドは、広く導入されている 推論プロトコルを使用する。
  • annotations は、リアルタイム指標の収集を Azure Monitor に命令する。

デプロイが完了したら、以下のようにログを確認できます。

  1. kubectl logs <podname> c gpt2
  2. == Triton Inference Server ==
  3. I0531 14:01:19.977429 1 metrics.cc:193] GPU 0: Tesla V100-PCIE-16GB
  4. I0531 14:01:19.977639 1 server.cc:119] Initializing Triton Inference Server
  5. I0531 14:01:21.819524 1 onnx_backend.cc:198] Creating instance gpt2_0_gpu0 on GPU 0 (7.0) using model.onnx
  6. I0531 14:01:24.692839 1 model_repository_manager.cc:925] successfully loaded ‘gpt2’ version 1
  7. I0531 14:01:24.695776 1 http_server.cc:2679] Started HTTPService at 0.0.0.0:9000

4. デプロイされたモデルで推論リクエストを実行する

これでモデルのデプロイが完了し、リアルタイムのテキスト生成を実行できるようになりました。これは、製品化後のモデルに REST リクエストを直接送信することで行われますが、最初にいくつかの手順を完了しておく必要があります。つまり、入力のトークン化、リクエストの送信、結果として得られたトークンのデコード、という手順です。以下で詳しく説明します。

  • 事前トレーニング済み Hugging Face GPT-2 トークナイザーを使用して、入力文をトークン化します。
  1. tokenizer =GPT2Tokenizer.from_pretrained("gpt2")
  2. input_text = 'I love Artificial Intelligence'
  3. token_input = tokenizer.encode(gen_sentence, return_tensors='tf')
  • 入力ペイロードを構築することで、トークンの送信が可能になります。
  1. payload = # ...input payload
  2. shape = input_ids.shape.as_list()</span
  3. payload = {
  4. <
               "inputs": [
  5.                {"name": "input_ids:0",
  6.                 "datatype": "INT32",
  7.                 "shape": shape,
  8.                 "data": input_ids.numpy().tolist()
  9.                 "data": input_ids.numpy().tolist()
  10.                 },
  11.                ...
  12.                ]
  13.            }
  14. res = requests.post(
  15.   ' http://<ingressIP>/seldon/seldon/gpt2gpu/v2/models/gpt2/infer',
  16.   json=payload
  17. )
  • GPT-2 モデルが、入力ベクトルのボキャブラリ (ロジット) に対する次のトークンの確率分布を返します。「貪欲な」アプローチに従い、応答を文字列にデコードし、入力文に追加します。
  1. next_token_str = postprocess_response(res)
  2. generated_sentence += ‘ ‘ + next_token_str
  • これを繰り返すことで、完全な合成文を生成します。
  1. ‘I love Artificial Intelligence. I love the way it’s designed’

エンドツーエンドの実装全体については、GPT-2 ノートブックを参照してください。

5. モニタリング指標を Azure Monitor で可視化する

ここからは、Seldon Model が生成したリアルタイムの指標を、可視化してモニタリングしていきます。そのためには、AKS クラスターで Azure Monitor Container Insights を有効化します。インサイト ブレードのページに移動し、SeldonDeployment に設定されたリソース/上限が健全なしきい値に収まっていることを確認して、モデルの推論中にメモリまたは CPU の変化をモニタリングします。

コンテナーの指標に加えて、Seldon Triton オーケストレーターが生成する特別な指標を収集できます。Azure Monitor Container Insights では、標準で提供される機能を使用して、Prometheus サーバーをインストールおよび運用せずに、宣言済みのエンドポイントから Prometheus 指標を収集できます。詳しくは、Container Insights と Prometheus 指標に関する Microsoft docs を参照してください。今回の場合、GPT-2 ノートブックのデモで説明されている、以下に示した専用ダッシュボードで、リアルタイムの指標を視覚化できます。

再利用可能な ML デプロイメント プロセスを今すぐ習得しましょう

このブログ記事ではこれまで、Azure で Seldon Core を使用して GPT-2 NLP モデルを完全なマイクロサービスとしてデプロイし、さらにリアルタイムの指標によって広範な観測性とモニタリング機能を実現するための、スケーラブルで再利用可能なプロセスについて見てきました。

具体的には、以下の処理を実現することができました。

  • トレーニング済みの GPT-2 モデルを Hugging Face を使って取得し、ONNX にインポートする。
  • Kubernetes 環境を設定し、モデル アーティファクトをアップロードする。
  • Seldon Core を使用して、ONNX モデルを Azure Kubernetes Service にデプロイする。
  • リクエストを送信して、デプロイされた GPT-2 モデルでテキストを生成する。
  • モニタリング指標を Azure のダッシュボードで可視化する。

これらのワークフローには、Seldon Core オープン ソース プロジェクトを通して継続的な改善と向上が加えられています。また、外れ値検出、コンセプト ドリフト、説明可能性などに関する最先端のアルゴリズムも常に改善されています。さらに学習を深めたい方や、私たちの取り組みに貢献いただける方は、ぜひお気軽にお問い合わせください。機械学習モデルのスケーラブルな展開戦略について実際の例を見ながら理解をさらに深めるには、以下のリソースがお勧めです。

< 前の記事

> 次の記事

トップに戻る