機械学習・AI

2019/12/13

機械学習基盤/ML Opsとは?運用課題と解決できること・DevOpsとの違い

機械学習モデルを構築して実際のビジネスに活用する組織が増加するなか、DevOpsのML版ということで注目の高まっているキーワードにML Ops(エムエルオプス)があります。

システム構成やインフラ基盤のアーキテクチャ、モデル作成から本番反映のプロセスといった運用に関して、Machine Learning特有の課題なども見えるようになってきました。

今回の記事では、そんなMLOps/機械学習基盤で実現できること、MLの開発サイクルや機械学習の課題、DevOpsと異なる点、OSSなどの技術要素を紹介します。

MLOpsとは

MLOpsとは、Machine Learning(マシンラーニング=機械学習)の開発側(ML)と運用側(Ops)が協調し合い、実装から運用までの流れを円滑に進める管理体制(機械学習基盤)を意味します。ビジネスでは、MLOpsチームやMLOpsエンジニアのように、機械学習のインフラ運用を担うエンジニアの役割を指してMLOpsという言葉が使われることもあります。

DevOpsから派生して生まれてきた概念がMLOpsであり、DevOpsの機械学習版ともいえるでしょう。機械学習モデルの作成やデプロイ、環境構築などを自動化し、開発スピードやリリースのサイクルを速める。モニタリングや監視をおこない安定稼働を担保する。など、DevとOpsが協調した取り組みに特徴があります。

MLOpsが取り組む内容として、「機械学習基盤の構築」「機械学習サイクルの円滑化」の2つを紹介します。

機械学習基盤の構築

機械学習では、継続的なデータの収集・蓄積・整備が必要です。実サービスへの適用や学習作業のほかに、データの加工や前処理、プログラムを実行しながらの再学習など様々なタスクやそれに対応した基盤が必要となります。

MLOpsは、そのような実行環境として利用する機械学習基盤のアーキテクチャを設計し、インフラ環境やプラットフォームを整備します。

機械学習サイクルの円滑化

機械学習サイクルをスムーズに実行するうえで、必要なプロセスの自動化や効率化を行うこともMLOpsといえます。デプロイの自動化やシステムの監視など、今まで人が行っていた作業を自動化することで、リリースまでの速度を高速化できます。

機械学習モデルやアプリケーションも作ったら終わりではなく、運用が必要です。システムプログラムを変更した場合のバージョン管理、モデルの微調整、修正作業などを繰り返し行います。

しかし、システムに新たな変更を加えると、稼動しているプログラムに不具合が発生する恐れがあります。そういった問題を解決して、運用作業を円滑に回すのがMLOpsといえます。

MLの開発サイクル

ML(機械学習)の開発サイクルは、いくつかの段階に分かれています。ML Opsでは、開発の各段階でタスクの自動化を実行して業務に組み込んでいきます。

データ開発

まずは分析や検証に必要なデータ基盤を開発していくのが基本です。例えば、顧客などの一般ユーザーの分析をするなら、顧客情報の年齢や性別、趣味などの分析で必要なデータを集めてまとめておきます。

機械学習を行うには、様々なデータが必要になるため、関連するデータを継続的に収集して蓄積しながら整備していきます。

モデル開発・検証

分析やモデル開発、検証では、必要なデータを探索して基礎調査を行い、そのデータを元にモデルを作成してパラメータチューニングを行います。テスト用のデータで十分な精度がだせた場合は、本番のサービスに適用して検証を行います。

ウェブサービスの場合は、APIの開発後に本番環境へデプロイしてABテストなどをしながら、実際のサービスでの検証を行います。

運用

機械学習モデルを本番環境へデプロイしたあとには運用をおこなう必要があります。収集したデータは常に更新していく必要があります。また、データが変わって精度が落ちることもありモニタリングが必要です。

更に精度を高めるには新しいデータを集めて追加していくことやモデル自体をチューニングしていく必要があるため、継続的に学習バッチやAPIの運用を行っていきます。

機械学習の課題

機械学習は人間では難しいタスクに取り組むことも可能になり、うまく活用できれば様々な分野で応用が利いて便利です。しかし、開発にあたって様々な課題もあります。MLOpsでは、そのような課題を理解した上で機械学習の開発を進めていくことが重要です。

機械学習以外の開発に工数がかかる

機械学習でモデルを作成すれば、開発が終わりではありません。むしろ、アプリケーションに組み込んだり、データを更新して入出力していく処理やAPIなど機械学習以外のシステム開発が必要です。それらのシステムを設置する開発環境やデータベースなども用意する必要があり、運用のための開発工数も必要です。

例えば、データを処理するためのパイプラインの構築や、複数人での作業では他のメンバーとコミュニケーションを取る必要があります。

コード実行やデータの再現性が担保されない

モデルの作成段階では問題なく稼動していたコードが、本番環境へ搭載するとエラーが発生することがあります。

開発環境は最新のTensorFlowだが本番環境は旧バージョンなど、テスト段階と実際の稼動条件が異なるためです。同じデータで同じモデルを学習させた場合でも違う結果が出力されることもあります。

また、データが保管されているテーブルの変更などで稀に起こる、カラムの中身が消えてしまうリスクもあります。

十分な計算リソースが使えない

分析・モデル作成時にバッチテストやAPIをするだけのインフラしか準備できず、実際の分析をローカルPCでしなければいけなくなり、かなりの負荷を抱えながらその実行速度も遅くなる問題が発生する場合があります。

事前にシステムを作るチームと、運用をするチームのコミュニケーションがしっかりと取れていれば問題ありませんが、複数の工数を抱えていると細かい連携がうまくいかないこともあります。

新しいモデルを作ってもすぐにデプロイできない

常に新しいモデルを作っていくと、いくつかのモデルは忘れ去られてしまい、そのまま放置されてしまうことがあります。作成段階ではそれなりの制度を持っていたとしても、時間が経つと精度が低下してしまい、使い物にならなくなる場合もあります。

MLOpsで実現できること

MLOpsは、ある程度の作業を自動化することで簡素化できるので、無駄な作業時間を無くしてリリースサイクルを早めることができるようになります。

機械学習でアジャイルを実践

機械学習の分析からモデリング、仮説検証までを身軽にして、素早く実践できるようにしたり安全で安定的にシステムが稼動できたりします。また、モデルの開発経路を分かりやすくして、メトリクスを常にモニタリングできるようにし、実施する施策が増えていっても、それに携わる人材を増やさないで対応できるようにします。分析や学習バッチAPI サービングなどを統一的に提供することで、時間と手間が省けるようになります。

複数環境でコードの再現性の確保

様々なテストや実装を違う環境で行っていると、システムがうまくかみ合わなかったりエラーが出たりと無駄なロスが発生するリスクがあります。そういった問題をできるだけ無くすために、分析やモデリング環境、学習バッチ環境やAPIサービングの環境は、KubernetesクラスターやDockerイメージを用いて構築します。

これにより、コードの再現性が確保されるため、エラーが発生しにくくなります。

継続的な再学習と自動デプロイ

モデルは、バッチにより再学習や自動デプロイを継続的に続けるので、学習結果に応じて精度低下などに対して対応できたり、アラートを通知したりできるため最低限の手間だけで済むので便利です。

また、過去に蓄積されたデプロイ履歴も含めて判断してデプロイを制御したり、メトリクスを継続的に記録し、時系列の変化を振り替えられたりできます。

他にも過去と現在のバージョン予測値を比較したり、特定のリビジョンモデルや学習データなどを復元できたりします。

DevOpsの枠組みからMLのサイクルを考える

ここからは、DevOpsの枠組みからML(機械学習)のサイクルを考えてみましょう。

Infrastructure as Code(IaC)

ここまで見てきた通り、MLで使うライブラリには依存関係があるため、開発の段階と本番での環境が同じでないと、開発の段階では問題がなかったとしても、本番でモデルが動作しなり場合があります。

また、ライブラリはバージョンを頻繁に変えるため、その度に新しい環境を構築すればエラーなどのリスクを回避しやすくなります。そこで必要となる概念がInfrastructure as Codeです。

インフラの構築・運用に関する作業をコード化することで、コストとリスクを下げ、実行サイクルを高速にできます。

マイクロサービス(Microservices)

アプリケーション全体で考えると、MLに関しては他のコンポーネントとプロダクトの更新サイクルが異なっていたり、必要とされている言語や環境についても異なっていたりします。

そのため、それぞれの環境に合った作り方をしないと、後で問題が発生する恐れがあります。アーキテクチャの考え方としてMicroservicesがあります。マイクロサービスは、単一のアプリケーションを、ビジネス機能にそった小さなサービスの組合せにより開発するアプローチです。

疎結合なアーキテクチャをとり、単位ごとの修正や変更を容易にするメリットがあります。MLの推論処理をマイクロサービスとして独立させる。

継続的デリバリー(Continuous Delivery)

新しく作ったモデルはテストの段階では成果などが詳しく分からないので、本番の環境に入れてみて初めてその効果が分かるようになります。そのため、テスト段階で想定していたデータも、本番では違った結果になる場合があります。

Continuous Deliveryにより自動化されたリリースプロセスでは、常にソフトウェアを本番にデプロイすることができるため、ビジネス価値の向上に寄与します。

DevOpsとML Opsの違い

次に、DevOpsとMLOpsで異なる点を紹介します。

学習データの管理

MLOpsでバージョン管理をする際には、コードや環境だけでなく学習データも同時に管理しないといけません。また、学習に利用したデータを他のモデルで利用したり、途中まですすめたモデルを別の環境で再利用したいという要望もあるかもしれません。

非エンジニアとの協働

開発(Development)と運用(Operations)を担当するエンジニアが協調するDevOpsの考え方に対して、MLOpsでは、事業部門やデータサイエンティストなどの非エンジニアとの協働も含まれます。

Devは開発をするエンジニアで、Opsは監視やメンテナンスをする非エンジニアという考え方もありますが、MLOpsはデータの整備からモデル構築、運用など、それぞれに合わせて様々なチームが協働する形になります。

MLOpsは、開発関係のエンジニア(Dev)を、機械学習(ML)に置き換えることで、実行サイクルを円滑化してくれます。

MLシステムのアーキテクチャ

MLシステムのアーキテクチャは「学習」と「予測」の2つを使い、目的によってシステムを構成していきます。

リアルタイム処理

リアルタイム処理は、大きく分けると2種類あります。ひとつは、ユーザーの属性やその行動に応じて、そのユーザーに焦点を絞ってコンテンツを推奨するなど、サーバーサイドのリアルタイム推論です。

もうひとつは、工場などで生産ラインにカメラを設置して、そのラインにある製品を撮影し、不良品を判定するエッジサイドのリアルタイム処理があります。どちらでもリアルタイムに自動で瞬時に判別して実行します。

バッチ処理

最もシンプルなアーキテクチャはバッチ処理です。以前に学習した情報を使用して予測をおこないます。例えば、メールマガジンなどで商品などを紹介する場合に、サイトのアクセスログや購入情報を元に商品をレコメンドして送信する方法です。

MLOpsを実現するサービス・ツール

MLOpsを実現するために、ツールやサービスを利用するとよいでしょう。MLOpsに関連するサービスや技術要素は複数あるので、用途に合わせて利用していきます。

GCP

GCPは(Google Cloud Platform)の略で、Googleが提供するクラウド上のサービスです。データ解析から機械学習のサービスなど、インフラ環境をクラウド化していきます。

具体的なサービスとしては、AIを活用した需要予測やAI画像分類を知識不要で実現するなど、Googleならではのサービスが多数あります。

Cloud ML Engine

Cloud ML Engineは、優れた機械学習のモデルを構築して、本番環境で実行できるようにするサービスです。例えば、衛星画像に写っている画像の判別や、メール対応の迅速化など、TensorFlowの実行環境をデプロイしてくれます。

AWS

AWSは(Amazon Web Services)の略で、Amazonが提供しているクラウドサービスです。代表的なサービスは、サーバーを構築して運用できるEC2や、インターネット経由でWordやExcelなどを保存できるS3などがあります。他にもデータベースの機能を提供してくれるRDSや、コマンドベースでAWSを操れるCLIなどがあります。

SageMaker

SageMakerはAmazonが提供している、完全マネージド型サービスです。機械学習の各プロセスで、負荷が大きくなる部分を取り除き、モデルを構築してトレーニング、デプロイできるようになっています。

ECS, EKS, Fargate

AWSのコンテナサービスは大きく分けると2種類あり、「コンテナの管理」がECSやEKS、「コンテナのホスト」がFargateやEC2です。「コンテナの管理」の名称は、コントロールプレーンと言いますが、簡単に言えばコンテナを管理する機能で、AWSの場合はECSとEKSが選択できます。

また、「コンテナのホスト」の名称は、データプレーンと言いますが、コンテナを稼働させるサーバーの事を指します。ECSはAWSにある各種サービスとスムーズに連携ができて、EKSはEC2やFargateのデータプレーンと組み合わせられます。FargateはAWSがインスタンスを管理し、コンテナを登録するだけで利用できます。

その他

dotDataやDataRobotは、機械学習を実装して運用するツールですが、それぞれに特徴があります。

dotData

dotDataはデータサイエンスのプロセスを自動化し、データ分析の時間や労力が解消されるだけでなく、ビジネスの施策検討に注力できます。また、データがあれば、MLに必要な作業を半自動的で実施します。

DataRobot

DataRobotは学習や推論に特化していて、高精度の機械学習モデルを構築します。また、複数のモデルがある場合、それらのモデルをどういった形で組み合わせれば良いのかも教えてくれるため、人の手によってモデルをチューニングする時の判断材料も提供してくれます。

Edge Algo Platform

Edge Algo Platformは、オープンソースソフトウェア(OSS)を統合するAIプラットフォームです。モデル実装⇒レポートの可視化⇒再学習⇒再実装と、本番実装後のプロセス短縮をサポートしてくれます。

MLOpsの技術要素解説

MLOpsには様々な技術要素があり、それぞれの意味を理解しておけば、開発をする上で何を利用すばいいのかが分かります。

コンテナオーケストレーション

コンテナオーケストレーションは、コンテナ(情報システムの基盤技術)を管理する技術のことで、コンテナとはアプリケーションの動作環境を仮想的に区切ることができます。それぞれの複数のコンテナを独立した環境で利用できて、アプリケーションとの組み合わせでシステムを設計できます。

Docker

Dockerはコンテナの仮想環境を作成して配布、実行するプラットフォームです。また、OSを共有して利用できるので、システム構築に必要なプログラムだけインストールができるようになります。これにより、すぐにプログラムが適用できるため導入のスピードを高速化できて、起動時間の短縮化やコンテナ設定の再利用などが可能になります。

Kubernetes

Kubernetesはデプロイやスケーリング、コンテナの管理などを自動化できるオープンソースシステムです。物理サーバーや、仮想サーバーのクラスタ環境などでコンテナを実行できて、コンテナをサーバー群へ展開したり、稼働中にコンテナ数を変更したりできます。

Kubeflow

Kubeflowは、Kubernetes上で機械学習ができるツールです。Jupyterを複数のユーザーで使えるようにした、JupyterHubや、学習用の分散環境が構築できるTensorFlow Training Controllerなどがあり、他にも構築したモデルを公開できるTensorFlow Servingもあります。モデル開発から学習、推論までの機械学習に関する機能を提供していて、すぐに使い始められます。

ワークフロー管理

ワークフロー管理とは、業務の流れをシステム上で実行しながら管理し、業務の円滑化を図る管理手法です。

Digdag

Digdagとは複雑なタスクを実行できるOSSのワークフローエンジンで、手動で行っていた操作を自動化できます。大規模なワークフローを自動化すると複雑になってしまうため、Digdagではタスクをグループ分けで編成し、バッチ処理の依存関係を明確に定義してジョブの管理をします。

Airflow

Airflowはワークフローを記述したり実行、監視したりするツールで、GUIベースの設定やダッシュボードによる監視ができます。また、タスクで障害が発生するとリトライ処理やエラー通知、ログの収集などを行ってくれます。

Webフレームワーク

Webフレームワークは、Webアプリケーション開発で必要な機能をまとめたライブラリのことです。以下に代表的なPythonのフレームワークを記載します。

Flask

FlaskはWebフレームワークのなかでも軽量で、機能についても最低限のものしかないため、無駄な機能で動作に負荷をかけることがありません。もちろん、Webで必要な言語である、HTMLやCSS、JavaScriptやjQueryは利用できます。また、カスタマイズ性が高いので、実装によっては細かい部分までカスタマイズできます。

Django

Djangoは、Pythonのプログラミング言語で、Webのアプリケーションを作る時に使うフレームワークです。Webアプリケーションをフルスタックで制作できて、管理画面からデータベースのテーブルオブジェクトを作成できます。他のアプリケーションと組み合わせないで単体でアプリケーションを制作でき、セキュリティーの機能も備わっています。

FastAPI

FastAPIは、APIを構築するためのWebフレームワークで、標準のPythonタイプヒントに基づいて、Python3.6+でAPIを構築します。また、高いパフォーマンスが特徴のフレームワークで、コーディングによるエラーを軽減できたりコードの重複を抑えたりできます。

関連記事Related Posts