Author: Localization Team


AWS 中国 (寧夏) リージョンが利用可能になりました

AWS は世界で 17番目、中国では 2 番目のリージョン提供を開始しました。Ningxia Western Cloud Data Technology Co. Ltd. (NWCD) が運営している AWS 中国 (寧夏) リージョンの一般公開を開始しました。これにより、中国の AWS でアプリケーションを実行したりデータを保管するお客様に新たなオプションを提供できるようになりました。

詳細
現在、NWCD が運営する新しい中国 (寧夏) リージョンは Auto ScalingAWS ConfigAWS CloudFormationAWS CloudTrailAmazon CloudWatchCloudWatch EventsAmazon CloudWatch LogsAWS CodeDeployAWS Direct ConnectAmazon DynamoDBAmazon Elastic Compute Cloud (EC2)Amazon Elastic Block Store (EBS)Amazon EC2 Systems ManagerAWS Elastic BeanstalkAmazon ElastiCacheAmazon Elasticsearch ServiceElastic Load BalancingAmazon EMRAmazon GlacierAWS Identity and Access Management (IAM)Amazon Kinesis StreamsAmazon RedshiftAmazon Relational Database Service (RDS)Amazon Simple Storage Service (S3)Amazon Simple Notification Service (SNS)Amazon Simple Queue Service (SQS)AWS Support APIAWS Trusted AdvisorAmazon Simple Workflow Service (SWF)Amazon Virtual Private CloudVM Import をサポートしています。サービス詳細については AWS 中国の製品ページをご覧ください。

同リージョンは C4D2M4T2R4I3X1 インスタンスすべてのサイズをサポートしています。

現在および今後の AWS リージョン詳細については、AWS グローバルインフラストラクチャのページを参照してください。

オペレーティングパートナー
中国の法律および規制を順守した状態で AWS 中国 (寧夏) リージョンにてサービスを運営し提供するため、AWS は NWCD と技術戦略の提携を組んでいます。2015 年に設立された NWCD は中国の寧夏にある認定データセンターおよびクラウドサービスプロバイダです。NWCD は中国における AWS オペレーティングパートナーとして AWS 中国の北京リージョンを運営している Sinnet と提携しています。NWCD と Sinnet が地元顧客に対し AWS クラウドサービスの運営と提供を行いながら、こうした提携を介して AWS は業界をリードするテクノロジーやガイダンス、専門知識を NWCD や Sinnet に提供しています。この 2 つの AWS 中国リージョンで提供しているクラウドサービスは他の AWS リージョンで提供しているものと同様ですが、AWS 中国はその他の AWS リージョンから単離しており、他とは区別された状態で AWS 中国のパートナーにより運営されています。そのため、AWS 中国リージョンをご利用のお客様は AWS とではなく Sinnet そして NWCD と取引約諾書を結ぶことになります。

今すぐ使用可能
NWCD が運営する AWS 中国 (寧夏) リージョンは今すぐ使い始めることができます。本日より、中国の開発者、スタートアップ、エンタープライズそして政府機関や教育機関、非営利組織は NWCD が運営する新しい AWS 中国 (寧夏) リージョンでアプリケーションの実行やデータを保管することができます。Sinnet が運営している AWS 中国 (北京) リージョンをすでにご利用のお客様は、AWS マネジメントコンソールから直接 AWS 中国 (寧夏) リージョンを選択することができます。AWS 中国リージョン両方の使用開始をご希望の新規のお客様は www.amazonaws.cn でアカウントをリクエストしてください。

Jeff;

AWS Deep Learning AMI の更新: TensorFlow、Apache MXNet、Keras、PyTorch の新バージョン

TensorFlow、PyTorch、Keras、最新バージョンの Apache MXNet 1.0 などを含む様々なフレームワークにわたり、NVIDIA Tesla V100 “Volta” GPUs でのトレーニング速度を大幅に改善するため、AWS Deep Learning AMI を更新しました。

現在使用可能な AMI には主に 2 つのタイプがあります。Conda ベースの AWS Deep Learning AMI は、一般的に使用されているフレームワークの最新のポイントリリース (事前設定済みの CUDA、ノートブック、サポートしているライブラリを含む) を Conda ベースの仮想環境内にまとめています。これはすべての開発者に対して推奨されています。ソースコードを使用する Deep Learning AMI は、基盤となるフレームワークに変更を施したい場合や、最先端の技術を取り入れたい場合に適しています。AWS はこの AMI で使用可能なカスタムそして最適化したビルドを構築しています。これにはいくつもの高度な機能やパフォーマンスの改善が含まれています。本稼働環境で導入する前にコードをテストしてください。 

TensorFlow の様々な精度を使用してトレーニング速度を改善

ソースコードを使用した新しい AMI には TensorFlow のカスタマイズされた更新済みビルドが含まれています。これは EC2 の P3 インスタンスで使用可能な V100 GPU で様々な精度を使用するトレーニングと推論を活用します。これによりトレーニング時間を大幅に短縮することができます。たとえば、このビルドを使用して ResNet-50 をトレーニングした場合、ストックの TensorFlow 1.4 に比べて 1.6 倍も優れた結果を得ることができます。

このビルドは Amazon LinuxUbuntu を対象とした CUDA 9 とソースコードを使用した更新済みの AMI で使用可能です。これは TensorFlow のマスターブランチをベースにしています (コミット: d73e8b3、抽出日: 2017 年 12 月 5)。TensorFlow 1.4 を使用したい場合は Amazon LinuxUbuntu を対象とした AWS Deep Learning AMI の Conda 仮想環境で利用することができます。 

Keras 2.0 のパフォーマンス改善

TensorFlow 1.4 バックエンドで実行している AMI の Conda 仮想環境で Keras 2.0 を使用できるようになりました。また、Volta に最適化した TensorFlow ビルドに対しても Keras コードを実行することができます。詳しくは先述の CUDA 9 を使用するソースコード AMI の項目をご覧ください。

Volta サポートを備えた PyTorch の最新バージョン

Conda とソースコード AMI に最新バージョンの PyTorch v0.3.0 が含まれるようになりました。これには CUDA 9、cuDNN 7 のサポートが追加されているほか、V100 “Volta” GPU で行うトレーニングモデルに関連するパフォーマンスの改善も含まれています。また、MXNet、Caffe2、Microsoft Cognitive Toolkit がサポートしている一般的なモデル交換形式の ONNX モデルエクスポーターを含むなど、新たなパフォーマンスとユーザビリティの改善も追加しています。

パフォーマンス、ユーザビリティ、相互運用性を含む Apache MXNet 1.0 の最新バージョン

AMI には Apache MXNet 1.0 リリースも含まれています。MXNet パッケージの新たなモデル提供機能は、数行のコードでディープラーニングモデルを実行し提供することができます。これには新しいグラデーション圧縮機能、Caffe フレームワークで記述されたニューラルネットワークコードを MXNet コードに変換する新しいモデルコンバーターも用意されており、開発者は MXNet のスケーラビリティとパフォーマンスをより簡単に活用できます。

ディープラーニングと ONNX

Open Neural Network Exchange (ONXX) は Facebook、Microsoft、AWS がサポートするイニシアチブで、フレームワーク間のトレーニング済みモデルの可搬性を改善します。Deep Learning AMI に含まれているフレームワークの多くが何らかの ONNX サポートを含むようになったため、AMI はインスタンスを終了せずに複数のエンジンでモデルの推論パフォーマンスをテストするのに優れた場所になりました。たとえば PyTorch をトレーニングし Caffe2 で推論を行うことができます。この移動を簡単に行い評価するのに必要な最新のフレームワークとツールをすべて備えているため、Deep Learning AMI が素早くスムーズに移動することができます。 

AWS Deep Learning AMI の使用開始

AWS Deep Learning AMI の使用開始は簡単です。Machine Learning ユーザーの様々なニーズに応えるため、AMI の最新リリースは AWS Marketplace で使用可能になっています。AWS の「AMI セレクションガイド (AMI selection guide)」では、1 回のクリックでディープラーニングプロジェクトに適した AMI を選択、取得できます。また、AWS ではモデルトレーニングを迅速に進められるよう、クイックチュートリアル開発者用リソースを多数ご用意しています。

Conda ベースの AMI:

Deep Learning AMI (Ubuntu)

Deep Learning AMI (Amazon Linux)

AMI とソースコード:

P3 インスタンス

Deep Learning AMI とソースコード (CUDA 9、Ubuntu)

Deep Learning AMI とソースコード (CUDA 9、Amazon Linux)

P2 インスタンス

Deep Learning AMI とソースコード (CUDA 8、Ubuntu)

Deep Learning AMI とソース (CUDA 8、Amazon Linux)


今回のブログの投稿者について

Cynthya Peranandamは、AWS 人工知能ソリューションのプリンシパルマーケティングマネージャーです。ユーザーがビジネス価値の提供を実現できるように、ディープラーニングの使用をサポートしています。余暇にはジョギングをしたり音楽鑑賞を楽しんでいます。

Apache MXNet 用のモデルサーバーのご紹介

今週初めに、AWS はディープラーニングモデルを提供する Apache MXNet の上に構築されるオープンソースのコンポーネントである、Apache MXNet 用のモデルサーバーの提供開始を発表しました。Apache MXNet は、機械学習のための使いやすく簡潔な API を備えた、高速でスケーラブルなトレーニングおよび推論フレームワークです。Apache MXNet 用のモデルサーバーにより、エンジニアは MXNet モデルを簡単、迅速、大規模に提供することができます。

Apache MXNet 用のモデルサーバーとは

Apache MXNet (MMS) 用のモデルサーバーは、推論のディープラーニングモデルを大規模なデプロイするタスクを簡略化するために設計された、オープンソースのコンポーネントです。推論のモデルをデプロイすることは、ささいなタスクではありません。さまざまなモデルアーティファクトの収集、提供スタックのセットアップ、ディープラーニングフレームワークの初期化と設定、エンドポイントの公開、リアルタイムメトリクスの出力、カスタム前処理および後処理コードの実行をはじめ、数多くのエンジニアリングタスクがあります。各タスクが必要以上に複雑にならないこともありますが、モデルのデプロイに関連する全体的な労力は、デプロイプロセスが時間のかかる面倒なものとなる要因として十分です。

MMS により、AWS はディープラーニングモデルのデプロイプロセスを大幅に簡略化する、Apache MXNet 用のオープンソースのエンジニアリングツールセットを提供します。モデルのデプロイに MMS を使用することにより得られる主要な機能を以下に示します。

  • MXNet モデルを提供するために必要なすべてをカプセル化する単一の「モデルアーカイブ」にすべてのモデルアーティファクトをパッケージ化し、エクスポートするためのツール。
  • HTTP 推論エンドポイント、MXNet ベースのエンジンを含むサービススタックの自動セットアップ。このすべては、ホストする特定のモデルに対して自動的に設定されます。
  • スケーラブルなモデルの提供用に NGINX、MXNet、および MMS で設定された、事前設定済みの Docker イメージ。
  • モデルの初期化から、前処理と推論を経てモデルの出力の後処理に至る、推論実行パイプラインの各ステップをカスタマイズする機能。
  • レイテンシー、リソース使用率、エラーを含む、推論サービスとエンドポイントをモニタリングするリアルタイムのオペレーションメトリクス。
  • Java、JavaScript、C# など一般的なスタックのクライアントコードの簡単な統合と自動生成を可能にする、OpenAPI 仕様のサポート。

MMS は PyPi パッケージを通じて、またはモデルサーバーの GitHub レポジトリから直接利用でき、Mac および Linux で実行されます。スケーラブルな本稼働のユースケースでは、MMS GitHub レポジトリで提供される事前設定済み Docker イメージの使用をお勧めします。

次の図は、リファレンスアーキテクチャの例を示しています。

モデル提供のクイックスタート

MMS; の使用開始は簡単です。以下の例で示します。この例では、MMS Model Zoo で一般公開されている事前トレーニング済みの SqueezeNet v1.1 オブジェクト検出モデルを利用します。

使用を開始するには、Python が必要です。これは MMS の唯一の前提条件です。Python がインストールされていない場合は、Python のウェブサイトの手順に従って、Python 2.7 または 3.6 をインストールします。

次に、PyPi を使用して選択したマシンに MMS をインストールします。MMS では Mac および Linux オペレーティングシステムがサポートされています。

$ pip install mxnet-model-server

モデルの提供は、MMS を実行し、モデルアーカイブ URL またはローカルファイルでそれを指すことにより行われます。

$ mxnet-model-server --models squeezenet=https://s3.amazonaws.com/model-server/models/squeezenet_v1.1/squeezenet_v1.1.model

このコマンドを実行すると、MMS プロセスが開始され、モデルアーカイブのダウンロードと解凍、モデルアーティファクトによるサービスの設定が行われた後で、ポート 8080、localhost の /squeezenet/predict エンドポイント経由で受信リクエストのリッスンが開始されます (ホストとポートは設定可能です)。

新しく作成されたサービスをテストするため、HTTP 経由で推論リクエストを送信し、イメージの分類をモデルに要求してみましょう。

$ curl -O https://s3.amazonaws.com/model-server/inputs/kitten.jpg
$ curl http://127.0.0.1:8080/squeezenet/predict -F "input0=@kitten.jpg"

次のようなレスポンスが表示され、モデルは 85% の確立で、イメージ内のオブジェクトを「Egyptian cat」として識別します。

{
  "prediction": [
    [
      {
        "class": "n02124075 Egyptian cat",
        "probability": 0.8515276312828064
      },
… (その他のより低い確率の予測) …
}

モデル提供の理解を深めるため、サーバードキュメントを参照してください。

提供用のモデルのエクスポート

MMS は、MMS モデルアーカイブ形式でパッケージ化されたモデルを提供します。これには、モデルアーティファクトをパッケージ化し、単一のモデルアーカイブファイルをエクスポートするコマンドラインインターフェイス mxnet-model-export が含まれます。エクスポートされたモデルアーカイブは、モデルを提供するために必要なすべてのアーティファクトとメタデータをカプセル化します。これは、提供エンドポイントを初期化するときに MMS によって消費されます。提供のために追加のモデルメタデータまたはリソースは必要ありません。

次の図はエクスポートプロセスを示しています。

図に示すように、モデルアーカイブをパッケージ化するために必要な必須のアーティファクトは、モデルのニューラルネットワークアーキテクチャとパラメータ (レイヤー、演算子、ウェイト) と、サービスの入出力データ型およびテンソル形状の定義です。ただし、現実のユースケースでモデルを使用するには、ニューラルネットワーク以上のものが必要になります。たとえば、多くのビジョンモデルでは、モデルに渡す前に入力イメージの前処理および変換が必要になります。別の例として、通常、分類結果をソートおよび切り捨てるために後処理を必要とする分類モデルがあります。これらの要件に対応し、モデルアーカイブへのモデルの完全なカプセル化を可能にするため、MMS はカスタム処理コードと補助ファイルをアーカイブにパッケージ化して、それらにファイルを実行時に利用可能にできます。この強力なメカニズムにより、完全な処理パイプラインをカプセル化するモデルアーカイブを生成できます。入力の前処理から開始し、推論のカスタマイズを経て、ネットワークの出力でクラスラベル ID を適用した直後に、ネットワーク経由でクライアントに返されます。

モデルアーカイブのエクスポートの詳細については、MMS エクスポートのドキュメントを参照してください。

詳細と貢献

MMS は、使いやすさ、柔軟性、およびスケーラビリティを実現するように設計されています。提供エンドポイントの設定、リアルタイムのメトリクスとログ記録、事前設定されたコンテナイメージなど、このブログ投稿の説明以外にも追加機能を備えています。

MMS の詳細を学習するには、「Single Shot MultiBox Detector (SSD) チュートリアル」から始めることをお勧めします。このチュートリアルでは、SSD モデルのエクスポートと提供について説明しています。その他の例と追加のドキュメントが、レポジトリのドキュメントフォルダで利用できます。

当社が MMS をさらに開発、拡大する際に、質問、リクエスト、貢献を通じたコミュニティへの参加を歓迎いたします。awslabs/mxnet-model-server レポジトリに移動して開始してください。


その他の参考資料

AWS と MXNet の詳細情報をご覧ください。


今回のブログの投稿者について

Hagay Lupesko は AWS Deep Learning のエンジニアリングマネージャーです。開発者やサイエンティストがインテリジェントアプリケーションを構築できるようにするディープラーニングツールの構築を担当しています。読書やハイキング、家族と時間を過ごすことが趣味です。

Ruofei Yu は AWS Deep Learning のソフトウェアエンジニアです。ソフトウェアエンジニアやサイエンティスト向けの革新的なディープラーニングツールの構築を担当しています。友人や家族と時間を過ごすことが趣味です。

Yao Wang は AWS Deep Learning のソフトウェアエンジニアです。ソフトウェアエンジニアやサイエンティスト向けの革新的なディープラーニングツールの構築を担当しています。ハイキング、読書、音楽を楽しむことが趣味です。

AWS Glue や Amazon Athena を用いたサーバーレスな Machine Learning 環境

属性をもとにデータセットを分割しなければならなかったことはありませんか?K-means はデータ分割を行うために最も頻繁に使用されている Machine Learning アルゴリズムの 1 つです。このアルゴリズムは異なるグループ (クラスター) にデータを分けることで機能します。各サンプルにはクラスターが指定されます。これは同じクラスターに指定されたサンプルが、他のクラスターにあるサンプルに比べて互いが類似しているようにするためです。

今回のブログでは AWS Glue を使用して、Amazon S3 にあるタクシー乗車のデータセットを例に K-means を適用し、そのデータをタクシーの座標に基づき 100 通りのクラスターに分割する方法を説明します。次に Amazon Athena を使用し、乗車数そして各クラスターのおおよその地域をクエリします。最後に Amazon Athena を使用して、最も乗車数の多かった 4 つの地域の座標を割り出します。AWS Glue と Amazon Athena では、ユーザーによるプロビジョンやサーバー管理を必要とせずに、こうしたタスクを実行することができます。

ソリューションの概要

今回は、過去のブログで使用したニューヨーク市のタクシーに関するデータセットを使用します: 「AWS Glue、Amazon Athena、Amazon QuickSight を使用して様々なプロバイダからのデータを調和、クエリ、視覚化する (Harmonize, Query, and Visualize Data from Various Providers using AWS Glue, Amazon Athena, and Amazon QuickSight)」2016 年 1 月のタクシー乗車に関する緑色のタイプから構成されたテーブルを使用します。

座標に基づいたデータセットを分割するために、Spark Machine Learning K-means クラスタリングライブラリを使用した AWS Glue のジョブスクリプトをお見せします。このスクリプトは緑のタクシーデータを読み込み、各行に指定されるクラスターを示す列を追加することで、このジョブを実行します。スクリプトは parquet 形式を使用してテーブルを Amazon S3 バケット (保存先ファイル) に保存します。バケットをクエリするには Amazon Athena を使用できます。

乗客を拾うすべての登録済みの場所に対し、100 種類のグループ (クラスター) にあるタクシー乗車のデータセットを分配させる場合の問題について見てみましょう ( pickup_longitude および pickup_latitude の列)。この問題を解決するため、AWS Glue スクリプトは出力テーブルを読み込み、Spark Machine Learning ライブラリを使用してクラスター数を 100 に設定した K-means を実装します。結果は parquet 形式を使用して Amazon S3 バケットに保存されるので、Amazon Athena を使用してクエリすることができます。

演習

AWS Glue ジョブの実行

以下の手順に従ってください。

  1. AWS マネジメントコンソールで AWS コンソールにアクセスします。テーブルを書き込むために AWS Glue クローラの新しいデータベースを作成します。
  2. 次にポイントする新しいクローラを作成します。
    s3://serverless-analytics/glue-blog  -- set to run on-demand

  3. クローラを実行します。

    クローラが次の属性を含む緑色のテーブルを分類しているか確認します。
  4. スクリプトファイル MLkmeans.py を S3 バケットいずれかにアップロードします。
  5. 新しい AWS Glue ジョブを追加し、ジョブの名前とロールを選びます。次に [An existing script that you provide] からジョブを実行するオプションを選択し、アップロードしたスクリプトの S3 パスを選んでから一時ファイルの S3 パスを選択します。[Next] を 2 回に渡り選択して完了します。
  6. スクリプトを編集します。
    • ジョブを選びオプションを選択して編集します。
    • [destination] の変数を希望する結果の保存先に変更します (次のイメージでは 17 列目)。
    • [namespace] と [tablename] を先に実行したクローラによる緑色のテーブルのデータベースと名前に変更します (次のイメージでは 18 列目と 19 列目)。
  7. AWS Glue ジョブを実行します。
  8. 送信先のパスで parquet 形式のファイルが作成されているか確認します。
  9. 送信先のパスにポイントするクローラを新たに作成します。
  10. 送信先のパスでクローラを実行し、新たに変換したデータセットにポイントする AWS Glue のデータカタログで新しいテーブルを作成します。

Athena を使用して結果をクエリする方法

AWS Glue が抽出した parquet 形式データセットの分析、変換、ジョブの読み込み (ETL) をクローラが完了したら、次の列を含むデータカタログにテーブルが表示されます。

予測用の列は k-means のアルゴリズムにより追加されたもので、各行に指定されたクラスター ID を表す整数が含まれています。

Amazon Athena にある次のクエリを使用して、算出済みのクラスタすべてをリストにした例を見てみましょう。

SELECT  count(*) as count, 
     (max(pickup_latitude) - min(pickup_latitude))*(max(pickup_longitude) - min(pickup_longitude)) 
as approximate_cluster_area , prediction  
FROM RESULTDATABASE.RESULTTABLENAME group by prediction  order by prediction 

結果のテーブル名とデータベースを RESULTDATABASE.RESULTTABLENAME に置き換えると、クエリは次のようになります。

この結果は地理的な各地域で客を拾ったタクシーの数を列にある数字で表しています。また、 approximate_cluster_area の列で示されている各エリアも対象にしています。

アクティビティが最も多い 10 件のクラスターをリストにした別の例も見てみましょう。そのセンターの座標も算出します。

 SELECT count(*) AS count,
         avg(pickup_latitude) AS latitute,
         avg(pickup_longitude) AS longitude,
         prediction
FROM RESULTDATABASE.RESULTTABLENAME
GROUP BY  prediction
ORDER BY  count DESC limit 10

RESULTDATABASE.RESULTTABLENAME を結果のテーブル名とデータベースに変えると、クエリは次のようになります。

乗車数が最も多かったクラスター 10 件が結果として表示されます。Amazon Quicksight 地理空間の視覚化を可能にする機能でこの座標を使うと次のように表示されます。

まとめ

このブログでは、サーバーを起動したり管理する必要がなく監視されていない Machine Learning アルゴリズムを使用して、AWS Glue や Amazon Athena を使う方法を説明しました。この例ではタクシーの座標に基づき、タクシーの乗車数のデータセットを 100 通りのグループに分類しました。クエリデータを使用して、各グループのエリアや乗車数を計算することができます。

このブログで説明したソリューションは、いくつかの編集を加えるだけで別のデータセットを適用することもできるので、独自のユースケースに使用することもできます。


その他の参考資料

PMML ベースのアプリケーション構築や AWS で予測を生成する方法をご覧ください。


今回のブログの投稿者について

Luis Caro は AWS プロフェッショナルサービスのビッグデータコンサルタントです。お客様にビッグデータプロジェクトに関するガイドや技術的なサポートの提供を担当、AWS を使用して顧客が独自のソリューション価値を改善するためのサポートに努めています。

Amazon Polly を使用した Haptik のパーソナルアシスタントサービス

今回のブログは Haptik Inc. の共同創立者および CTO の Swapan Rajdev 氏より寄稿いただきました。

日々忙しく過ごしている我々にとって、やるべき事柄は増加する一方で達成しなければならない毎日のタスクをすべて管理することは容易ではありません。ミーティング日程を忘れないようにしたり、飛行機のチケットを購入したり、十分な水分補給そしてジムで体を動かすことなど、すべきことを数えだせばきりがありません。スケジュール管理というのは本当に面倒です。

Haptik はインド初のパーソナルアシスタントアプリです。ユーザーは旅行のプランを立てたり、フライトの確認、タクシーの予約そしてリマインダー設定を行うために、このアプリを使用しています。様々な機能を搭載しているこのアプリですが、中でユーザーが頻繁に使用しているのはリマインダー機能です。このアプリのユーザーは、モーニングコールを設定したり、水分補給を忘れずに行うようにリマインダーをセットアップしたり、異なる時間に電話を掛けたり、特別な日にメッセージを送るなど、リマインダーを必要とする様々な事柄に Haptik を使用しています。リマインダー機能を介して、ユーザーはアプリでリマインダーメッセージに関する通知を受信、そしてリクエストした時間に電話を受け取ることができます。

今回のブログでは、タスクを知らせるため指定時間にユーザーに電話をする場合に、当社がどのように Machine Learning や読み上げ機能 (TTS) を使用してユーザーのリマインダーを設定しているのかご説明します。各ユーザーに合わせて電話を掛けたり、何百万人というユーザーに対しリマインダー機能をスケーリングする場合に、どれほど Amazon Polly が役立っているか解説します。

Haptik のリマインダー機能

パーソナルアシスタントに仕事をさせるため、ユーザーは Haptik アプリにアクセスしてボットにメッセージを送信します。当社のシステムにあるメッセージはすべてメッセージパイプラインを通るようになっています。ここでは次の点を検出します。

  • ユーザーが意図するドメイン (リマインダー、旅行、周辺情報など)
  • ユーザーが完了したいタスク (目的)
  • エンティティ (ユーザーのタスクを完了するために必要な別のデータ)

このパイプラインの終わりに近づいた時点でボットがすべての情報を取得している場合は、タスクを完了します。それ以外の場合は、関連性のある質問を返してすべての情報を収集します。

このベーシックパイプラインの他にも、アルゴリズムがいくつもあります。これはディープラーニングを使用してユーザーの介入なしに、ユーザーのタスクを完了しやすくするため、チャット履歴から学習します。

ユーザーに電話を掛ける理由は?

ユーザーに予定のタスクを知らせるため、アプリで通知を送信し電話でも連絡します。Haptik は一般的に使用されている通知技術を使用してユーザーにリマインダーを送信していますが、次のいくつかの理由により、ユーザーに電話を掛ける方がさらに効果的であると当社は考えています。

まず、今のスマートフォン時代では、どのアプリからも大量の通知が届くようになっているので、重要な通知を見逃してしまうことがあります。そのため、知らない番号または Haptik から電話を受け取ることは、スヌーズボタンを押すだけで終わってしまう通常のアラームに比べて効果的です。

2 つめの理由は、当社はリマインダーを設定したタスクの種類に基づいて、電話を掛ける声とその内容を変更し、より優れたユーザーエクスペリエンスを提供しています。たとえば、モーニングコールには穏やかで落ち着いた音声を使用しています。そして時々、ユーザーが気持ち良く元気な状態で起床できるようにするため、電話の終わりに自己啓発的なメッセージも追加しています。Amazon Polly を使用することで、こうした TTS ユースケースの実装をシンプルで信頼性があるものにすることができます。

(more…)

ONNX 1.0 の提供開始を発表

アマゾン ウェブ サービス (AWS)、Facebook、Microsoft は Open Neural Network Exchange (ONNX) 形式が本稼働環境で使用できるようになったことを発表しました。

ディープラーニングモデルのオープンスタンダード形式である ONNX は、Apache MXNet、Caffe2、Microsoft Cognitive Toolkit、PyTorch といったディープラーニングフレームワーク間での相互運用を可能にします。ONNX 1.0 は、ユーザーがフレームワーク間でディープラーニングモデルを移動できるようにし、本番稼働環境に取り入れやすくします。たとえば、開発者は PyTorch のようなフレームワークを使用して洗練されたコンピュータビジョンモデルを構築し、Microsoft Cognitive Toolkit または Apache MXNet を使用し推論で実行することができます。

ONNX の初回リリースは 9 月だったので、我々はこの成長とコミュニティサポートの勢いやその関与をたのもしく思いながら観察しています。Qualcomm、Huawei、Intel などを含む数々のハードウェアパートナーが各社のハードウェアプラットフォームで ONNX 形式をサポートしていることを発表しており、ユーザーが異なるハードウェアプラットフォームでモデルを実行しやすくしています。新機能のコードやサポートに貢献して下さったコミュニティの皆さんに、この場を借りて感謝申し上げます。

開発者が最新のリサーチにアクセスし最先端モデルを本稼働アプリケーションと統合できるようにするため、今後も ONNX の進化において ONNX パートナーやコミュニティと協力していきます。

関連の発表


今回のブログの投稿者について

Sukwon Kim は AWS Deep Learning のシニアプロダクトマネージャーです。 特にオープンソースの Apache MXNet エンジンに注目し、ディープラーニングエンジンを使いやすくする製品を担当しています。余暇にはハイキングや旅行を楽しんでいます。

AWS、Apache MXNet の ディープラーニングエンジンのマイルストーンである 1.0 のリリースに対し新しいモデル提供機能の追加を含む貢献

AWS は Apache MXNet ディープラーニングエンジンのマイルストーンとなる 1.0 のリリースへの貢献と、MXNet 向けの新しいモデル提供機能の導入を発表しました。これらの新機能により、(1) ディープラーニングモデルのトレーニングとデプロイが簡素化され、(2) 最先端のパフォーマンス強化の実装が可能になり、また (3) ディープラーニングフレームワーク間の相互運用性が簡単になります。

このブログ記事では、本日導入された主な機能それぞれの開始方法を説明します。

シンプルで使用が容易

Apache MXNet 向けモデルサーバー: モデルサーバーは、わずか数行のコードを使用するだけで、ディープラーニングモデルを数秒でパッケージ化、実行、提供します。これにより API エンドポイント経由でインターネットを使用してアクセスすることができます。その後、アプリケーションからこのエンドポイントを呼び出して予測を行うことができます。また、モデルサーバーには 10 個の事前トレーニング済みモデルを備えた model zoo が含まれています。モデルを自分でトレーニングする必要はなく、簡単にデプロイできます。モデルサーバーによって、ウェブ、モバイル、IoT アプリケーション内への AI 機能のデプロイが簡素化されます。

Apache MXNet 向けモデルサーバーの使用を開始するには、以下のコマンドを使用してライブラリをインストールします。

pip install mxnet-model-server

モデルサーバーのライブラリには、SqueezeNet v1.1 オブジェクト分類モデルが含まれています。次のコマンドを使用して SqueezeNet モデルの提供を開始できます。

mxnet-model-server --models squeezenet=https://s3.amazonaws.com/model-server/models/squeezenet_v1.1/squeezenet_v1.1.model 

モデルサーバーの詳細とソースコード、リファレンスサンプル、チュートリアルの表示方法については、こちらを参照してください。

アドバンスドインデックス作成: 1.0 リリースには、アドバンスドインデックス作成機能が含まれています。これにより、Python NumPy ライブラリ内の ndarray 配列オブジェクトクラスの既存の知識を活用して、より直感的な方法でテンソル演算を実行できます。この機能によりより効率的な方法でインデックスにアクセスできるため、開発者の時間と手間を節約できます。以下は、MXNet の新しいアドバンスドインデックス作成機能の例です。

  • 整数のリストをインデックスとしてサポート:
    x = nd.array([[1, 2], [3, 4], [5, 6]], dtype = ‘int32’)
    print(x[[0, 1, 0]])
    [[1, 2] [3, 4]  [1, 0]] # the row index is [0, 1, 0] and print the corresponding row of matrix 
  • 正方行列から対角要素を取得:
    • アドバンスドインデックス作成機能を使用しない場合は 3 行のコードを作成する必要があります:
      a = [[0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15]]
      index = mx.nd.array([0, 1, 2, 3], dtype=’int32’)
      index = mx.nd.stack(index, index)
      diag = mx.nd.gather_nd(a, index) 
    • アドバンスドインデックス作成のサポートを使用すると、1 行のコードでジョブを実行できます:
      diag = a[[0, 1, 2, 3], [0, 1, 2, 3]] 

アドバンスドインデックス作成の詳細については、こちらをご覧ください。

高性能

1.0 リリースには、ディープラーニング分野におけるモデルトレーニングおよび推論の最適化に関する最新の研究成果に基づいた機能が実装されています。

グラデーション圧縮: 分散トレーニングでは、各マシンがモデルパラメータを更新し、それにより、単一モデルを集合的に構築するために、頻繁に他のマシンと通信する必要があります。そのためネットワークトラフィックが高くなり、しばしばトレーニング速度とパフォーマンスに悪影響を及ぼします。グラデーション圧縮により、各インスタンスで通信されるモデルの変更を圧縮することで、集束率または精度を失うことなく、最大 5 倍高速にモデルをトレーニングできます。グラデーション圧縮は、しきい値を下回るウェイトの更新の同期を遅延させる方法を使用します。VGGNet や AlexNet などのアーキテクチャは、通信と比較して低コンピューティングを使用しているため、トレーニング速度に目覚ましい改善を見せることができます。

次の例では、しきい値が 2 に設定されている場合に、2 ビットグラデーション圧縮がどのようにグラデーションを圧縮するかを示しています。緑の要素はしきい値に一致しているため、量子化された形式で 2 つのビット「11」と表されます。青色の要素の負の値はしきい値に一致しているため、別の 2 つのビット「10」で表されます。絶対値がしきい値未満の残りの値は、「00」で表されます。グラデーション圧縮では、通信されるグラデーションを、各グラデーション値に 2 ビットのみを使用して圧縮します。実際のグラデーションと展開されたグラデーションの差異は残余として保存され、次回のイテレーションで量子化の前に加算されます。

グラデーション圧縮はランタイム設定パラメータであり、次のように Gluon API を使用して有効にできます。グラデーション圧縮の詳細についてはこちらをご覧ください。

trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': .1}, compression_params={'type’:'2bit', 'threshold':0.5})

NVIDIA Collective Communication Library (NCCL): NCCL は、NVIDIA GPU に対してパフォーマンスが最適化されたマルチ GPU およびマルチノードの集合的な通信プリミティブを実装しています。NCCL は、マルチ GPU 間の通信で高い帯域幅を達成するよう最適化された通信ルーチンを提供します。MXNet は、単一ノードマルチ GPU システムでの NCCL をサポートするため、トレーニング速度が約 20% 増加します。これには、ライブラリをインストールし、次のように kvstore のタイプのランタイム設定パラメータを渡す必要があります。

trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': .1}, kvstore = ‘nccl’)

NCCL の詳細についてはこちらをご覧ください。

相互運用が容易

MXNet に、Caffe フレームワークで記述されたニューラルネットワークコードを MXNet コードに変換するためのツールが含まれました。MXNet のスケーラビリティとパフォーマンスをより簡単に活用できます。Caffe トランスレータはトレーニング/検証 prototxt およびソルバー prototxt を入力として受け取り、MXNet Python コードを出力として生成します。変換された Python コードは、MXNet シンボルおよびモジュール API を使用したネットワークの構築、LMDB ファイルからのデータの読み取り、トレーニングの実行、および MXNet モジュール API を使用したトレーニング済みモデルの保存を行います。MXNet 向け Caffe トランスレータの使用を開始するには、実効可能な JAR ファイルを Apache maven からダウンロードします。

train_val.prototxt および solver.prototxt を MXNet Python コードに変換するには、次のコマンドを実行します。

java -jar caffe-translator-<version>.jar --training-prototxt <train_val.prototxt_path> \
    --solver <solver.prototxt_path> \ --output-file <output_file_path>

変換されたコードを実行するには、MXNet インターフェイス搭載の Caffe または Caffe プラグイン搭載の MXNet のいずれかを使用する必要があります。変換された Python コードは単純に、他の Python コードと同様に次のように実行できます。

python translated_code.py

Caffe Translator の詳細についてはこちらをご覧ください。

MXNet の開始方法

Apache MXNet の使用を開始するには、以下のコマンドを使用して pip のインストールを実行します。

pip install mxnet==1.0.0

Gluon インターフェイスとディープラーニングの詳細については、この包括的な一連のチュートリアルを参照できます。これらのチュートリアルでは、ディープラーニングの概要から最先端のニュートラルネットワークモデルを実装する方法まで紹介しています。


今回のブログの投稿者について

Sukwon Kim は AWS Deep Learning のシニアプロダクトマネージャーです。 特にオープンソースの Apache MXNet エンジンに注目し、ディープラーニングエンジンを使いやすくする製品を担当しています。余暇にはハイキングや旅行を楽しんでいます。

AWS が Apache MXNet のマイルストーン 1.0 リリースに貢献、モデル提供機能を追加

Dr. Matt Wood による投稿

AWS は MXNet 向けの新しいモデル提供機能の導入を含む、Apache MXNet ディープラーニングエンジンのマイルストーンとなる 1.0 のリリースへの協力について発表しました。MXNet の新機能は、ユーザーにとって次のような利点があります。

1) MXNet は使用が簡単: MXNet 向けモデルサーバーは AWS が導入した新機能であり、わずか数行のコードを使用するだけで、ディープラーニングモデルを数秒でパッケージ化、実行、提供します。これにより API エンドポイント経由でインターネットを使用してアクセスすることができるため、アプリケーションに簡単に統合することができます。また、1.0 リリースには、詳細なインデックス作成機能が含まれています。これにより、ユーザーはより直観的な方法でマトリックス操作を実行できます。

  • Model Serving により予測のための API エンドポイントのセットアップが可能に: わずか数行のコードで予測機能を実行してアプリケーションに統合するための API エンドポイントの設定タスクを要約し、開発者の時間と労力を減らします。Docker コンテナベースのデプロイモデルを通じて、Python ベースのディープラーニングフレームワークと本稼働システム間の壁を克服します。
  • MXNet 用の配列オペレーションの用の高度なインデックス作成: 開発者が MXNet で強力な配列オペレーションを利用できるよう、より直感的になりました。NumPy/SciPy 配列の既存の知識を利用して、高度なインデックス作成機能を使用できます。たとえば、MXNet NDArray および Numpy ndarray をインデックスとしてサポートします (例: a[mx.nd.array([1,2], dtype = ‘int32’])。

2) MXNet は高速: 1.0 リリースには、トレーニングと推論のパフォーマンスを最適化する、最新鋭の機能が実装されています。グラデーション圧縮により、ユーザーは集束率または正確さを失うことなく、コンピューティングノード間の通信の帯域幅を減らすことで、最大 5 倍高速にモデルをトレーニングすることができます。Alexa 音声のような音声認識アコースティックモデルの場合、この機能により、トレーニング中に最大 3 桁までネットワーク帯域幅を減らすことができます。NVIDIA Collective Communication Library (NCCL) のサポートにより、ユーザーはマルチ GPU システムでモデルを 20% 高速にトレーニングできます。

  • グラデーション圧縮によりネットワーク帯域幅を最適化: 分散トレーニングでは、各マシンが重量ベクトルを更新し、それにより、単一モデルを集合的に構築して、高いネットワークトラフィックとなるよう、各マシンは頻繁に他のマシンと通信する必要があります。グラデーション圧縮アルゴリズムにより、ユーザーは各インスタンスから伝えられたモデル変更を圧縮することで、最大 5 倍高速にモデルをトレーニングすることができます。
  • NCCL を利用してトレーニングのパフォーマンスを最適化: NCCL は、NVIDIA GPU に対してパフォーマンスが最適化されたマルチ GPU およびマルチノードの集合的な通信プリミティブを実装しています。NCCL は、マルチ GPU 間の相互通信で高い帯域幅を達成するよう最適化された通信ルーチンを提供します。MXNet は NCCL のサポートにより、マルチ GPU システムよりも約 20% 高速にモデルをトレーニングします。

3) MXNet が簡単な相互運用性を提供: MXNet は、Caffe フレームワークで書かれたニューラルネットワークコードを MXNet コードに変換し、ユーザーが MXNet のスケーラビリティおよびパフォーマンスを簡単に活用できるようにします。

  • Caffe モデルを MXNet に移行: Caffe コードを MXNet コードに変換する新しいソースコード変換を使用して、Caffe コードを簡単に MXNet に移行できるようになりました。

MXNet は開発者や研究者が言語の翻訳から自動運転車や行動バイオメトリックセキュリティまで、すべてにおいて前進を可能にしてきました。MXNet で開発およびトレーニングされたニューラルネットワークモデルを利用した本番稼働用の人工知能アプリケーションを構築する幅広いユーザーベースが生まれるのを楽しみにしています。たとえば、自動運転の会社である TuSimple は最近、アリゾナ州ユマからカリフォルニア州サンディエゴまで 200 マイルの距離の移動を、MXNet を使用して無人運転トラックで試験しました。このリリースには、Gluon プログラミングインターフェイスの完全な機能とパフォーマンスに最適化したバージョンも含まれています。この使いやすさと幅広い一連のチュートリアルにより、ディープラーニングを初めて学習する開発者の間でもかなり採用が進んでいます。このインターフェイスの柔軟性が、研究コミュニティ (特に自然言語処理分野) 内で関心を高めています。

MXNet の使用開始
MXNet の開始は簡単です。Gluon インターフェイスとディープラーニングの詳細については、この包括的な一連のチュートリアルを参照できます。これらのチュートリアルでは、ディープラーニングの概要から最先端のニュートラルネットワークモデルを実装する方法まで紹介しています。機械学習フレームワークに携わっている場合は、GitHub でインターフェイスの仕様をご確認ください。

Apache MXNet 向けモデルサーバーの使用を開始するには、以下のコマンドを使用してライブラリをインストールします。

$ pip install mxnet-model-server

モデルサーバーのライブラリには、SqueezeNet 1.1 オブジェクト分類モデルを含む Model Zoo と 10 個のトレーニング済みディープラーニングモデルが含まれています。次のコマンドを使用するだけで SqueezeNet モデルの提供を開始できます。

$ mxnet-model-server \
  --models squeezenet=https://s3.amazonaws.com/model-server/models/squeezenet_v1.1/squeezenet_v1.1.model \
  --service dms/model_service/mxnet_vision_service.py

モデルサーバーの詳細とソースコード、リファレンスサンプル、チュートリアルの表示方法については、https://github.com/awslabs/mxnet-model-server/ を参照してください。

-Dr. Matt Wood

AWS DeepLens の拡張機能: 独自のプロジェクトの構築

AWS DeepLens では、ディープラーニング、Internet of Things (IoT) などの新しいテクノロジーを知ることができるだけでなく、現実的な問題を解決する革新的なシステムを構築することができます。このデバイスおよびサービスには、定義済みのプロジェクトセットが付属しており、プロジェクトをすばやく実行することができます。また、開発者が初心者か経験豊富かに関係なく、同様にエキサイティングなプロジェクトを新しく構築 (および共有) できるようにするオープンプラットフォームとして設計されています。

このブログ投稿では、独自のプロジェクトを構築するプロセスについて説明します。以下に一部のステップを紹介します。

  • ディープラーニングモデルのトレーニング (Amazon SageMaker を使用)
  • AWS DeepLens エッジデバイス上で実行できるように、トレーニング済みのモデルを最適化する
  • モデルをロードし、ビデオストリーム上で推論を実行できるように、AWS Lambda 関数を開発する
  • AWS Greengrass を使用して AWS Lambda 関数を AWS DeepLens にデプロイする
  • コマンドを送信し、推論を出力できるように、エッジ AWS Lambda 関数をクラウドに接続する
  • 完成

ディープラーニングモデルのトレーニング (Amazon SageMaker を使用)

Amazon SageMaker は、データサイエンスで手間のかかる作業を排除する新しいサービスです。このサービスには、推奨のエンジンから Alexa や Amazon Go、Amazon Robotics などの機械学習に基づくシステムまで、Amazon.com のビジネスのさまざまな側面で、Amazon データサイエンティストの長年の経験が反映されています。

優れた機械学習モデルを設計、構築する全体のプロセスは非常に興味深いですが、今回のブログ投稿では割愛します。実際、DeepLens デバイスにディープラーニングモデルをデプロイして再接続し、その出力を活用するフローで生産性を高めれば、現実の新しい問題を解決するために新たなモデルの構築にますます多くの時間を費やすことになります。

機械学習の初心者が、データサイエンティストのエキスパートと同じ開始ポイントに立つには、Amazon SageMaker でノートブックインスタンスを作成する際に利用できる Jupyter ノートブック内のノートブックセットから始めることをお勧めします。たとえば、以下は、転移学習のプロセスと、推論エンドポイントホスティング向けに微調整されたディープラーニングモデルを構築、トレーニング、デプロイするために Amazon SageMaker SDK を使用するフローの両方を示すノートブックです。

このブログ投稿では、プロセスの次のステップに進められるように、Amazon S3 におけるモデルアーティファクトの保存に焦点を当てています。

以下は、SageMaker のトレーニングジョブを使用してトレーニングされたモデルの例です。このトレーニングで使用した出力ディレクトリやハイパーパラメータなどがあります。

ハイパーパラメータは、モデルの使用方法を理解するのに役立ちます。たとえば、カラーイメージ (3=RGB チャネル) を処理するには、image_shape (3,224,224) に基づき、224*224 ピクセルにリサイズする必要があります。また、今後のトレーニングジョブで、トレーニングデータ (epochs>2) を超える実行、learning_rate の変更、num_training_samples 数の増加など、詳細にモデルを設定するのにも役立ちます。

AWS DeepLens エッジデバイス上で実行できるように、トレーニング済みのモデルを最適化する

実際のディープラーニングシステムにおけるこのステップの重要な例として、モデルのハードウェアを DeepLens デバイスに最適化するステップがあります。前のステップでは、モデルのトレーニング用にほぼ無制限のクラウドリソースがありましたが、モデルを推論に使用する場合は、スケーリングなど、新しいビジネス制約に直面します。クラウドでは、GPU ベースのインスタンスの大規模なクラスターを容易に取得できるため、数時間のトレーニングで複数のことを実行できます。しかし、モデルをエッジデバイスにデプロイする場合は、チップセット (CPU/GPU)、メモリ、ネットワーク帯域幅、安定性などの点から、デバイスの仕様を検討する必要があります。DeepLens デバイスは、高フレームレートで高解像度のビデオストリームのモデルを複数実行する上で十分強力ですが、ほとんどの場合、それほど高いスペックは必要ないでしょう。そこで、インテルは、MXNet モデルのアーティファクトを取り、DeepLens デバイスに搭載されているインテルのチップボードに最適化するライブラリを開発しました。このライブラリは、前のステップでモデルをインポートした後、DeepLens コンソールを使用してモデルをデプロイするときに自動的に実行されます。

モデルのトレーニングが終了したら、DeepLens にインポートする際にトレーニングジョブ ID を指定することができます。(モデルをインポートするには、Sagemaker と DeepLens のいずれも、同じ AWS リージョンに存在する必要があります。)

モデルをロードし、ビデオストリーム上で推論を実行できるように、AWS Lambda 関数を開発する

IoT デバイス (ここでは AWS DeepLens カメラ) 上で動作している AWS Greengrass コアでは、デプロイされている AWS Lambda Python 関数を実行することができます。次回以降の投稿では、Greengrass Group、Core、および登録デバイスを作成するステップについて説明します。「入門ガイド」については、Greengrass ドキュメントをご覧ください。AWS DeepLens は、これらのステップのほとんどで自動化されています。ここでは、Lambda 関数を開発して、登録、構成されたデバイスにデプロイする方法について説明します。

それぞれの Lambda 関数において、以下のステップを行います。

  • モデルのロード
  • フレームのキャプチャ
  • フレームでのモデル推論の実行
  • 推論結果の解析
  • MQTT トピックに結果を発行する

これらのステップの例をいくつか見ていきましょう。

モデルのロード

AWS DeepLens デバイスは、ヘルパーライブラリ awscam に事前にインストールされています。このライブラリを使用すると、Lambda 関数のロジックに統一しやすくなります。このロジックでは、モデルのロードなど、最も一般的なステップで行われます。次の例で示すように、モデル XML ファイルへのパスとモデルのコンテキスト (GPU/CPU) を指定する必要があります。モデルの読み込みとバインディングはライブラリで自動的に行われます。

import awscam
modelPath = "/opt/awscam/artifacts/mxnet_deploy_CaltechTransfer_224_FP16_FUSED.xml"
# Load model to GPU (use {"GPU": 0} for CPU)
mcfg = {"GPU": 1}
model = awscam.Model(modelPath, mcfg)

このステップは、内部の推論関数 (例: 以下の greengrass_infer_image_run) 外で定義する必要があります。このステップは、モデルがディスクからメモリおよび GPU にロードされるまでに数秒かかる場合があるため、1 回だけ実行する必要があります。

フレームのキャプチャ

OpenCV (cv2) は、ディープラーニングモデルの (リサイズ) 前と (ボックスとラベルの描画) 後の画像を操作するために使用されます。トレーニングの入力仕様はモデルごとに異なるため、最初のステップとして、キャプチャされたフレームを適切なサイズにリサイズします。

import cv2
input_width = 224
input_height = 224
ret, frame = awscam.getLastFrame()
# Resize frame to fit model input requirement
frameResize = cv2.resize(frame, (input_width, input_height))

フレームでのモデル推論の実行

ヘルパーライブラリ awscam は、predict コマンドがシンプルな doInference 関数に含まれているため、この Lambda 関数の部分を簡潔にすることができます。

# リサイズされたフレームでモデルの推論を実行する
inferOutput = model.doInference(frameResize)

推論結果の解析

ヘルパーライブラリは、従来のいくつかのコンピュータビジョン問題に対応しています。たとえば、ラベルでオブジェクトを分類する「分類」、オブジェクトのラベルと境界ボックスを提供する、オブジェクト検出およびローカリゼーションの「ssd」 (「single-shot-multibox-detector」)、イメージをリージョンに分割し、ピクセルレベルの出力を提供する「セグメンテーション」 (例: スタイル転送) などがあります。次の例は、一般的な「ssd」タイプのモデルを対象としています。

modelType = "ssd"
parsed_results = model.parseResult(modelType, inferOutput)['ssd']

MQTT トピックに結果を発行する

最後に、モデルの出力を送信します。このロジックは、モデルのタイプと、解決を試みる問題のタイプによって異なります。シンプルな出力としては、以下の例で示す Dog/Cat または Hotdog/Not Hotdog などの画像のラベルがあります。他の出力タイプには、顔検出モデルから顔認識に送信される画像内の顔の切り抜きや、ビデオストリーム内のオブジェクトの境界ボックス、画像/ビデオのニューラルスタイル転送などがあります。最もかんたんにデバイスからの出力を送信するには、次のコードに示すように、Greengrass クライアントを使用して MQTT を経由します。このチャネルは、テキストメッセージだけでなく、テキストエンコード後の画像 (境界ボックスやラベルなどを含む) にも対応しています。

# Greengrass コアの sdk クライアントを作成する
client = greengrasssdk.client('iot-data')
iotTopic = 'iot-data'
for obj in parsed_results:
    if obj['prob'] > max_threshold:
        label = '{{"label":"{}", "prob":{:.2f}%'.format(outMap[obj['label']], obj['prob']*100 )
        client.publish(topic=iotTopic, payload = label)

AWS Greengrass を使用して AWS Lambda 関数を DeepLens にデプロイする

Greengrass では、主な 2 つのモード (固定およびオンデマンド) で Lambda 関数を実行することができます。AWS DeepLens モデルでは、Lambda 関数の起動時に固定オプションを使用することが推奨されています。ディープラーニングモデルが大きい場合 (数百 MB から数 GB) は時間がかかります。推論がトリガーされる頻度や時間は以下のモードで制御することができます。

  • 高フレームレート – フレーム間に「スリープ」がない無限ループで関数を実行します。フレームレートは、モデル推論の速度、前処理および後処理に応じて、10~30 FPS に設定することができます。
  • 特定フレームレート – フレーム間に定義済みの「スリープ」を含む無限ループで関数を実行します。顔検出などのタスクでは、1 秒あたり 1~5 フレームレートで実行することができ、リージョン内のすべての顔を検出するのに必要な機能が搭載されています。関数の推論のレートを制御するには、Timer を使用します。
    インポートタイマーのスレッディング
    def greengrass_infer_image_run():
        # 画像の読み取り
        # 前処理
        # 画像のモデル推論を実行する
        # 結果を解析する
        # 結果を出力する
        
        # この関数が 0.5 秒で再実行されるように非同期でスケジュールする
        Timer(0.5, greengrass_infer_image_run).start()
  • オンデマンド – この関数は、手動または別のイベントからトリガーする場合に実行します。固定の関数を実行している場合でも、イベントハンドラーを使用して実行できます。この例では、各イベントの推論をトリガーする方法を表していますが、イベントのパラメータを解析して、イベントハンドラーから関数を制御する (モデルまたはモデルモードの切替えなど) こともできます。
    インポートタイマーのスレッディング
    def greengrass_infer_image_run():
        # 画像の読み取り
        # 前処理
        # 画像のモデル推論を実行する
        # 結果を解析する
        # 結果を出力する
        
    def lambda_handler(event, context):
        client.publish(topic=iotTopic, payload="About to call image inference function")
        greengrass_infer_image_run()
    return

Lambda 関数の Greengrass スケルトンをかんたんに取得するには、AWS Lambda コンソールで Greengrass のいずれかの設計図を使用します。パッケージにすでに Greengrass クライアントライブラリが含まれているため、できれば greengrassHelloWorld を使用します。この設計図を使用して Lambda 関数を作成し、この関数の Python コードをお客様のコードに置き換え、新しく作成した Lambda 関数を発行します。これで、プロジェクトに追加し、AWS DeepLens コンソールからデバイスにデプロイできるようになりました。

コマンドを送信し、推論出力を受信できるように、ローカル Lambda 関数をクラウドに接続する

以前に説明したように、Lambda 関数では、MQTT プロトコルを介して IoT トピックスに書き出すことができます。組み込みプロジェクトで使用されているデフォルトの出力トピックは以下のとおりです。

iotTopic = '$aws/things/{}/infer'.format(os.environ['AWS_IOT_THING_NAME'])

これは AWS DeepLens コンソールまたは AWS IoT コンソールをご覧ください。同じ形式を使用するか、前の例の iotTopic = ‘iot-data’ など、Lambda 関数のトピック名を使用することもできます。

lambda_handler を使用して、オンデマンドモードで Lambda 関数をトリガーできることも説明しました。これを行うには、IoT コンソールを使用して、IoT クラウドと Lambda 関数の間にサブスクリプションをセットアップする必要があります。たとえば、Lambda 関数のインバウンドサブスクリプションとアウトバウンドサブスクリプション (ImageInferenceTest バージョン 19) は以下のとおりです。

この例では、トピック「trigger-image-inference」をリッスンすると、エッジ Lambda 関数は、イベントがこのトピックに発行される度にトリガーされます。もう一方のサブスクリプションでは、エッジ Lambda から出力メッセージを表示し、クラウド側で確認することができます。たとえば、AWS IoT ルールエンジンを使用して、特定のメッセージ (例: 「顔が検出されました」) をフィルタリングし、他のクラウドサイド の Lambda 関数や、Amazon Elasticsearch Service、Amazon Kinesis などに送信することができます。また、DeepLens デバイスでもサブスクリプションが有効になるように必ずサブスクリプションをデプロイ (「Actions」の下) してください。

また、Lambda 関数のログや、Greengrass の主要情報 (またはデバッグ) のログを表示できるように、デバイスの Greengrass グループの Amazon CloudWatch ログを有効にすることをお勧めします。詳細については、「Greengrass グループコンソールページ」の「設定」セクションで確認できます。

まとめ

今回は、AWS DeepLens で使用できるオープンプロジェクト環境を拡張する方法について説明しました。次回以降は、同様の構造を使用してブロックを構築しながら、このフロー上で構築されている例を紹介していきます。以下の図は、既存のプロジェクトを拡張するか (モデルの改善または Lambda 関数の変更)、一から新しいプロジェクトを作成するステップを示します。


その他の参考資料

AWS DeepLens を拡張して AWS Lambda で SMS 通知を送信する方法について説明します。


今回のブログの投稿者について

Guy Ernest 氏は Amazon AI のプリンシパルソリューションアーキテクトです。マインドシェア構築の戦略に携わり、Amazon の AI、Machine Learning、ディープラーニングのユースケースのクラウドコンピューティングプラットフォームを幅広く使用しています。時間がある時は家族との時間を楽しみ、面白くちょっと恥ずかしい話しを集めたり、Amazon や AI の今後について話し合ったりしています。

Whooshkaa と Amazon Polly: 視覚と聴覚を組み合わせてパブリッシングの世界を広げる

これは、Robert Loewenthal 氏 (Whooshkaa 社 CEO 兼創立者) のゲストブログ投稿です。

Whooshkaa は、オーストラリアを本拠地とするクリエイティブなオーディオオンデマンドのポッドキャストプラットフォームであり、パブリッシャーや広告主によるオーディエンス到達範囲の拡大を支援しています。当社は、常に新しい製品と手法を試しており、これらを組み合わせてお客様のための新しいソリューションを生み出しています。

Amazon Polly のテキスト読み上げ (TTS) 機能が好例です。当社のお客様の中には、すでに Amazon Polly を使用して既存の配信方法を拡張している大手のパブリッシャー、スポーツ団体、オーストラリア最大の通信会社があります。

これらの従来の情報プロバイダーは、今日の購読者が目だけでなく、耳を通した情報の取得に関心がある点に注目しています。Whooshkaa では、Amazon Polly TTS を使用することで、情報プロバイダーが 48 種類の音声と 24 言語で購読者に情報を提供できます。

今年初めに、オーストラリアを代表する全国紙 The Australian に Amazon Polly が導入されました。購読者は、運転やエクササイズなどで手や目を放せないときに Amazon Polly が読み上げる新聞の記事、レシピ、スポーツの試合結果などを聴くことができます。

Whooshkaa では、Amazon Polly を使用することで、特定のパートナーは選択した任意の新聞記事を数秒以内にポッドキャストエピソードに変換できます。当社が提供するツールでは、複数の記事をマージし、音声をカスタマイズしてアクセント、ピッチ、速度、音量を変更することもできます

Whooshkaa の配信ネットワークは多様であり、ユーザーは様々な手段から選んでコンテンツを再生できます。代表的な手段はお気に入りのポッドキャストアプリを使うことです。Whooshkaa は Facebook と独自の提携をしているため、ポッドキャストエピソードをネイティブのオーディオプレイヤーで再生できます。当社のカスタマイズ可能なウェブプレイヤーは Twitter でもサポートされています。ただし、任意のウェブサイトに埋め込むことができます。

このテクノロジーが充実すれば、世界の地域と言語を問わず、パブリッシャーは新聞記事を自由に提供できるようになります。新聞記事は、読者の設定とニーズに応じてカスタマイズすることもできます。

当社はまた、オーストラリア最大の通信会社 Telstra およびナショナルラグビーリーグと提携し、接続されたスマートスピーカーを通じてユーザーのお気に入りのチームの試合結果をライブ配信しています。ユーザーがデバイスに尋ねるだけで、最新の結果が即座に読み上げられます。

当社の開発者 Christian Carlsson によると、Amazon Polly TTS の即応性と幅広い言語は、あらゆるタイプのパブリッシャーに無限の可能性をもたらします。

「人工知能と Whooshkaa の既存の強力なプラットフォームを統合することで、30 秒未満でテキストから完全な自動ポッドキャストエピソードを作成できるようになりました。しかも、これは始まりにすぎません」と Carlsson は述べています。

AFL 統合の技術的な実装

オーストラリアンフットボールリーグ (AFL) は、ファンがスマートスピーカーに話しかけてお気に入りのチームをフォローできるようにしたいと考えました。そのために、Whooshkaa では RSS フィードを作成し、最新の結果を 2 分ごとに更新する必要がありました。次は、この実装の概略図です。

必要なデータが含まれている AFL の API のクロールをトリガーするために、API を呼び出すシンプルな AWS Lambda 関数を設定しました。Whooshkaa API は、データをフェッチして解析し、テキストを音声に変換して、新しく作成した RSS フィードを Amazon S3 に発行します。

まず、2 分ごとにリクエストを初期化するための serverless.yml ファイルを準備しました。このファイルは特別なものではありません。

Serverless.yml:
createAFLFeeds:
 handler: api.createAFLFeeds
 events:
   - schedule:
       rate: rate(2 minutes)
       enabled: ${self:custom.${opt:stage}.ScheduledEvents}

これにより、次のコードがトリガーされます。

WhooshkaaAPI.js
createAFLFeeds() {
    return new Promise((resolve, reject) => {
      this.fetchAFLTeams().then(result => {
        for (const team of result) {
          this.createAFLFeedByTeamID(team['id']);
        }
      }, error => {
        console.log(error);
        reject(error);
      });
      resolve({message: "success"});
    });
}

次に、 createAFLFeedByTeamID メソッドから POST リクエストがエンドポイントに送信され、エンドポイントで以下の操作が行われます。

  1. AFL API からデータをフェッチします。このメソッドをできるだけ読み取り可能にするために、データの正規化が別の AFL パッケージに抽象化されます。どのデータを解析するかは、いくつかの異なる条件で決まります。チームが試合中であるか過去 24 時間以内に試合をしている場合は、チームの一致するデータが取得されます。それ以外の場合は、デフォルトで、チームの最新のニュースが取得されます。
  2. ハッシュを Amazon S3 に保存することで、返されたデータが最新であることを確認します。$this->publisher は抽象化されたクラスであり、3 つの異なるストレージアダプターとして、ローカル、Whooshkaa S3 バケット、および AFL S3 バケットが含まれます。ローカルアダプターではデータを操作し、Whooshkaa S3 バケットではハッシュを保存します。AFL S3 バケットには、生成した RSS フィードを発行します。
  3. 取得したテキストを Amazon Polly を通じてオーディオストリームに変換します。 makeAudio メソッドは、一部の単語を操作して期待どおりの音声で生成する方法を示しています。たとえば、マジソンスクエアガーデンの略である MCG は「McGee」と解釈されるため、代わりに、これをスペルアウトするよう Amazon Polly に指示します。
  4. RSS フィードを作成して AFL の S3 バケットに発行します。
AFLController.php:
public function team(string $id)
{
    if (!$team = Team::findById($id)) {
        $this->response->errorNotFound('Invalid team ID.');
    }

    if ($team->isPlayingOrHasRecentlyPlayed()) {
        $story = $team->match;
    } else {
        $story = $team->news;
    }

    $this->publisher->setTeamId($id);
    $this->publisher->setStory($story->getStory());

    $hash = Hash::make($story, $this->publisher->getRemoteStorageAdapter());
    if ($hasBeenUpdated = $hash->hasBeenUpdated()) {
        $fileName = $this->publisher->getFileName();

        $audio = $this->makeAudio($story);
        $this->publisher->store($fileName, $audio->getContent());

        $feed = $this->makeFeed($team, $story);
        $this->publisher->store('feed.xml', $feed->getContent());

        $this->publisher->moveToCloud([$fileName, 'feed.xml']);
        $this->publisher->cleanUp();

        $hash->store();
    }

    return response([
        'rss' => $this->publisher->getRemoteUrl('feed.xml'),
        'updated' => $hasBeenUpdated,
    ]);
}

private function makeAudio($story)
{
   $polly = new Polly;
   $polly->setPhonemes(['live' => 'laɪve']);
   $polly->setProsody('AFL', ['rate' => 'fast']);
   $polly->setSayAs(['MCG' => 'spell-out']);

   $text = $story->getStory();
   // Trim the text to a maximum of 1500 characters.
   if (strlen($text) > 1499) {
       $text = $this->text->setText($text)->trimToWordBoundary(1499);
   }

   try {
       $audioStream = $polly->fetchAudioStream($text);
   }
   catch (\Exception $e) {
       $this->response->error($e->getMessage(), $e->getStatusCode());
   }

   return response()->make($audioStream)->header('Content-Type', 'audio/mpeg');
}

private function makeFeed(Team $team, $story)
{
   $feed = new Feed($this->publisher->getRemoteURL('feed.xml'));
   $feed->setTitle($team->getName() . "'s Official Live Feed");
   $feed->setDescription('An official live feed from the Australian Football League.');
   $feed->setLink('http://www.afl.com.au');
   $feed->setOwner('The Australian Football League', 'podcast@afl.com.au');
   $feed->setImage($team->getImage());
   $feed->appendElements([
       'itunes:subtitle' => "Follow {$team->getName()}'s Live Matches and Latest News",
       'itunes:explicit' => 'no',
       'language' => 'en-us',
       'lastBuildDate' => Carbon::now('UTC')->toRssString(),
       'ttl' => 2,
       'copyright' => 'The Australian Football League',
   ]);

   $feed->setCategories([
       'Sports & Recreation' => [
           'Professional',
       ]
   ]);

   $fileName = $this->publisher->getFileName();
   $metaData = $this->getMetaData($fileName);

   $item = $feed->addItem([
       'title' => $story->getTitle(),
       'link' => $story->getArticleURL(),
       'pubDate' => Carbon::now('UTC')->toRssString(),
       'itunes:duration' => $metaData['playtime_string'],
   ]);
   $item->appendDescription($story->getStory());
   $item->appendEnclosure($this->publisher->getRemoteUrl($fileName, true), $metaData['filesize'], $metaData['mime_type']);
   $item->append('itunes:image', null, ['href' => $team->getImage()]);
   $item->append('guid', $this->publisher->getGuid(), ['isPermaLink' => 'false']);

   return response()->make($feed->output())->header('Content-Type', 'text/xml');
}

オーストラリアの「Daily News」の技術的な実装

The Australian は News Corp 傘下の新聞社です。この新聞社は、毎日 10 大ニュースを読者に音声で提供することを考えました。ニュースをポッドキャストエピソードとして 1 日に 5 回更新する必要があります。当社では、Amazon Polly との統合により、この要件を簡単に実装できました。この実装の概略図は次のとおりです。

この実装は AFL の統合と酷似していますが、1 つの例外があります。RSS フィードを生成する代わりに、エピソードの発行先を Whooshkaa のオーストラリアのアカウントの指定されたショーにします。これにより、エピソードはほぼ即座に iTunes、Pocket Casts、またはその他のポッドキャストプレイヤーで再生できます。

この実装をビルドするために、AFL 実装の場合と同じように AWS Lambda 関数をセットアップしました。「Daily News」エンドポイントを毎日の特定の時間にトリガーする必要があるためです。

Serverless.yml
createDailyNewsStory:
 handler: api.createDailyNewsStory
 events:
   - schedule:
       rate: cron(0 2,6,10,22 * * ? *)
       enabled: ${self:custom.${opt:stage}.ScheduledEvents}
   - schedule:
       rate: cron(30 14 * * ? *)
       enabled: ${self:custom.${opt:stage}.ScheduledEvents}
WhooshkaaAPI.js
createDailyNewsStory() {
 const options = {
   hostname: this.commonOptions.hostname,
   port: this.commonOptions.port,
   path: '/news-corp/daily-news',
   method: 'POST',
 };
 return new Promise((resolve, reject) => {
   this.sendRequest(options).then(result => {
     return resolve(result);
   }, error => {
     console.log(error);
     return reject('Could not create "Daily News" story.');
   });
 });
}

次に、 createDailyNewsStory ハンドラで createDailyNewsStory 関数を呼び出し、以下のように、API で dailyNews エンドポイントをトリガーします。

NewsCorpController.php
public function dailyNews()
{
   $show = Show::find(DailyNewsStory::SHOW_ID);
   $storyBuilder = new StoryBuilder($show);

   $dateTime = Carbon::now('Australia/Sydney')->format('F j (g:00 a)');
   $title = $show->title . ' - ' . $dateTime;

   $story = new DailyNewsStory;
   $story->setLimit(10);
   $story->setTitle($title);
   $story->setDescription($title);

   $episode = $storyBuilder->fetch($story)->publish();

   return $this->response->item($episode, new EpisodesTransformer);
}

DailyNewsStory で拡張される StoryBase クラスには、 NewsCorpApi クラスの依存関係が挿入されています。 DailyNewsStory の値は NewsCorpApi クラスに渡されます。ここでデータを取得して正規化します。

次に、取得したすべての記事のオーディオを生成し、1 つのエピソードとして発行します。これは StoryBuilder クラスで次のように行われます。

StoryBuilder.php
public function publish()
{
   $title = $this->story->getTitle();
   $description = $this->story->getDescription();

   if (!$episode = $this->episodes->findByTitleAndDescription($title, $description)) {
       $audio = $this->makeAudio();
       $fileName = $this->storage->putContent($audio->content(), Polly::OUTPUT_FORMAT);

       $data = [
           'podcast_id' => $this->show->id,
           'title' => $title,
           'description' => $description,
           'media_file' => $fileName,
           'length' => $this->storage->getSize($fileName),
       ];

       $episode = $this->episodes->create($data);
   }

   return $episode;
}

public function makeAudio()
{
   $polly = new Polly;

   $audioStream = null;
   foreach ($this->story->getBody() as $body) {
       $audioStream .= $polly->makeAudioStream($body);
   }

   return $polly->makeAudioResponse($audioStream);
}

次に $this->story->getBody() をループさせます。これは配列であり、前述した 10 個すべての記事が含まれているためです。これにより、Amazon Polly から継続的なオーディオストリームが作成されます。次に、オーディオストリームは mp3 ファイルとして S3 バケットにアップロードされ、そのファイル名が残りの情報と共にデータベースに保存されてリクエストで返されます。

当社の多くのお客様は、大量のリッチコンテンツを生成しています。当社が提供するプラットフォームでは、お客様は Amazon Polly を使用してコンテンツをオーディオに変換し、配信、分析、営利化できます。あるニュースパブリッシャーは、Whooshkaa および Amazon Polly のテキスト読み上げを使用してレシピライブラリを提供する予定です。

Whooshkaa では、常にオーディオを使用したイノベーションの方法を追求しています。クリエイターに最も広範な配信ネットワークを提供するために新しい市場とテクノロジーを開拓しています。従来のパブリッシャーと Amazon Polly の組み合わせは極めて有望です。


今回のブログの投稿者について

Robert Loewenthal 氏は、Whooshkaa の CEO 兼創立者です。Whooshkaa は、オーストラリアのシドニーを本拠地とするフルサービスのオーディオオンデマンド企業であり、クリエイターおよびブランドによるコンテンツの生成、ホスト、共有、追跡および収益化を支援しています。